diff --git a/backend/00-router.go b/backend/00-router.go index 8e5cfbb..09569f9 100644 --- a/backend/00-router.go +++ b/backend/00-router.go @@ -119,6 +119,10 @@ func splitRecipients(value string) ([]string, error) { } func homeHandler(w http.ResponseWriter, r *http.Request) { + if !CanManageAccounts(r) { + http.Redirect(w, r, "/view", http.StatusSeeOther) + return + } renderStartPage(w, r) } @@ -128,28 +132,18 @@ func renderStartPage(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, ` Mail-Graveyard - - + +
- + %s %s
- - +%s
Willkommen
@@ -163,7 +157,7 @@ func renderStartPage(w http.ResponseWriter, r *http.Request) {
-`, renderRibbonEmailBoxMenu("home"), renderRibbonTransferMenu(""), renderRibbonActions(false, user), html.EscapeString(userDisplayLabel(user))) +`, renderAppMenuButton(user), renderRibbonEmailBoxMenuForUser("home", user), renderRibbonTransferMenuForUser("", user), renderRibbonActions(false, user), renderBackstageForUser("home", user), html.EscapeString(userDisplayLabel(user))) } // renderShell ist das Grundgeruest im Outlook-2013-Look: @@ -176,32 +170,19 @@ func renderShell(w http.ResponseWriter, r *http.Request, active, readingPane str fmt.Fprintf(w, ` Mail-Graveyard - + - +
- + %s %s
- - +%s
-`, renderRibbonEmailBoxMenu("archive"), renderRibbonTransferMenu(""), renderRibbonActions(false, user), renderInitialReadPane(readingPane)) +`, renderAppMenuButton(user), renderRibbonEmailBoxMenuForUser("archive", user), renderRibbonTransferMenuForUser("", user), renderRibbonActions(false, user), renderBackstageForUser("archive", user), renderInitialReadPane(readingPane)) } func accountsHandler(w http.ResponseWriter, r *http.Request) { @@ -359,6 +340,9 @@ func transferHandler(w http.ResponseWriter, r *http.Request) { } func emailBoxHandler(w http.ResponseWriter, r *http.Request) { + if !requireManager(w, r) { + return + } accounts, err := ListAccounts() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) @@ -392,6 +376,9 @@ func emailBoxHandler(w http.ResponseWriter, r *http.Request) { } func sourceMailboxMessagesHandler(w http.ResponseWriter, r *http.Request) { + if !requireManager(w, r) { + return + } accountName := strings.TrimSpace(r.URL.Query().Get("source")) folder := strings.TrimSpace(r.URL.Query().Get("folder")) w.Header().Set("Content-Type", "text/html; charset=utf-8") @@ -414,6 +401,9 @@ func sourceMailboxMessagesHandler(w http.ResponseWriter, r *http.Request) { } func sourceMailboxMessageHandler(w http.ResponseWriter, r *http.Request) { + if !requireManager(w, r) { + return + } accountName := strings.TrimSpace(r.URL.Query().Get("source")) folder := strings.TrimSpace(r.URL.Query().Get("folder")) index, err := strconv.Atoi(r.URL.Query().Get("index")) @@ -436,6 +426,9 @@ func sourceMailboxMessageHandler(w http.ResponseWriter, r *http.Request) { } func targetMailboxMessagesHandler(w http.ResponseWriter, r *http.Request) { + if !requireManager(w, r) { + return + } accountName := strings.TrimSpace(r.URL.Query().Get("target")) folder := strings.TrimSpace(r.URL.Query().Get("folder")) w.Header().Set("Content-Type", "text/html; charset=utf-8") @@ -458,6 +451,9 @@ func targetMailboxMessagesHandler(w http.ResponseWriter, r *http.Request) { } func targetMailboxMessageHandler(w http.ResponseWriter, r *http.Request) { + if !requireManager(w, r) { + return + } accountName := strings.TrimSpace(r.URL.Query().Get("target")) folder := strings.TrimSpace(r.URL.Query().Get("folder")) index, err := strconv.Atoi(r.URL.Query().Get("index")) @@ -570,6 +566,10 @@ func migrateRunHandler(w http.ResponseWriter, r *http.Request) { } func migrateStatusHandler(w http.ResponseWriter, r *http.Request) { + if !CanManageAccounts(r) { + fmt.Fprint(w, "bereit") + return + } type job struct { Account string Started string @@ -752,9 +752,9 @@ func renderAccountsPage(w http.ResponseWriter, r *http.Request, accounts []Accou fmt.Fprintf(w, ` Konten-Verwaltung - Mail-Graveyard - + - +
@@ -798,9 +798,9 @@ func renderArchivesPage(w http.ResponseWriter, r *http.Request, archives []strin fmt.Fprintf(w, ` Archiv-mbox Verwaltung - Mail-Graveyard - + - +
@@ -846,9 +846,9 @@ func renderUsersPage(w http.ResponseWriter, r *http.Request, users []AppUser, ed fmt.Fprintf(w, ` Benutzerverwaltung - Mail-Graveyard - + - +
@@ -920,9 +920,9 @@ func renderTransferPage(w http.ResponseWriter, r *http.Request, mode transferMod fmt.Fprintf(w, ` %s - Mail-Graveyard - + - +
@@ -964,6 +964,9 @@ func renderTransferPage(w http.ResponseWriter, r *http.Request, mode transferMod } func transferSideHandler(w http.ResponseWriter, r *http.Request) { + if !requireManager(w, r) { + return + } side := transferSide(r.URL.Query().Get("side")) kind := strings.TrimSpace(r.URL.Query().Get("kind")) value := strings.TrimSpace(r.URL.Query().Get("value")) @@ -984,6 +987,9 @@ func transferSideHandler(w http.ResponseWriter, r *http.Request) { } func transferMessagesHandler(w http.ResponseWriter, r *http.Request) { + if !requireManager(w, r) { + return + } side := transferSide(r.URL.Query().Get("side")) kind := strings.TrimSpace(r.URL.Query().Get("kind")) value := strings.TrimSpace(r.URL.Query().Get("value")) @@ -994,6 +1000,9 @@ func transferMessagesHandler(w http.ResponseWriter, r *http.Request) { } func transferMessageHandler(w http.ResponseWriter, r *http.Request) { + if !requireManager(w, r) { + return + } kind := strings.TrimSpace(r.URL.Query().Get("kind")) value := strings.TrimSpace(r.URL.Query().Get("value")) folder := strings.TrimSpace(r.URL.Query().Get("folder")) @@ -1372,9 +1381,9 @@ func renderSourceEmailBoxPage(w http.ResponseWriter, r *http.Request, accounts [ fmt.Fprintf(w, ` Quell-Postfach - Mail-Graveyard - + - +
@@ -1416,9 +1425,9 @@ func renderTargetEmailBoxPage(w http.ResponseWriter, r *http.Request, accounts [ fmt.Fprintf(w, ` Ziel-Postfach - Mail-Graveyard - + - +
@@ -1973,11 +1982,47 @@ func renderRibbonEmailBoxMenu(active string) string { return b.String() } +func renderAppMenuButton(user AppUser) string { + if !hasRole(user, roleManager) { + return "" + } + return `` +} + +func renderRibbonEmailBoxMenuForUser(active string, user AppUser) string { + if hasRole(user, roleManager) { + return renderRibbonEmailBoxMenu(active) + } + var b strings.Builder + homeClass := "tab app-tab" + if active == "home" { + homeClass += " active" + } + archiveClass := "tab" + if active == "archive" { + archiveClass += " active" + } + fmt.Fprintf(&b, `Mail-Graveyard`, homeClass) + fmt.Fprintf(&b, `Archiv-Boxen`, archiveClass) + return b.String() +} + +func renderRibbonTransferMenuForUser(active string, user AppUser) string { + if !hasRole(user, roleManager) { + return "" + } + return renderRibbonTransferMenu(active) +} + func renderRibbonActions(settingsActive bool, user AppUser) string { settingsClass := "ribbon-icon" if settingsActive { settingsClass += " active" } + if !hasRole(user, roleManager) { + return fmt.Sprintf(`
%s`, + html.EscapeString(user.Username), html.EscapeString(userDisplayName(user))) + } return fmt.Sprintf(`
%s`, html.EscapeString(user.Username), html.EscapeString(userDisplayName(user)), settingsClass) } @@ -2037,6 +2082,13 @@ func renderBackstage(active string) string { return b.String() } +func renderBackstageForUser(active string, user AppUser) string { + if !hasRole(user, roleManager) { + return "" + } + return renderBackstage(active) +} + func renderTransferPicker(kind string, accounts []Account, archives []string) string { var b strings.Builder b.WriteString(`
`) diff --git a/frontend-js/dist/app.js b/frontend-js/dist/app.js index 5ebfa76..9cbd261 100644 --- a/frontend-js/dist/app.js +++ b/frontend-js/dist/app.js @@ -4,6 +4,7 @@ if (!ribbon || document.querySelector(".mail-actionbar")) return; const bar = document.createElement("div"); + const managerTools = !!document.querySelector("[data-ribbon-menu-toggle]"); bar.className = "mail-actionbar"; bar.innerHTML = ` @@ -16,6 +17,7 @@ + ${managerTools ? `
@@ -33,6 +35,7 @@
+ ` : ""} `; ribbon.insertAdjacentElement("afterend", bar); }