diff --git a/functions/_middleware.js b/functions/_middleware.js index a7f3be6..a4b5260 100644 --- a/functions/_middleware.js +++ b/functions/_middleware.js @@ -32,9 +32,10 @@ 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 Tages-Code (siehe functions/_shared/verwaltung-auth.js, - /verwaltung-code.html) — auf ausdrücklichen Wunsch, damit die Bestellübersicht auch bei - einer kompromittierten/geteilten normalen Sitzung nicht dauerhaft offen bleibt. + 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. - 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. @@ -108,9 +109,11 @@ 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 Tages-Code — - bewusst EIN gemeinsamer Code (kein Unterschied qciga/VanVan), da es hier nur um die - zusätzliche Hürde geht, nicht um eine rollenabhängige Anzeige. */ +/* 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. */ async function handleVerwaltungAuth(request, env) { let body; try { @@ -125,7 +128,7 @@ async function handleVerwaltungAuth(request, env) { const next = typeof body.next === "string" && body.next.startsWith("/") ? body.next : "/verwaltung/"; if (!env.VERWALTUNG_ACCESS_CODE || code !== env.VERWALTUNG_ACCESS_CODE) { - return new Response(JSON.stringify({ ok: false, error: "Falscher Tages-Code." }), { + return new Response(JSON.stringify({ ok: false, error: "Falscher Code." }), { status: 401, headers: { "Content-Type": "application/json" }, }); @@ -217,7 +220,7 @@ export async function onRequest(context) { } if (url.pathname.startsWith("/api/")) { - return new Response(JSON.stringify({ ok: false, error: "Tages-Code für die Verwaltung erforderlich." }), { + return new Response(JSON.stringify({ ok: false, error: "Zusätzlicher Verwaltungs-Code erforderlich." }), { status: 401, headers: { "Content-Type": "application/json" }, }); diff --git a/functions/_shared/verwaltung-auth.js b/functions/_shared/verwaltung-auth.js index 51ffb86..4f73b4e 100644 --- a/functions/_shared/verwaltung-auth.js +++ b/functions/_shared/verwaltung-auth.js @@ -1,9 +1,15 @@ /* ===================================================================== functions/_shared/verwaltung-auth.js — ZWEITE, ZUSÄTZLICHE Zugangsschranke NUR für - /verwaltung/ + /api/verwaltung/* — auf ausdrücklichen Wunsch: ein einziger, gemeinsamer - Tages-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, und dieser hier läuft nach 24 Stunden ab. + /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"). 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 diff --git a/functions/api/verwaltung/orders.js b/functions/api/verwaltung/orders.js index 97184ce..a9023d0 100644 --- a/functions/api/verwaltung/orders.js +++ b/functions/api/verwaltung/orders.js @@ -5,8 +5,9 @@ Zusätzlich zur Middleware (functions/_middleware.js, schützt /api/verwaltung/* IMMER, unabhängig von SITE_PUBLIC) prüft diese Route die Sitzung noch einmal selbst — Verteidigung in der Tiefe, falls diese Datei mal unabhängig von der Middleware aufgerufen wird. Das - umfasst BEIDE Schranken: den normalen Seitenzugang UND den zusätzlichen Verwaltungs- - Tages-Code (siehe functions/_shared/verwaltung-auth.js). ===================================================================== */ + umfasst BEIDE Schranken: den normalen Seitenzugang UND den zusätzlichen Verwaltungs-Code + (fest, tägliche Neueingabe wegen Sitzungsablauf — siehe functions/_shared/verwaltung-auth.js). + ===================================================================== */ import { getGateRole, unauthorizedJson } from "../../_shared/auth.js"; import { hatGueltigeVerwaltungSitzung } from "../../_shared/verwaltung-auth.js"; @@ -18,7 +19,7 @@ export async function onRequestGet(context) { const role = await getGateRole(request, env); if (!role) return unauthorizedJson(); if (!(await hatGueltigeVerwaltungSitzung(request, env))) { - return json(401, { ok: false, error: "Tages-Code für die Verwaltung erforderlich." }); + return json(401, { ok: false, error: "Zusätzlicher Verwaltungs-Code erforderlich." }); } if (!env.DB) { diff --git a/functions/api/verwaltung/orders/[id].js b/functions/api/verwaltung/orders/[id].js index 9800cbf..58d8c48 100644 --- a/functions/api/verwaltung/orders/[id].js +++ b/functions/api/verwaltung/orders/[id].js @@ -4,7 +4,7 @@ Genau wie bei GET /api/verwaltung/orders: zusätzlich zur Middleware-Sperre wird die Sitzung hier noch einmal eigenständig geprüft — beide Schranken (normaler Seitenzugang UND - Verwaltungs-Tages-Code). ===================================================================== */ + Verwaltungs-Code, fest, tägliche Neueingabe wegen Sitzungsablauf). ===================================================================== */ import { getGateRole, unauthorizedJson } from "../../../_shared/auth.js"; import { hatGueltigeVerwaltungSitzung } from "../../../_shared/verwaltung-auth.js"; @@ -18,7 +18,7 @@ export async function onRequestPatch(context) { const role = await getGateRole(request, env); if (!role) return unauthorizedJson(); if (!(await hatGueltigeVerwaltungSitzung(request, env))) { - return json(401, { ok: false, error: "Tages-Code für die Verwaltung erforderlich." }); + return json(401, { ok: false, error: "Zusätzlicher Verwaltungs-Code erforderlich." }); } if (!env.DB) { diff --git a/public/verwaltung-code.html b/public/verwaltung-code.html index 40e396f..6d6fe74 100644 --- a/public/verwaltung-code.html +++ b/public/verwaltung-code.html @@ -3,7 +3,7 @@ -Tages-Code — Bestellverwaltung +Verwaltungs-Code — Bestellverwaltung