docs(licence): scenario d'essai, et le bouton qui le rend jouable

LICENCE-TESTS.md : cinq series. B eprouve ce qui doit tomber (chaine
quelconque, licence tronquee, charge utile trafiquee, autre poste, autre
paire de cles), C le risque symetrique et plus couteux — refuser un
client qui a paye (espaces colles, retour a la ligne, redemarrage
machine). D est dediee a la stabilite de l'empreinte, le defaut deja
rencontre. E delimite la portee de l'activation.

Le plan citait cmd://licence/clear sans moyen de l'appeler : un bouton
"Deactivate (debug)" au bas de Settings -> Licence, revele seulement
quand config.txt existe. Il donne au passage son unique appelant a
ClearLicence, qui etait du code mort.

Le document dit aussi ce qu'aucun essai ne prouve : rapiecer l'exe reste
possible, il n'y a pas de revocation, et le brouillage n'est pas du
chiffrement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-05 18:06:45 +01:00
parent fc945ac6ab
commit 253e81252c
5 changed files with 205 additions and 2 deletions
+25 -1
View File
@@ -315,7 +315,7 @@ const Bridge = (() => {
}, 3000);
});
},
onLicenceResult(ok, holder, machine, email, issued) {
onLicenceResult(ok, holder, machine, email, issued, debug) {
const r = licenceResolver;
if (!r) return;
licenceResolver = null;
@@ -325,8 +325,16 @@ const Bridge = (() => {
machine: machine || '',
email: email || '',
issued: issued || '',
debug: !!debug,
});
},
// Desactive la licence pour eprouver l'activation. Cote Delphi la
// commande est inerte sans config.txt — le bouton qui l'appelle n'est
// d'ailleurs revele que dans ce cas.
clearLicence() {
if (!active) return;
cmd('cmd://licence/clear');
},
onPrefResult(key, value) {
const r = prefResolvers[key];
if (r) {
@@ -6958,6 +6966,10 @@ function applyLicenceInfo(st) {
$('#settingLicenceEmail').textContent = st.email || '—';
$('#settingLicenceIssued').textContent = st.issued || '—';
$('#settingLicenceMachine').textContent = st.machine || '—';
// Reservee aux essais : elle renvoie a l'ecran d'activation sans emporter
// le reste des preferences, contrairement a supprimer prefs.bin.
const deact = $('#settingLicenceClear');
if (deact) deact.hidden = !st.debug;
}
async function ensureLicence() {
@@ -8206,6 +8218,18 @@ async function init() {
const lbl = autofillComboLabel(state.autofillHotkeyFull);
toast(state.autofillEnabled ? ('Autofill enabled (' + lbl + ')') : 'Autofill disabled');
});
$('#settingLicenceClear').addEventListener('click', async () => {
const ok = await confirmDialog({
title: 'Deactivate licence?',
body: 'The activation screen will come back on next launch. '
+ 'Your vault is untouched. Debug builds only.',
okText: 'Deactivate',
danger: true,
});
if (!ok) return;
Bridge.clearLicence();
toast('Licence cleared — restart to see the activation screen');
});
$('#settingAutofillClear').addEventListener('change', e => {
state.autofillClearField = e.target.checked;
localStorage.setItem('autofillClearField', e.target.checked ? '1' : '0');