48f3336956
gates / gates (push) Successful in 23s
The notes a background run SAVES — last night's backup line, the last error, the proof result, the restore outcome — are written in the BOX's language at the moment they are written. A household that switches sees the previous run's note in the old language until the next run rewrites it: the operator's §16 option 1, stated rather than hidden. EndRestoreOp no longer receives a Hungarian literal from anywhere. The language switch is a globe. Two text links wrapped in the sidebar footer and asked the reader to recognise "Magyar"/"English" as links; a globe is the one symbol every web user already reads as "language", so nobody has to read Hungarian to escape Hungarian. It is <details>/<summary> — a menu with no script, drawn inline because the icon sprite lives only in layout.html and the visitor pages have their own shell. Those visitor pages get the same globe, and a visitor's choice stays theirs: a display-only felhom_lang cookie that langFor reads ONLY when there is no session. A signed-in household can never inherit a language a previous visitor picked in the same browser. POST /lang is CSRF-exempt for a narrow reason written at the exemption — its only achievable effect is the language of the page the victim's own browser shows them — and safeBackPath refuses //evil.example as well as https://, because "starts with /" alone is not the test. §16 taken: a successful claim carries the cookie into the household's setting. TWO PARITY EXCEPTIONS, MEASURED: 106 fixtures compared with a real diff — exactly two change shapes (the dashboard footer, the globe in the shells) and 5 byte-identical, which are the three pages that must not change. I INTRODUCED A DEADLOCK AND THE SUITE CAUGHT IT BY HANGING. UpdateOffboxStatus holds the settings write lock while running its callback; boxLang() wants the read lock; sync.RWMutex is not reentrant. On a real box an off-site run would have hung forever HOLDING the settings lock. Fixed by resolving the language before the callback, and guarded by a test that names the file and line in a second instead of hanging for 25 minutes. MinAgent: 0.131.0 (unchanged). No hub release needed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
135 lines
6.8 KiB
HTML
135 lines
6.8 KiB
HTML
|
|
<!DOCTYPE html>
|
|
<html lang="hu">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<meta name="robots" content="noindex, nofollow">
|
|
<title>Adatok visszaszerzése — Felhom</title>
|
|
<link rel="stylesheet" href="/static/style.css">
|
|
</head>
|
|
<body class="login-body">
|
|
<div class="shell-lang"><details class="lang-globe">
|
|
<summary class="lang-globe-btn" aria-label="Nyelv" title="Nyelv"><svg class="ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10" /><path d="M2 12h20" /><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z" /></svg></summary>
|
|
<ul class="lang-globe-menu">
|
|
<li><form method="POST" action="/lang"><input type="hidden" name="back" value="/i18n-fixture"><button type="submit" name="lang" value="hu" lang="hu" class="lang-globe-item current" aria-current="true">Magyar</button></form></li>
|
|
<li><form method="POST" action="/lang"><input type="hidden" name="back" value="/i18n-fixture"><button type="submit" name="lang" value="en" lang="en" class="lang-globe-item">English</button></form></li>
|
|
</ul>
|
|
</details></div>
|
|
<div class="login-card" style="max-width:46rem">
|
|
<img src="/static/felhom-logo.svg" alt="Felhom.eu" class="login-logo">
|
|
|
|
|
|
|
|
<h1 class="login-title">Adatok <span class="title-accent">visszaszerzése</span></h1>
|
|
<p class="login-subtitle">Teszt Ügyfél</p>
|
|
|
|
<div class="alert alert-info">A kód elfogadva rendben.</div>
|
|
<div class="alert alert-error">Egy hiba történt közben.</div>
|
|
|
|
<p>
|
|
Ezt a gépet újratelepítették. A korábbi, <strong>házon kívüli mentéseid megvannak</strong> — a
|
|
Felhom központi rendszere őriz hozzájuk egy lezárt csomagot, amelyet
|
|
<strong>2026-09-01 10:00</strong> zártunk le. A csomagot csak a <strong>te helyreállítási
|
|
kódoddal</strong> lehet kinyitni.
|
|
</p>
|
|
|
|
<div class="alert alert-warning">
|
|
<strong>A helyreállítási kódot senki nem tudja pótolni</strong> — sem a Felhom, sem az
|
|
ügyfélszolgálat, sem az üzemeltető. Ez szándékos: így a mentéseidet rajtad kívül senki nem
|
|
tudja megnyitni. Ha a kód elveszett, a korábbi mentések nem nyithatók meg többé.
|
|
</div>
|
|
|
|
<p>
|
|
Ha megadod a kódot, <strong>feloldjuk a mentéseid zárolását és megmutatjuk, mi van bennük</strong>
|
|
— melyik alkalmazás, mikorról, mekkora. <strong>Ebben a lépésben semmit nem állítunk vissza és
|
|
semmi nem változik.</strong> A visszaállítást utána, alkalmazásonként külön választhatod.
|
|
</p>
|
|
|
|
<div id="unlock-gateway-error" class="alert alert-error" style="display:none" role="alert"></div>
|
|
|
|
<form id="unlock-form" method="POST" action="/recovery/unlock" autocomplete="off">
|
|
|
|
<label for="recovery_code">Helyreállítási kód (tíz szó)</label>
|
|
<input type="password" id="recovery_code" name="recovery_code"
|
|
autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false"
|
|
placeholder="tíz szó, szóközökkel elválasztva" required>
|
|
<div class="form-actions">
|
|
<button type="submit" class="btn btn-primary">Mentések feloldása</button>
|
|
<form method="POST" action="/recovery/postpone" style="display:inline">
|
|
|
|
<button type="submit" class="btn btn-outline">Most nem</button>
|
|
</form>
|
|
</div>
|
|
</form>
|
|
|
|
|
|
<script>
|
|
(function () {
|
|
var form = document.getElementById('unlock-form');
|
|
var box = document.getElementById('unlock-gateway-error');
|
|
if (!form || !box || !window.fetch) { return; }
|
|
form.addEventListener('submit', function (ev) {
|
|
ev.preventDefault();
|
|
box.style.display = 'none';
|
|
var btn = form.querySelector('button[type=submit]');
|
|
if (btn) { btn.disabled = true; btn.textContent = 'Feloldás folyamatban…'; }
|
|
fetch(form.action, {
|
|
method: 'POST',
|
|
body: new FormData(form),
|
|
credentials: 'same-origin',
|
|
redirect: 'follow'
|
|
}).then(function (resp) {
|
|
if (resp.status >= 500) { throw new Error('gateway'); }
|
|
return resp.text().then(function (html) {
|
|
document.open(); document.write(html); document.close();
|
|
});
|
|
}).catch(function () {
|
|
|
|
|
|
if (btn) { btn.disabled = false; btn.textContent = 'Mentések feloldása'; }
|
|
box.textContent = 'A gép éppen újraindul, ezért most nem tudtuk befejezni a műveletet. '
|
|
+ 'Semmi nem változott. Várj néhány másodpercet, és próbáld újra — a kódodra továbbra is szükséged lesz, '
|
|
+ 'úgyhogy tartsd kéznél.';
|
|
box.style.display = '';
|
|
});
|
|
});
|
|
})();
|
|
</script>
|
|
|
|
<p class="form-hint">
|
|
A „Most nem” csak azt jelenti, hogy nem zavarunk vele többet a kezdőlapon. A mentéseid ettől
|
|
megmaradnak, és ez az oldal a <strong>Biztonsági mentés → Távoli mentés</strong> oldalról
|
|
bármikor újra elérhető.
|
|
</p>
|
|
|
|
|
|
<hr style="margin:1.5rem 0;border:none;border-top:1px solid var(--border,#2a3142)">
|
|
|
|
|
|
<div class="alert alert-error">
|
|
<p><strong>Biztosan nem kéred vissza a korábbi mentéseket?</strong></p>
|
|
<p>Ha megerősíted:</p>
|
|
<ul>
|
|
<li>a korábbi mentéseket <strong>most félretesszük</strong>, és <strong>30 nap múlva véglegesen töröljük</strong> — a lezárt helyreállítási csomaggal együtt;</li>
|
|
<li>a 30 nap alatt <strong>meggondolhatod magad</strong>: ha előkerül a helyreállítási kódod, a mentéseid visszaszerezhetők, és a törlés elmarad;</li>
|
|
<li>a pontos dátumot a <strong>Távoli mentés</strong> oldalon végig látni fogod, és emlékeztetni is fogunk;</li>
|
|
<li>a gép <strong>új, üres mentési tárolót kezd</strong>, és mostantól oda ment;</li>
|
|
<li>a törlés után <strong>ez a kérdés nem jön vissza többé</strong> — mert nem marad mit visszaszerezni.</li>
|
|
</ul>
|
|
<p>Ha csak most nincs kéznél a kódod, válaszd inkább a „Most nem” lehetőséget — az semmit nem indít el.</p>
|
|
</div>
|
|
<div class="form-actions">
|
|
<form method="POST" action="/backup/offbox/reset">
|
|
|
|
<input type="hidden" name="confirm" value="1">
|
|
<button type="submit" class="btn btn-danger">Igen, félretehetitek a korábbi mentéseket</button>
|
|
</form>
|
|
<a href="/recovery" class="btn btn-outline">Mégsem</a>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|