From c1504bef9268fe6a837bff1a15398526bbbdafeb Mon Sep 17 00:00:00 2001 From: qcigano Date: Tue, 4 Aug 2026 12:54:01 +0200 Subject: [PATCH] Verwaltungsseite: kein separater dritter Code mehr, sondern derselbe wie beim normalen Login MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix für gemeldetes Problem: VanVans Code funktionierte nicht auf der Verwaltungsseite. Ursache war ein dritter, komplett separater, gemeinsamer Code (6GAM4AST), den sich niemand gemerkt hatte — VanVan gab stattdessen ihren normalen persönlichen Zugangscode ein, der dort aber nicht galt. Jetzt auf ausdrücklichen Wunsch vereinheitlicht: die Verwaltungsseite prüft denselben persönlichen Code wie der normale Seitenzugang (SITE_ACCESS_CODE_QCIGA/_VANVAN). Die tägliche Neueingabe-Pflicht bleibt bestehen (eigene Sitzung mit 24h statt 90 Tagen Gültigkeit) — nur der geprüfte Code ist jetzt kein separater dritter mehr. Das alte Secret VERWALTUNG_ACCESS_CODE wird nicht mehr verwendet. Lokal mit wrangler pages dev end-to-end getestet (beide Codes + alter Code korrekt abgelehnt). Co-Authored-By: Claude Sonnet 5 --- functions/_middleware.js | 40 +++++++++++++++++----------- functions/_shared/verwaltung-auth.js | 28 +++++++++---------- public/verwaltung-code.html | 13 ++++----- 3 files changed, 46 insertions(+), 35 deletions(-) diff --git a/functions/_middleware.js b/functions/_middleware.js index a4b5260..d9ae763 100644 --- a/functions/_middleware.js +++ b/functions/_middleware.js @@ -31,11 +31,13 @@ ist nie für Kund:innen gedacht. /api/orders (Bestellung ANLEGEN beim Checkout) ist bewusst NICHT dauerhaft geschützt — das muss auch für echte Kund:innen erreichbar sein, sobald der Shop öffentlich ist, genau wie der Checkout selbst. - - /verwaltung/* + /api/verwaltung/* verlangen ZUSÄTZLICH zum normalen 90-Tage-Seitenzugang - noch einen zweiten, eigenen, FESTEN Code (siehe functions/_shared/verwaltung-auth.js, - /verwaltung-code.html) — auf ausdrücklichen Wunsch. Der Code selbst ändert sich NICHT von - selbst (kein Zufalls-/Rotationscode) — nur die SITZUNG läuft nach 24 Stunden ab, wodurch - derselbe Code einmal täglich neu eingegeben werden muss, statt für immer gültig zu bleiben. + - /verwaltung/* + /api/verwaltung/* verlangen ZUSÄTZLICH zum normalen 90-Tage-Seitenzugang noch + eine zweite, eigene Sitzung, die nur 24 Stunden gültig ist (siehe + functions/_shared/verwaltung-auth.js, /verwaltung-code.html) — auf ausdrücklichen Wunsch. + Geprüft wird dabei GENAU DERSELBE persönliche Code wie beim normalen Seitenzugang (kein + separater dritter Code mehr — das hatte anfangs zu Verwirrung geführt, siehe Tagesprotokoll + 04.08.2026). Wer /verwaltung/ öffnen will, tippt also überall denselben Code, muss ihn aber + hier einmal täglich neu eingeben, statt 90 Tage lang eingeloggt zu bleiben. - API-Routen (/api/*) bekommen bei fehlender Sitzung eine 401-JSON-Antwort statt der 302-Weiterleitung zur Zugangscode-Seite — ein fetch() im Checkout/Verwaltung-Skript soll einen klaren Fehler sehen, nicht versehentlich HTML als Antwort bekommen. @@ -109,11 +111,14 @@ async function handleAuth(request, env) { return new Response(JSON.stringify({ ok: true, next }), { status: 200, headers }); } -/* Gegenstück zu handleAuth() oben, aber für den zweiten, verwaltungseigenen Code — bewusst EIN - gemeinsamer, FESTER Code (kein Unterschied qciga/VanVan, keine Rotation), da es hier nur um - die zusätzliche Hürde geht, nicht um eine rollenabhängige Anzeige. Nur die dadurch erzeugte - SITZUNG läuft nach 24h ab (siehe VERWALTUNG_SESSION_STUNDEN unten) — der Code selbst bleibt - unverändert, bis ihn qciga manuell über "wrangler pages secret put" ändert. */ +/* Gegenstück zu handleAuth() oben, aber für die zweite, tägliche Sitzung auf /verwaltung/ — auf + ausdrücklichen Wunsch NACH einer Verwirrung mit einem anfangs dritten, separaten Code umgestellt + (04.08.2026): Es gibt KEINEN eigenen Verwaltungs-Code mehr. Stattdessen gilt hier genau derselbe + persönliche Code wie beim normalen Seitenzugang (SITE_ACCESS_CODE_QCIGA / SITE_ACCESS_CODE_VANVAN, + siehe handleAuth() oben) — wer sich einmal am Tag einloggt, tippt also überall denselben, ihr + bereits bekannten Code, statt sich einen dritten, separaten Code merken zu müssen. Einzige + Besonderheit gegenüber dem normalen Zugang: die dadurch erzeugte SITZUNG läuft schon nach 24h ab + (statt 90 Tage), wodurch derselbe Code hier täglich neu eingegeben werden muss. */ async function handleVerwaltungAuth(request, env) { let body; try { @@ -127,7 +132,10 @@ async function handleVerwaltungAuth(request, env) { const code = (body.code || "").trim(); const next = typeof body.next === "string" && body.next.startsWith("/") ? body.next : "/verwaltung/"; - if (!env.VERWALTUNG_ACCESS_CODE || code !== env.VERWALTUNG_ACCESS_CODE) { + const codeGueltig = + (env.SITE_ACCESS_CODE_QCIGA && code === env.SITE_ACCESS_CODE_QCIGA) || + (env.SITE_ACCESS_CODE_VANVAN && code === env.SITE_ACCESS_CODE_VANVAN); + if (!codeGueltig) { return new Response(JSON.stringify({ ok: false, error: "Falscher Code." }), { status: 401, headers: { "Content-Type": "application/json" }, @@ -206,10 +214,12 @@ export async function onRequest(context) { return handleVerwaltungAuth(request, env); } - // Fail-open auch hier: fehlt das Secret komplett, lieber die zweite Schranke nicht scharf - // schalten, als sich selbst auszusperren — die erste Schranke (normaler Seitenzugang) - // schützt /verwaltung/ in diesem Fall ja immer noch. - if (!env.VERWALTUNG_SESSION_SECRET || !env.VERWALTUNG_ACCESS_CODE) { + // Fail-open auch hier: fehlt das Sitzungs-Secret komplett, lieber die zweite Schranke nicht + // scharf schalten, als sich selbst auszusperren — die erste Schranke (normaler Seitenzugang) + // schützt /verwaltung/ in diesem Fall ja immer noch. Die Zugangscodes selbst + // (SITE_ACCESS_CODE_QCIGA/_VANVAN) sind an dieser Stelle bereits garantiert vorhanden, siehe + // codesKonfiguriert-Prüfung weiter oben in onRequest(). + if (!env.VERWALTUNG_SESSION_SECRET) { return next(); } diff --git a/functions/_shared/verwaltung-auth.js b/functions/_shared/verwaltung-auth.js index 4f73b4e..3ef781b 100644 --- a/functions/_shared/verwaltung-auth.js +++ b/functions/_shared/verwaltung-auth.js @@ -1,22 +1,22 @@ /* ===================================================================== functions/_shared/verwaltung-auth.js — ZWEITE, ZUSÄTZLICHE Zugangsschranke NUR für - /verwaltung/ + /api/verwaltung/* — auf ausdrücklichen Wunsch: ein einziger, gemeinsamer, - FESTER Code (VERWALTUNG_ACCESS_CODE), den nur qciga und VanVan kennen, unabhängig vom - normalen 90-Tage-Seitenzugang (siehe functions/_shared/auth.js). Wer die Bestellübersicht - öffnen will, braucht also BEIDE Codes — den normalen Seitenzugang UND diesen hier. - - WICHTIG: Der Code selbst ändert sich NIE von selbst (kein Zufalls-/Rotationscode, keine - Tages-Ableitung) — nur die durch ihn erzeugte SITZUNG läuft nach 24 Stunden ab. Dadurch - muss derselbe, unveränderte Code einmal täglich neu eingegeben werden, statt dauerhaft - gültig zu bleiben (auf ausdrücklichen Wunsch: "ein fester Code, der aber jeden Tag einmal - eingegeben werden muss"). + /verwaltung/ + /api/verwaltung/*, unabhängig vom normalen 90-Tage-Seitenzugang (siehe + functions/_shared/auth.js). Wer die Bestellübersicht öffnen will, braucht also eine gültige + Sitzung auf BEIDEN Ebenen — die Prüfung des eingegebenen Codes selbst läuft dabei nicht hier, + sondern in handleVerwaltungAuth() in functions/_middleware.js (dort wird GENAU DERSELBE + persönliche Code wie beim normalen Seitenzugang akzeptiert, SITE_ACCESS_CODE_QCIGA/_VANVAN — + ursprünglich gab es hier einen dritten, separaten Code, der aber auf ausdrücklichen Wunsch + nach echter Verwirrung bei VanVan am 04.08.2026 wieder entfernt wurde). Diese Datei kümmert + sich nur noch um die SITZUNG danach: die läuft absichtlich schon nach 24 Stunden ab (statt + 90 Tage wie beim normalen Zugang), wodurch derselbe Code hier täglich neu eingegeben werden + muss. Bewusst als eigene, kleine Kopie der HMAC-Signaturlogik statt geteiltem Code mit auth.js (gleiches Prinzip wie bei customer-auth.js) — ein Leck bei einer Sitzungsart darf nie die - andere gefährden. Eigenes Geheimnis (VERWALTUNG_SESSION_SECRET), eigenes Cookie, eigener - einzelner Code (VERWALTUNG_ACCESS_CODE) statt getrennter Codes pro Person — hier reicht ein - gemeinsamer Code, weil es nur um diese eine zusätzliche Hürde geht, nicht um die Anzeige - einer rollenabhängigen Vorschau wie beim normalen Seitenzugang. ===================================================================== */ + andere gefährden. Eigenes Geheimnis (VERWALTUNG_SESSION_SECRET), eigenes Cookie — auch wenn + der geprüfte CODE jetzt derselbe wie beim normalen Zugang ist, bleibt die SITZUNG technisch + komplett getrennt (anderes Cookie, andere Gültigkeitsdauer, eigene Signatur). + ===================================================================== */ export const VERWALTUNG_COOKIE_NAME = "vandiy_verwaltung_session"; export const VERWALTUNG_SESSION_STUNDEN = 24; diff --git a/public/verwaltung-code.html b/public/verwaltung-code.html index 0eb9796..a79faed 100644 --- a/public/verwaltung-code.html +++ b/public/verwaltung-code.html @@ -3,7 +3,7 @@ -Verwaltungs-Code — Bestellverwaltung +Tägliche Bestätigung — Bestellverwaltung