feat(licence): lier la licence au poste (carte mere + disque)
C'etait la decision prise, et je l'avais mal lue : "pour le moment 1" repondait a la question 1, pas "une seule licence". PM.MachineId melange l'UUID de la carte mere (WMI) et la serie du volume systeme, puis n'en publie que 16 hexa : l'empreinte se recopie dans un courriel, l'UUID brut n'a pas a circuler. Un UUID nul ou tout a FF est rejete — VM et images clonees l'annoncent, et deux postes tomberaient alors sur la meme empreinte. Le champ m est compare APRES la signature. m absent = licence flottante, acceptee : seule la cle privee peut en emettre, et le champ ne peut pas etre retire sans casser la signature. Cote script -Machine est obligatoire sauf -Floating explicite. L'ecran d'activation affiche l'Installation ID : une licence liee ne peut plus etre emise avant l'installation. Verifie sur ce poste : liee a lui acceptee, liee a un autre refusee, flottante acceptee. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
+36
-1
@@ -14,6 +14,8 @@ param(
|
||||
[switch]$Init,
|
||||
[string]$For,
|
||||
[string]$Name = '',
|
||||
[string]$Machine,
|
||||
[switch]$Floating,
|
||||
[string]$KeyFile = "$PSScriptRoot\licence-private.key"
|
||||
)
|
||||
|
||||
@@ -77,10 +79,42 @@ $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.
|
||||
#
|
||||
# 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.
|
||||
#
|
||||
# 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) {
|
||||
throw @'
|
||||
Il manque -Machine <empreinte>.
|
||||
|
||||
Fais-toi envoyer l'empreinte affichee sur l'ecran d'activation du poste
|
||||
(format XXXX-XXXX-XXXX-XXXX), puis :
|
||||
|
||||
.\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.
|
||||
'@
|
||||
}
|
||||
|
||||
# Charge utile courte : elle voyage dans la cle que l'utilisateur recopie.
|
||||
# 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))."
|
||||
}
|
||||
}
|
||||
$json = ($payload | ConvertTo-Json -Compress)
|
||||
$bytes = [Text.Encoding]::UTF8.GetBytes($json)
|
||||
$sig = $ecdsa.SignData($bytes, [System.Security.Cryptography.HashAlgorithmName]::SHA256)
|
||||
@@ -88,7 +122,8 @@ $sig = $ecdsa.SignData($bytes, [System.Security.Cryptography.HashAlgorithmNa
|
||||
$licence = (ToB64Url $bytes) + '.' + (ToB64Url $sig)
|
||||
|
||||
''
|
||||
'Licence pour ' + $For
|
||||
if ($Machine) { 'Licence pour ' + $For + ' — liee au poste ' + $Machine }
|
||||
else { 'Licence pour ' + $For + ' — FLOTTANTE (toute machine)' }
|
||||
''
|
||||
$licence
|
||||
''
|
||||
|
||||
Reference in New Issue
Block a user