feat: add S/MIME store for managing key records and public certificates

- Implemented Zustand store for S/MIME functionality, including state management for key records and public certificates.
- Added methods for importing PKCS#12 files and public certificates, binding identities to keys, and managing unlocked keys.
- Introduced session storage for remembering unlocked keys across sessions.
- Enhanced error handling and loading states during data operations.
This commit is contained in:
Linus Rath
2026-03-17 20:14:01 +01:00
parent 7c5785e9e8
commit de35d1d8e8
45 changed files with 24687 additions and 64 deletions
+97 -1
View File
@@ -416,6 +416,15 @@
"upload_cancel": "Cancelar envio",
"upload_failed": "Falha ao enviar {filename}",
"send_failed": "Falha ao enviar o e-mail",
"smime_sign_on": "Assinatura S/MIME ativada",
"smime_sign_off": "Assinatura S/MIME desativada",
"smime_encrypt_on": "Criptografia S/MIME ativada",
"smime_encrypt_off": "Criptografia S/MIME desativada",
"smime_encrypt_unavailable": "A criptografia S/MIME não está disponível: {reason}",
"smime_unlock_title": "Desbloquear chave S/MIME",
"smime_unlock_message": "Insira a frase secreta para desbloquear sua chave S/MIME.",
"smime_unlock_button": "Desbloquear",
"smime_passphrase_placeholder": "Frase secreta S/MIME",
"continue_draft": "Continuar rascunho",
"close_draft_title": "Salvar ou descartar rascunho?",
"close_draft_message": "Você tem alterações não salvas. Deseja salvar como rascunho ou descartar?",
@@ -552,6 +561,7 @@
"folders": "Pastas",
"keywords": "Palavras-chave",
"security": "Segurança",
"encryption": "Criptografia",
"files": "Arquivos",
"contacts": "Contacts"
},
@@ -1439,7 +1449,16 @@
"calendar": "Calendário",
"calendar_uri": "URL do calendário",
"scheduling_uri": "URL de agendamento",
"freebusy_uri": "URL de disponibilidade"
"freebusy_uri": "URL de disponibilidade",
"cert_issuer": "Emissor",
"cert_expires": "Expira em",
"cert_expired": "Expirado",
"cert_fingerprint": "Impressão digital",
"cert_algorithm": "Algoritmo",
"import_to_smime": "Importar para S/MIME",
"cert_already_imported": "Certificado já importado",
"cert_imported": "Certificado importado",
"cert_import_failed": "Falha ao importar o certificado"
},
"form": {
"create_title": "Novo contato",
@@ -1989,5 +2008,82 @@
"settings_folder_layout_desc": "Choose how folders are displayed: inline with files or in a sidebar tree",
"settings_folder_layout_inline": "Inline",
"settings_folder_layout_sidebar": "Sidebar"
},
"smime": {
"your_certificates": "Seus certificados",
"your_certificates_desc": "Importe e gerencie seus certificados S/MIME para assinar e criptografar e-mails",
"recipient_certificates": "Certificados dos destinatários",
"recipient_certificates_desc": "Certificados públicos para criptografar e-mails para destinatários",
"identity_bindings": "Vínculos de identidade e chave",
"identity_bindings_desc": "Associe certificados S/MIME às suas identidades de e-mail",
"defaults_title": "Padrões",
"defaults_desc": "Configure o comportamento padrão de assinatura e criptografia",
"import_pkcs12": "Importar PKCS#12 (.p12/.pfx)",
"import_public_cert": "Importar certificado",
"no_certificates": "Nenhum certificado importado ainda",
"no_recipient_certs": "Nenhum certificado de destinatário",
"expires": "Expira em",
"expired": "Expirado",
"bound_to": "Vinculado a",
"no_key_bound": "Nenhum",
"lock": "Bloquear chave",
"unlock": "Desbloquear chave",
"details": "Ver detalhes",
"delete": "Excluir",
"encrypt_by_default": "Criptografar por padrão",
"encrypt_by_default_desc": "Criptografar e-mails automaticamente quando todos os destinatários tiverem certificados",
"remember_unlocked": "Lembrar chaves desbloqueadas",
"remember_unlocked_desc": "Manter as chaves desbloqueadas durante esta sessão do navegador",
"sign_default_for": "Assinar por padrão para",
"enter_p12_passphrase": "Inserir a frase secreta do PKCS#12",
"p12_passphrase_desc": "Insira a frase secreta que protege este arquivo de certificado",
"enter_storage_passphrase": "Definir frase secreta de armazenamento",
"storage_passphrase_desc": "Escolha uma frase secreta para proteger esta chave no navegador",
"next": "Próximo",
"import": "Importar",
"unlock_key": "Desbloquear chave",
"unlock_key_desc": "Insira a frase secreta de armazenamento para desbloquear esta chave para assinatura ou descriptografia",
"passphrase_placeholder": "Insira a frase secreta",
"confirm_passphrase_placeholder": "Confirme a frase secreta",
"passphrase_mismatch": "As frases secretas não coincidem",
"cancel": "Cancelar",
"processing": "Processando…",
"close": "Fechar",
"certificate_details": "Detalhes do certificado",
"cert_subject": "Assunto",
"cert_issuer": "Emissor",
"cert_email": "E-mail",
"cert_serial": "Número de série",
"cert_validity": "Validade",
"cert_fingerprint": "Impressão digital (SHA-256)",
"cert_algorithm": "Algoritmo",
"cert_capabilities": "Recursos",
"cert_source": "Origem",
"cert_expired": "Este certificado expirou",
"cert_not_yet_valid": "Este certificado ainda não é válido",
"cap_sign": "Assinatura",
"cap_encrypt": "Criptografia",
"cap_none": "Nenhum",
"show_passphrase": "Mostrar frase secreta",
"hide_passphrase": "Ocultar frase secreta",
"sign_toggle": "Assinar",
"encrypt_toggle": "Criptografar",
"missing_recipient_certs": "Certificados ausentes para: {emails}",
"missing_sender_cert": "Nenhum certificado vinculado a esta identidade",
"status_encrypted_ok": "Esta mensagem foi criptografada",
"status_encrypted_no_key": "Esta mensagem está criptografada, mas nenhuma chave correspondente foi encontrada",
"status_encrypted_failed": "Falha ao descriptografar esta mensagem",
"status_signed_valid": "Assinatura verificada",
"status_signed_invalid": "A verificação da assinatura falhou",
"status_signed_expired_cert": "Assinada com um certificado expirado",
"status_signed_mismatch": "A assinatura é válida, mas o signatário não corresponde ao remetente",
"status_unsupported": "Formato S/MIME não suportado",
"auto_import_signer_certs": "Importar automaticamente certificados de signatários",
"auto_import_signer_certs_desc": "Salvar automaticamente certificados de e-mails assinados verificados para criptografia futura",
"export": "Exportar",
"enter_export_passphrase": "Definir frase secreta de exportação",
"export_passphrase_desc": "Escolha uma frase secreta para proteger o arquivo PKCS#12 exportado",
"export_storage_desc": "Insira a frase secreta de armazenamento para descriptografar a chave para exportação",
"incorrect_passphrase": "Frase secreta incorreta"
}
}