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": "Filtros",
"templates": "Modelos",
"folders": "Pastas",
"keywords": "Palavras-chave"
"keywords": "Palavras-chave",
"security": "Segurança"
},
"tab_groups": {
"general": "Geral",
@@ -663,6 +664,70 @@
"value": "{time}"
}
},
"security": {
"title": "Segurança da conta",
"description": "Gerencie sua senha, autenticação de dois fatores e configurações de segurança",
"detecting": "Detectando recursos do servidor...",
"not_available": "O gerenciamento de segurança da conta não está disponível para este servidor de e-mail.",
"password": {
"title": "Alterar senha",
"current": "Senha atual",
"new": "Nova senha",
"confirm": "Confirmar nova senha",
"submit": "Alterar senha",
"success": "Senha alterada com sucesso",
"error_title": "Falha ao alterar a senha",
"error_mismatch": "As novas senhas não coincidem",
"error_min_length": "A senha deve ter pelo menos 8 caracteres",
"error_generic": "Não foi possível alterar a senha"
},
"display_name": {
"label": "Nome de exibição",
"description": "Seu nome como aparece no servidor",
"save": "Salvar",
"success": "Nome de exibição atualizado",
"error": "Não foi possível atualizar o nome de exibição"
},
"totp": {
"section_title": "Autenticação de dois fatores",
"label": "Autenticação TOTP",
"description": "Adicione uma camada extra de segurança com uma senha única baseada em tempo",
"active": "Habilitado",
"inactive": "Desabilitado",
"enabled": "Autenticação de dois fatores habilitada",
"disabled": "Autenticação de dois fatores desabilitada",
"enable_error": "Não foi possível habilitar a 2FA",
"disable_error": "Não foi possível desabilitar a 2FA",
"setup_instructions": "Copie esta URL para seu aplicativo de autenticação (Google Authenticator, Authy, etc.):"
},
"app_passwords": {
"title": "Senhas de aplicativo",
"description": "Crie senhas para aplicativos que não suportam autenticação de dois fatores",
"add": "Adicionar",
"create": "Criar",
"cancel": "Cancelar",
"generate": "Gerar",
"name_label": "Nome do aplicativo",
"name_placeholder": "ex. Thunderbird, iPhone Mail",
"password_label": "Senha (deixe vazio para auto-gerar)",
"password_placeholder": "Auto-gerada se vazio",
"added": "Senha de aplicativo criada",
"removed": "Senha de aplicativo removida",
"add_error": "Não foi possível criar a senha de aplicativo",
"remove_error": "Não foi possível remover a senha de aplicativo",
"none": "Nenhuma senha de aplicativo configurada"
},
"encryption": {
"section_title": "Criptografia em repouso",
"label": "Criptografia de e-mail",
"description": "Criptografe e-mails armazenados no servidor para maior privacidade",
"active": "Criptografia {type} habilitada",
"inactive": "Desabilitado",
"enabled": "Criptografia em repouso habilitada",
"disabled_success": "Criptografia em repouso desabilitada",
"error": "Não foi possível atualizar as configurações de criptografia"
}
},
"identities": {
"title": "Identidades de Envio",
"description": "Gerencie endereços de e-mail que você pode usar para enviar",