From adb265e6031176e74e192df50c81fa8dacbfe5d3 Mon Sep 17 00:00:00 2001 From: Dogfather Date: Mon, 5 Oct 2026 12:19:10 +0200 Subject: [PATCH] Highlights: auf der Agenturadresse gibt es die Rudel-Bretter nicht mehr Filipe, dringend: "ich kann gerade bei highlights keine videos hochladen." DAS HOCHLADEN WAR NICHT KAPUTT. Gemessen an der laufenden Datenbank: 49 Highlights, ALLE mit haus = crew -- so legt hausFuerNeuenEintrag sie an, ausdruecklich "egal, von welcher Adresse aus jemand hineinschreibt". 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 "geht nicht hoch". Beleg: Eintrag #77 wurde heute um 08:41 erfolgreich angelegt, #76 gestern von Filipe selbst. Im Serverlog stand seit Stunden keine Fehlerzeile, und TikTok antwortet dem Server normal (HTTP 200 in 0,2 s) -- beides geprueft, bevor im Code gesucht wurde. ZWEI REGELN WIDERSPRACHEN SICH, und jede fuer sich war richtig: "diese Bretter sind immer crew" gegen "diese Adresse zeigt nur agentur". Keine Pruefung konnte das merken, weil keine den Zwischenraum ansah. Aufgeloest in Filipes Richtung (Rueckfrage 05.10.): Auf der Agenturadresse gibt es diese Bretter gar nicht -- 404 statt leerem Brett. Das ist die Regel vom 24.09. beim Wort genommen: "auf jeder Adresse nur deren Bestand." EINE Regel (brettAufDieserAdresse), zwei Tore: die Middleware in workspace-bereiche.js und die Video-Route, die NICHT an ihr haengt. Ohne das zweite liesse sich weiterhin etwas anlegen, das danach niemand sieht -- derselbe Zustand, nur still. Ohne Adresse (Pruefungen, 127.0.0.1) bleibt alles offen, dieselbe vorsichtige Richtung wie in nurDiesesHaus. ZWEIMAL VON DER MESSUNG KORRIGIERT WORDEN: 1. Ich hatte zusaetzlich einen Kachelfilter gebaut. Er war toter Code: Auf der Agenturadresse liefert bereicheRoh `null` ("der Browser nimmt seine eigene Liste"), und in dieser stehen die Rudel-Bretter gar nicht -- weder in start.html noch in bereiche.js. Es gab nichts zu filtern. Wieder entfernt: Ein Filter, den nichts erreicht, sieht beim Lesen aus wie der Schutz, und man sucht den echten nicht mehr. 2. Meine erste Pruefzeile erwartete auf der Agenturadresse Serverkacheln und wurde rot -- zu Recht, ich hatte eine Liste vermutet, wo keine ist. pruef-haus-trennung 100 -> 107, beide Richtungen und alle drei Wege (Kachel, Brett, Video). Die Gegenprobe auf crew. schickt bewusst KEINE echte TikTok-Adresse: Der Riegel sitzt vor der Adresspruefung, also beweist 400 ebenso gut, dass er nicht gesprungen ist -- und der Lauf geht dafuer nicht ins Netz. Mit einer echten Adresse riss der Server beim Beenden in einen libuv-Absturz (107 Pruefungen, 1 Fehler, Rueckgabewert 127). Co-Authored-By: Claude Opus 5 --- server/pruef-haus-trennung.mjs | 93 ++++++++++++++++++++++++++++++++++ server/workspace-bereiche.js | 9 +++- server/workspace-video.js | 11 +++- server/workspace.js | 47 +++++++++++++++++ 4 files changed, 157 insertions(+), 3 deletions(-) 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;