diff --git a/server/pruef-struktur.mjs b/server/pruef-struktur.mjs index fcfdd7ba..1d7b8c40 100644 --- a/server/pruef-struktur.mjs +++ b/server/pruef-struktur.mjs @@ -298,6 +298,49 @@ const BEKANNT_TOT = [".content-wurzel", ".code-feld"]; : `kein neues totes CSS (${BEKANNT_TOT.length} bekannte Reste stehen bewusst)`); } +/* ---------- 9. Kommt jedes Manifest auch WIRKLICH an? -------------------- + + Ein Manifest kann fehlerfrei im Repo liegen und trotzdem nie beim + Browser ankommen -- wenn eine Zugangswand davorsteht und HTML statt + JSON zurueckgibt. Dann bietet der Browser "App installieren" gar + nicht erst an, und niemand merkt etwas: Die Datei ist ja da. + + Genau das ist DREIMAL passiert (webdesign/app.webmanifest, + verwaltung.webmanifest, portal.webmanifest). Zweimal stand die + Begruendung danach im Code -- und beim dritten Mal wurde sie trotzdem + uebersehen. Ein Kommentar verhindert nichts; eine Pruefung schon. + + Geprueft wird gegen die Ausnahmeliste in webdesign-gate.js: Jedes + Manifest unter /webdesign/ MUSS dort stehen. */ +console.log(` +=== Manifeste hinter der Zugangswand ===`); +{ + const tor = join(SERVER, "webdesign-gate.js"); + const torText = existsSync(tor) ? readFileSync(tor, "utf8") : ""; + ok(torText.length > 1000, "webdesign-gate.js gelesen"); + + const manifeste = []; + const suche = (ordner, vorn) => { + for (const n of readdirSync(ordner, { withFileTypes: true })) { + if (n.name.startsWith(".") || n.name === "node_modules") continue; + const rel = vorn ? `${vorn}/${n.name}` : n.name; + if (n.isDirectory()) { if (rel === "webdesign") suche(join(ordner, n.name), rel); continue; } + if (n.name.endsWith(".webmanifest") || n.name === "manifest.json") manifeste.push(rel); + } + }; + suche(REPO, ""); + + const hinterWand = manifeste.filter((m) => m.startsWith("webdesign/")); + ok(hinterWand.length >= 2, `${hinterWand.length} Manifeste unter /webdesign/ gefunden`); + + const fehlend = hinterWand.filter((m) => !torText.includes(`"/${m}"`)); + ok(fehlend.length === 0, + fehlend.length + ? `NICHT in der Ausnahmeliste von webdesign-gate.js: ${fehlend.join(", ")} ` + + `— der Browser bekaeme HTML statt JSON und boete "App installieren" nicht an` + : `alle ${hinterWand.length} stehen in der Ausnahmeliste`); +} + /* ---------- Gegenprobe --------------------------------------------------- */ console.log(`\n=== Gegenprobe (muss anschlagen) ===`); diff --git a/server/webdesign-gate.js b/server/webdesign-gate.js index 6c0af01e..62cdfeaf 100644 --- a/server/webdesign-gate.js +++ b/server/webdesign-gate.js @@ -495,7 +495,30 @@ export function webdesignGate(req, res, next) { drei Verknüpfungen. Keine Kunden-, Projekt- oder Preisdaten. Wer es liest, erfährt, dass es eine Verwaltung GIBT — was die Zugangswand ohnehin verrät. */ - pfad === "/webdesign/verwaltung.webmanifest" + pfad === "/webdesign/verwaltung.webmanifest" || + /* Das Manifest des Kundenportals (05.09.2026). ZUM DRITTEN MAL + derselbe Fehler an derselben Stelle -- und diesmal stand die + Begründung schon direkt darüber. + + Das Portal bekam im Zuge der neuen App-Symbole ein eigenes + Manifest; vorher lief es unter dem der Webdesign-Seite und trug + deshalb deren Namen und deren Symbol. Die neue Datei wurde + angelegt, eingebunden, ausgeliefert -- und in diese Liste + einzutragen vergessen. + + Live gemessen, nicht vermutet: Symbole 200, Manifest 302 auf + zugang.html. Der Browser bekam HTML statt JSON und bot "App + installieren" gar nicht erst an. Die ganze Arbeit an dem Symbol + wäre für das Portal wirkungslos geblieben, ohne dass irgendwo + etwas rot geworden wäre. + + Unbedenklich aus demselben Grund wie die beiden darüber: Name, + Farben, Symbolpfade. Keine Kunden-, Projekt- oder Preisdaten. + + MERKE: Wer unter /webdesign/ eine Datei anlegt, die der BROWSER + selbst holen muss (Manifest, Service Worker, Symbol), muss sie + hier eintragen. Sonst liegt sie da und kommt nie an. */ + pfad === "/webdesign/portal.webmanifest" ) { return next(); }