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:
+33
-29
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user