feat(license): Lizenz-System mit Ed25519-Verify gegen license.netcell-it.com

Portiert mail-gateway/internal/license (Verify, Cache, Trial, Signature)
+ DB-Mirror (internal/services/license) + REST-Handler (status/verify/key/clear)
+ UI-Page /license (Activate, Status, Limits, Features, Re-verify)
+ <LicenseBanner /> neben UpdateBanner (trial-expiring, expired, verify-failed)
+ Scheduler: täglich Re-verify (24h-Tick)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Debian
2026-05-11 13:41:16 +02:00
parent 1324a34f11
commit 62505d547c
17 changed files with 1278 additions and 10 deletions

View File

@@ -18,6 +18,7 @@
"ntp": "Zeit (NTP)",
"firewall": "Firewall",
"cluster": "Cluster",
"license": "Lizenz",
"settings": "Einstellungen",
"section": {
"overview": "Übersicht",
@@ -551,5 +552,42 @@
"download": "Download",
"copy": "Kopieren",
"copied": "Kopiert"
},
"license": {
"title": "Lizenz",
"status": "Status",
"product": "Produkt",
"key": "Lizenz-Schlüssel",
"noKey": "Kein Schlüssel hinterlegt",
"validUntil": "Gültig bis",
"expired": "Abgelaufen",
"daysLeft": "noch {{days}} Tage",
"lastVerifiedAt": "Letzte Verifizierung",
"verifiedBy": "Verifiziert von",
"limits": "Limits",
"unlimited": "Unbegrenzt",
"features": "Features",
"reverify": "Erneut prüfen",
"reverified": "Lizenz erfolgreich verifiziert",
"enterKey": "Schlüssel eingeben",
"replaceKey": "Schlüssel ersetzen",
"enterKeyHint": "Lizenz-Schlüssel aus dem Self-Service-Portal von license.netcell-it.com einfügen.",
"activate": "Aktivieren",
"saved": "Lizenz gespeichert und verifiziert",
"savedButVerifyFailed": "Schlüssel gespeichert, aber Server-Verifizierung fehlgeschlagen",
"clearKey": "Schlüssel entfernen",
"cleared": "Lizenz entfernt — System fällt auf Trial zurück",
"confirmClear": "Lizenz-Schlüssel wirklich entfernen?",
"confirmClearHint": "System fällt auf Trial-Modus zurück, sobald der Schlüssel gelöscht wird.",
"lastVerifyFailed": "Letzte Server-Verifizierung fehlgeschlagen",
"trialExpiring": "Trial läuft in {{days}} Tag(en) ab",
"trialExpiringHint": "Lizenz aktivieren, bevor die Trial-Periode endet."
},
"licenseBanner": {
"expired": "Lizenz abgelaufen oder ungültig.",
"trialExpiring": "Trial läuft in {{days}} Tag(en) ab.",
"verifyFailed": "Lizenz-Verifizierung fehlgeschlagen",
"cta": "Jetzt aktivieren →",
"openPage": "Lizenz-Seite öffnen →"
}
}

View File

@@ -18,6 +18,7 @@
"ntp": "Time (NTP)",
"firewall": "Firewall",
"cluster": "Cluster",
"license": "License",
"settings": "Settings",
"section": {
"overview": "Overview",
@@ -551,5 +552,42 @@
"download": "Download",
"copy": "Copy",
"copied": "Copied"
},
"license": {
"title": "License",
"status": "Status",
"product": "Product",
"key": "License key",
"noKey": "No key configured",
"validUntil": "Valid until",
"expired": "Expired",
"daysLeft": "{{days}} days left",
"lastVerifiedAt": "Last verified",
"verifiedBy": "Verified by",
"limits": "Limits",
"unlimited": "Unlimited",
"features": "Features",
"reverify": "Re-verify",
"reverified": "License re-verified successfully",
"enterKey": "Enter key",
"replaceKey": "Replace key",
"enterKeyHint": "Paste your license key from the self-service portal at license.netcell-it.com.",
"activate": "Activate",
"saved": "License saved and verified",
"savedButVerifyFailed": "Key saved but server-verify failed",
"clearKey": "Remove key",
"cleared": "License removed — system falls back to trial",
"confirmClear": "Really remove the license key?",
"confirmClearHint": "The system will fall back to trial-mode once the key is deleted.",
"lastVerifyFailed": "Last server verify failed",
"trialExpiring": "Trial expires in {{days}} day(s)",
"trialExpiringHint": "Activate a license before the trial period ends."
},
"licenseBanner": {
"expired": "License expired or invalid.",
"trialExpiring": "Trial expires in {{days}} day(s).",
"verifyFailed": "License verification failed",
"cta": "Activate now →",
"openPage": "Open license page →"
}
}