Verwaltung: Zugangscode wieder bei jedem Oeffnen noetig

Dogi hat die Lockerung vom 04.08.2026 ("Code nur einmal am Tag") heute
zurueckgenommen. Gewaehlte Auspraegung: Code beim OEFFNEN der Seite/App,
Neuladen im selben Tab wirft nicht raus, keine Abmeldung bei Untaetigkeit.

- admin-auth.js legt die Sitzung jetzt in sessionStorage statt in
  localStorage: gehoert zum Tab/App-Fenster, uebersteht F5 und Uploads,
  ist beim naechsten Oeffnen weg. Zweiter Tab = eigener Code.
- Alte localStorage-Sitzung wird beim ersten Laden einmalig entfernt --
  sonst waere Dogi trotz Umstellung mit dem alten Token weiter drin und
  ein Token laege monatelang im Browser herum.
- Versionsnummer des Skripts hochgesetzt: Caddy liefert Assets mit
  max-age=14400, der Browser haette die alte Anmelde-Logik sonst bis zu
  vier Stunden weiterbenutzt.
- Der 24-Std-Ablauf bleibt als Rueckfallsicherung fuer tagelang offene
  Tabs; der Server erzwingt dieselbe Grenze weiterhin selbst.
- Neuer Test pruef-verwaltung-anmeldung.mjs (12 Pruefungen: Gate beim
  Oeffnen, alte Sitzung wirkungslos, falscher/richtiger Code, F5 bleibt
  drin, neuer Tab verlangt Code, Abmelden raeumt auf, Untaetigkeit meldet
  NICHT ab).
- pruef-verwaltung-kacheln.mjs: echten Aufruf ans Live-Backend abgefangen
  und auf die Supporter-Zeilen gewartet -- der Test hatte dadurch
  gelegentlich falsch gemeldet.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-27 13:28:14 +02:00
co-authored by Claude Opus 5
parent 0465a7a14a
commit 7960b212c8
4 changed files with 226 additions and 20 deletions
+13
View File
@@ -123,9 +123,22 @@ async function laden(browser, viewport, dateiname) {
await seite.route("**/assets/js/admin-auth.js*", (route) =>
route.fulfill({ status: 200, contentType: "text/javascript", body: ATTRAPPE })
);
/* Die Seite holt die Website-Texte mit einem eigenen fetch() direkt vom
Live-Backend — das ginge im Test wirklich ins Netz und verzögerte je
nach Laufzeit alles, was danach kommt (die Supporter-Liste wird erst
danach gefüllt). Deshalb hier abfangen: der Test soll messen, was die
Seite tut, nicht wie schnell der Server gerade antwortet. */
await seite.route("https://postfach.dogfather-universe.com/**", (route) =>
route.fulfill({
status: 200,
headers: { "access-control-allow-origin": "*", "content-type": "application/json" },
body: JSON.stringify({ ok: true, texte: {} }),
})
);
seite.on("pageerror", (e) => pruefe("Kein JS-Fehler (" + dateiname + ")", false, (e.stack || e.message).split("\n").slice(0, 4).join(" | ")));
await seite.goto("http://127.0.0.1:4422/verwaltung.html");
await seite.waitForSelector("[data-testimonial-id]", { timeout: 8000 });
await seite.waitForSelector("#supporter-tbody tr[data-id]", { timeout: 8000 });
await seite.waitForTimeout(400);
return seite;
}