[DEMO] Fix 2 bug SPA-side trovati al collaudo browser headless (auth in-memory + boot seed)

Il collaudo curl validava il backend ma non l'esecuzione JS nel browser. Con google-chrome --dump-dom:
1) common-bi.js: sync api.token/orgId IN-MEMORY (api.js crea l'istanza prima leggendo localStorage vuoto
   → checkAuth vedeva token null → redirect a login). Ora la SPA si auto-autentica.
2) demo-mode.js boot(): non bloccare sul seed quando HMAC_ENFORCE=false (cross-origin il seed non arriva;
   non serve, HMAC off) → il runtime (banner/listener/ready) ora parte.
Verificato headless su dashboard/risks/incidents: login:0, banner+nis2-demo-on presenti.
This commit is contained in:
DevEnv nis2-agile
2026-06-13 11:30:55 +02:00
parent f946b3a9ca
commit fcf8b0963b
2 changed files with 14 additions and 4 deletions
+7 -2
View File
@@ -182,13 +182,18 @@
try { try {
var h = new URLSearchParams((window.location.hash || '').replace(/^#/, '')); var h = new URLSearchParams((window.location.hash || '').replace(/^#/, ''));
var djwt = h.get('djwt'); var djwt = h.get('djwt');
if (djwt && !localStorage.getItem('nis2_access_token')) { if (djwt) {
localStorage.setItem('nis2_access_token', djwt); localStorage.setItem('nis2_access_token', djwt);
localStorage.setItem('nis2_user_role', 'compliance_manager'); localStorage.setItem('nis2_user_role', 'compliance_manager');
var orgv = null;
try { try {
var pl = JSON.parse(atob(djwt.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'))); var pl = JSON.parse(atob(djwt.split('.')[1].replace(/-/g, '+').replace(/_/g, '/')));
if (pl && pl.org_id) localStorage.setItem('nis2_org_id', String(pl.org_id)); if (pl && pl.org_id) { orgv = String(pl.org_id); localStorage.setItem('nis2_org_id', orgv); }
} catch (e2) { /* jwt opaco: org via credentials */ } } catch (e2) { /* jwt opaco: org via credentials */ }
// CRITICO: api.js ha già creato l'istanza `api` leggendo localStorage VUOTO al load
// (api.js è incluso PRIMA di common-bi.js). Senza questo sync in-memory, checkAuth()
// vede api.token=null e redirige a login. Aggiorniamo l'istanza viva.
try { if (typeof api !== 'undefined' && api) { api.token = djwt; if (orgv) api.orgId = orgv; } } catch (e3) { /* noop */ }
} }
} catch (e1) { /* noop */ } } catch (e1) { /* noop */ }
var css = document.createElement('link'); css.rel = 'stylesheet'; css.href = '/css/demo.css'; document.head.appendChild(css); var css = document.createElement('link'); css.rel = 'stylesheet'; css.href = '/css/demo.css'; document.head.appendChild(css);
+7 -2
View File
@@ -159,8 +159,13 @@
} }
function boot() { function boot() {
loadCredentials() // HMAC_ENFORCE=false (canale runtime-avatar origin-verified): seed/chiave NON necessari.
.then(function () { if (!state.jwt || !state.seed) throw new Error('demo creds mancanti'); return deriveKey(); }) // Cross-origin il widget non può scrivere il seed in sessionStorage e /credentials non lo
// restituisce → NON bloccare il boot sul seed, altrimenti il runtime (banner/listener) non parte.
var pre = HMAC_ENFORCE
? loadCredentials().then(function () { if (!state.jwt || !state.seed) throw new Error('demo creds mancanti'); return deriveKey(); })
: Promise.resolve();
pre
.then(function () { .then(function () {
banner(); banner();
w.addEventListener('message', onMessage, false); w.addEventListener('message', onMessage, false);