bug: un jeton d'activation d'une autre machine bloque la licence en Gratuite, sans issue dans l'interface #360
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#360
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Trouvé en vérifiant la revue de la PR #359 (#270). Un jeton d'activation signé pour une autre machine fait retomber la licence en édition Gratuite, et l'interface n'offre aucun moyen d'en sortir. Le cas se produit après une réinstallation du système ou une migration de poste, dès que le dossier de données de l'application est restauré.
Mécanisme (vérifié dans le code le 2026-09-26)
current_entitlements→resolve_license_entitlements(src-tauri/src/commands/license_commands.rs) : siactivation.tokenexiste et ne valide pas contre l'identifiant de cette machine, l'édition retombe en Gratuite (règle CWE-863 de l'ADR 0017).machine_uid::get()(/etc/machine-idsous Linux,MachineGuidsous Windows). Il change quand le système est réinstallé ou quand on passe à un autre poste.app_data_dir, identifiantcom.simpl.resultat) contientlicense.keyetactivation.token. Un utilisateur qui le restaure après une réinstallation, ou qui le copie sur un nouveau poste, se retrouve donc en Gratuite.hasLicense = edition !== "free",LicenseCard.tsx:17) : aucun bouton « Activer » n'est proposé.store_license(l.170-177) n'écrit quelicense.key, l'ancien jeton reste et l'édition reste Gratuite.activation.token.machine_id_internal(l.362) annonce pourtant « the user must re-activate (handled in Issue #53) ». La réactivation existe, mais elle est hors d'atteinte dans cet état.Ce que la règle protège réellement
Une copie de
license.keyseule, sans jeton, donne l'édition complète : l'état « pré-activation » est toléré. Faire retomber en Gratuite une machine dont le jeton ne correspond pas n'empêche donc pas la copie. Cela ne pénalise qu'un utilisateur légitime qui a restauré ses données. Le jeton reste en revanche indispensable côté serveur pour les cours du Bilan (/v1/prices), qui le vérifie.Pistes (à trancher)
store_licensesupprime un jeton qui ne correspond pas à cette machine.Liens
Tranchée par l'analyse de #347 (2026-09-29) : piste (c), élargie. Décision D12 : le jeton d'activation ne fait plus jamais retomber en Gratuite. L'édition suit la seule clé ; le jeton ne sert plus qu'à l'état « Activée » de la carte et aux cours du Bilan, que le serveur vérifie. Après une réinstallation avec restauration des données, la clé garde son édition, et la section Machines reste visible avec « Non activée » et « Activer ».
Motif : une
license.keycopiée seule garde déjà son édition (état pré-activation toléré), donc la règle ne protégeait rien et ne pénalisait que ce cas légitime. L'ADR 0017 sera amendé (contrainte 2 et règle CWE-863 locale).Réalisée par #347, qui fermera cette issue à son merge.