Interne Bewerbungs-Rückseiten (Postfach, Zugänge, Login) komplett entfernt

Auf Wunsch: die öffentlichen Bewerbungsseiten (bewerben*.html) bleiben
unverändert bestehen, aber die internen "Rückseiten", wo die Bewerbungen
verwaltet wurden, werden nicht mehr gebraucht und sind komplett raus:

- postfach.html (Bewerbungs-Postfach) und zugaenge.html (Zugänge & Rollen)
  gelöscht
- zugehörige tote Skripte gelöscht: postfach.js, zugaenge.js, admin-auth.js
- "Login"-Knopf in der Navigation entfernt
- "Intern"-Block im Footer (Bewerbungs-Postfach / Zugänge & Rollen) entfernt
- KEIN_NAHTLOSER_WECHSEL-Ausnahmeliste geleert (referenzierte nur die
  jetzt gelöschten Seiten)
- .nav-login CSS-Regeln entfernt (totes CSS)
- robots.txt: Disallow-Zeile für /postfach.html entfernt

Der Cloudflare-Worker (Backend/D1) und die Bewerbungsformulare selbst
bleiben unangetastet — Bewerbungen können weiterhin eingereicht werden.
This commit is contained in:
2026-08-01 11:04:01 +02:00
parent 888de712de
commit e910017e51
8 changed files with 5 additions and 1269 deletions
-81
View File
@@ -1,81 +0,0 @@
/* =====================================================================
admin-auth.js — gemeinsame Session-Logik für postfach.html und
zugaenge.html. Session (Token + Rolle/Rechte) liegt in sessionStorage
(pro Tab, verschwindet beim Schließen) — der Server erzwingt zusätzlich
Inaktivitäts-Timeout (30 Min) und eine absolute Höchstdauer (12 Std).
===================================================================== */
const SESSION_KEY = "dogfather_admin_session";
function getSession() {
try {
return JSON.parse(sessionStorage.getItem(SESSION_KEY) || "null");
} catch {
return null;
}
}
function setSession(data) {
sessionStorage.setItem(SESSION_KEY, JSON.stringify(data));
}
function clearSession() {
sessionStorage.removeItem(SESSION_KEY);
}
/** Prüft, ob die aktuelle Session (Owner oder Rolle+Overrides) ein Recht hat. */
function sessionHasPermission(session, key) {
if (!session) return false;
if (session.isOwner) return true;
const overrides = session.overrides || {};
if (Object.prototype.hasOwnProperty.call(overrides, key)) return !!overrides[key];
return Array.isArray(session.permissions) && session.permissions.includes(key);
}
async function apiCall(apiBaseUrl, path, body, { auth = true } = {}) {
const session = getSession();
const headers = { "Content-Type": "application/json" };
if (auth && session?.token) headers["Authorization"] = `Bearer ${session.token}`;
const res = await fetch(`${apiBaseUrl}${path}`, {
method: "POST",
headers,
body: JSON.stringify(body || {}),
});
let data;
try {
data = await res.json();
} catch {
data = { ok: false, error: "Ungültige Antwort vom Server." };
}
if (res.status === 401 && auth) {
clearSession(); // Session ist abgelaufen/ungültig -> zurück zum Login zwingen
}
return { httpOk: res.ok, ...data };
}
async function doLogin(apiBaseUrl, code) {
const res = await apiCall(apiBaseUrl, "/auth/login", { code }, { auth: false });
if (res.ok) {
setSession({
token: res.token,
isOwner: res.isOwner,
name: res.name,
username: res.username,
roleName: res.roleName,
permissions: res.permissions || [],
overrides: res.overrides || {},
});
}
return res;
}
async function doLogout(apiBaseUrl) {
await apiCall(apiBaseUrl, "/auth/logout", {});
clearSession();
}
// Für Einbindung ohne Modul-Bundler global verfügbar machen.
if (typeof window !== "undefined") {
window.AdminAuth = { getSession, setSession, clearSession, sessionHasPermission, apiCall, doLogin, doLogout };
}