From 415d35f6e2598571ba2bbbc5b39fab16dfd8927f Mon Sep 17 00:00:00 2001
From: Kirill Khrychikov
Date: Thu, 12 Jun 2025 00:47:38 +0300
Subject: [PATCH] .
---
auth.go | 71 +
echo.go | 98 +
frontend/.env.development | 1 +
frontend/.env.production | 1 +
frontend/.gitignore | 29 +
frontend/README.md | 40 +-
frontend/components.d.ts | 115 +
frontend/env.d.ts | 1 +
frontend/index.html | 20 +-
frontend/package-lock.json | 2107 ++++++++++----
frontend/package.json | 35 +-
frontend/package.json.md5 | 2 +-
frontend/public/favicon.ico | Bin 0 -> 1897 bytes
frontend/src/App.vue | 95 +-
frontend/src/assets/base.css | 36 +
frontend/src/assets/fonts/OFL.txt | 93 -
.../fonts/nunito-v16-latin-regular.woff2 | Bin 18972 -> 0 bytes
frontend/src/assets/g69.png | Bin 0 -> 13456 bytes
frontend/src/assets/images/logo-universal.png | Bin 139695 -> 0 bytes
frontend/src/assets/logo-200x200.png | Bin 0 -> 16375 bytes
frontend/src/assets/main.css | 47 +
frontend/src/components/HelloWorld.vue | 71 -
frontend/src/components/Logo.vue | 35 +
frontend/src/components/NotImplemented.vue | 53 +
frontend/src/components/PageNotFound.vue | 44 +
frontend/src/components/admin/Dashboard.vue | 465 +++
frontend/src/components/admin/domains/Add.vue | 120 +
.../src/components/admin/domains/DKIM.vue | 156 +
.../admin/domains/IncomingRules.vue | 61 +
.../admin/domains/MailsPermDeletion.vue | 344 +++
.../components/admin/domains/Migration.vue | 151 +
.../admin/domains/OutgoingRules.vue | 68 +
.../admin/domains/SharedAddressBooks.vue | 25 +
.../admin/domains/SharedCalendars.vue | 21 +
.../admin/domains/SharedFolders.vue | 25 +
.../admin/domains/cidr_access/Policy.vue | 471 +++
.../admin/domains/cidr_access/Pools.vue | 397 +++
.../admin/domains/mailstorage/Export.vue | 158 +
.../admin/domains/mailstorage/Mailboxes.vue | 747 +++++
.../admin/domains/mailstorage/Settings.vue | 1071 +++++++
.../admin/domains/resources/Categories.vue | 328 +++
.../admin/domains/resources/Offices.vue | 352 +++
.../admin/domains/resources/Resources.vue | 608 ++++
.../components/admin/domains/userdb/Add.vue | 115 +
.../admin/domains/userdb/Groups.vue | 434 +++
.../admin/domains/userdb/Redirects.vue | 245 ++
.../admin/domains/userdb/Settings.vue | 812 ++++++
.../components/admin/domains/userdb/Users.vue | 294 ++
.../components/admin/security/BlockedIPs.vue | 164 ++
.../admin/security/black_list/Email.vue | 215 ++
.../admin/security/black_list/IP.vue | 213 ++
.../admin/security/white_list/Email.vue | 215 ++
.../admin/security/white_list/IP.vue | 213 ++
.../admin/settings/AddressRules.vue | 50 +
.../components/admin/settings/Calendars.vue | 110 +
.../src/components/admin/settings/License.vue | 272 ++
.../src/components/admin/settings/Main.vue | 1010 +++++++
.../components/admin/settings/SettingsDB.vue | 257 ++
.../admin/settings/smtp_queue/Manage.vue | 388 +++
.../admin/settings/smtp_queue/Settings.vue | 304 ++
.../src/components/common/AddressBooks.vue | 815 ++++++
frontend/src/components/common/Calendars.vue | 475 +++
.../src/components/common/CalendarsAccess.vue | 504 ++++
.../src/components/common/SharedFolders.vue | 755 +++++
.../src/components/common/TimezoneSelect.vue | 40 +
.../src/components/common/WorkDaysSelect.vue | 36 +
.../common/WorkHoursRangePicker.vue | 6 +
.../src/components/common/approval/Day.vue | 118 +
.../components/common/approval/Interval.vue | 66 +
.../src/components/common/rules/Actions.vue | 74 +
.../components/common/rules/Conditions.vue | 91 +
.../src/components/common/rules/Rules.vue | 588 ++++
.../common/rules/address/Actions.vue | 61 +
.../common/rules/address/Conditions.vue | 192 ++
.../common/rules/incoming/Actions.vue | 210 ++
.../common/rules/incoming/Conditions.vue | 503 ++++
.../common/rules/outgoing/Actions.vue | 381 +++
.../common/rules/outgoing/Conditions.vue | 300 ++
.../user/AddressBooks/AvaliableToMe.vue | 176 ++
.../components/user/AddressBooks/MyBooks.vue | 23 +
.../user/Calendars/AvaliableToMe.vue | 176 ++
.../user/Calendars/EventsPlanner/List.vue | 360 +++
.../Calendars/EventsPlanner/NewOrEdit.vue | 1430 +++++++++
.../EventsPlanner/ScriptErrorNotify.vue | 90 +
.../components/user/Calendars/MyCalendars.vue | 23 +
.../user/Calendars/ShareFreeTime.vue | 255 ++
.../src/components/user/IncomingRules.vue | 55 +
.../components/user/MailboxSharedAccess.vue | 345 +++
frontend/src/components/user/Profile.vue | 277 ++
.../src/components/user/RecoveryFolder.vue | 84 +
.../src/components/user/SharedFolders.vue | 23 +
frontend/src/composables/alert.ts | 27 +
frontend/src/composables/apiFetch.ts | 47 +
frontend/src/composables/misc.ts | 79 +
frontend/src/composables/restart.ts | 31 +
frontend/src/locale/index.ts | 32 +
frontend/src/locale/translations.ts | 2593 +++++++++++++++++
frontend/src/main.ts | 52 +-
frontend/src/router/consts.ts | 98 +
frontend/src/router/index.ts | 105 +
frontend/src/router/middleware/log.ts | 7 +
frontend/src/router/middleware/pipeline.ts | 13 +
frontend/src/router/routes.ts | 275 ++
frontend/src/stores/auth.ts | 28 +
frontend/src/stores/returnToPage.ts | 33 +
frontend/src/style.css | 26 -
frontend/src/views/Admin.vue | 1546 ++++++++++
frontend/src/views/Login.vue | 168 ++
frontend/src/views/User.vue | 445 +++
.../views/shared/EventsExternalApproval.vue | 271 ++
frontend/src/views/shared/FreeTime.vue | 265 ++
frontend/src/vite-env.d.ts | 7 -
frontend/tsconfig.app.json | 14 +
frontend/tsconfig.json | 27 +-
frontend/tsconfig.node.json | 20 +-
frontend/vite.config.ts | 16 +-
go.mod | 10 +-
go.sum | 10 +
handlers.go | 20 +
main.go | 46 +-
tools/auth.go | 30 +
tools/consts.go | 12 +
tools/responses.go | 130 +
123 files changed, 28022 insertions(+), 866 deletions(-)
create mode 100644 auth.go
create mode 100644 echo.go
create mode 100644 frontend/.env.development
create mode 100644 frontend/.env.production
create mode 100644 frontend/.gitignore
create mode 100644 frontend/components.d.ts
create mode 100644 frontend/env.d.ts
create mode 100644 frontend/public/favicon.ico
create mode 100644 frontend/src/assets/base.css
delete mode 100644 frontend/src/assets/fonts/OFL.txt
delete mode 100644 frontend/src/assets/fonts/nunito-v16-latin-regular.woff2
create mode 100644 frontend/src/assets/g69.png
delete mode 100644 frontend/src/assets/images/logo-universal.png
create mode 100644 frontend/src/assets/logo-200x200.png
create mode 100644 frontend/src/assets/main.css
delete mode 100644 frontend/src/components/HelloWorld.vue
create mode 100644 frontend/src/components/Logo.vue
create mode 100644 frontend/src/components/NotImplemented.vue
create mode 100644 frontend/src/components/PageNotFound.vue
create mode 100644 frontend/src/components/admin/Dashboard.vue
create mode 100644 frontend/src/components/admin/domains/Add.vue
create mode 100644 frontend/src/components/admin/domains/DKIM.vue
create mode 100644 frontend/src/components/admin/domains/IncomingRules.vue
create mode 100644 frontend/src/components/admin/domains/MailsPermDeletion.vue
create mode 100644 frontend/src/components/admin/domains/Migration.vue
create mode 100644 frontend/src/components/admin/domains/OutgoingRules.vue
create mode 100644 frontend/src/components/admin/domains/SharedAddressBooks.vue
create mode 100644 frontend/src/components/admin/domains/SharedCalendars.vue
create mode 100644 frontend/src/components/admin/domains/SharedFolders.vue
create mode 100644 frontend/src/components/admin/domains/cidr_access/Policy.vue
create mode 100644 frontend/src/components/admin/domains/cidr_access/Pools.vue
create mode 100644 frontend/src/components/admin/domains/mailstorage/Export.vue
create mode 100644 frontend/src/components/admin/domains/mailstorage/Mailboxes.vue
create mode 100644 frontend/src/components/admin/domains/mailstorage/Settings.vue
create mode 100644 frontend/src/components/admin/domains/resources/Categories.vue
create mode 100644 frontend/src/components/admin/domains/resources/Offices.vue
create mode 100644 frontend/src/components/admin/domains/resources/Resources.vue
create mode 100644 frontend/src/components/admin/domains/userdb/Add.vue
create mode 100644 frontend/src/components/admin/domains/userdb/Groups.vue
create mode 100644 frontend/src/components/admin/domains/userdb/Redirects.vue
create mode 100644 frontend/src/components/admin/domains/userdb/Settings.vue
create mode 100644 frontend/src/components/admin/domains/userdb/Users.vue
create mode 100644 frontend/src/components/admin/security/BlockedIPs.vue
create mode 100644 frontend/src/components/admin/security/black_list/Email.vue
create mode 100644 frontend/src/components/admin/security/black_list/IP.vue
create mode 100644 frontend/src/components/admin/security/white_list/Email.vue
create mode 100644 frontend/src/components/admin/security/white_list/IP.vue
create mode 100644 frontend/src/components/admin/settings/AddressRules.vue
create mode 100644 frontend/src/components/admin/settings/Calendars.vue
create mode 100644 frontend/src/components/admin/settings/License.vue
create mode 100644 frontend/src/components/admin/settings/Main.vue
create mode 100644 frontend/src/components/admin/settings/SettingsDB.vue
create mode 100644 frontend/src/components/admin/settings/smtp_queue/Manage.vue
create mode 100644 frontend/src/components/admin/settings/smtp_queue/Settings.vue
create mode 100644 frontend/src/components/common/AddressBooks.vue
create mode 100644 frontend/src/components/common/Calendars.vue
create mode 100644 frontend/src/components/common/CalendarsAccess.vue
create mode 100644 frontend/src/components/common/SharedFolders.vue
create mode 100644 frontend/src/components/common/TimezoneSelect.vue
create mode 100644 frontend/src/components/common/WorkDaysSelect.vue
create mode 100644 frontend/src/components/common/WorkHoursRangePicker.vue
create mode 100644 frontend/src/components/common/approval/Day.vue
create mode 100644 frontend/src/components/common/approval/Interval.vue
create mode 100644 frontend/src/components/common/rules/Actions.vue
create mode 100644 frontend/src/components/common/rules/Conditions.vue
create mode 100644 frontend/src/components/common/rules/Rules.vue
create mode 100644 frontend/src/components/common/rules/address/Actions.vue
create mode 100644 frontend/src/components/common/rules/address/Conditions.vue
create mode 100644 frontend/src/components/common/rules/incoming/Actions.vue
create mode 100644 frontend/src/components/common/rules/incoming/Conditions.vue
create mode 100644 frontend/src/components/common/rules/outgoing/Actions.vue
create mode 100644 frontend/src/components/common/rules/outgoing/Conditions.vue
create mode 100644 frontend/src/components/user/AddressBooks/AvaliableToMe.vue
create mode 100644 frontend/src/components/user/AddressBooks/MyBooks.vue
create mode 100644 frontend/src/components/user/Calendars/AvaliableToMe.vue
create mode 100644 frontend/src/components/user/Calendars/EventsPlanner/List.vue
create mode 100644 frontend/src/components/user/Calendars/EventsPlanner/NewOrEdit.vue
create mode 100644 frontend/src/components/user/Calendars/EventsPlanner/ScriptErrorNotify.vue
create mode 100644 frontend/src/components/user/Calendars/MyCalendars.vue
create mode 100644 frontend/src/components/user/Calendars/ShareFreeTime.vue
create mode 100644 frontend/src/components/user/IncomingRules.vue
create mode 100644 frontend/src/components/user/MailboxSharedAccess.vue
create mode 100644 frontend/src/components/user/Profile.vue
create mode 100644 frontend/src/components/user/RecoveryFolder.vue
create mode 100644 frontend/src/components/user/SharedFolders.vue
create mode 100644 frontend/src/composables/alert.ts
create mode 100644 frontend/src/composables/apiFetch.ts
create mode 100644 frontend/src/composables/misc.ts
create mode 100644 frontend/src/composables/restart.ts
create mode 100644 frontend/src/locale/index.ts
create mode 100644 frontend/src/locale/translations.ts
create mode 100644 frontend/src/router/consts.ts
create mode 100644 frontend/src/router/index.ts
create mode 100644 frontend/src/router/middleware/log.ts
create mode 100644 frontend/src/router/middleware/pipeline.ts
create mode 100644 frontend/src/router/routes.ts
create mode 100644 frontend/src/stores/auth.ts
create mode 100644 frontend/src/stores/returnToPage.ts
delete mode 100644 frontend/src/style.css
create mode 100644 frontend/src/views/Admin.vue
create mode 100644 frontend/src/views/Login.vue
create mode 100644 frontend/src/views/User.vue
create mode 100644 frontend/src/views/shared/EventsExternalApproval.vue
create mode 100644 frontend/src/views/shared/FreeTime.vue
delete mode 100644 frontend/src/vite-env.d.ts
create mode 100644 frontend/tsconfig.app.json
create mode 100644 handlers.go
create mode 100644 tools/auth.go
create mode 100644 tools/consts.go
create mode 100644 tools/responses.go
diff --git a/auth.go b/auth.go
new file mode 100644
index 0000000..5591381
--- /dev/null
+++ b/auth.go
@@ -0,0 +1,71 @@
+package main
+
+import (
+ "crypto/rand"
+ "myproject/tools"
+ "net/http"
+ "strings"
+
+ "github.com/gorilla/sessions"
+ "github.com/labstack/echo/v4"
+)
+
+func NewAuthStore() *sessions.CookieStore {
+ auth := make([]byte, 32)
+ _, _ = rand.Read(auth)
+ enc := make([]byte, 16)
+ _, _ = rand.Read(enc)
+ s := sessions.NewCookieStore(auth, enc)
+ s.Options.Secure = false
+ s.Options.SameSite = http.SameSiteDefaultMode
+ s.MaxAge(3600)
+ return s
+}
+
+func setAuth(onlyAdmin bool, g *echo.Group) *echo.Group {
+ g.Use(
+ func(next echo.HandlerFunc) echo.HandlerFunc {
+ return func(c echo.Context) error {
+ sess, err := c.Get("authStore").(*sessions.CookieStore).New(c.Request(), tools.SessionName)
+ if err != nil {
+ // journal.Debug(ctx, commerr.Trace(err).Error())
+ }
+
+ userName := sess.Values[tools.UserNameSessionKey]
+ if userName == nil {
+ return echo.ErrUnauthorized
+ }
+
+ email, lp, domain := SplitEmail(userName.(string))
+ c.Set(tools.UserCtxKey, email)
+ c.Set(tools.LpCtxKey, lp)
+ c.Set(tools.DomainCtxKey, domain)
+
+ return next(c)
+ }
+ },
+ func(next echo.HandlerFunc) echo.HandlerFunc {
+ return func(c echo.Context) error {
+ if onlyAdmin && tools.GetUser(c) != "admin" {
+ return echo.ErrUnauthorized
+ }
+
+ return next(c)
+ }
+ },
+ )
+
+ return g
+}
+
+func SplitEmail(toSplit string) (email, user, domain string) {
+ email = strings.TrimSpace(toSplit)
+ email = strings.ToLower(email)
+ parts := strings.Split(email, "@")
+ user = parts[0]
+ if len(parts) > 1 {
+ domain = parts[1]
+ }
+
+ return
+}
diff --git a/echo.go b/echo.go
new file mode 100644
index 0000000..ecfccde
--- /dev/null
+++ b/echo.go
@@ -0,0 +1,98 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "myproject/tools"
+ "net"
+ "net/http"
+ "strings"
+ "time"
+
+ "github.com/labstack/echo/v4"
+ "github.com/labstack/echo/v4/middleware"
+)
+
+func NewEcho(ctx context.Context, restartMode *bool) *echo.Echo {
+ timeout := 5 * time.Minute
+ e := echo.New()
+ e.HideBanner = true
+ e.Server.ReadTimeout = timeout
+ e.Server.WriteTimeout = timeout
+ e.Server.BaseContext = func(listener net.Listener) context.Context {
+ return ctx
+ }
+ e.HTTPErrorHandler = func(err error, c echo.Context) {
+ httpError, ok := err.(*echo.HTTPError)
+ if ok {
+ errorCode := httpError.Code
+ switch errorCode {
+ case http.StatusServiceUnavailable:
+ tools.Serve503(c)
+ case http.StatusTooManyRequests:
+ tools.Serve429(c)
+ case http.StatusForbidden:
+ tools.Serve403(c)
+ case http.StatusUnauthorized:
+ tools.Serve401(c)
+ case http.StatusNotFound, http.StatusMethodNotAllowed:
+ if strings.HasPrefix(c.Request().RequestURI, "/backend") {
+ switch errorCode {
+ case http.StatusNotFound:
+ tools.Serve404(c)
+ case http.StatusMethodNotAllowed:
+ tools.Serve405(c)
+ }
+ return
+ }
+ c.Redirect(http.StatusTemporaryRedirect, fmt.Sprintf("/?redirect=%s", c.Request().RequestURI))
+ default:
+ tools.Serve500(c)
+ }
+ }
+ }
+
+ authStore := NewAuthStore()
+
+ e.Use(
+ middleware.CORSWithConfig(middleware.CORSConfig{
+ AllowOrigins: []string{"http://localhost:7777", "http://localhost:8808"},
+ AllowHeaders: []string{
+ echo.HeaderOrigin,
+ echo.HeaderContentType,
+ echo.HeaderAccept,
+ echo.HeaderAccessControlAllowOrigin,
+ echo.HeaderAccessControlAllowCredentials,
+ echo.HeaderAccessControlAllowHeaders,
+ echo.HeaderAccessControlRequestHeaders,
+ echo.HeaderAuthorization,
+ },
+ AllowCredentials: true,
+ }),
+ middleware.GzipWithConfig(middleware.GzipConfig{
+ Level: 6,
+ }),
+ func(next echo.HandlerFunc) echo.HandlerFunc {
+ return func(c echo.Context) error {
+ c.Set("authStore", authStore)
+
+ return next(c)
+ }
+ },
+ func(next echo.HandlerFunc) echo.HandlerFunc {
+ return func(c echo.Context) error {
+
+ return next(c)
+ }
+ },
+ func(next echo.HandlerFunc) echo.HandlerFunc {
+ return func(c echo.Context) error {
+ c.Set(tools.RootCtxKey, ctx)
+
+ return next(c)
+ }
+ },
+ )
+
+ return e
+}
diff --git a/frontend/.env.development b/frontend/.env.development
new file mode 100644
index 0000000..1bb4252
--- /dev/null
+++ b/frontend/.env.development
@@ -0,0 +1 @@
+VITE_API_URL=http://localhost:8888
\ No newline at end of file
diff --git a/frontend/.env.production b/frontend/.env.production
new file mode 100644
index 0000000..3452b5c
--- /dev/null
+++ b/frontend/.env.production
@@ -0,0 +1 @@
+VITE_API_URL=
\ No newline at end of file
diff --git a/frontend/.gitignore b/frontend/.gitignore
new file mode 100644
index 0000000..a52d458
--- /dev/null
+++ b/frontend/.gitignore
@@ -0,0 +1,29 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+.DS_Store
+dist-ssr
+coverage
+*.local
+
+/cypress/videos/
+/cypress/screenshots/
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+*.tsbuildinfo
diff --git a/frontend/README.md b/frontend/README.md
index 98f4a52..74e1fcc 100644
--- a/frontend/README.md
+++ b/frontend/README.md
@@ -1,23 +1,33 @@
-# Vue 3 + TypeScript + Vite
+# js
-This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue
-3 `
-
+
+
+