feat(licence): ecran d'activation au demarrage

ensureLicence() en tete d'init(), avant tout le reste : un ecran
d'authentification qui s'affiche puis se fait recouvrir donnerait
l'impression que le coffre etait accessible.

L'ecran reprend les classes de l'ecran d'authentification — zero style
nouveau hormis un z-index. Le statut est demande deux fois avant de le
montrer : un demarrage a froid lent manquerait la fenetre de reponse, et
le silence se lirait comme un refus.

Une cle refusee ne dit pas pourquoi, et le journal note le verdict sans
jamais la cle.

ATTENTION : tant que LicencePublicKeyBlob est a zero, l'ecran est
infranchissable. Poser la cle publique avant de deployer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-05 14:58:19 +01:00
parent 960d2b388a
commit cd6e70449d
5 changed files with 156 additions and 1 deletions
+30
View File
@@ -286,6 +286,36 @@ tools\licence.ps1 -For "a@b.com" -Name "Ami" # une licence
`VerifyAgainstKey` prend la cle publique en parametre exactement pour que
l'auto-test n'ait pas besoin d'un second jeu de constantes de production.
### Ecran d'activation au demarrage
`ensureLicence()` (js/app.js) est appele **en tete d'`init()`**, avant tout le
reste : un ecran d'authentification qui s'affiche puis se fait recouvrir
donnerait l'impression que le coffre etait accessible. Il ne rend la main que
sur une licence acceptee — pas de bouton « plus tard ».
- Balisage `#licenceScreen` dans index.html, **place apres `#authScreen`** et
reprenant ses classes (`.auth-screen`, `.auth-card`, `.auth-hint`,
`.auth-form`) : zero style nouveau, sauf `#licenceScreen { z-index: 300 }`
pour passer au-dessus du bandeau (100) et du voile d'attente (200).
- Pont : `cmd://licence/status` et `cmd://licence/activate?key=`, reponse par
`Bridge.onLicenceResult(ok, porteur)`. La cle est du base64url plus un point,
donc rien a encoder de special sur le trajet.
- **Le statut est demande deux fois** avant de montrer l'ecran : un demarrage a
froid lent peut manquer la fenetre de 3 s, et le silence se lirait comme un
refus — presenter l'activation a quelqu'un qui a deja paye coute plus cher
qu'un second appel.
- Une cle refusee ne dit **pas pourquoi** : signature invalide, recopie fautive
et charge utile trafiquee se ressemblent, et detailler n'aiderait que celui
qui essaie d'en fabriquer une. Le journal note le verdict, **jamais la cle**.
- Hors du navigateur hote (`Bridge.active` faux : dev en navigateur, harnais de
test) il n'y a pas de licence a verifier — la porte est ouverte.
**ORDRE OBLIGATOIRE.** Tant que `LicencePublicKeyBlob` est a zero, aucune
licence n'est valide et l'ecran d'activation est **infranchissable** — l'exe
construit ne s'ouvre plus. Poser la cle publique AVANT de deployer :
`-Init` → coller les 72 octets → reconstruire → `-For` pour s'emettre une
licence a soi.
**Ce que ca arrete** : sans la cle privee, personne ne fabrique de licence
valable. **Ce que ca n'arrete pas** : rapiecer l'exe pour sauter l'appel — vrai
de tout schema hors ligne. La seule parade reelle serait de deporter une