From 1d30605533c5ea6ec3ea5df7e89036b3151cd15d Mon Sep 17 00:00:00 2001
From: Mikhail Yenuchenko ` text; the backup page title is `SelfPost — backup &
+ migration` to reflect domain import as well as full backup. Operator guide and
+ architecture route tables updated.
+
### Fixed
- image: `mail.log` rotation no longer silently stops when the build context
diff --git a/docs/architecture.md b/docs/architecture.md
index aba6fe2..7d3b663 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -170,7 +170,8 @@ unless noted. The table below is a summary — HTMX fragment endpoints
| `/system-log` | `mail.log` tail |
| `/reload` | Reload OpenDKIM + Postfix maps |
| `/backup` | Full backup download (page also hosts the import form) |
-| `/account` | Admin username/password |
+| `/settings` | Admin username/password and DMARC report address |
+| `/users`, `/users/*` | Panel user CRUD (global admin only) |
HTMX polling refreshes monitoring fragments (5 s while the operator is active on
the page, 30 s when the tab is visible but idle, none when hidden — scheduled in
diff --git a/docs/guide.md b/docs/guide.md
index 0b76805..17b0fe4 100644
--- a/docs/guide.md
+++ b/docs/guide.md
@@ -229,7 +229,7 @@ service healthy and will mail be accepted?"
- **Backup** (`/backup`) — download a full-server backup; the same page hosts
the domain-import form (`POST /domains/import`). See
[Backup, restore, and moving a single domain](#backup-restore-and-moving-a-single-domain).
-- **Settings** (`/account`) — change the administrator username and/or password.
+- **Settings** (`/settings`) — change the administrator username and/or password.
Application SASL logins are separate and are not changed here.
**Sessions.** A login survives a container restart: sessions live in SQLite, not
diff --git a/internal/web/handlers/handlers_account.go b/internal/web/handlers/handlers_account.go
index 5661e5a..c359327 100644
--- a/internal/web/handlers/handlers_account.go
+++ b/internal/web/handlers/handlers_account.go
@@ -49,7 +49,7 @@ func (h *Handlers) renderAccount(w http.ResponseWriter, r *http.Request, status
}
data := h.pageBase(r)
data["Title"] = "SelfPost — settings"
- data["Active"] = "account"
+ data["Active"] = "settings"
data["FormUsername"] = formUsername
data["FormDMARCEmail"] = formDMARCEmail
data["ShowDMARC"] = showDMARC
@@ -59,7 +59,7 @@ func (h *Handlers) renderAccount(w http.ResponseWriter, r *http.Request, status
data["ReportAuthHub"] = dnscheck.EmailDomain(formDMARCEmail)
data["Error"] = formErr
data["Flash"] = accountFlash(r)
- h.view.Render(w, status, "account", data)
+ h.view.Render(w, status, "settings", data)
}
func accountFlash(r *http.Request) string {
@@ -196,7 +196,7 @@ func (h *Handlers) submitAccount(w http.ResponseWriter, r *http.Request) {
}
logf("panel: user %d account updated (username: %t, password: %t, dmarc email: %t)", user.ID, renaming, repassword, emailChanging)
- http.Redirect(w, r, "/account?updated="+updatedFlag(renaming, repassword, emailChanging), http.StatusSeeOther)
+ http.Redirect(w, r, "/settings?updated="+updatedFlag(renaming, repassword, emailChanging), http.StatusSeeOther)
}
func updatedFlag(renamed, repassword, emailChanged bool) string {
diff --git a/internal/web/handlers/handlers_backup.go b/internal/web/handlers/handlers_backup.go
index 5d14e8e..b07b83e 100644
--- a/internal/web/handlers/handlers_backup.go
+++ b/internal/web/handlers/handlers_backup.go
@@ -45,7 +45,7 @@ func (h *Handlers) renderBackupPage(w http.ResponseWriter, r *http.Request, stat
// wrong form.
func (h *Handlers) renderBackupPageWith(w http.ResponseWriter, r *http.Request, status int, importErr, backupErr string) {
data := h.pageBase(r)
- data["Title"] = "SelfPost — backup"
+ data["Title"] = "SelfPost — backup & migration"
data["Active"] = "backup"
data["ImportErr"] = importErr
data["BackupErr"] = backupErr
diff --git a/internal/web/handlers/handlers_domains.go b/internal/web/handlers/handlers_domains.go
index b68bfaf..d090be4 100644
--- a/internal/web/handlers/handlers_domains.go
+++ b/internal/web/handlers/handlers_domains.go
@@ -41,7 +41,7 @@ func (h *Handlers) renderDashboard(w http.ResponseWriter, r *http.Request, statu
return
}
data := h.pageBase(r)
- data["Title"] = "SelfPost"
+ data["Title"] = "SelfPost — domains"
data["Active"] = "domains"
data["Domains"] = h.domainRows(domains)
data["Error"] = formErr
diff --git a/internal/web/handlers/handlers_users.go b/internal/web/handlers/handlers_users.go
index 6edb923..ce80617 100644
--- a/internal/web/handlers/handlers_users.go
+++ b/internal/web/handlers/handlers_users.go
@@ -121,7 +121,11 @@ func (h *Handlers) renderUserForm(w http.ResponseWriter, r *http.Request, status
return
}
data := h.pageBase(r)
- data["Title"] = "SelfPost — user"
+ if userID != 0 {
+ data["Title"] = "SelfPost — edit user"
+ } else {
+ data["Title"] = "SelfPost — create user"
+ }
data["Active"] = "users"
data["UserID"] = userID
data["Domains"] = domains
diff --git a/internal/web/view/templates/domain_detail.html b/internal/web/view/templates/domain_detail.html
index c2ea521..0f894be 100644
--- a/internal/web/view/templates/domain_detail.html
+++ b/internal/web/view/templates/domain_detail.html
@@ -53,7 +53,7 @@
they are policy, and the domain may already publish an SPF record for other
senders. SelfPost is a send-only relay — most operators have no inbox on the
sending domain, so the suggested DMARC record omits
rua= unless a
- report address is configured below or in Settings.
+ report address is configured below or in Settings.
Publish both as TXT records.
{{.Error}}
{{end}} {{if .ShowDMARC}} -