Der Treff: eine eigene Tür für die Community, und sie sieht nur, was dasteht
Filipe: "eine community rolle und community kategorie, wo die community auch dann nur die sieht" · "wieso nur eine kachel — ich will mehrere, mit mehreren optionen" · "egal welche rolle hinzugefügt wird soll immer nur das sehen was ich erlaube". DIE DRITTE ADRESSE. treff.dogfather-universe.com bekommt eine eigene Weiche (treff-adresse.js), eine eigene Zugangswand, ein eigenes Manifest und acht eigene Bühnenbilder. Ohne sie stünde dort die Wand der Agentur: Spicy-Logo, "Creator Workspace", fünf Rollenkacheln mit den Namen Admin, Manager, Scout, Creator — die komplette Struktur des Unternehmens, vor der Anmeldung, für jeden mit der Adresse. Welche Wand zu welcher Tür gehört, steht jetzt in EINER Tafel (istFremdeWand) statt als Sonderfall im Code. Bei zwei Wänden war ein Sonderfall richtig; bei drei wären es drei geworden, bei vier sechs. SIEBEN BRETTER UND EIN ACHTES NUR FÜRS TEAM. Anschlagbrett, Was ansteht, Der Treff, Wunschliste, Highlights, Regeln & Hilfe, Mitmachen — dazu "Meldungen & Maßnahmen", das ausdrücklich NICHT in TREFF_BEREICHE steht: dort wäre es lautlos bei der Community gelandet und hätte ausgesehen wie die anderen sieben. WAS AUF DEN BRETTERN PASSIERT: "Will ich auch" (eine Stimme je Person, erzwungen durch den Schlüssel, nicht durch eine Prüfung) · Anheften, höchstens drei, gezählt IN der Transaktion · Freigabe vor Sichtbarkeit für Termine und Highlights, wobei Abwesenheit der Ruhezustand ist · Melden mit Pflicht-Grund (DSA Art. 16) · Entfernen mit Grund, der den Beitrag ÜBERLEBT (DSA Art. 17) · drei Stufen, gerechnet statt gespeichert · die Bannleiter: Modi bis 7 Tage, dauerhaft nur DogFather (seine Entscheidung) · "Mitmachen" wird zum Talent, genau einmal. Der Ausschluss wirkt in sitzungLesen() — also nicht nur beim Schreiben. Wer ausgeschlossen ist, ist weg, nicht stumm. ZWEI SEITEN MEHR. treff-regeln.html holt seine ZAHLEN vom Server (Mindestalter 18, Fristen, Anschläge) — ein Regeltext, der eine andere Zahl nennt als die Regel, ist schlimmer als keiner. rechte.html rechnet "Wer sieht was" aus derselben Tafel aus, aus der die Schranke ihre Entscheidung holt. Die Community steht dort bei 3 von 23. SECHS BEFUNDE, KEINEN HAT DAS LESEN GEFUNDEN: · Ein Modi kam über den verborgenen Zugang in den Treff — die Bedingung war durch Ausschluss formuliert und nahm die neue Wand automatisch mit · /api/personen gab einem Mitglied Namen und Rolle von DogFather · Ein DELETE mit Körper wird von Nodes HTTP-Parser mit einem leeren 400 abgewiesen, bevor Express ihn sieht (gemessen). Der Grund reist jetzt in der Adresse · Der Kommentar, der erklärt, warum die Zugangswand keine Rollennamen nennt, nannte selbst einen — in einer ausgelieferten Datei · Zwei Listen für "welche Seiten sind ohne Anmeldung offen". Sie stimmten, weil beide am selben Tag entstanden · Ein Portkonflikt, den ich selbst gebaut hatte (4391 gehört pruef-chat-aufloesen) Dazu zwei feste Zahlen abgeschafft (die 20 in pruef-rechtetafel, die Kachelzahl in pruef-treff) und zwei Werkzeuge, die jetzt SUCHEN statt aufzuzählen: Der Versionsstempel findet seine Manifeste selbst — das dritte hätte sonst keinen bekommen, und die neue App hätte bis zu vier Stunden lang das falsche Zeichen getragen. Das Bildwerkzeug baut beide Zugangswände aus einer Vorlage mit zwei Werten. Zwei neue Kacheltöne, gemessen statt gewählt: #2f2f7f (Abstand 31,4 in Lab) und #7c2771 (29,7). Das schwächste Paar der vorhandenen 34 liegt bei 24,9. Geprüft: treff 69 · treff-werkzeuge 60 · rollen 312 · start-ansicht 147 · crew-adresse 129 · sicht 84 · modi-verborgen 80 · haus-trennung 62 · bereiche-lesend 37 · css-klassen 30 · zwischenspeicher 21 · alle-wege 19 · rechtetafel 19 — alles grün. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
+110
-27
@@ -93,6 +93,25 @@ export const CREW_ADRESSE = "https://crew.dogfather-universe.com";
|
||||
stehen kann. workspace.js gibt sie fuer die Fachmodule weiter. */
|
||||
export const TEAM_DOGI_ROLLEN = new Set(["hand", "modi"]);
|
||||
|
||||
/* WER VON AUSSEN KOMMT (11.09.2026).
|
||||
|
||||
Die Community. Sie steht hier und nicht in workspace.js, weil diese
|
||||
Datei von nichts abhaengt -- workspace.js importiert von hier, nicht
|
||||
umgekehrt. Eine zweite Liste dort waere die, die auseinanderlaeuft.
|
||||
|
||||
Der Unterschied zu TEAM_DOGI_ROLLEN ist nicht die Verborgenheit,
|
||||
sondern die Richtung: Das Team gehoert zum Haus und wird vor der
|
||||
Agentur verborgen. Die Community gehoert NICHT zum Haus -- sie
|
||||
bekommt nur, was ausdruecklich fuer sie da ist. */
|
||||
export const AUSSEN_ROLLEN = new Set(["gast"]);
|
||||
|
||||
/* Die Adresse des Treffs. Eigene Wand, eigenes Haus -- und ausdruecklich
|
||||
NICHT crew.: Diese Adresse ist absichtlich verborgen (kein Eintrag bei
|
||||
Suchmaschinen, keine Rollennamen in ausgelieferten Dateien, Codes nur
|
||||
persoenlich). Dutzende Zuschauer heben jede dieser Eigenschaften auf.
|
||||
Nicht durch einen Fehler, sondern durch die Nutzung. */
|
||||
const TREFF_HOSTS = new Set(["treff.dogfather-universe.com"]);
|
||||
|
||||
/** Die Adresse der Modi-App. Feste Menge, kein Muster -- Falle 1. */
|
||||
const CREW_HOSTS = new Set(["crew.dogfather-universe.com"]);
|
||||
|
||||
@@ -121,6 +140,26 @@ export function istOhneModiAdresse(hostKopfzeile) {
|
||||
return OHNE_MODI_HOSTS.has(nurHost(hostKopfzeile));
|
||||
}
|
||||
|
||||
/** Eine Pruefadresse -- localhost und die Nummern, unter denen die
|
||||
* Pruefungen ihren eigenen Server starten.
|
||||
*
|
||||
* Sie steht hier als EIGENE Funktion und nicht als "alles, was keine
|
||||
* der echten Adressen ist". Genau diese Formulierung durch Ausschluss
|
||||
* hat am 11.09.2026 dazu gefuehrt, dass der verborgene Zugang auf der
|
||||
* neuen dritten Wand mitgalt, ohne dass es jemand entschieden haette.
|
||||
* Wer eine vierte Adresse baut, muss sie hier NICHT eintragen -- und
|
||||
* bekommt dadurch von selbst das sichere Verhalten. */
|
||||
export function istPruefAdresse(hostKopfzeile) {
|
||||
const h = nurHost(hostKopfzeile);
|
||||
return h === "localhost" || h === "127.0.0.1" || h.startsWith("127.")
|
||||
|| h === "::1" || h === "[::1]";
|
||||
}
|
||||
|
||||
/** Ist das die Adresse des Treffs? */
|
||||
export function istTreffAdresse(hostKopfzeile) {
|
||||
return TREFF_HOSTS.has(nurHost(hostKopfzeile));
|
||||
}
|
||||
|
||||
/** Gehoert dieser Pfad zum Workspace-Teil? Genau "/workspace" oder
|
||||
* alles darunter -- aber NICHT /workspaceXYZ (Falle 3). */
|
||||
export function istWorkspacePfad(pfad) {
|
||||
@@ -128,6 +167,57 @@ export function istWorkspacePfad(pfad) {
|
||||
return p === "/workspace" || p.startsWith("/workspace/");
|
||||
}
|
||||
|
||||
/* =====================================================================
|
||||
WELCHE WAND GEHOERT ZU WELCHER TUER (11.09.2026)
|
||||
=====================================================================
|
||||
|
||||
Drei Zugangswaende liegen als drei Dateien im selben Ordner, und
|
||||
express.static liefert jede aus, die man beim Namen nennt. Ohne eine
|
||||
Regel kann also jeder jede aufrufen: die Community die Wand von Team
|
||||
Dogi, das Team die Wand des Treffs, und beide auf der Agenturadresse.
|
||||
|
||||
DAS WAR SCHON EINMAL EIN LOCH, und gefunden hat es nicht das Lesen,
|
||||
sondern der Wortleck-Test, der ALLE ausgelieferten Dateien durchsucht.
|
||||
Damals stand die Regel als EIN Sonderfall im Code ("auf den alten
|
||||
Adressen gibt es crew-index.html nicht"). Bei der dritten Wand waeren
|
||||
daraus drei Sonderfaelle geworden, bei der vierten sechs. Deshalb
|
||||
steht hier jetzt eine Tafel: Jede benannte Wand nennt die Adresse,
|
||||
auf die sie gehoert, und die Frage wird einmal beantwortet.
|
||||
|
||||
404 UND KEINE WEITERLEITUNG: "Gibt es nicht" verraet nichts. Eine
|
||||
Weiterleitung wuerde sagen, dass es die Datei gibt, nur woanders.
|
||||
|
||||
/workspace/index.html STEHT ABSICHTLICH NICHT IN DER TAFEL. Sie ist
|
||||
keine benannte Wand, sondern die Vorgabe -- jede Adresse biegt sie
|
||||
auf ihre eigene um, bevor daraus eine Datei wird. Stuende sie hier,
|
||||
bekaeme man auf crew. und treff. ein 404 statt der eigenen Wand.
|
||||
|
||||
AUF PRUEFADRESSEN GILT DIE TAFEL NICHT, und das ist dieselbe
|
||||
Ueberlegung wie bei OHNE_MODI_HOSTS: Sonst koennten die Pruefungen,
|
||||
die jede Wand im Browser ansehen, keine mehr oeffnen -- sie blieben
|
||||
gruen und wuerden nichts mehr messen. Ein gruener Lauf, der nichts
|
||||
mehr prueft, ist schlimmer als ein roter. */
|
||||
const BENANNTE_WAENDE = [
|
||||
{ datei: "/workspace/crew-index.html", zuhause: istCrewAdresse },
|
||||
{ datei: "/workspace/treff-index.html", zuhause: istTreffAdresse },
|
||||
];
|
||||
|
||||
/** Wird hier eine Wand verlangt, die zu einer ANDEREN Tuer gehoert? */
|
||||
export function istFremdeWand(hostKopfzeile, pfad) {
|
||||
/* Mehrfache Schraegstriche zusammenziehen: express raeumt Punkt-
|
||||
Segmente weg, doppelte Striche aber nicht -- und express.static
|
||||
zieht sie danach selbst zusammen und liefert die Datei aus. Genau
|
||||
daran ist am 04.09.2026 die Schranke des Workspace vorbeigelaufen. */
|
||||
const p = String(pfad || "").toLowerCase().replace(/\/{2,}/g, "/");
|
||||
const wand = BENANNTE_WAENDE.find((w) => w.datei === p);
|
||||
if (!wand) return false;
|
||||
if (istPruefAdresse(hostKopfzeile)) return false;
|
||||
const benannt = istOhneModiAdresse(hostKopfzeile)
|
||||
|| istCrewAdresse(hostKopfzeile) || istTreffAdresse(hostKopfzeile);
|
||||
if (!benannt) return false;
|
||||
return !wand.zuhause(hostKopfzeile);
|
||||
}
|
||||
|
||||
/**
|
||||
* Darf diese Person auf dieser Adresse angemeldet sein?
|
||||
*
|
||||
@@ -141,6 +231,16 @@ export function istWorkspacePfad(pfad) {
|
||||
*/
|
||||
export function sitzungPasstZurAdresse(rolle, hostKopfzeile) {
|
||||
const team = TEAM_DOGI_ROLLEN.has(rolle);
|
||||
/* AUSSENROLLEN GEHOEREN AUF GENAU EINE ADRESSE (11.09.2026).
|
||||
|
||||
Und die Bedingung steht in BEIDE Richtungen: Die Community kommt
|
||||
nur auf treff. herein, und auf treff. kommt NUR sie herein. Das
|
||||
Team sieht den Treff auf seiner eigenen Adresse -- es hat dort
|
||||
nichts zu suchen, und ein Konto, das an zwei Waenden funktioniert,
|
||||
ist eine Tuer, die man beim naechsten Umbau uebersieht. */
|
||||
const aussen = AUSSEN_ROLLEN.has(rolle);
|
||||
if (istTreffAdresse(hostKopfzeile)) return aussen;
|
||||
if (aussen) return false;
|
||||
/* crew.: das Team -- und DogFather, der in beiden Welten arbeitet. */
|
||||
if (istCrewAdresse(hostKopfzeile)) return team || rolle === "admin";
|
||||
/* Die echten alten Adressen: alle ausser dem Team. */
|
||||
@@ -175,36 +275,19 @@ export function sitzungPasstZurAdresse(rolle, hostKopfzeile) {
|
||||
* Serverumbau lautlos weg.
|
||||
*/
|
||||
export function crewWeiche(req, res, next) {
|
||||
if (!istCrewAdresse(req.get("host"))) {
|
||||
/* DIE ANDERE RICHTUNG -- und sie war ein echtes Loch.
|
||||
/* DIE FREMDE WAND -- fuer JEDE Adresse, auch fuer crew. selbst.
|
||||
|
||||
Die zweite Zugangswand liegt als Datei im selben Ordner wie alles
|
||||
andere und wird von express.static ausgeliefert. Ohne diese Zeile
|
||||
kann sie JEDER unter ihrem Dateinamen aufrufen, auch auf
|
||||
workspace.dogfather-universe.com -- und saehe dort eine
|
||||
Anmeldeseite, die es dort gar nicht geben soll.
|
||||
|
||||
Gefunden hat das nicht ein Gedanke, sondern eine Pruefung: Der
|
||||
Wortleck-Test durchsucht ALLE ausgelieferten Dateien, und dass er
|
||||
diese eine ueberhaupt las, war die Antwort auf eine Frage, die
|
||||
ich mir nicht gestellt hatte -- naemlich wer sie sonst noch
|
||||
abrufen kann.
|
||||
|
||||
404 UND KEINE WEITERLEITUNG: "Gibt es nicht" ist die Antwort, die
|
||||
nichts verraet. Eine Weiterleitung wuerde sagen, dass es die
|
||||
Datei gibt, nur woanders.
|
||||
|
||||
NUR AUF DEN DREI ECHTEN ADRESSEN, nicht "ueberall ausser crew":
|
||||
Sonst waere sie auch auf localhost gesperrt, und die Pruefung,
|
||||
die die Wand im Browser ansieht, koennte sie nicht mehr oeffnen
|
||||
-- sie wuerde gruen bleiben und nichts mehr messen. */
|
||||
if (istOhneModiAdresse(req.get("host"))
|
||||
&& req.path.toLowerCase().replace(/\/{2,}/g, "/") === "/workspace/crew-index.html") {
|
||||
return res.status(404).type("html").send("Nicht gefunden.");
|
||||
}
|
||||
return next();
|
||||
Sie steht vor der Weiche und nicht in ihrem Nein-Zweig. Dort stand
|
||||
sie bis zum 11.09.2026, und das war richtig, solange es zwei Waende
|
||||
gab: Die eigene kann man nicht "fremd" verlangen. Mit der dritten
|
||||
stimmt das nicht mehr -- auf crew. ist die Wand des Treffs fremd,
|
||||
und im Nein-Zweig waere diese Frage dort nie gestellt worden. */
|
||||
if (istFremdeWand(req.get("host"), req.path)) {
|
||||
return res.status(404).type("html").send("Nicht gefunden.");
|
||||
}
|
||||
|
||||
if (!istCrewAdresse(req.get("host"))) return next();
|
||||
|
||||
res.setHeader("X-Robots-Tag", "noindex, nofollow");
|
||||
|
||||
/* DAS MANIFEST MACHT DIE APP (10.09.2026).
|
||||
|
||||
Reference in New Issue
Block a user