Die alte Wand schweigt: ein Modi-Code zaehlt dort wie ein erfundener

Filipe: "auf der workspace seite fuer die agentur und so sollen die modis
von mir nicht mehr rein kommen." Das war seit dem Deploy schon so -- ein
Modi bekam dort keine Sitzung. Offen war nur, WIE die Wand reagiert:
Bis eben zeigte sie ihm den Weg zur neuen Adresse. Seine Entscheidung:
"gar nichts -- Code stimmt nicht."

WARUM DAS EIN ANDERER WEG IST UND NICHT NUR EINE ANDERE ANTWORT

Ein schlichtes `return 401` haette die richtige Meldung gezeigt und
trotzdem eine Spur hinterlassen: Der verborgene Zugang waere weiterhin
befragt worden -- ein Suchschluessel-Treffer und EIN scrypt-Durchlauf
statt der Kandidatenschleife der gewaehlten Kachel. Das ist messbar, und
Zeitunterschiede sind genau die Spur, die dieser Zugang vermeiden soll.

Deshalb wird stillerZugang() auf den drei alten Adressen ueberhaupt
nicht mehr aufgerufen. Der Code faellt danach durch den gewohnten Weg
wie jeder unbekannte: dieselbe Schleife, derselbe Eintrag in `versuche`,
dieselbe Antwort, dieselbe Dauer. Die alte Wand verhaelt sich exakt so
wie an dem Tag, bevor es diese Rollen gab.

GEPRUEFT WIRD DIE UNUNTERSCHEIDBARKEIT, NICHT DER STATUSCODE
Eine 401 waere leicht zu erfuellen und truege trotzdem eine Spur, wenn
Rumpf oder Koepfe anders aussaehen. Die Pruefung schickt deshalb einen
echten Modi-Code und einen frei erfundenen an dieselbe Wand und
vergleicht Zeichen fuer Zeichen:

  ok  workspace.: der Modi-Code wird abgewiesen wie ein erfundener (401)
  ok  workspace.: und die Antwort ist Zeichen fuer Zeichen dieselbe
  ok  workspace.: die neue Adresse wird nicht genannt

DER PREIS, und er gehoert genannt: Ein Modi mit der alten Verknuepfung
sammelt dort jetzt Fehlversuche wie jeder andere. Acht in zehn Minuten
sperren seine IP -- auch fuer die neue Adresse, denn die Sperre haengt
an der IP, nicht am Hostnamen.

GEMESSEN
pruef-crew-adresse    115 (statt 114 -- die neue Gegenprobe)
pruef-rollen          274   pruef-modi-verborgen  78

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
2026-09-10 15:44:18 +02:00
co-authored by Claude Opus 5
parent 63b3ace3fa
commit d36f122926
2 changed files with 57 additions and 43 deletions
+33 -29
View File
@@ -27,7 +27,7 @@ import { dirname, join } from "node:path";
import { fileURLToPath, pathToFileURL } from "node:url";
import { mkdirSync } from "node:fs";
import { createRequire } from "node:module";
import { sitzungPasstZurAdresse, CREW_ADRESSE, istOhneModiAdresse, istCrewAdresse,
import { sitzungPasstZurAdresse, istOhneModiAdresse, istCrewAdresse,
TEAM_DOGI_ROLLEN } from "./crew-adresse.js";
/* Weitergereicht, damit die Fachmodule sie wie alles andere aus
workspace.js beziehen und nicht wissen muessen, wo sie wohnt. */
@@ -2827,35 +2827,39 @@ workspaceRouter.post("/workspace/api/anmelden", (req, res) => {
DER SUCHSCHLUESSEL ALLEIN LAESST NIEMANDEN HEREIN. Er sagt nur,
WEN man pruefen soll -- danach entscheidet scrypt wie ueberall. */
const still = codeBrauchbar ? stillerZugang(code) : null;
/* AUF DEN ALTEN ADRESSEN WIRD DER VERBORGENE ZUGANG GAR NICHT ERST
GEFRAGT (Entscheidung Filipe, 10.09.2026).
Vorher stand hier eine Weiterleitung: Wer seinen Code noch auf
workspace.dogfather-universe.com eintippte, bekam keine Sitzung,
aber den Weg zur neuen Adresse. Filipes Entscheidung dagegen:
"gar nichts -- Code stimmt nicht". Die alte Wand soll sich
verhalten, als waere der Code erfunden.
WARUM DAS NICHT NUR EINE ANDERE ANTWORT IST, SONDERN EIN ANDERER
WEG: Haette ich hier bloss `return 401` gesetzt, waere der Ablauf
trotzdem ein anderer geblieben -- ein Suchschluessel-Treffer und
EIN scrypt-Durchlauf statt der Kandidatenschleife der gewaehlten
Kachel. Das ist messbar, und Zeitunterschiede sind genau die
Spur, die dieser ganze Zugang vermeiden soll.
Deshalb wird `stillerZugang` auf diesen drei Adressen ueberhaupt
nicht aufgerufen. Der Code faellt danach durch den gewohnten Weg
wie jeder unbekannte: dieselbe Schleife, derselbe Eintrag in
`versuche`, dieselbe Antwort, dieselbe Dauer. Die alte Wand
verhaelt sich damit exakt so wie vor dem Tag, an dem es diese
Rollen gab.
DER PREIS, und er gehoert genannt: Ein Modi, der die alte
Verknuepfung auf dem Handy hat, sammelt dort Fehlversuche wie
jeder andere auch. Acht in zehn Minuten sperren seine IP -- und
zwar auch fuer die neue Adresse, denn die Sperre haengt an der
IP, nicht am Hostnamen. Das ist der Preis der Stille; er faellt
nur an, wenn jemand die alte Adresse mehrfach probiert. */
const still = codeBrauchbar && !istOhneModiAdresse(req.get("host"))
? stillerZugang(code)
: null;
if (still) {
/* AUF DER ALTEN ADRESSE GIBT ES KEINE SITZUNG MEHR (10.09.2026).
Die Modi-App hat seit heute eine eigene Adresse. Wer seinen Code
noch auf workspace.dogfather-universe.com eintippt, bekommt hier
den Weg dorthin -- und ausdruecklich KEINE Anmeldung: zwei
Sitzungen auf zwei Adressen waeren zwei Apps auf dem
Startbildschirm und eine zweite Spur genau dort, wo alle anderen
arbeiten.
DASS DIE ANTWORT DIE NEUE ADRESSE NENNT, IST KEIN LECK. Sie
kommt nur nach Eingabe eines gueltigen Modi-Codes; wer den hat,
ist Modi. Fuer jeden anderen -- auch fuer einen Manager mit
gueltigem eigenen Code -- veraendert sich hier gar nichts.
Kein Eintrag in `versuche`: Der Code war richtig. Ein Modi, der
die alte Verknuepfung auf dem Handy hat, wuerde sich sonst mit
jedem Versuch selbst aussperren. */
if (istOhneModiAdresse(req.get("host"))) {
protokolliere("anmeldung_alte_adresse", {
personId: still.id, rolle: still.rolle, ip, detail: still.name,
});
return res.json({
weiter: `${CREW_ADRESSE}/workspace/start.html`,
name: still.name, rolle: still.rolle, umgezogen: true,
});
}
db().prepare("DELETE FROM versuche WHERE ip = ?").run(ip);
db().prepare("UPDATE personen SET letzter_login = ? WHERE id = ?").run(jetzt(), still.id);
sitzungSetzen(res, still, req);