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:
@@ -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 →"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 →"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user