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 subida",
"upload_failed": "Error al subir {filename}",
"send_failed": "Error al enviar el correo",
"smime_sign_on": "Firma S/MIME activada",
"smime_sign_off": "Firma S/MIME desactivada",
"smime_encrypt_on": "Cifrado S/MIME activado",
"smime_encrypt_off": "Cifrado S/MIME desactivado",
"smime_encrypt_unavailable": "El cifrado S/MIME no está disponible: {reason}",
"smime_unlock_title": "Desbloquear clave S/MIME",
"smime_unlock_message": "Introduce la contraseña para desbloquear tu clave S/MIME.",
"smime_unlock_button": "Desbloquear",
"smime_passphrase_placeholder": "Contraseña S/MIME",
"continue_draft": "Continuar borrador",
"close_draft_title": "¿Guardar o descartar borrador?",
"close_draft_message": "Tiene cambios sin guardar. ¿Desea guardar esto como borrador o descartarlo?",
@@ -552,6 +561,7 @@
"folders": "Carpetas",
"keywords": "Palabras clave",
"security": "Seguridad",
"encryption": "Cifrado",
"files": "Archivos",
"contacts": "Contacts"
},
@@ -1439,7 +1449,16 @@
"calendar": "Calendario",
"calendar_uri": "URL del calendario",
"scheduling_uri": "URL de programación",
"freebusy_uri": "URL de disponibilidad"
"freebusy_uri": "URL de disponibilidad",
"cert_issuer": "Emisor",
"cert_expires": "Caduca",
"cert_expired": "Caducado",
"cert_fingerprint": "Huella digital",
"cert_algorithm": "Algoritmo",
"import_to_smime": "Importar a S/MIME",
"cert_already_imported": "Certificado ya importado",
"cert_imported": "Certificado importado",
"cert_import_failed": "Error al importar el certificado"
},
"form": {
"create_title": "Nuevo contacto",
@@ -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": "Tus certificados",
"your_certificates_desc": "Importa y administra tus certificados S/MIME para firmar y cifrar correos",
"recipient_certificates": "Certificados de destinatarios",
"recipient_certificates_desc": "Certificados públicos para cifrar correos a destinatarios",
"identity_bindings": "Vinculaciones de identidad y clave",
"identity_bindings_desc": "Vincula certificados S/MIME a tus identidades de correo",
"defaults_title": "Valores predeterminados",
"defaults_desc": "Configura el comportamiento predeterminado de firma y cifrado",
"import_pkcs12": "Importar PKCS#12 (.p12/.pfx)",
"import_public_cert": "Importar certificado",
"no_certificates": "Aún no se han importado certificados",
"no_recipient_certs": "No hay certificados de destinatarios",
"expires": "Caduca",
"expired": "Caducado",
"bound_to": "Vinculado a",
"no_key_bound": "Ninguno",
"lock": "Bloquear clave",
"unlock": "Desbloquear clave",
"details": "Ver detalles",
"delete": "Eliminar",
"encrypt_by_default": "Cifrar por defecto",
"encrypt_by_default_desc": "Cifrar correos automáticamente cuando todos los destinatarios tengan certificados",
"remember_unlocked": "Recordar claves desbloqueadas",
"remember_unlocked_desc": "Mantener las claves desbloqueadas durante esta sesión del navegador",
"sign_default_for": "Firmar por defecto para",
"enter_p12_passphrase": "Introducir la contraseña de PKCS#12",
"p12_passphrase_desc": "Introduce la contraseña que protege este archivo de certificado",
"enter_storage_passphrase": "Definir contraseña de almacenamiento",
"storage_passphrase_desc": "Elige una contraseña para proteger esta clave en tu navegador",
"next": "Siguiente",
"import": "Importar",
"unlock_key": "Desbloquear clave",
"unlock_key_desc": "Introduce la contraseña de almacenamiento para desbloquear esta clave para firmar o descifrar",
"passphrase_placeholder": "Introduce la contraseña",
"confirm_passphrase_placeholder": "Confirma la contraseña",
"passphrase_mismatch": "Las contraseñas no coinciden",
"cancel": "Cancelar",
"processing": "Procesando…",
"close": "Cerrar",
"certificate_details": "Detalles del certificado",
"cert_subject": "Asunto",
"cert_issuer": "Emisor",
"cert_email": "Correo electrónico",
"cert_serial": "Número de serie",
"cert_validity": "Validez",
"cert_fingerprint": "Huella digital (SHA-256)",
"cert_algorithm": "Algoritmo",
"cert_capabilities": "Capacidades",
"cert_source": "Origen",
"cert_expired": "Este certificado ha caducado",
"cert_not_yet_valid": "Este certificado aún no es válido",
"cap_sign": "Firma",
"cap_encrypt": "Cifrado",
"cap_none": "Ninguno",
"show_passphrase": "Mostrar contraseña",
"hide_passphrase": "Ocultar contraseña",
"sign_toggle": "Firmar",
"encrypt_toggle": "Cifrar",
"missing_recipient_certs": "Faltan certificados para: {emails}",
"missing_sender_cert": "No hay un certificado vinculado a esta identidad",
"status_encrypted_ok": "Este mensaje fue cifrado",
"status_encrypted_no_key": "Este mensaje está cifrado, pero no se encontró una clave coincidente",
"status_encrypted_failed": "No se pudo descifrar este mensaje",
"status_signed_valid": "Firma verificada",
"status_signed_invalid": "La verificación de la firma falló",
"status_signed_expired_cert": "Firmado con un certificado caducado",
"status_signed_mismatch": "La firma es válida, pero el firmante no coincide con el remitente",
"status_unsupported": "Formato S/MIME no compatible",
"auto_import_signer_certs": "Importar automáticamente certificados de firmantes",
"auto_import_signer_certs_desc": "Guardar automáticamente certificados de correos firmados verificados para futuros cifrados",
"export": "Exportar",
"enter_export_passphrase": "Definir contraseña de exportación",
"export_passphrase_desc": "Elige una contraseña para proteger el archivo PKCS#12 exportado",
"export_storage_desc": "Introduce la contraseña de almacenamiento para descifrar la clave antes de exportarla",
"incorrect_passphrase": "Contraseña incorrecta"
}
}