sysops
2a91f6e249
fix: IMAP-Serveradresse dynamisch aus Backend laden
...
Hardcodierte 192.168.1.131 in settings/page.tsx ersetzt durch
dynamischen API-Call GET /api/system/info → {fqdn, imap_port}.
Fallback auf window.location.hostname wenn API nicht antwortet.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-06 11:06:58 +02:00
sysops
3b05e949dd
feat(PROJ-13,PROJ-42): REST API v1 + Gespeicherte Suchanfragen
...
PROJ-13: Externe REST API für CRM/ERP-Anbindung
- API-Key Middleware mit SHA-256-Hash-Lookup + Token-Bucket Rate-Limiter
- GET /api/v1/mails — Suche mit Paginierung (max 100/Seite)
- GET /api/v1/mails/{id} — Mail-Metadaten als JSON
- GET /api/v1/mails/{id}/raw — Original-EML Download
- Admin-Endpoints: POST/GET/DELETE /api/admin/apikeys
- Tenant-Isolation, Audit-Log, 405 für non-GET Methoden
PROJ-42: Gespeicherte Suchanfragen
- Tabelle saved_searches (user_id, tenant_id, name, query_json)
- GET/POST/DELETE /api/searches/saved mit Ownership-Check
- Frontend: "Suche speichern"-Button + Popover mit gespeicherten Suchen
- shadcn/ui Komponenten, Loading/Empty States
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-06 10:54:26 +02:00
sysops
9298216ce0
feat(PROJ-40,PROJ-41): Prometheus Metriken + Dashboard Zeitreihe
...
- PROJ-40: /api/health mit Version+Uptime, /metrics Prometheus-Format
(mails_last_60min/24h/7d/30d, mails_total, storage_bytes, tenants_total,
users_total, uptime_seconds) — Token-Schutz optional konfigurierbar
- PROJ-41: GET /api/admin/stats/timeseries (30-Tage tagesgenau, Tenant-scoped)
+ SVG-Balkendiagramm im Dashboard (Mail-Eingang letzte 30 Tage)
- storage.DBQueryRow() Helper für Metrics-Queries ohne Pool-Exposition
- config.MetricsConfig (enabled, token) in config.go
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-05 21:10:42 +02:00
sysops
4f366a3634
fix(PROJ-39): exportEDiscovery in api/index.ts re-exportieren
...
exportEDiscovery war in mail.ts definiert, aber fehlte im Re-Export-Block
von index.ts — Frontend-Build schlug mit "Export doesn't exist" fehl.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-05 20:57:32 +02:00
sysops
a82e854cfc
feat(PROJ-39): eDiscovery Export + Feature-Specs PROJ-40–43
...
- Neuer POST /api/export/ediscovery Handler (internal/api/ediscovery.go)
- Route in server.go registriert
- Feature-Specs PROJ-39 bis PROJ-43 angelegt
- INDEX.md aktualisiert
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-05 20:55:37 +02:00
sysops
887548a9c7
fix(PROJ-38): getThread + ThreadMail/ThreadResponse in api/index.ts re-exportieren
2026-04-05 20:19:36 +02:00
sysops
b252172cc7
feat(PROJ-26,PROJ-38): IMAP LDAP-Auth + Mail-Threading
2026-04-05 20:17:41 +02:00
sysops
fdb25cb16a
feat: Labels-Feature vollständig entfernen (PROJ-9)
...
Backend:
- internal/labelstore/ gelöscht (Store, Schema, CRUD)
- internal/api/label_handlers.go gelöscht (alle Label-Routen)
- internal/api/server.go: labels-Feld + SetLabels() entfernt
- internal/api/search_handlers.go: label_id-Filter + Enrichment entfernt
- internal/index/index.go: LabelID aus SearchRequest entfernt
- internal/imapserver/server.go: labels-Feld + labelbasierte Mailboxen entfernt
- cmd/archivmail/main.go: labelstore-Init + SetLabels() entfernt
- cmd/archivmail/version.go: labelstore-Modul entfernt, index-Kommentar korrigiert
Frontend:
- LabelList.tsx, LabelPicker.tsx, LabelsTab.tsx gelöscht
- src/lib/api/system.ts: MailLabel/LabelRule-Typen + alle Label-Funktionen entfernt
- src/lib/api/index.ts: Label-Exports entfernt
- src/app/search/page.tsx: LabelList + selectedLabelId State entfernt
- src/app/mail/[id]/page.tsx: LabelPicker + Labels-State entfernt
- src/app/admin/page.tsx: LabelsTab + alle Label-Handler/State entfernt
Docs:
- features/PROJ-9: Status auf Removed gesetzt
- features/INDEX.md: PROJ-9 auf Removed gesetzt
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-04 21:32:13 +02:00
sysops
4d1bdb6e8b
fix(ui): rollenbasierte Navigation + domain_auditor-Support
...
- useAuth.ts: domain_auditor (Level 3) in roleLevels ergänzt
- navbar.tsx: IMAP/POP3-Links nur noch für user + domain_admin;
domain_auditor bekommt Zugang zum Admin-Bereich
- UserNav.tsx: Rollenbezeichnung deutsch + leserlich (domain_auditor →
"Domain-Auditor"); Badge ausgeblendet wenn Username = Rollenname
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-04 21:16:53 +02:00
sysops
0db2324c8b
fix(ui): Label-Sidebar für auditor/domain_auditor ausblenden
...
Auditoren haben keine eigenen Mails — Labels machen für sie keinen Sinn.
Die Sidebar (inkl. "+ Neues Label") wird jetzt nur noch für Rollen
mit eigenen Mails angezeigt (user, domain_admin, superadmin).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-04 21:13:46 +02:00
sysops
a93a843506
feat(PROJ-30): Xapian → Manticore Search Migration
...
- internal/index/manticore.go: ManticoreTenantManager + manticoreIndex (RT-Indizes, CGO-frei)
- internal/index/index.go: TenantIndexer Interface (Xapian + Manticore)
- internal/index/tenant_worker.go: mgr-Typ auf TenantIndexer Interface
- internal/api/server.go: idxMgr auf TenantIndexer Interface
- config/config.go: IndexConfig.ManticoreDSN Feld
- cmd/archivmail/cmd_reindex.go: reindex Subkommando
- cmd/archivmail/main.go: Manticore-Branch + reindex Case
- go.mod: github.com/go-sql-driver/mysql v1.8.1
- update.sh: Manticore auto-install, CGO_ENABLED=0, config.yml migration, auto-reindex
fix(IMAP): TCP-Deadline-Wrapper für steckengebliebene Imports
fix(auth): Email-Claim in JWT für User-Isolation
fix(search): User-Isolation via sess.Email (fail-safe)
fix(ui): Admin-Login Auth-Cache, Logout-Redirect, IMAP-Polling-Resilienz
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-04-03 21:19:36 +02:00
sysops
d7b01504aa
fix(ui): Mandanten-Tabelle — Slug unter Name, LDAP-Host anzeigen, Slug-Spalte entfernt
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 23:54:50 +02:00
sysops
acc0d93318
feat: getrennte Login-Seiten für User (/), Admins (/admin/login)
...
- /admin/login: neue Login-Seite nur für auditor, admin, domain_admin, superadmin
- /: blockiert Admin-Rollen mit Hinweis auf /admin
- useAuth: neuer loginPage-Parameter für flexiblen Unauthentifiziert-Redirect
- /admin: leitet bei Nicht-Auth zu /admin/login statt /
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 23:47:41 +02:00
sysops
c1a9004720
feat(PROJ-28): SMTP-Out Relay — DB-Konfiguration + Admin-Tab
...
- smtpoutconfig.Store: AES-256-GCM verschlüsseltes Passwort in DB (id=1 Singleton)
- Mailer: Reload() für Runtime-Konfigurationswechsel (sync.RWMutex)
- API: GET/PUT/DELETE /api/admin/smtp-out + POST /api/admin/smtp-out/test
- Admin-Tab: Host, Port, User, Passwort, TLS-Switch, From, Test-Button, Status-Badge
- Startup: Lädt DB-Konfiguration und aktiviert Mailer ohne Restart
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 22:36:57 +02:00
sysops
4583262ea4
feat(PROJ-28): Self-Service Onboarding — Signup, Verify, Password Reset, Invites
...
- internal/mailer: SMTP-Out via net/smtp (TLS + STARTTLS), HTML+Text-Templates
- internal/tokenstore: auth_tokens Tabelle, SHA-256-Hash, TTL, einmalig verwendbar
- userstore: CreateInactive(), Activate(), GetByEmail(), SetPassword()
- API: POST /signup, GET /verify, POST /forgot-password, POST /reset-password
- API: POST /admin/invite (domain_admin+), GET /auth/invite?token (check)
- Login-Seite: Links zu "Passwort vergessen" und "Registrieren"
- Frontend: /signup, /verify, /forgot-password, /reset-password Seiten
- server.fqdn nicht konfiguriert → Startup-Warnung, Self-Service deaktiviert
- LDAP-Nutzer: Passwort-Reset abgewiesen
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 21:54:11 +02:00
sysops
7930b85cde
feat(PROJ-29): Tenant-Quotas & Usage-Limits
...
- DB: max_storage_bytes, max_users, max_emails per Tenant (NULL = unlimited)
- storage/quota.go: CheckQuota() mit 60s-Cache, ErrQuotaExceeded
- Save() prüft Quota vor dem Schreiben — Ablehnung bei Hard-Limit
- tenantstore/quota.go: SetQuota(), GetQuota(), GetUsage()
- API: GET/PUT /api/admin/tenant/{id}/quota, GET /api/admin/quotas
- QuotaTab: Usage-Balken (Speicher/Nutzer/Mails), Edit-Dialog, Warnung ab 80%
- InvalidateQuotaCache() nach Quota-Änderung für sofortige Wirkung
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 21:21:11 +02:00
sysops
ebc9e278ea
fix(PROJ-34): Mandanten-Retention ist Opt-in — kein globaler Lock für Mandanten
...
storage.Save(): retention_days eines Mandanten muss explizit > 0 sein.
Globale config greift nie automatisch auf Mandanten-Mails.
Mails ohne Mandant: globale config als Fallback (unveraendert).
Frontend: Hinweis und Labels klargestellt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 10:50:54 +02:00
sysops
58bcfb1586
feat: Dashboard-Metriken nach Mailpiler-Vorbild (Uptime, Aktivität, Prognose)
...
- storage_stats.go (neu): MailActivityStats (60min/24h/7d/30d), StorageEstimateStats
- dashboard_handlers.go: Uptime (/proc/uptime), activity + estimate in System-Stats-Response
- DashboardTab: Uptime in API-Kachel, neue Kacheln "Mail-Eingang" + "Speicherprognose"
- Warnung (Badge "Knapp!") wenn Partition in <90 Tagen voll
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 10:44:02 +02:00
sysops
5bbf6d0ff3
feat(PROJ-34): Retention-Tab + pro-Mandant Aufbewahrungsfristen
...
- tenantstore: retention_days Spalte, GetRetentionDays/SetRetentionDays
- storage.Save(): per-tenant retention überschreibt globale config
- API: GET /api/admin/retention, PUT /api/admin/tenant/{id}/retention
- Frontend: RetentionTab mit globaler Policy-Anzeige, Mandanten-Tabelle,
Bearbeiten-Dialog und Purge-Button (superadmin only)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 10:37:15 +02:00
sysops
842640c3aa
fix: Superadmin wird direkt zu /admin weitergeleitet
...
- Login: superadmin → /admin, alle anderen → /search
- Cached-Session: superadmin → /admin
- Search-Seite: superadmin wird sofort zu /admin umgeleitet
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 10:05:08 +02:00
sysops
27040ffcb1
feat(PROJ-28): FQDN + smtp_out Konfiguration
...
- config: server.fqdn, SMTPOutConfig, smtp_out Abschnitt
- config: IMAPServerConfig.FQDN (runtime-gesetzt)
- main: FQDN-Fallback für SMTP EHLO, FQDN an IMAP-Server
- imapserver: Greeting nutzt server.fqdn (RFC 3501)
- smtpd/imapserver Modulversion 1.3
fix: Superadmin sieht keine Suche/IMAP/POP3 Nav-Links
- Navbar: Suche, IMAP Import, POP3 Import nur für non-superadmin
- Superadmin landet direkt auf Admin-Dashboard
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 09:51:41 +02:00
sysops
8d0f685fc9
feat(PROJ-33): IMAP UID-Stabilität + Shared/Personal-Modus
...
Backend:
- storage: uid BIGSERIAL Migration, MailWithUID, GetMailsWithUID, GetMailsByRecipient
- tenantstore: imap_mode Spalte, GetIMAPMode, SetIMAPMode
- imapserver: stable UIDs aus DB, personal/shared Modus, userEmail in session
- api: GET/PUT /api/admin/settings/imap-mode (domain_admin only, double opt-in)
Frontend:
- IMAPSettingsTab: Modus-Anzeige + Toggle mit Double-Opt-In Dialog
- Admin-Panel: IMAP-Tab für domain_admin
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 09:46:52 +02:00
sysops
b6856af2eb
feat(PROJ-32): Message-ID-basierte Duplikatserkennung
...
- message_id Spalte + UNIQUE-Index in emails-Tabelle
- Save() prüft Message-ID vor SHA-256-Flow (kein Disk-I/O bei Duplikat)
- lookupByMessageID() als private Hilfsfunktion
- insertMeta() schreibt message_id, gibt error zurück (Race-safe)
- SaveMeta() schreibt message_id idempotent (Backfill)
feat(PROJ-34): Retention-Policy + Löschsperre (GoBD)
- retain_until TIMESTAMPTZ Spalte in emails-Tabelle
- ErrRetentionLock typed error
- Delete() prüft Retention-Frist vor Löschung
- Purge() löscht alle Mails mit abgelaufener Retention
- POST /api/admin/purge Endpunkt (superadmin only)
- config: storage.retention_days
fix: Superadmin-Benutzerübersicht zeigt Mandant-Spalte
- UsersTab: Mandant-Spalte wenn isSuperAdmin
- domain_auditor Rolle im Create-Dialog ergänzt
- storage Modulversion → 1.6
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-31 01:29:25 +02:00
sysops
e0f6a818eb
feat: LDAP-Test zeigt klickbare Filter-Vorschläge (UCS/AD-Erkennung)
...
Nach erfolgreichem Verbindungstest werden passende Filter-Vorschläge
angezeigt. Erkennt automatisch Univention UCS (posixAccount) vs.
Active Directory (sAMAccountName). Klick übernimmt den Filter direkt
ins Formular. Vorschläge berücksichtigen mailPrimaryAddress (UCS).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-20 14:50:20 +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
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
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
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
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
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
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
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
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