// The PIN lock: in a new browser tab the panel asks for the admin's PIN // before showing anything. The tab remembers it was unlocked (sessionStorage // lives as long as the tab, through reloads, and a new tab starts empty), so // a reload does not ask again. Loaded in , before the page shows. // A device can be set to trust the PIN for a while: for that many minutes // after it was entered, new tabs there open without asking (localStorage, // this browser only). (function () { 'use strict'; var KEY = 'lpra.pin.ok'; var ok = false; try { ok = sessionStorage.getItem(KEY) === '1'; } catch (e) { /* no storage: ask */ } if (ok) return; try { if (Date.now() < Number(localStorage.getItem('lpra.pin.until') || 0)) { sessionStorage.setItem(KEY, '1'); return; } } catch (e) { /* ask */ } var root = document.documentElement; root.classList.add('pin-wait'); function release() { root.classList.remove('pin-wait'); } function remember() { try { sessionStorage.setItem(KEY, '1'); } catch (e) { /* asked again next load */ } } // After the PIN itself: no asking on this device for the minutes it trusts. function trust() { try { var min = Number(localStorage.getItem('lpra.pin.grace') || 0); if (min > 0) localStorage.setItem('lpra.pin.until', String(Date.now() + min * 60000)); } catch (e) { /* asks every tab */ } } fetch('/api/panel/pin', {cache: 'no-store'}) .then(function (r) { return r.ok ? r.json() : {pin: false}; }) .then(function (d) { if (!d.pin) { remember(); release(); return; } if (document.body) lock(); else document.addEventListener('DOMContentLoaded', lock); }) .catch(release); function lock() { var LOCK = ''; var BACK = ''; var box = document.createElement('div'); box.className = 'pinlock'; box.setAttribute('role', 'dialog'); box.setAttribute('aria-modal', 'true'); box.setAttribute('aria-label', 'Ввод PIN-кода'); var keys = ''; ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'out', '0', 'back'].forEach(function (k) { var label = k === 'back' ? ' aria-label="Стереть">' + BACK : k === 'out' ? ' title="Выйти из панели">Выйти' : '>' + k; keys += '