diff --git a/pruef-inhaltsrichtlinie.mjs b/pruef-inhaltsrichtlinie.mjs index 07234aaf..d81f148c 100644 --- a/pruef-inhaltsrichtlinie.mjs +++ b/pruef-inhaltsrichtlinie.mjs @@ -134,9 +134,84 @@ try { fs.writeFileSync(pruefDatei, inhaltVorher, "utf8"); } -const a2 = await fetch("http://127.0.0.1:4408/assets/css/main.css"); -pruefe(" auch fuer Nicht-Seiten (CSS)", - (a2.headers.get("content-security-policy") || "").includes("default-src 'none'")); +/* Umgedreht am 26.08.2026. Vorher verlangte dieser Test fuer + Nicht-Seiten ausdruecklich "default-src 'none'" -- und hat damit + genau den Fehler abgesichert, der die App lahmgelegt hat. + + Eine Richtlinie steuert, was ein DOKUMENT nachladen darf. Ein + Stylesheet laedt nichts nach, dort ist sie wirkungslos. Bei einem + Service-Worker-Skript ist sie das Gegenteil von wirkungslos: Sie + wird zur Richtlinie des Workers und kann ihn stilllegen. + + Deshalb gilt jetzt: Richtlinie nur fuer HTML. Ein Test, der das + Gegenteil verlangt, haette den naechsten Versuch, es richtig zu + machen, als Fehler gemeldet. */ +for (const pfad of ["/assets/css/main.css", "/assets/js/wd-core.js", + "/webdesign/sw.js", "/assets/img/favicon.png"]) { + const a = await fetch("http://127.0.0.1:4408" + pfad); + const r = a.headers.get("content-security-policy"); + pruefe(` ${pfad}: keine Richtlinie`, !r, r ? "hat eine: " + r.slice(0, 40) : "keine"); +} + +/* ===================================================================== + 2c. DER SERVICE WORKER MUSS ARBEITEN KOENNEN + + ⚠️ Dieser Abschnitt fehlte, und genau durch die Luecke ist am + 26.08.2026 ein Fehler bis zum Benutzer durchgerutscht: + + Die erste Fassung setzte fuer alles, was keine Seite ist, + "default-src 'none'" -- mit dem Gedanken "kostet nichts, schadet + nie". Ein Service Worker uebernimmt aber die Richtlinie, die beim + Herunterladen SEINER EIGENEN Skriptdatei galt. Mit 'none' darf er + nichts mehr abrufen; jede Anfrage scheitert, und er zeigt seine + Offline-Seite. Fuer den Benutzer sah das aus wie ein Netzausfall -- + bei laufendem Server und einer Seite, die im Browser tadellos lud. + + Der Test von damals hat alle 48 Seiten geoeffnet und nichts bemerkt, + weil er den Service Worker nie hat arbeiten lassen. Eine Pruefung, + die den entscheidenden Weg auslaesst, ist gruen und wertlos zugleich. + ===================================================================== */ +console.log("\n2c. KANN DER SERVICE WORKER ARBEITEN?"); +{ + const kontext = await browser.newContext({ serviceWorkers: "allow" }); + const sw = await kontext.newPage(); + const verstoesse = []; + sw.on("console", (m) => { + if (/Content Security Policy|Refused to/i.test(m.text())) verstoesse.push(m.text().slice(0, 110)); + }); + + await sw.goto("http://127.0.0.1:4408/webdesign/zugang.html", { waitUntil: "networkidle" }); + await sw.waitForTimeout(3500); + + const stand = await sw.evaluate(async () => { + const r = await navigator.serviceWorker.getRegistration("/webdesign/"); + return { da: !!r, aktiv: !!(r && r.active) }; + }); + pruefe(" Service Worker meldet sich an", stand.da, stand.aktiv ? "aktiv" : "noch nicht aktiv"); + + /* Der Kern: Ein Service Worker, der nichts holen darf, ist genau der + Fehler von damals -- und von aussen nicht zu sehen. */ + const holen = await sw.evaluate(async () => { + try { + const a = await fetch("/assets/css/webdesign.css", { cache: "no-store" }); + return { ok: a.ok, laenge: (await a.text()).length }; + } catch (e) { + return { ok: false, fehler: String(e).slice(0, 70) }; + } + }); + pruefe(" er darf auch etwas abrufen", holen.ok, + holen.ok ? holen.laenge + " Bytes" : holen.fehler); + + pruefe(" dabei kein Richtlinien-Verstoss", verstoesse.length === 0, verstoesse[0] || "sauber"); + + /* Und die Skriptdatei selbst darf keine Richtlinie mitbekommen -- sie + wuerde sonst zur Richtlinie des Workers. */ + const kopf = (await fetch("http://127.0.0.1:4408/webdesign/sw.js")) + .headers.get("content-security-policy"); + pruefe(" sw.js traegt selbst KEINE Richtlinie", !kopf, kopf || "keine — richtig so"); + + await kontext.close(); +} console.log("\n3. GEGENPROBE: VERBIETET SIE AUCH WIRKLICH ETWAS?"); /* Ohne diesen Abschnitt waere Teil 1 wertlos: Eine Richtlinie, die