68 lines
2.3 KiB
Go
68 lines
2.3 KiB
Go
package webui
|
|
|
|
import (
|
|
"net/http"
|
|
"strings"
|
|
|
|
"mailgoserver/internal/db"
|
|
)
|
|
|
|
// webmailListTypes are the only list_types a mailbox owner may self-manage — "block"
|
|
// (admin's hard-reject-at-RCPT list) is deliberately excluded, see
|
|
// esrv_mailbox_allowblock's schema comment.
|
|
var webmailListTypes = map[string]bool{"allow": true, "junk": true}
|
|
|
|
// webmailBlocklistPage shows a mailbox owner's own Blocklist ("junk" entries — mail
|
|
// from these addresses/domains is always quarantined straight to Junk, bypassing
|
|
// spam scoring) and Whitelist ("allow" entries — never scored as spam, always lands
|
|
// in INBOX; the escape hatch for a trusted sender rspamd or the built-in heuristic
|
|
// keeps flagging).
|
|
func (a *App) webmailBlocklistPage(w http.ResponseWriter, r *http.Request) {
|
|
mbox := mailboxFromContext(r)
|
|
entries, err := a.DB.ListAllowBlock(mbox.ID)
|
|
if err != nil {
|
|
setFlash(w, "error", "Error loading lists")
|
|
}
|
|
var blocked, allowed []db.MailboxAllowBlockEntry
|
|
for _, e := range entries {
|
|
switch e.ListType {
|
|
case "junk":
|
|
blocked = append(blocked, e)
|
|
case "allow":
|
|
allowed = append(allowed, e)
|
|
}
|
|
}
|
|
a.render(w, r, "webmail_blocklist.html", M{
|
|
"mailbox": mbox, "blocked": blocked, "allowed": allowed,
|
|
"flashes": popFlashes(w, r), "active_section": "blocklist",
|
|
})
|
|
}
|
|
|
|
func (a *App) webmailBlocklistAdd(w http.ResponseWriter, r *http.Request) {
|
|
mbox := mailboxFromContext(r)
|
|
pattern := strings.ToLower(strings.TrimSpace(r.FormValue("pattern")))
|
|
listType := r.FormValue("list_type")
|
|
if pattern == "" || !webmailListTypes[listType] {
|
|
setFlash(w, "error", "Enter an address (or @domain.com) and choose a list")
|
|
http.Redirect(w, r, MailboxPrefix+"/blocklist", http.StatusFound)
|
|
return
|
|
}
|
|
if _, err := a.DB.AddAllowBlockEntry(mbox.ID, listType, pattern); err != nil {
|
|
setFlash(w, "error", "Error adding entry")
|
|
} else {
|
|
setFlash(w, "success", "Added")
|
|
}
|
|
http.Redirect(w, r, MailboxPrefix+"/blocklist", http.StatusFound)
|
|
}
|
|
|
|
func (a *App) webmailBlocklistRemove(w http.ResponseWriter, r *http.Request) {
|
|
mbox := mailboxFromContext(r)
|
|
id := int64(atoi(r.PathValue("id")))
|
|
if err := a.DB.RemoveAllowBlockEntry(id, mbox.ID); err != nil {
|
|
setFlash(w, "error", "Error removing entry")
|
|
} else {
|
|
setFlash(w, "success", "Removed")
|
|
}
|
|
http.Redirect(w, r, MailboxPrefix+"/blocklist", http.StatusFound)
|
|
}
|