diff --git a/server/pruef-haus-trennung.mjs b/server/pruef-haus-trennung.mjs index bfa38663..01cf9e11 100644 --- a/server/pruef-haus-trennung.mjs +++ b/server/pruef-haus-trennung.mjs @@ -996,6 +996,99 @@ console.log("=== Haengt es wirklich an der Adresse? ==="); + `(${titel(fremd) || "leer"} / ${titel(echt) || "leer"})`); } +/* ======================================================================= + DIE BRETTER DES RUDELS GIBT ES NUR AUF DER CREW-ADRESSE (05.10.2026) + + Filipe: "ich kann gerade bei highlights keine videos hochladen." + + GEMESSEN AN DER LAUFENDEN DATENBANK, bevor etwas angefasst wurde: + 49 Highlights, ALLE mit `haus = crew` -- so legt + `hausFuerNeuenEintrag` sie an, ausdruecklich unabhaengig von der + Adresse. Der Adressriegel vom 03.10. zeigt auf der Agenturadresse + aber nur `haus = agentur`: + + crew. -> 49 Highlights + workspace -> 0 + + Das Brett stand dort leer, und ein eingefuegtes Video verschwand in + derselben Sekunde -- angelegt und sofort ausgeblendet. Von aussen + sieht das aus wie "das Hochladen geht nicht". Belegt: Eintrag #77 + wurde heute um 08:41 erfolgreich angelegt. + + ZWEI REGELN WIDERSPRACHEN SICH, und keine Pruefung konnte das + merken: Jede fuer sich war richtig. Diese hier misst genau den + Zwischenraum -- deshalb in BEIDE Richtungen und auf allen drei + Wegen (Kachel, Brett, Video). Ein Riegel an nur einem davon waere + derselbe Fehler in leiser. + ======================================================================= */ +console.log(""); +console.log("=== Rudel-Bretter: nur auf crew. ==="); +{ + const a = await beide("/workspace/api/ich", dogi.keks); + const ziele = (x) => [...(x?.bereiche || []), ...(x?.bereiche_zusatz || [])] + .map((k) => k.ziel || ""); + const crewZiele = ziele(a.crew); + const wsZiele = ziele(a.ws); + + /* Die Zahl gehoert in die Bedingung: Kaeme gar keine Kachel zurueck, + waere "keine Highlight-Kachel" gruen, ohne etwas gesehen zu haben. */ + ok(crewZiele.length > 0 && crewZiele.some((z) => /b=highlight/.test(z)), + `auf crew. steht die Highlights-Kachel (${crewZiele.length} Kacheln)`); + + /* AUF DER AGENTURADRESSE SCHICKT DER SERVER GAR KEINE LISTE, und das + ist Absicht: `bereiche === null` heisst "der Browser nimmt seine + eigene". Hier stand zuerst eine Zeile, die dort Agenturbretter + erwartete -- sie wurde rot, und zwar zu Recht: Ich hatte eine + Liste vermutet, wo keine ist. In der Browserliste stehen die + Rudel-Bretter ohnehin nicht (weder in start.html noch in + bereiche.js nachweisbar), deshalb gibt es dort auch nichts + auszublenden -- die Kachel war nie das Problem. */ + ok(a.ws?.bereiche === null, + `auf der Agenturadresse kommt bewusst keine Serverliste (${JSON.stringify(a.ws?.bereiche)})`); + ok(!wsZiele.some((z) => /b=highlight/.test(z)), + `und nirgends eine Highlights-Kachel (${wsZiele.length} Zusatzkacheln geprueft)`); + + /* ---- Das Brett selbst ------------------------------------------- */ + const hl = { + crew: await hole("/workspace/api/bereich/highlight", { host: CREW, keks: dogi.keks }), + ws: await hole("/workspace/api/bereich/highlight", { host: WS, keks: dogi.keks }), + }; + ok(hl.crew.status === 200, `das Brett antwortet auf crew. (${hl.crew.status})`); + ok(hl.ws.status === 404, + `auf der Agenturadresse gibt es es gar nicht -- 404 statt leer (${hl.ws.status})`); + + /* ---- Und der Weg, auf dem das Video hereinkommt ------------------ + Er haengt NICHT an derselben Middleware und braucht seinen + eigenen Riegel. Genau deshalb wird er hier eigens gemessen: Ohne + ihn liesse sich weiterhin etwas anlegen, das danach niemand + sieht -- derselbe Zustand, nur still. */ + const video = await hole("/workspace/api/bereich/highlight/video", { + host: WS, keks: dogi.keks, methode: "POST", + rumpf: JSON.stringify({ url: "https://www.tiktok.com/@dogfather/video/1234567890" }), + }); + ok(video.status === 404, + `auch ein Video laesst sich von dort nicht mehr einfuegen (${video.status})`); + + /* GEGENPROBE: Auf crew. wird es NICHT mit 404 abgewiesen. Die + Adresse ist der Unterschied, nicht etwa eine kaputte Route -- + sonst waere die Zeile darueber wertlos. (Dass TikTok die erfundene + Nummer nicht kennt, ist hier egal: Jede Antwort ausser 404 zeigt, + dass der Riegel nicht gegriffen hat.) */ + const videoCrew = await hole("/workspace/api/bereich/highlight/video", { + host: CREW, keks: dogi.keks, methode: "POST", + /* ABSICHTLICH KEINE ECHTE TIKTOK-ADRESSE. Der Riegel sitzt VOR der + Adresspruefung: Kommt hier 400 ("keine TikTok-Adresse") zurueck, + ist er nachweislich nicht gesprungen -- und die Pruefung schickt + dabei keine Anfrage ins Netz. Mit einer echten Adresse lief der + Server gegen TikTok, und die offenen Verbindungen rissen ihn + beim Beenden in einen libuv-Absturz: 107 Pruefungen, 1 Fehler, + Rueckgabewert 127. */ + rumpf: JSON.stringify({ url: "https://example.invalid/kein-tiktok" }), + }); + ok(videoCrew.status === 400, + `Gegenprobe: auf crew. greift der Riegel nicht (${videoCrew.status} statt 404)`); +} + d.close(); try { rmSync(ordner, { recursive: true, force: true }); } catch { /* egal */ } console.log(""); diff --git a/server/workspace-bereiche.js b/server/workspace-bereiche.js index 8b1dc55c..5e82f865 100644 --- a/server/workspace-bereiche.js +++ b/server/workspace-bereiche.js @@ -82,7 +82,7 @@ import { db, protokolliere, echteIp, sitzungLesen, DATEN_ORDNER, betreutWo, darfCreator, betreuteIds, istLeitung, istDogFather, siehtAlles, istSpicy, ohneDogFather, externPruefen, externSql, ohneTeamDogi, ohneAgentur, siehtModis, fuehrtTeamDogi, MODI_BEREICHE_ERLAUBT, brettHinterSeiteOffen, TEAM_DOGI_ROLLEN, - TREFF_BRETTER, TREFF_ROLLEN, AUSSEN_ROLLEN, + TREFF_BRETTER, TREFF_ROLLEN, AUSSEN_ROLLEN, brettAufDieserAdresse, heuteLokal, gehoertAufDieseAdresse, bereicheFuer, kanaeleFuer, KANAELE, @@ -949,6 +949,13 @@ bereicheRouter.use("/workspace/api/bereich/:bereich", (req, res, next) => { Faellt eines weg, haelt das andere. */ if (TREFF_BRETTER.includes(b) && !TREFF_ROLLEN.has(req.person?.rolle)) return nein(); + /* UND AUF DER AGENTURADRESSE GIBT ES SIE GAR NICHT (05.10.2026). + Begruendung bei `brettAufDieserAdresse` in workspace.js -- kurz: + Diese Bretter sind immer `crew`, der Adressriegel zeigt dort nur + `agentur`, also standen sie leer da und Neues verschwand sofort. + Jetzt antwortet die Seite gar nicht erst. */ + if (!brettAufDieserAdresse(req.person, b)) return nein(); + if (!TEAM_DOGI_ROLLEN.has(req.person?.rolle)) return next(); /* Bretter mit eigener Kachel: wer die Kachel hat, darf hinein. */ if (MODI_BEREICHE_ERLAUBT.has(b)) return next(); diff --git a/server/workspace-video.js b/server/workspace-video.js index d8ca7dbf..c789eec5 100644 --- a/server/workspace-video.js +++ b/server/workspace-video.js @@ -46,7 +46,7 @@ import { join } from "node:path"; import { mkdirSync, writeFileSync, unlinkSync } from "node:fs"; import { db, protokolliere, echteIp, sitzungLesen, DATEN_ORDNER, - KANAELE, kanalVonHandle, TREFF_BRETTER, + KANAELE, kanalVonHandle, TREFF_BRETTER, brettAufDieserAdresse, heuteLokal, hausFuerNeuenEintrag, } from "./workspace.js"; @@ -162,7 +162,14 @@ videoRouter.post("/workspace/api/bereich/:bereich/video", async (req, res) => { let abgelegt = null; try { const bereich = String(req.params.bereich); - if (!TREFF_BRETTER.includes(bereich)) { + /* DIESE ROUTE HAT IHR EIGENES TOR. Sie haengt nicht an der + Middleware von workspace-bereiche.js -- deshalb steht der + Adressriegel hier eigens. Ohne ihn liesse sich von der + Agenturadresse aus weiterhin ein Video anlegen, das danach + niemand dort sieht: genau der Zustand, der heute gemeldet + wurde, nur still. */ + if (!TREFF_BRETTER.includes(bereich) + || !brettAufDieserAdresse(req.person, bereich)) { return res.status(404).json({ fehler: "nicht_gefunden" }); } const warum = darfSchreiben(req.person, bereich); diff --git a/server/workspace.js b/server/workspace.js index c9bd74ac..23b8ad86 100644 --- a/server/workspace.js +++ b/server/workspace.js @@ -2160,6 +2160,53 @@ const TREFF_MIT_EIGENEM = [...TREFF_BEREICHE, HILFE_KACHEL, STECKBRIEF_KACHEL_TR assets/js/bereiche.js und wird dort ergaenzt. `[]` heisst "diese Rolle bekommt gar nichts"; ihr eine einzelne Kachel zu geben waere die Ausnahme, die spaeter niemand mehr erklaeren kann. */ +/** Gibt es dieses Brett auf der Adresse, auf der jemand angemeldet ist? + * + * DIE SIEBEN BRETTER DES RUDELS GIBT ES NUR BEI TEAM DOGI (05.10.2026). + * + * Filipe: "ich kann gerade bei highlights keine videos hochladen." + * + * Nachgemessen an der laufenden Datenbank: 49 Highlights, ALLE mit + * `haus = crew` -- so legt `hausFuerNeuenEintrag` sie an, ausdruecklich + * "egal, von welcher Adresse aus jemand hineinschreibt". Seit dem + * Adressriegel vom 03.10. zeigt die Agenturadresse aber nur Eintraege + * mit `haus = agentur`. Ergebnis: + * + * crew. -> 49 Highlights + * workspace-> 0 + * + * Das Brett stand dort also leer da, und was jemand einfuegte, + * verschwand in derselben Sekunde -- angelegt, aber sofort + * ausgeblendet. Von aussen sieht das aus wie "das Hochladen geht + * nicht"; in Wahrheit ging alles, nur sehen konnte er es nicht. + * + * Zwei Regeln widersprachen sich: Die eine sagt "diese Bretter sind + * immer crew", die andere "auf dieser Adresse nur agentur". Aufgeloest + * wird es in Filipes Richtung (05.10.2026, nach Rueckfrage): Auf der + * Agenturadresse gibt es diese Bretter gar nicht mehr -- weder als + * Kachel noch als Seite noch als Schnittstelle. Das ist die Regel vom + * 24.09. beim Wort genommen: "auf jeder Adresse nur deren Bestand." + * + * OHNE ADRESSE (Pruefungen, 127.0.0.1) bleibt alles offen. Dieselbe + * vorsichtige Richtung wie in `nurDiesesHaus` -- ein Riegel, der auch + * dort zuschlaegt, wo niemand ein Haus kennt, sperrt die eigenen + * Messungen aus. */ +export const brettAufDieserAdresse = (person, bereich) => + !(TREFF_BRETTER.includes(String(bereich)) && person?.haus === "agentur"); + +/* HIER STAND EIN KACHELFILTER -- und er war toter Code (05.10.2026). + + Die Idee war, die Rudel-Kacheln auf der Agenturadresse aus der + Serverliste zu streichen. Nachgemessen gibt es dort gar keine + Serverliste: `bereicheRoh` liefert fuer die Agenturrollen `null`, + und das heisst "der Browser nimmt seine eigene Liste". In dieser + stehen die Rudel-Bretter nicht -- weder in start.html noch in + bereiche.js. Es gab also nichts zu filtern. + + Ein Filter, den nichts erreicht, ist schlimmer als keiner: Er sieht + beim Lesen aus wie der Schutz, und man sucht den echten nicht mehr. + Der echte ist das Tor in workspace-bereiche.js und in der + Video-Route -- beide gemessen in pruef-haus-trennung. */ export function bereicheFuer(person) { const liste = bereicheRoh(person); if (liste === null || !Array.isArray(liste) || !liste.length) return liste;