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": "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 →"
}
}