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": "Annuler l'envoi",
"upload_failed": "Échec du téléversement de {filename}",
"send_failed": "Échec de l'envoi de l'e-mail",
"smime_sign_on": "Signature S/MIME activée",
"smime_sign_off": "Signature S/MIME désactivée",
"smime_encrypt_on": "Chiffrement S/MIME activé",
"smime_encrypt_off": "Chiffrement S/MIME désactivé",
"smime_encrypt_unavailable": "Le chiffrement S/MIME n'est pas disponible : {reason}",
"smime_unlock_title": "Déverrouiller la clé S/MIME",
"smime_unlock_message": "Entrez la phrase secrète pour déverrouiller votre clé S/MIME.",
"smime_unlock_button": "Déverrouiller",
"smime_passphrase_placeholder": "Phrase secrète S/MIME",
"continue_draft": "Continuer le brouillon",
"close_draft_title": "Enregistrer ou supprimer le brouillon ?",
"close_draft_message": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer comme brouillon ou supprimer ?",
@@ -552,6 +561,7 @@
"folders": "Dossiers",
"keywords": "Mots-clés",
"security": "Sécurité",
"encryption": "Chiffrement",
"files": "Fichiers",
"contacts": "Contacts"
},
@@ -1439,7 +1449,16 @@
"calendar": "Calendrier",
"calendar_uri": "URL du calendrier",
"scheduling_uri": "URL de planification",
"freebusy_uri": "URL de disponibilité"
"freebusy_uri": "URL de disponibilité",
"cert_issuer": "Émetteur",
"cert_expires": "Expire le",
"cert_expired": "Expiré",
"cert_fingerprint": "Empreinte",
"cert_algorithm": "Algorithme",
"import_to_smime": "Importer dans S/MIME",
"cert_already_imported": "Certificat déjà importé",
"cert_imported": "Certificat importé",
"cert_import_failed": "Échec de l'import du certificat"
},
"form": {
"create_title": "Nouveau contact",
@@ -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": "Vos certificats",
"your_certificates_desc": "Importez et gérez vos certificats S/MIME pour signer et chiffrer les e-mails",
"recipient_certificates": "Certificats des destinataires",
"recipient_certificates_desc": "Certificats publics pour chiffrer les e-mails destinés aux destinataires",
"identity_bindings": "Liaisons identité-clé",
"identity_bindings_desc": "Associez des certificats S/MIME à vos identités de messagerie",
"defaults_title": "Valeurs par défaut",
"defaults_desc": "Configurez le comportement par défaut de signature et de chiffrement",
"import_pkcs12": "Importer PKCS#12 (.p12/.pfx)",
"import_public_cert": "Importer un certificat",
"no_certificates": "Aucun certificat importé pour le moment",
"no_recipient_certs": "Aucun certificat destinataire",
"expires": "Expire le",
"expired": "Expiré",
"bound_to": "Lié à",
"no_key_bound": "Aucun",
"lock": "Verrouiller la clé",
"unlock": "Déverrouiller la clé",
"details": "Voir les détails",
"delete": "Supprimer",
"encrypt_by_default": "Chiffrer par défaut",
"encrypt_by_default_desc": "Chiffrer automatiquement les e-mails lorsque tous les destinataires ont un certificat",
"remember_unlocked": "Mémoriser les clés déverrouillées",
"remember_unlocked_desc": "Conserver les clés déverrouillées pendant cette session du navigateur",
"sign_default_for": "Signer par défaut pour",
"enter_p12_passphrase": "Entrer la phrase secrète PKCS#12",
"p12_passphrase_desc": "Entrez la phrase secrète qui protège ce fichier de certificat",
"enter_storage_passphrase": "Définir la phrase secrète de stockage",
"storage_passphrase_desc": "Choisissez une phrase secrète pour protéger cette clé dans votre navigateur",
"next": "Suivant",
"import": "Importer",
"unlock_key": "Déverrouiller la clé",
"unlock_key_desc": "Entrez la phrase secrète de stockage pour déverrouiller cette clé pour la signature ou le déchiffrement",
"passphrase_placeholder": "Entrez la phrase secrète",
"confirm_passphrase_placeholder": "Confirmez la phrase secrète",
"passphrase_mismatch": "Les phrases secrètes ne correspondent pas",
"cancel": "Annuler",
"processing": "Traitement…",
"close": "Fermer",
"certificate_details": "Détails du certificat",
"cert_subject": "Sujet",
"cert_issuer": "Émetteur",
"cert_email": "E-mail",
"cert_serial": "Numéro de série",
"cert_validity": "Validité",
"cert_fingerprint": "Empreinte (SHA-256)",
"cert_algorithm": "Algorithme",
"cert_capabilities": "Capacités",
"cert_source": "Source",
"cert_expired": "Ce certificat a expiré",
"cert_not_yet_valid": "Ce certificat n'est pas encore valide",
"cap_sign": "Signature",
"cap_encrypt": "Chiffrement",
"cap_none": "Aucune",
"show_passphrase": "Afficher la phrase secrète",
"hide_passphrase": "Masquer la phrase secrète",
"sign_toggle": "Signer",
"encrypt_toggle": "Chiffrer",
"missing_recipient_certs": "Certificats manquants pour : {emails}",
"missing_sender_cert": "Aucun certificat n'est lié à cette identité",
"status_encrypted_ok": "Ce message a été chiffré",
"status_encrypted_no_key": "Ce message est chiffré, mais aucune clé correspondante n'a été trouvée",
"status_encrypted_failed": "Impossible de déchiffrer ce message",
"status_signed_valid": "Signature vérifiée",
"status_signed_invalid": "Échec de la vérification de la signature",
"status_signed_expired_cert": "Signé avec un certificat expiré",
"status_signed_mismatch": "La signature est valide, mais le signataire ne correspond pas à l'expéditeur",
"status_unsupported": "Format S/MIME non pris en charge",
"auto_import_signer_certs": "Importer automatiquement les certificats des signataires",
"auto_import_signer_certs_desc": "Enregistrer automatiquement les certificats des e-mails signés vérifiés pour un futur chiffrement",
"export": "Exporter",
"enter_export_passphrase": "Définir la phrase secrète d'export",
"export_passphrase_desc": "Choisissez une phrase secrète pour protéger le fichier PKCS#12 exporté",
"export_storage_desc": "Entrez la phrase secrète de stockage pour déchiffrer la clé avant l'export",
"incorrect_passphrase": "Phrase secrète incorrecte"
}
}