feat(cert-manager): cert role badges + ZIP download in split view

- API: detectCertRole() classifies certs as root/intermediate/end-entity
  via basicConstraints.cA + self-signed check (subject.hash === issuer.hash)
- API: SplitEntry gains certRole field; filenames now reflect role
  (root-ca.pem, intermediate-1.pem, cert.pem)
- Web: SplitTab shows colour-coded role badge per cert
  (red=Root-CA, amber=Zwischen-CA, blue=Zertifikat)
- Web: "Alle als ZIP herunterladen" button via fflate (client-side)
- i18n: add certRole labels + downloadZip action key (de + en)
- i18n: add missing accentColor* and deleteAvatar* keys (de + en)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 10:40:39 +02:00
parent 7da1c19b31
commit 819d50a222
7 changed files with 130 additions and 25 deletions
+16 -1
View File
@@ -125,7 +125,16 @@
"uploadSuccess": "Profilbild wurde erfolgreich aktualisiert.",
"uploadError": "Hochladen fehlgeschlagen. Bitte pruefen Sie das Dateiformat und die Dateigröße.",
"ldapManagedNotice": "Ihr Passwort wird ueber das Verzeichnis (LDAP) verwaltet. Eine Aenderung ist hier nicht moeglich.",
"passwordSectionTitle": "Passwort aendern"
"passwordSectionTitle": "Passwort aendern",
"accentColorLabel": "Akzentfarbe",
"accentColorHelp": "Passt die Hauptfarbe der Oberflaeche an.",
"accentColorReset": "Zuruecksetzen",
"accentColorSave": "Farbe speichern",
"accentColorSuccess": "Akzentfarbe erfolgreich gespeichert.",
"accentColorError": "Speichern fehlgeschlagen.",
"deleteAvatarCta": "Bild loeschen",
"deleteAvatarSuccess": "Profilbild erfolgreich geloescht.",
"deleteAvatarError": "Loeschen fehlgeschlagen."
},
"sourceDeleteConfirm": "Moechten Sie diese Kalenderquelle wirklich loeschen?",
"sourceDeleteCta": "Quelle loeschen",
@@ -463,8 +472,14 @@
"merge": "Zusammenfuehren",
"convert": "Konvertieren",
"download": "Herunterladen",
"downloadZip": "Alle als ZIP herunterladen",
"processing": "Wird verarbeitet..."
},
"certRole": {
"root": "Root-CA",
"intermediate": "Zwischen-CA",
"end-entity": "Zertifikat"
},
"emptyState": {
"inspect": "Kein Zertifikat geladen.",
"inspectBody": "Lade eine Datei hoch oder fuege PEM-Text ein.",