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:
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user