Overview

Licensing

Questa pagina spiega il licensing dal punto di vista utente finale: cosa serve, come ottenere la licenza e come applicarla.

Come ottenere una licenza

Consulta i piani, le feature incluse per ciascun tier (Developer / Professional / Software House) e procedi all'acquisto sul sito pubblico:

Dopo l'acquisto riceverai una mail con license-payload + license-signature da installare come descritto nella "Procedura utente finale" qui sotto.

Come funziona

  • La licenza e valida solo se:
  • firma corretta.
  • machineFingerprint del server corrente presente nella lista machineFingerprints del payload firmato.
  • licenza non scaduta (expiryUtc). Una licenza che scade mentre il server e' acceso smette di valere entro 5 minuti (la validazione resta in cache per quel tempo), senza bisogno di riavvii.
  • manutenzione: la versione installata non e' piu' recente della fine manutenzione (maintenanceExpiryUtc). Se la build e' successiva, la licenza non e' valida (maintenance_expired), anche se non e' scaduta.
  • Se la licenza non e valida, la lettura dati (getFlatRecordData) viene limitata a massimo 20 record. Inoltre l'hook host customizeSelect viene bypassato (non invocato).

Dove trovo il machineFingerprint

Endpoint backend:

  • GET /api/Meta/LicenseStatus → campo machineFingerprint (sempre disponibile, anche senza licenza).
  • Durante il first-run lo espone anche GET /api/Meta/FirstRunStatus.
  • Host la cui identita' cambia a ogni avvio (es. container con machine-id rigenerato): l'impronta si fissa con la variabile d'ambiente WUIC_LICENSE_MACHINE_FINGERPRINT, impostata sull'host. Non esiste un equivalente negli appsettings: chi puo' modificare la configurazione dall'applicazione non deve poter far risultare il server come un'altra macchina.

Procedura utente finale

1. Recupera machineFingerprint dal tuo host.

2. Invia il valore al fornitore/licensor.

3. Ricevi i valori licenza:

  • license-payload
  • license-signature

4. Incolla i valori dall'interfaccia: Amministrazione > Editor AppSettings, sezione

License (campi License email, License payload, License signature), poi salva.

La chiave pubblica che verifica la firma e' incorporata nel framework: non si configura

(l'editor non ha piu' il campo Public key (PEM) e license-public-key-pem negli appsettings e' ignorato). In alternativa si possono scrivere a mano nella sezione

AppSettings del file appsettings.{Environment}.json dell'host in esecuzione.

L'editor AppSettings richiede una sessione con ruolo superadmin, verificato lato server.

5. Verifica lo stato licenza:

  • da API: GET /api/Meta/LicenseStatus, atteso licenseValid = true;
  • oppure dalla pagina stessa, che rilegge la licenza subito dopo il salvataggio.

Riavviare il backend non serve, se passi dall'editor. Salvando license-payload /

license-signature dall'AppSettings Editor il backend ricarica da se' il servizio di

validazione, e la licenza vale dalla richiesta successiva. Il riavvio serve solo nell'altro

caso, quando i valori vengono scritti a mano nel file: quello viene riletto all'avvio.

Licenza multi-macchina

Un'unica licenza puo autorizzare piu macchine includendo piu valori in machineFingerprints.

Troubleshooting rapido

  • licenseReason = invalid_signature:
  • payload/firma non coerenti tra loro (copiati incompleti o modificati) oppure firmati con una chiave diversa da quella del fornitore.
  • licenseReason = machine_fingerprint_not_authorized:
  • il fingerprint della macchina corrente non e presente nella licenza ricevuta.
  • licenseReason = machine_fingerprint_missing:
  • il runtime non riesce a calcolare il fingerprint locale.
  • licenseReason = license_expired:
  • la licenza e scaduta, richiedi rinnovo.
  • licenseReason = maintenance_expired:
  • la manutenzione e' terminata prima della data di build della versione installata: installa una versione rilasciata entro la fine della manutenzione oppure rinnova la manutenzione.

Screenshot

licensing / LicenseStatus API response (licenseValid=true, tier=developer)
licensing / LicenseStatus API response (licenseValid=true, tier=developer)