fix(license): Rejection-Reason anzeigen + Placeholder NETC- korrigieren

Wenn der License-Server valid:false zurückgibt, wird payload.reason
jetzt als roter Alert angezeigt — bisher war der Grund nicht sichtbar
und der Operator sah nur "Abgelaufen" ohne Erklärung.

Formular-Placeholder NMG-XXXX → NETC-XXXX (mail-gateway copy-paste).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Debian
2026-05-28 15:06:48 +02:00
parent 6a9019058a
commit 2a76a6599b
7 changed files with 18 additions and 5 deletions

View File

@@ -1 +1 @@
1.1.129 1.1.130

View File

@@ -60,7 +60,7 @@ import (
usersvc "git.netcell-it.de/projekte/edgeguard-native/internal/services/users" usersvc "git.netcell-it.de/projekte/edgeguard-native/internal/services/users"
) )
var version = "1.1.129" var version = "1.1.130"
func main() { func main() {
addr := os.Getenv("EDGEGUARD_API_ADDR") addr := os.Getenv("EDGEGUARD_API_ADDR")

View File

@@ -11,7 +11,7 @@ import (
"git.netcell-it.de/projekte/edgeguard-native/internal/services/setup" "git.netcell-it.de/projekte/edgeguard-native/internal/services/setup"
) )
var version = "1.1.129" var version = "1.1.130"
const usage = `edgeguard-ctl — EdgeGuard CLI const usage = `edgeguard-ctl — EdgeGuard CLI

View File

@@ -41,7 +41,7 @@ import (
"git.netcell-it.de/projekte/edgeguard-native/internal/services/tlscerts" "git.netcell-it.de/projekte/edgeguard-native/internal/services/tlscerts"
) )
var version = "1.1.129" var version = "1.1.130"
const ( const (
// renewTickInterval — how often we re-evaluate expiring certs. // renewTickInterval — how often we re-evaluate expiring certs.

View File

@@ -1071,6 +1071,7 @@
"confirmClear": "Lizenz-Schlüssel wirklich entfernen?", "confirmClear": "Lizenz-Schlüssel wirklich entfernen?",
"confirmClearHint": "System fällt auf Trial-Modus zurück, sobald der Schlüssel gelöscht wird.", "confirmClearHint": "System fällt auf Trial-Modus zurück, sobald der Schlüssel gelöscht wird.",
"lastVerifyFailed": "Letzte Server-Verifizierung fehlgeschlagen", "lastVerifyFailed": "Letzte Server-Verifizierung fehlgeschlagen",
"serverRejected": "Lizenz vom Server abgelehnt",
"trialExpiring": "Trial läuft in {{days}} Tag(en) ab", "trialExpiring": "Trial läuft in {{days}} Tag(en) ab",
"trialExpiringHint": "Lizenz aktivieren, bevor die Trial-Periode endet.", "trialExpiringHint": "Lizenz aktivieren, bevor die Trial-Periode endet.",
"tagActive": "Aktiv", "tagActive": "Aktiv",

View File

@@ -1071,6 +1071,7 @@
"confirmClear": "Really remove the license key?", "confirmClear": "Really remove the license key?",
"confirmClearHint": "The system will fall back to trial-mode once the key is deleted.", "confirmClearHint": "The system will fall back to trial-mode once the key is deleted.",
"lastVerifyFailed": "Last server verify failed", "lastVerifyFailed": "Last server verify failed",
"serverRejected": "License rejected by server",
"trialExpiring": "Trial expires in {{days}} day(s)", "trialExpiring": "Trial expires in {{days}} day(s)",
"trialExpiringHint": "Activate a license before the trial period ends.", "trialExpiringHint": "Activate a license before the trial period ends.",
"tagActive": "Active", "tagActive": "Active",

View File

@@ -25,6 +25,7 @@ interface LicenseStatus {
payload?: { payload?: {
product?: string product?: string
type?: string type?: string
reason?: string
limits?: Record<string, number> limits?: Record<string, number>
features?: Record<string, boolean> features?: Record<string, boolean>
} }
@@ -130,6 +131,16 @@ export default function LicensePage() {
/> />
)} )}
{status?.status !== 'active' && status?.payload?.reason && (
<Alert
type="error"
showIcon
message={t('license.serverRejected')}
description={status.payload.reason}
className="mb-16"
/>
)}
{isTrial && days !== null && days <= 14 && ( {isTrial && days !== null && days <= 14 && (
<Alert <Alert
type={days <= 3 ? 'error' : 'warning'} type={days <= 3 ? 'error' : 'warning'}
@@ -226,7 +237,7 @@ export default function LicensePage() {
<Paragraph type="secondary">{t('license.enterKeyHint')}</Paragraph> <Paragraph type="secondary">{t('license.enterKeyHint')}</Paragraph>
<Form form={form} layout="vertical" onFinish={(v) => setKey.mutate(v.license_key.trim())}> <Form form={form} layout="vertical" onFinish={(v) => setKey.mutate(v.license_key.trim())}>
<Form.Item name="license_key" label={t('license.key')} rules={[{ required: true }]}> <Form.Item name="license_key" label={t('license.key')} rules={[{ required: true }]}>
<Input.TextArea rows={3} placeholder="NMG-XXXX-XXXX-XXXX-XXXX" /> <Input.TextArea rows={3} placeholder="NETC-XXXX-XXXX-XXXX-XXXX" />
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>