feat: add Stalwart account security management

- Add Stalwart API client library (lib/stalwart/client.ts)
- Add server-side proxy routes for auth, crypto, password, principal, probe
- Add account security Zustand store with full state management
- Add Security settings tab with password change, display name, TOTP 2FA,
  app passwords, and encryption-at-rest controls
- Add stalwartFeaturesEnabled config flag (opt-out via STALWART_FEATURES=false)
- Add i18n translations for all 8 locales (en, de, es, fr, it, ja, nl, pt)
- Add tests for Stalwart client (24 tests) and security store (29 tests)
This commit is contained in:
Linus Rath
2026-03-12 02:20:56 +01:00
parent 68d4a9a641
commit ab72fc06ff
26 changed files with 3143 additions and 310 deletions
+66 -1
View File
@@ -449,7 +449,8 @@
"filters": "Filter",
"templates": "Vorlagen",
"folders": "Ordner",
"keywords": "Schlüsselwörter"
"keywords": "Schlüsselwörter",
"security": "Sicherheit"
},
"tab_groups": {
"general": "Allgemein",
@@ -663,6 +664,70 @@
"value": "{time}"
}
},
"security": {
"title": "Kontosicherheit",
"description": "Verwalten Sie Ihr Passwort, Zwei-Faktor-Authentifizierung und Sicherheitseinstellungen",
"detecting": "Serverfunktionen werden erkannt...",
"not_available": "Kontosicherheitsverwaltung ist für diesen Mailserver nicht verfügbar.",
"password": {
"title": "Passwort ändern",
"current": "Aktuelles Passwort",
"new": "Neues Passwort",
"confirm": "Neues Passwort bestätigen",
"submit": "Passwort ändern",
"success": "Passwort erfolgreich geändert",
"error_title": "Passwortänderung fehlgeschlagen",
"error_mismatch": "Neue Passwörter stimmen nicht überein",
"error_min_length": "Das Passwort muss mindestens 8 Zeichen lang sein",
"error_generic": "Passwort konnte nicht geändert werden"
},
"display_name": {
"label": "Anzeigename",
"description": "Ihr Name, wie er auf dem Server angezeigt wird",
"save": "Speichern",
"success": "Anzeigename aktualisiert",
"error": "Anzeigename konnte nicht aktualisiert werden"
},
"totp": {
"section_title": "Zwei-Faktor-Authentifizierung",
"label": "TOTP-Authentifizierung",
"description": "Fügen Sie eine zusätzliche Sicherheitsebene mit einem zeitbasierten Einmalpasswort hinzu",
"active": "Aktiviert",
"inactive": "Deaktiviert",
"enabled": "Zwei-Faktor-Authentifizierung aktiviert",
"disabled": "Zwei-Faktor-Authentifizierung deaktiviert",
"enable_error": "2FA konnte nicht aktiviert werden",
"disable_error": "2FA konnte nicht deaktiviert werden",
"setup_instructions": "Kopieren Sie diese URL in Ihre Authenticator-App (Google Authenticator, Authy, etc.):"
},
"app_passwords": {
"title": "App-Passwörter",
"description": "Erstellen Sie Passwörter für Apps, die keine Zwei-Faktor-Authentifizierung unterstützen",
"add": "Hinzufügen",
"create": "Erstellen",
"cancel": "Abbrechen",
"generate": "Generieren",
"name_label": "App-Name",
"name_placeholder": "z.B. Thunderbird, iPhone Mail",
"password_label": "Passwort (leer lassen für Auto-Generierung)",
"password_placeholder": "Automatisch generiert, wenn leer",
"added": "App-Passwort erstellt",
"removed": "App-Passwort entfernt",
"add_error": "App-Passwort konnte nicht erstellt werden",
"remove_error": "App-Passwort konnte nicht entfernt werden",
"none": "Keine App-Passwörter konfiguriert"
},
"encryption": {
"section_title": "Verschlüsselung im Ruhezustand",
"label": "E-Mail-Verschlüsselung",
"description": "Verschlüsseln Sie gespeicherte E-Mails auf dem Server für zusätzlichen Datenschutz",
"active": "{type}-Verschlüsselung aktiviert",
"inactive": "Deaktiviert",
"enabled": "Verschlüsselung im Ruhezustand aktiviert",
"disabled_success": "Verschlüsselung im Ruhezustand deaktiviert",
"error": "Verschlüsselungseinstellungen konnten nicht aktualisiert werden"
}
},
"identities": {
"title": "Sendeidentitäten",
"description": "Verwalten Sie E-Mail-Adressen, von denen Sie senden können",