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:
+1
-1
@@ -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
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user