feat(licence): refuser les licences non liees a un poste

Une cle flottante etait sortie. Un schema hors ligne n'a pas de
revocation — rien ne peut aller dire a un exe installe qu'une cle ne vaut
plus — donc la seule prise est de cesser d'accepter toute la classe.

MachineMatches exige desormais une empreinte, et -Floating disparait du
script : il ne peut plus fabriquer une cle que l'exe rejetterait.

Effet de bord assume : plus de licence de site, et un poste sans
empreinte exploitable n'est plus licenciable du tout — mieux qu'une
empreinte degeneree qui ouvrirait partout.

Verifie : liee a ce poste acceptee, liee a un autre refusee, les deux
flottantes deja emises refusees.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-05 15:38:07 +01:00
parent 405ac7fac4
commit 988694b20d
3 changed files with 40 additions and 31 deletions
+13 -18
View File
@@ -15,7 +15,6 @@ param(
[string]$For,
[string]$Name = '',
[string]$Machine,
[switch]$Floating,
[string]$KeyFile = "$PSScriptRoot\licence-private.key"
)
@@ -79,17 +78,17 @@ $p.Q = $q
$ecdsa = [System.Security.Cryptography.ECDsa]::Create($p)
# LE LIAGE AU POSTE EST LE DEFAUT, ET IL FAUT LE DIRE POUR Y COUPER.
# LE LIAGE AU POSTE EST OBLIGATOIRE, ET IL N'Y A PLUS DE DEROGATION.
#
# Une licence flottante s'active sur autant de machines qu'on veut : c'est
# parfois voulu (licence de site), jamais par distraction. -Floating l'exige
# explicitement, sinon l'oubli de -Machine produirait en silence la licence
# la plus permissive - exactement le defaut qu'on ne veut pas.
# Les licences flottantes (sans champ m) existaient ; l'exe les refuse
# desormais, ce qui etait la seule facon d'annuler celle qui etait sortie -
# un schema hors ligne n'a pas de revocation. En emettre une aujourd'hui
# produirait une cle que l'application rejettera : autant ne pas pouvoir.
#
# L'empreinte est celle qu'affiche l'ecran d'activation sur le poste du
# client : il faut donc qu'il ait installe l'application AVANT qu'on emette
# sa licence. C'est le prix du liage.
if (-not $Machine -and -not $Floating) {
if (-not $Machine) {
throw @'
Il manque -Machine <empreinte>.
@@ -98,8 +97,7 @@ Fais-toi envoyer l'empreinte affichee sur l'ecran d'activation du poste
.\licence.ps1 -For "a@b.com" -Name "Nom" -Machine "XXXX-XXXX-XXXX-XXXX"
Pour une licence NON liee, qui s'activera sur n'importe quelle machine,
demande-la explicitement avec -Floating.
Une licence non liee n'est plus emettable : l'application la refuserait.
'@
}
@@ -107,13 +105,11 @@ demande-la explicitement avec -Floating.
# Pas d'expiration - une date qu'on fait respecter avec l'horloge de la
# machine du client ne prouve rien. A ajouter le jour ou on vend un abonnement.
$payload = [ordered]@{ n = $Name; e = $For; d = (Get-Date).ToString('yyyy-MM-dd') }
if ($Machine) {
# Les tirets ne sont qu'une aide a la recopie ; Delphi compare le condense
# nu, en minuscules.
$payload.m = ($Machine -replace '[^0-9A-Fa-f]', '').ToLower()
if ($payload.m.Length -ne 16) {
throw "Empreinte attendue : 16 caracteres hexadecimaux (recu $($payload.m.Length))."
}
# Les tirets ne sont qu'une aide a la recopie ; Delphi compare le condense
# nu, en minuscules.
$payload.m = ($Machine -replace '[^0-9A-Fa-f]', '').ToLower()
if ($payload.m.Length -ne 16) {
throw "Empreinte attendue : 16 caracteres hexadecimaux (recu $($payload.m.Length))."
}
$json = ($payload | ConvertTo-Json -Compress)
$bytes = [Text.Encoding]::UTF8.GetBytes($json)
@@ -122,8 +118,7 @@ $sig = $ecdsa.SignData($bytes, [System.Security.Cryptography.HashAlgorithmNa
$licence = (ToB64Url $bytes) + '.' + (ToB64Url $sig)
''
if ($Machine) { 'Licence pour ' + $For + ' — liee au poste ' + $Machine }
else { 'Licence pour ' + $For + ' — FLOTTANTE (toute machine)' }
'Licence pour ' + $For + ' — liee au poste ' + $Machine
''
$licence
''