Verwaltung fragt nicht mehr grundlos nach dem Zugangscode

Zwei Ursachen, die zusammenwirkten.

1. Nach einem Neuladen war die HERKUNFT des Schluessels vergessen. Der
   Code speicherte nur den Schluessel selbst, nicht ob er aus einer
   Codeeingabe oder aus dem Ausweis der Zugangswand stammt.

2. Weil die Herkunft fehlte, wurde vorsichtshalber 'code' angenommen.
   Als Vorsicht gedacht, mit unangenehmer Kehrseite: Ein Ausweis gilt nur
   15 Minuten. Als 'code' behandelt wurde er nie erneuert -- nach einer
   Viertelstunde kam der erste 401, und man landete in der Codeeingabe,
   obwohl alles in Ordnung war. Der Schutz 'eine Code-Sitzung wird nie
   durch einen Ausweis ersetzt' war damit ab dem ersten Neuladen ohnehin
   wirkungslos.

Die Herkunft steht jetzt neben dem Schluessel und ueberlebt ein
Neuladen. Fehlt sie -- etwa aus einer aelteren Sitzung --, bleibt es bei
der vorsichtigen Annahme 'code'.

Das behebt die Haelfte des Problems. Die andere Haelfte ist eine
Einstellung auf dem Server: Die beiden Dienste benutzen nicht dasselbe
WEBDESIGN_API_SECRET, weshalb jeder Ausweis abgelehnt wird. Der Kommentar
in server/.env.example sagt ausdruecklich, dass beide Werte exakt gleich
sein muessen. Das kann nur Filipe angleichen -- /home/dogiintern/ ist
fuer claudian gesperrt.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-08-23 22:50:22 +02:00
co-authored by Claude Opus 5
parent 131bc8a755
commit 659a1ee9ce
2 changed files with 47 additions and 11 deletions
+1 -1
View File
@@ -34,7 +34,7 @@
Start alle alten Zwischenspeicher weg. Muss bei jeder Änderung an den
Dateien unten hochgezählt werden, sonst hängen Nutzer auf einem alten
Stand fest. */
const CACHE_NAME = "dogfather-webdesign-v23";
const CACHE_NAME = "dogfather-webdesign-v24";
/* Bausteine, die die Oberfläche zum Anzeigen braucht. Bewusst KEINE
HTML-Datei in dieser Liste. */
+46 -10
View File
@@ -1104,11 +1104,36 @@
var s = window.WD.sicher;
var meldung = document.getElementById("vw-meldung");
/* Die HERKUNFT wird mitgespeichert, nicht nur der Schluessel.
Vorher ueberlebte nur der Schluessel selbst ein Neuladen, die
Herkunft nicht. Damit galt eine gueltige Code-Sitzung nach jedem F5
als "unbekannt": Beim naechsten 401 holte die Seite einen Ausweis,
ueberschrieb damit den funktionierenden Code-Schluessel -- und wenn
der Ausweis abgelehnt wird, landet man in der Anmeldemaske. Der
Schutz "eine Code-Sitzung wird nie ersetzt" war also genau ab dem
ersten Neuladen wirkungslos.
Gefunden am 23.08.2026 auf die Rueckmeldung hin, dass beim Wechsel
der Kategorie wieder nach dem Code gefragt wird. */
var QUELLE_SCHLUESSEL = TOKEN_SCHLUESSEL + "-quelle";
function tokenLesen() {
try { return sessionStorage.getItem(TOKEN_SCHLUESSEL); } catch (e) { return null; }
}
function tokenSchreiben(t) {
try { if (t) sessionStorage.setItem(TOKEN_SCHLUESSEL, t); else sessionStorage.removeItem(TOKEN_SCHLUESSEL); } catch (e) { /* egal */ }
function quelleLesen() {
try { return sessionStorage.getItem(QUELLE_SCHLUESSEL); } catch (e) { return null; }
}
function tokenSchreiben(t, quelle) {
try {
if (t) {
sessionStorage.setItem(TOKEN_SCHLUESSEL, t);
if (quelle) sessionStorage.setItem(QUELLE_SCHLUESSEL, quelle);
} else {
sessionStorage.removeItem(TOKEN_SCHLUESSEL);
sessionStorage.removeItem(QUELLE_SCHLUESSEL);
}
} catch (e) { /* egal */ }
}
/* ---------------------------------------------------------------------
@@ -1160,7 +1185,7 @@
ausweisLaeuft = ausweisHolen().finally(function () { ausweisLaeuft = null; });
}
var neu = await ausweisLaeuft;
if (neu) { token = neu; tokenQuelle = "ausweis"; tokenSchreiben(neu); }
if (neu) { token = neu; tokenQuelle = "ausweis"; tokenSchreiben(neu, "ausweis"); }
return neu;
}
@@ -1249,7 +1274,7 @@
var antwort = await window.WD.api("/auth/login", { method: "POST", body: { code: code } });
token = antwort.token;
tokenQuelle = "code";
tokenSchreiben(token);
tokenSchreiben(token, "code");
document.getElementById("vw-name").textContent = antwort.name || antwort.actor || "angemeldet";
zeigeBereich();
ladeUebersicht();
@@ -3489,11 +3514,22 @@
async function start() {
token = tokenLesen();
if (token) {
/* Herkunft nach einem Neuladen unbekannt. Vorsichtshalber als
"code" behandeln: Lieber einmal die Codeeingabe zeigen, als eine
funktionierende Sitzung durch einen untauglichen Ausweis zu
ersetzen. */
tokenQuelle = "code";
/* Die Herkunft steht jetzt daneben und ueberlebt ein Neuladen.
Vorher wurde nach jedem Neuladen "code" ANGENOMMEN. Das war als
Vorsicht gemeint, hatte aber eine unangenehme Kehrseite: Ein
AUSWEIS gilt nur 15 Minuten. Als "code" behandelt wurde er nie
erneuert -- nach einer Viertelstunde kam der erste 401, und man
landete in der Codeeingabe, obwohl alles in Ordnung war. Genau
das war die Rueckmeldung vom 23.08.2026 ("wenn ich von Uebersicht
auf andere Kategorien gehe, werd ich wieder nach dem Code
gefragt").
Steht dort nichts -- etwa aus einer aelteren Sitzung, die den
Eintrag noch nicht kannte --, bleibt es bei der vorsichtigen
Annahme "code": Eine funktionierende Sitzung durch einen
untauglichen Ausweis zu ersetzen waere der schlimmere Fehler. */
tokenQuelle = quelleLesen() || "code";
zeigeBereich(); ladeUebersicht(); zaehlerHolen();
return;
}
@@ -3502,7 +3538,7 @@
if (ausweis) {
token = ausweis;
tokenQuelle = "ausweis";
tokenSchreiben(token);
tokenSchreiben(token, "ausweis");
document.getElementById("vw-name").textContent =
(document.cookie.match(/dogiwd_rolle=([^;]+)/) || [])[1] === "vanvan" ? "VanVan" : "Dogfather";
zeigeBereich();