sysops
2fa7104605
fix: User-Struct JSON-Tags ergänzen (active/source/id etc. waren Großbuchstaben)
...
Frontend erhielt 'Active'/'Source' statt 'active'/'source' →
Inaktiv-Badge und local-Badge zeigten falsche Werte.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 13:46:47 +01:00
sysops
0b435d8d1a
fix: LDAP FetchUsers Filter ohne Klammern erzeugt Compile Error
...
UserFilter wie 'uid=%s' wurde zu 'uid=*' — kein gültiger LDAP-Filter.
Fix: Klammern ergänzen wenn der Filter nicht mit '(' beginnt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 13:38:19 +01:00
sysops
a6a66beaa8
chore: weitere Code-Aufteilung (api.ts, hooks, ldap_sync)
...
- src/lib/api.ts (1085 Zeilen) → 5 thematische Module unter src/lib/api/
(core, users, ldap, tenants, mail, system) + index.ts Re-Export
- useLDAPConfig / useTenantLDAPConfig / useTenantUsers Hooks extrahiert;
admin/page.tsx nutzt diese statt roher useState-Blöcke
- handleSyncTenantLDAP, handleAdminSyncTenantLDAP, doSyncTenantLDAP,
buildTenantTestConfig, syncResult aus ldap_tenants.go in ldap_sync.go verschoben
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 13:05:19 +01:00
sysops
bc4a98de0d
chore: admin/page.tsx in Einzelkomponenten aufteilen (3917 → 1304 Zeilen)
...
- Tab-Sektionen → src/components/admin/tabs/ (11 Dateien)
- Dialoge → src/components/admin/ (TenantLDAPDialog, UserDialogs)
- Keine Verhaltensänderungen, TypeScript fehlerfrei
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 12:30:16 +01:00
sysops
38f8cdddc7
fix: TypeScript-Fehler bei tenantUsersSyncResult errors-Pruefung
...
Optional chaining auf errors.length fuehrt zu 'possibly undefined'
in strict mode -- explizite null-Guard + nullish coalescing fix.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 11:36:35 +01:00
sysops
72b023b598
feat: LDAP-User-Sync in Mandanten-Benutzerliste
...
Neuer Endpoint POST /api/admin/tenants/{id}/ldap/sync importiert alle
LDAP-User (source=ldap) per UpsertLDAPUser in die Tenant-Benutzerliste.
Im Nutzer-Dialog erscheint ein "LDAP-Benutzer synchronisieren"-Button
wenn LDAP für den Mandanten aktiv ist. Unterstützt Univention UCS
(mailPrimaryAddress, inetOrgPerson). Benutzertabelle zeigt jetzt auch
die Quelle (local/ldap).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 11:35:02 +01:00
sysops
2da61689ea
feat: LDAP-Test zeigt User-Tabelle mit Univention-UCS-Support
...
Nach erfolgreichem Verbindungstest werden bis zu 50 Benutzer (UID,
Name, E-Mail) in einer scrollbaren Tabelle angezeigt. Unterstützt
mailPrimaryAddress (Univention UCS) als Fallback für mail sowie
inetOrgPerson objectClass.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 11:23:12 +01:00
sysops
30c6694dff
feat(PROJ-24): Mandanten-Logo Upload
...
- DB: logo_data (BYTEA) + logo_content_type Spalten in tenants-Tabelle
- Backend: SetLogo/GetLogo/DeleteLogo im tenantstore
- API: Logo-Endpunkte für superadmin (beliebiger Mandant) und
domain_admin (eigener Mandant), max. 2 MB, PNG/JPEG/GIF/WebP/SVG
- Frontend: Logo-Dialog in Mandantentabelle (superadmin),
Logo-Upload-Sektion im LDAP-Tab (domain_admin)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 03:15:34 +01:00
sysops
cd2781bdff
fix: Mandanten-Nutzerdialog Fehlerhandling + LDAP-Hinweis
...
- Fehlerstate für Nutzer-Dialog: API-Fehler werden jetzt angezeigt statt silent ignoriert
- LDAP-Hinweis: wenn LDAP aktiv aber keine lokalen User da sind, erklärender Text
"LDAP ist aktiv — Benutzer erscheinen hier nach ihrem ersten Login"
- tenantUsersDialogLdap State: speichert ob Tenant LDAP aktiviert hat
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 02:18:41 +01:00
sysops
9db433c4c1
fix: Mandantenverwaltung LDAP-Status und Nutzer-Listing
...
- tenantstore.List(): LEFT JOIN tenant_ldap hinzugefügt — ldap_enabled + ldap_url
werden jetzt im GET /api/tenants Response mitgeliefert
- Tenant-Struct: Felder LDAPEnabled *bool + LDAPURL string ergänzt
- Neuer Endpunkt GET /api/tenants/{id}/users → listet Nutzer eines Mandanten
- api.ts: getTenantUsers() Funktion + tenant_id Feld im User Interface
- Admin-Panel: "Nutzer"-Button im Mandanten-Tab öffnet Dialog mit Nutzerliste
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 02:01:12 +01:00
sysops
b3074b303e
fix: LDAP leere BindPassword schlägt Login fehl + install.sh Passwort-Extraktion
...
- auth.Manager.Login: LDAP-Fallback überspringen wenn URL oder BindPassword leer
(verhindert go-ldap ErrorEmptyPassword Code 206 bei fehlerhaftem LDAP-Config-Eintrag)
- install.sh: grep-Muster von variablenbreitem Lookbehind auf \K umgestellt
(PCRE unterstützt keine variablen Lookbehinds — Passwörter wurden nie korrekt extrahiert)
- install.sh: Wartezeit auf Backend-Start erhöht (bis zu 15s statt 2s)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 01:47:48 +01:00
sysops
fd46f0de9a
fix: superadmin beim ersten Start anlegen + Installer zeigt echte Passwörter
...
- seedDefaultUsers: superadmin (Rolle superadmin) zu Default-Usern hinzugefügt
→ wird beim ersten Backend-Start mit Zufallspasswort angelegt
- Installer: Passwörter werden nach dem Deployment aus dem Journal gelesen
(journalctl -u archivmail) statt falschen Platzhalter 'archivmailrockz'
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 01:23:33 +01:00
sysops
32032b49d2
fix(installer): echte Web-Passwörter aus Journal lesen statt Platzhalter
...
Der Backend generiert beim ersten Start zufällige Passwörter und gibt
sie im Journal aus. Der Installer liest sie nun nach dem Deployment
und trägt sie korrekt in install-summary.txt und Terminal-Output ein.
Zuvor wurden fälschlicherweise 'archivmailrockz' als Passwörter angezeigt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 01:22:50 +01:00
sysops
33eafc1624
feat(installer): Zusammenfassung aller angelegten User & Passwörter
...
- Abschlussbericht zeigt alle Credentials in übersichtlicher Tabelle:
DB-Passwort, API-Secret, Web-Logins (superadmin/admin/auditor)
- Speichert vollständige Zusammenfassung als /etc/archivmail/install-summary.txt
(chmod 600, nur root lesbar) mit allen Pfaden, Diensten und Hinweisen
- Tabelle im Terminal-Output mit allen wichtigen Zugangsdaten auf einen Blick
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 01:10:19 +01:00
sysops
d262253faf
fix(installer): DB-Passwort-Mismatch bei Re-Install verhindern
...
Bei vorhandener config.yml wird das DB-Passwort daraus gelesen und
PostgreSQL entsprechend aktualisiert — verhindert Auth-Fehler beim
zweiten Installer-Durchlauf auf demselben Server.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 01:05:51 +01:00
sysops
48e04f36fd
fix(installer): Lücken aus Gap-Report geschlossen
...
- rsync zum apt-Paket-Block hinzugefügt
- DEBIAN_FRONTEND=noninteractive gesetzt (keine debconf-Interaktion)
- go PATH-Fix: Debian-spezifische Pfade in /usr/lib/go-*/bin ergänzen
(update.sh + install.sh symlink-Fallback)
- TLS-Zertifikat: selbstsigniertes RSA-4096 Cert via hostname -f,
/etc/ssl/archivmail/ anlegen + Permissions (640, root:archivmail)
- nginx: HTTPS von Anfang an (HTTP→HTTPS Redirect + TLS-Block statt HTTP-only)
- config.yml-Template vollständig:
- smtp.enabled, smtp.domain (hostname -f), smtp.tls_cert/tls_key
- imap_server (enabled, bind :993, tls_cert/tls_key)
- api.trusted_proxies, api.secure_cookies: true
- Vorhandenes config.yml wird nicht überschrieben
- systemd archivmail.service: AmbientCapabilities=CAP_NET_BIND_SERVICE
(für privilegierten Port 993 als non-root User)
NoNewPrivileges=false (erforderlich für AmbientCapabilities)
ReadOnlyPaths um /etc/ssl/archivmail ergänzt
- systemctl enable am Ende des Installers (ohne --now)
- update.sh nach /opt/archivmail/ kopieren + erstes Deployment direkt anstoßen
- Abschlussbericht: FQDN, HTTPS/IMAP/SMTP URLs, TLS-Hinweis
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 01:03:57 +01:00
sysops
c59cad92be
fix: IMAP-Konto bearbeiten + Löschen auch bei sync_running
...
- Store: UpdateCredentials() — Zugangsdaten + Passwort neu verschlüsseln,
setzt status='idle', error_msg='', sync_running=false zurück
- Handler: PATCH /api/imap/{id} unterstützt nun Credential-Update
(name/host/username vorhanden = Credential-Update, sonst sync_interval)
- Frontend: "Bearbeiten"-Button öffnet Edit-Dialog mit allen Feldern;
Passwort-Feld leer = unverändertes Passwort
- Frontend: Löschen-Button nicht mehr durch sync_running blockiert
(nur noch bei status=running gesperrt)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 00:49:37 +01:00
sysops
4a4136e4a6
feat: FQDN-Support, IMAP-TLS und SMTP-TLS via Master-Cert
...
- config: IMAPServerConfig um TLSCert/TLSKey erweitert
- imapserver: TLS-Support (tls.Listen) mit automatischem Port 993-Default
- Server-Konfiguration: FQDN archivmail.scahome.local
- nginx server_name auf archivmail.scahome.local gesetzt
- SMTP domain auf archivmail.scahome.local
- SMTP TLS aktiviert (/etc/ssl/archivmail/archivmail.crt)
- IMAP-Server TLS auf Port 993 aktiviert
- secure_cookies: true (HTTPS)
- Firewall: Port 993 geöffnet
- Zertifikat neu ausgestellt (SAN: archivmail.scahome.local + archivmail + 192.168.1.131)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 00:32:25 +01:00
sysops
9e71af104f
feat: Dark Mode + Zertifikat-Verwaltung im Superadmin
...
- Dark Mode: ThemeProvider (next-themes), ThemeToggle in Navbar (Hell/Dunkel/System)
- Zertifikat-Tab (superadmin only): aktuelles Zertifikat anzeigen, Upload (cert+key),
Self-Signed ausstellen, Let's Encrypt/ACME
- Backend: /api/admin/cert/* Endpunkte (info, upload, self-signed, acme), nginx reload
- HTTPS bereits live auf Server (self-signed RSA-4096, Port 443)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 00:14:43 +01:00
sysops
0e62b10bd4
fix(PROJ-26): IMAP-Löschen-Fehler nicht mehr stumm verschlucken — Fehlermeldung anzeigen
2026-03-18 12:16:32 +01:00
sysops
d79e334029
refactor: server.go in separate Handler-Dateien aufgeteilt
...
server.go (2357 -> 391 Zeilen) enthaelt nur noch Server-Struct,
Konstruktor, Router, Middleware und Hilfsfunktionen.
Neue Dateien:
- auth_handlers.go: Login, Logout, Me
- search_handlers.go: Suche, Mail-Anzeige, Anhaenge, Raw-Download
- admin_handlers.go: User-CRUD, SMTP/Storage-Stats, Services, Security
- import_handlers.go: IMAP + POP3 Account-Verwaltung und Import
- dashboard_handlers.go: System-Stats, Audit-Log
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 11:55:21 +01:00
sysops
e7146fdbac
fix: ungenutzten pgx/v5 Import in labelstore entfernen
2026-03-18 11:47:10 +01:00
sysops
19a55a3166
feat(PROJ-26): IMAP-Archive-Server Read-Only Zugriff auf archivierte Mails
...
- Neues Package internal/imapserver: vollständiger IMAP4rev1-Server (~700 Zeilen)
- Auth via bcrypt (userstore.VerifyPassword), Multi-Tenant-Isolation
- INBOX + INBOX/LabelName Ordnerstruktur
- FETCH mit BODY[], ENVELOPE, RFC822.SIZE, INTERNALDATE, FLAGS, UID
- SEARCH: ALL, FROM, TO, SUBJECT, SINCE, BEFORE + UID FETCH/SEARCH
- Read-Only: STORE, DELETE, COPY, MOVE, APPEND → NO [CANNOT]
- \Seen-Flag nicht persistent (GoBD-konform)
- Max 5 gleichzeitige Verbindungen pro User, 30min Idle-Timeout
- Audit-Log: imap_login / imap_login_failed Events
- Config: imap_server.enabled + imap_server.bind (default: 127.0.0.1:1143)
- Externe Ports: 9993 (primär) und 993 (alternativ) via nginx TLS-Terminierung
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 11:42:35 +01:00
sysops
5c25e3a7e7
feat(PROJ-26): IMAP-Verbindungsinfo in User-Settings anzeigen
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 11:36:04 +01:00
sysops
dd41e1f00e
fix(PROJ-16): LDAP URL-Feld zeigt flexible Port-Hinweise inkl. Univention UCS (7389/7636)
2026-03-18 10:50:34 +01:00
sysops
cee75094ad
feat(PROJ-9): implement labels frontend - LabelList, LabelPicker, search integration, admin UI
2026-03-18 09:51:10 +01:00
sysops
2e9f1f0471
feat(PROJ-26): Add feature specification for IMAP server interface (read-only archive access)
2026-03-18 09:50:53 +01:00
sysops
5a6289c83d
feat(PROJ-9): implement labels backend - DB schema, labelstore, API handlers, Xapian integration
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 08:32:30 +01:00
sysops
bd09992441
feat(PROJ-21): Phase 6+7 abschliessen — Dienste-Tab nur superadmin
...
Frontend: Dienste-Tab (Systemdienste starten/stoppen) ist jetzt nur
noch für superadmin sichtbar. domain_admin sieht: Dashboard, Benutzer,
Audit-Log, Import, LDAP (eigener Mandant).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 01:18:28 +01:00
sysops
372eee7aef
fix: api.ts internes request-Typ auch auf qr_code korrigiert
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 01:13:38 +01:00
sysops
26ab14b25b
fix: restlichen setQrSvg-Aufruf auf setQrCode umbenennen
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 01:12:52 +01:00
sysops
dc13edf2f6
fix(PROJ-25): QR-Code als PNG-Base64 anzeigen (statt fehlendem SVG)
...
Backend gibt qr_code als base64-PNG zurück — Frontend war auf qr_code_svg
ausgerichtet. Fix: getTOTPSetup-Typ angepasst, img-Tag statt dangerouslySetInnerHTML.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 01:12:07 +01:00
sysops
0fbb1924bb
fix(security): W-02 Secure-Cookie-Flag + W-03 TrustedProxies für X-Forwarded-For
...
W-02: Cookie Secure-Flag ist nun über config.yml steuerbar.
api.secure_cookies: true/false — default false (kein Breaking Change).
Alle 3 SetCookie-Aufrufe (Login, Logout, TOTP) nutzen s.cfg.SecureCookies.
W-03: remoteIP() ist jetzt eine Methode und prüft api.trusted_proxies.
X-Forwarded-For wird nur ausgewertet wenn der direkte Peer in der
trusted_proxies-Liste steht (IP oder CIDR). Sonst wird r.RemoteAddr
verwendet — kein Spoofing mehr möglich.
Neue Hilfsfunktion: isTrustedProxy(ip, proxies).
config.go: APIConfig um SecureCookies bool + TrustedProxies []string erweitert.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 01:10:24 +01:00
sysops
280034679e
feat(PROJ-25): User-Profil & Einstellungen — Passwort, E-Mail, 2FA
...
Backend:
- PATCH /api/auth/password — Passwort ändern (bcrypt, LDAP-Guard, Audit-Log)
- PATCH /api/auth/email — E-Mail ändern (Unique-Check, LDAP-Guard, Audit-Log)
- userstore: UpdatePassword, UpdateEmail, GetPasswordHash
Frontend:
- UserNav.tsx: Dropdown-Menü (Profil & Einstellungen, Abmelden)
- navbar.tsx: UserNav eingebunden
- /settings: Passwort ändern, E-Mail ändern, 2FA verwalten (QR-Code + Deaktivieren)
- api.ts: changePassword, changeEmail, getTOTPSetup, confirmTOTPSetup, disableTOTP
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 01:05:33 +01:00
sysops
89a6651b62
chore: go.sum aktualisiert für go-ldap/v3 + Abhängigkeiten
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 00:55:54 +01:00
sysops
5fd419617d
chore: go.sum aktualisiert für github.com/pquerna/otp v1.4.0 (PROJ-24 TOTP)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 00:55:22 +01:00
sysops
2de340573b
fix(security): behebe F-01/F-02/W-03/W-04 aus Security-Audit + PROJ-24 TOTP 2FA
...
F-01: err.Error() wird nicht mehr an HTTP-Clients gesendet.
Stattdessen generische Fehlermeldungen + Server-Log.
Betrifft: handleCreateUser, handleUpdateUser, handleDeleteUser,
handleSyncNow, handleSecurityConfig, handleUpload.
F-02: Login-Audit-Log enthält keinen rohen err.Error() mehr.
Neue classifyLoginError() Funktion: invalid_password / ldap_error /
account_disabled / unknown — schützt vor LDAP-Info-Leak via Audit-API.
W-03: remoteIP() trimmt jetzt Leerzeichen aus X-Forwarded-For.
Vollständige Lösung erfordert Proxy-Konfiguration (W-03 bleibt WARN).
W-04: Attachment-Dateiname wird durch sanitizeFilename() bereinigt.
Nur [a-zA-Z0-9._- ] erlaubt — verhindert Header-Injection.
PROJ-24: TOTP 2FA vollständig implementiert:
- internal/auth/totp.go: GenerateSecret, ValidateTOTP, QRCodeSVG
- internal/api/totp_handlers.go: Setup, Login-Step2, Admin-Reset
- internal/userstore: SetTOTPSecret, EnableTOTP, DisableTOTP, ResetTOTP
- Login-Flow: totp_pending JWT → /api/auth/totp → vollwertiger JWT
- AES-256-GCM verschlüsseltes Secret in users.totp_secret
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 00:54:00 +01:00
sysops
787db6638f
fix(PROJ-23): Privilege Escalation in Tenant-LDAP + Login-Reihenfolge
...
- BUG-1 (P0): domain_admin kann keine Rollen > auditor in default_role/
group_mappings setzen — serverseitige Allowlist-Prüfung in
handleSaveTenantLDAP (user/auditor) und handleAdminSaveTenantLDAP
(user/auditor/domain_admin)
- WARN-1: Login-Fallback-Reihenfolge korrigiert — tenant_ldap wird
jetzt VOR globalem ldap_config geprüft (Spec: tenant > global > local)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 00:32:47 +01:00
sysops
9e7add31cd
feat(PROJ-23): Pro-Mandant LDAP Frontend
...
- domain_admin: neuer LDAP-Tab mit Tenant-Konfiguration (eigener Mandant)
- Gruppen-Mapping auf user/auditor beschränkt (keine Eskalation)
- Nutzt /api/tenant/ldap Endpunkte
- superadmin: globaler LDAP-Tab umbenannt zu "LDAP (Global)"
- superadmin: Mandantentabelle um LDAP-Statusspalte erweitert
- Badge: Aktiv / Deaktiviert / ---
- TenantLDAPDialog pro Mandant (alle Rollen bis domain_admin)
- api.ts: TenantLDAPConfig Interface + 8 neue API-Funktionen
- getTenantLDAPConfig/save/delete/test (domain_admin)
- getAdminTenantLDAPConfig/save/delete/test (superadmin)
- Tenant Interface: ldap_enabled + ldap_url Felder ergänzt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 00:27:51 +01:00
sysops
e333e34a03
fix: unused time import in tenant_store.go
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 00:19:00 +01:00
sysops
78d83d3e98
feat(PROJ-21/23): Pro-Tenant Xapian-Index + Tenant-LDAP Backend
...
PROJ-21 Phase 4:
- internal/index/tenant_manager.go: TenantIndexManager mit lazy-loading Pool
- internal/index/tenant_worker.go: TenantIndexWorker leitet Submit an richtigen Index
- Jeder Mandant bekommt eigenes Xapian-Verzeichnis (tenant-<id>/)
- handleSearch nutzt direkt Tenant-Index statt nachgelagertem Post-Filter
- runBackfill re-indexiert pro Mandant beim Start
PROJ-23 / PROJ-16 Phase B:
- internal/ldapconfig/tenant_store.go: TenantStore mit AES-256-GCM für tenant_ldap
- internal/api/ldap_tenants.go: 8 neue Handler (GET/PUT/DELETE/test für
/api/tenant/ldap und /api/admin/tenants/{id}/ldap)
- internal/auth/auth.go: Login-Fallback prüft tenant_ldap nach globalem LDAP
(Domain-Extraktion → tenant_ldap config → UpsertLDAPUser mit tenant_id)
- internal/api/server.go: SetTenantLDAP(), neue Routen registriert
- internal/tenantstore/store.go: GetByDomain() Interface für auth-Package
- cmd/archivmail/main.go: TenantLDAPStore + TenantIndexManager verdrahtet
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 00:18:35 +01:00
sysops
46d7bfe608
fix(security): Kritische Sicherheitslücken beheben (SEC-01/02/03/05/08/17/22/26/28)
...
- SEC-01: Privilege Escalation verhindert — Rollenhierarchie in Create/Update/DeleteUser
- SEC-02: Tenant-Isolation in Update/DeleteUser — domain_admin nur eigene Nutzer
- SEC-03: IMAP/POP3 Owner-Check via auth.HasRole statt direktem String-Vergleich
- SEC-05: Export PDF/ZIP prüft Tenant-Zugehörigkeit vor Dateiausgabe
- SEC-08: HKDF-SHA256 trennt JWT-Secret von AES-Key (archivmail-jwt-v1 / archivmail-aes-v1)
- SEC-17: handleSecurityFix erfordert requireRole(superadmin)
- SEC-22: Mail-ID Regex [0-9a-f]{64} in allen Handlern (Path-Traversal-Schutz)
- SEC-26: SMTP Fail-Closed — leere AllowedIPs blockiert alles statt zu erlauben
- SEC-28: handleGetRaw — Parse-Fehler bricht ab statt Fallthrough zu Dateizugriff
BREAKING: IMAP/POP3/LDAP-Passwörter müssen nach Deploy einmalig neu eingegeben
werden (neuer AES-Key). JWT-Sessions laufen ab (einmaliges Re-Login nötig).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-18 00:05:47 +01:00
sysops
143db65755
fix: Tenant-Isolation in handleSearch + requireMailAccess
...
- handleSearch: Ergebnisse nach tenant_id filtern (via email_refs)
- requireMailAccess: domain_admin darf Mails lesen, Tenant-Prüfung
erfolgt bereits in handleGetMail via GetTenantForMail
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-17 22:03:22 +01:00
sysops
d8a8204e36
fix: allowed_ips non-null assertion
2026-03-17 21:46:25 +01:00
sysops
3e7f365707
fix: allowed_ips optional chain
2026-03-17 21:45:40 +01:00
sysops
24d866d100
fix: smtpStatus.domains optional chain
2026-03-17 21:44:57 +01:00
sysops
13cc114f2f
fix: optional SMTPStatus Felder mit ?? absichern
2026-03-17 21:44:14 +01:00
sysops
473715ca20
fix: SMTPStatus Typ um tenant-Felder erweitert
2026-03-17 21:43:19 +01:00
sysops
b360e07e2d
fix: doppelte sess-Deklaration in handleServiceAction
2026-03-17 21:42:23 +01:00
sysops
2dbddff0e2
feat: rollenbasierte SMTP-Statistik + Service-Aktionen
...
- handleServiceAction: nur superadmin darf Dienste stoppen/starten
- handleSMTPStatus: domain_admin bekommt tenant-gefilterte Stats
(Domains, Mailanzahl, Speicher) statt globaler Daemon-Info
- Admin-Dashboard: SMTP-Kacheln, Systemauslastung, IP-Allowlist
nur für superadmin; domain_admin sieht eigene Domain-Statistik
- Dienste-Tab: Aktions-Buttons nur für superadmin sichtbar
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-17 21:41:57 +01:00