The escrow wizard sends the typed-back words to the box; the new package reaches the hub only when they match (R-1151 controller half, unreleased; works with every agent)
gates / gates (push) Successful in 47s

This commit is contained in:
2026-10-19 03:19:02 +02:00
parent 8ae9178138
commit ba4a6f060b
12 changed files with 434 additions and 35 deletions
@@ -244,6 +244,7 @@
<div id="verify-error" class="alert alert-error" style="display:none;margin-top:.5rem">A megadott szavak nem egyeznek — ellenőrizd a felírt kódot.</div>
</div>
<button class="btn btn-sm" id="verify-btn" onclick="verifyWords()">Szavak ellenőrzése</button>
<a href="/backup/escrow" class="btn btn-sm btn-primary" id="verify-restart" style="display:none">Újraindítás</a>
<div id="finish-block" style="display:none;margin-top:1rem">
<h3>7. Befejezés</h3>
@@ -385,6 +386,9 @@ function pollStatus(){
var claimedR='';
var verifyIdx=[0,0];
var confirmRequired=false;
async function claimCode(){
var btn=document.getElementById('reveal-btn'); btn.disabled=true;
var errEl=document.getElementById('reveal-error'); errEl.style.display='none';
@@ -398,9 +402,13 @@ async function claimCode(){
var words=claimedR.split('-');
var n=words.length;
var a=1+Math.floor(Math.random()*n), b=1+Math.floor(Math.random()*n);
while(b===a){ b=1+Math.floor(Math.random()*n); }
verifyIdx=[Math.min(a,b),Math.max(a,b)];
confirmRequired=!!j.data.confirm_required;
if(confirmRequired){ verifyIdx=[j.data.verify_positions[0], j.data.verify_positions[1]]; }
else {
var a=1+Math.floor(Math.random()*n), b=1+Math.floor(Math.random()*n);
while(b===a){ b=1+Math.floor(Math.random()*n); }
verifyIdx=[Math.min(a,b),Math.max(a,b)];
}
@@ -433,13 +441,31 @@ function setCodeBlur(on){
}
function toggleCodeBlur(){ setCodeBlur(!codeBlurred); }
function verifyWords(){
async function verifyWords(){
var words=claimedR.split('-');
var w1=(document.getElementById('verify-w1').value||'').trim().toLowerCase();
var w2=(document.getElementById('verify-w2').value||'').trim().toLowerCase();
var ok = w1===words[verifyIdx[0]-1] && w2===words[verifyIdx[1]-1];
document.getElementById('verify-error').style.display=ok?'none':'block';
if(ok){ document.getElementById('finish-block').style.display='block'; }
var errEl=document.getElementById('verify-error');
errEl.textContent='A megadott szavak nem egyeznek — ellenőrizd a felírt kódot.';
errEl.style.display=ok?'none':'block';
if(!ok){ return; }
if(confirmRequired){
var btn=document.getElementById('verify-btn'); btn.disabled=true;
try{
var r=await fetch('/api/escrow/confirm',{method:'POST',
headers:Object.assign({'Content-Type':'application/json'},csrfHeaders()),body:JSON.stringify({words:[w1,w2]})});
var j=await r.json();
if(!j.ok){
errEl.textContent=j.error||'A megadott szavak nem egyeznek — ellenőrizd a felírt kódot.'; errEl.style.display='block';
if(j.data && j.data.restart){
claimedR=''; document.getElementById('code-block').textContent='';
btn.style.display='none'; document.getElementById('verify-restart').style.display='inline-block'; return; }
btn.disabled=false; return;
}
}catch(e){ errEl.textContent='Hiba: '+e.message; errEl.style.display='block'; btn.disabled=false; return; }
}
document.getElementById('finish-block').style.display='block';
}
function finishWizard(){
@@ -249,6 +249,7 @@
<div id="verify-error" class="alert alert-error" style="display:none;margin-top:.5rem">A megadott szavak nem egyeznek — ellenőrizd a felírt kódot.</div>
</div>
<button class="btn btn-sm" id="verify-btn" onclick="verifyWords()">Szavak ellenőrzése</button>
<a href="/backup/escrow" class="btn btn-sm btn-primary" id="verify-restart" style="display:none">Újraindítás</a>
<div id="finish-block" style="display:none;margin-top:1rem">
<h3>7. Befejezés</h3>
@@ -390,6 +391,9 @@ function pollStatus(){
var claimedR='';
var verifyIdx=[0,0];
var confirmRequired=false;
async function claimCode(){
var btn=document.getElementById('reveal-btn'); btn.disabled=true;
var errEl=document.getElementById('reveal-error'); errEl.style.display='none';
@@ -403,9 +407,13 @@ async function claimCode(){
var words=claimedR.split('-');
var n=words.length;
var a=1+Math.floor(Math.random()*n), b=1+Math.floor(Math.random()*n);
while(b===a){ b=1+Math.floor(Math.random()*n); }
verifyIdx=[Math.min(a,b),Math.max(a,b)];
confirmRequired=!!j.data.confirm_required;
if(confirmRequired){ verifyIdx=[j.data.verify_positions[0], j.data.verify_positions[1]]; }
else {
var a=1+Math.floor(Math.random()*n), b=1+Math.floor(Math.random()*n);
while(b===a){ b=1+Math.floor(Math.random()*n); }
verifyIdx=[Math.min(a,b),Math.max(a,b)];
}
@@ -438,13 +446,31 @@ function setCodeBlur(on){
}
function toggleCodeBlur(){ setCodeBlur(!codeBlurred); }
function verifyWords(){
async function verifyWords(){
var words=claimedR.split('-');
var w1=(document.getElementById('verify-w1').value||'').trim().toLowerCase();
var w2=(document.getElementById('verify-w2').value||'').trim().toLowerCase();
var ok = w1===words[verifyIdx[0]-1] && w2===words[verifyIdx[1]-1];
document.getElementById('verify-error').style.display=ok?'none':'block';
if(ok){ document.getElementById('finish-block').style.display='block'; }
var errEl=document.getElementById('verify-error');
errEl.textContent='A megadott szavak nem egyeznek — ellenőrizd a felírt kódot.';
errEl.style.display=ok?'none':'block';
if(!ok){ return; }
if(confirmRequired){
var btn=document.getElementById('verify-btn'); btn.disabled=true;
try{
var r=await fetch('/api/escrow/confirm',{method:'POST',
headers:Object.assign({'Content-Type':'application/json'},csrfHeaders()),body:JSON.stringify({words:[w1,w2]})});
var j=await r.json();
if(!j.ok){
errEl.textContent=j.error||'A megadott szavak nem egyeznek — ellenőrizd a felírt kódot.'; errEl.style.display='block';
if(j.data && j.data.restart){
claimedR=''; document.getElementById('code-block').textContent='';
btn.style.display='none'; document.getElementById('verify-restart').style.display='inline-block'; return; }
btn.disabled=false; return;
}
}catch(e){ errEl.textContent='Hiba: '+e.message; errEl.style.display='block'; btn.disabled=false; return; }
}
document.getElementById('finish-block').style.display='block';
}
function finishWizard(){