feat(licence): Settings affiche le porteur de la licence

Porteur, courriel, date d'emission et Installation ID, lus dans la charge
utile deja verifiee. Rempli une fois au demarrage sur les deux chemins
(deja licencie, activation reussie) : rien n'y change pendant une
session. Section masquee hors navigateur hote.

Les champs sont echappes avant interpolation dans ExecuteJavaScript bien
qu'ils viennent d'une charge utile signee — signee ne veut pas dire
inoffensive.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-05 16:19:24 +01:00
parent 61ec5ff7a1
commit 8f0bbb580f
4 changed files with 77 additions and 9 deletions
+26 -4
View File
@@ -315,11 +315,17 @@ const Bridge = (() => {
}, 3000);
});
},
onLicenceResult(ok, holder, machine) {
onLicenceResult(ok, holder, machine, email, issued) {
const r = licenceResolver;
if (!r) return;
licenceResolver = null;
r({ ok: !!ok, holder: holder || '', machine: machine || '' });
r({
ok: !!ok,
holder: holder || '',
machine: machine || '',
email: email || '',
issued: issued || '',
});
},
onPrefResult(key, value) {
const r = prefResolvers[key];
@@ -6939,14 +6945,29 @@ function resetAutoLock() {
// La porte d'entrée : sans licence valable, rien d'autre ne se peint.
// Ne rend la main QUE sur une licence acceptée — il n'y a pas de bouton
// "plus tard", c'est tout l'objet de l'écran.
// Les quatre lignes de Settings → Licence. Rien ici ne change pendant une
// session, donc c'est ecrit une fois au demarrage plutot que branche sur le
// rendu des reglages : le panneau existe deja dans le DOM, cache.
function applyLicenceInfo(st) {
const section = $('#settingLicenceSection');
if (!section) return;
// Hors du navigateur hote il n'y a pas de licence — montrer une section
// vide de tirets ferait croire a une activation perdue.
if (!Bridge.active) { section.style.display = 'none'; return; }
$('#settingLicenceHolder').textContent = st.holder || '—';
$('#settingLicenceEmail').textContent = st.email || '—';
$('#settingLicenceIssued').textContent = st.issued || '—';
$('#settingLicenceMachine').textContent = st.machine || '—';
}
async function ensureLicence() {
let st = await Bridge.licence('status');
if (st.ok) return;
if (st.ok) { applyLicenceInfo(st); return; }
// Un démarrage à froid lent peut manquer la fenêtre de réponse, et le
// silence se lit alors comme un refus : redemander une fois coûte moins
// qu'un écran d'activation présenté à quelqu'un qui a déjà payé.
st = await Bridge.licence('status');
if (st.ok) return;
if (st.ok) { applyLicenceInfo(st); return; }
const screen = $('#licenceScreen');
const hint = $('#licenceHint');
@@ -6975,6 +6996,7 @@ async function ensureLicence() {
input.select();
return;
}
applyLicenceInfo(res);
screen.classList.add('is-hidden');
resolve();
});