From 61ec5ff7a15e5041d26468e26a4589ba386ee9bb Mon Sep 17 00:00:00 2001 From: r-zakarya <82443831+r-zakarya@users.noreply.github.com> Date: Sat, 5 Sep 2026 16:00:50 +0100 Subject: [PATCH] fix(licence): l'empreinte ne depend plus de l'ordre de demarrage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BoardUUID s'appuyait sur un COM initialise par quelqu'un d'autre. Appele apres WebView2 il lisait le vrai UUID de carte mere, appele avant il echouait et retombait sur MachineGuid : deux empreintes pour une seule machine, et une licence liee a l'une que l'autre refuse. Il suffisait que licence/status parte avant l'init du navigateur pour verrouiller l'utilisateur hors de son coffre. CoInitializeEx est desormais appele sur place. Pas de CoUninitialize symetrique : essaye, il rend une violation d'acces — les mandataires WMI et le cache de type-info de ComObj se liberent plus tard, dans un appartement qu'on vient de fermer. Verifie avec un harnais qui n'initialise PAS COM : il rend maintenant la meme empreinte que l'application. Co-Authored-By: Claude Opus 5 --- CLAUDE.md | 9 ++++++++- delphi-backend/Source/PM.MachineId.pas | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index 47bd892..3e1ae02 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -293,7 +293,14 @@ que dans une charge utile dont on sait deja qu'elle vient de nous. courriel, et l'UUID brut de la carte mere est un identifiant materiel unique qui n'a pas a circuler en clair ni a finir dans nos journaux. - UUID lu par WMI (`Win32_ComputerSystemProduct`, COM via `Winapi.ActiveX` pour - `IEnumVariant`). **Un UUID nul ou tout a FF est rejete** : beaucoup de VM et + `IEnumVariant`). **`BoardUUID` appelle `CoInitializeEx` lui-meme** : sans ca + l'empreinte dependait de qui avait demarre avant — apres l'init de WebView2 + elle lisait le vrai UUID, avant elle echouait et retombait sur `MachineGuid`, + soit DEUX empreintes pour une seule machine et une licence liee a l'une que + l'autre refuse. Un identifiant qui depend de l'ordre de demarrage n'est pas un + identifiant. **Et on ne fait PAS de `CoUninitialize` symetrique** : il parait + propre et se paie d'une violation d'acces, les mandataires WMI et le cache de + type-info de ComObj se liberant plus tard, dans un appartement ferme. **Un UUID nul ou tout a FF est rejete** : beaucoup de VM et d'images clonees l'annoncent, et s'en contenter ferait tomber des postes differents sur la MEME empreinte — une licence emise pour l'un ouvrirait chez l'autre. Repli sur `MachineGuid` (HKLM\...\Cryptography), distinct par diff --git a/delphi-backend/Source/PM.MachineId.pas b/delphi-backend/Source/PM.MachineId.pas index 93c9c9b..ad38cb9 100644 --- a/delphi-backend/Source/PM.MachineId.pas +++ b/delphi-backend/Source/PM.MachineId.pas @@ -53,6 +53,23 @@ var LFetched: LongWord; begin Result := ''; + + // COM DOIT ETRE INITIALISE ICI, PAS AILLEURS PAR CHANCE. + // + // Sans ca, l'empreinte depend de qui a demarre avant nous : appelee apres + // l'initialisation de WebView2 elle lit le vrai UUID de la carte mere, + // appelee avant elle echoue et retombe sur MachineGuid — DEUX empreintes + // differentes pour une seule machine, et une licence liee a l'une que + // l'autre refuse. Un identifiant qui depend de l'ordre de demarrage n'est + // pas un identifiant. + // + // ET ON NE LIBERE PAS. Un CoUninitialize symetrique parait propre et se + // paie d'une violation d'acces : les mandataires WMI et le cache de + // type-info de ComObj survivent a l'appel et se liberent plus tard, dans un + // appartement qui n'existe plus. Laisser l'appartement ouvert pour la duree + // du processus ne coute rien ici — cette application heberge WebView2, donc + // COM y est de toute facon initialise et le reste. + CoInitializeEx(nil, COINIT_APARTMENTTHREADED); try LLocator := CreateOleObject('WbemScripting.SWbemLocator'); LServices := LLocator.ConnectServer('.', 'root\CIMV2');