Server F checks the dashboard's entry ticket as itsdangerous does (tools/ticket-oracle: tickets made by itsdangerous 2.2.0 itself), redeems it at /__auth for a session cookie (only the key's SHA-256 is kept) and decides at /sync by the session's grant: none, read or write; a frozen project is read by everyone; every refusal names its reason (one list in packages/protocol/src/sync.ts). A WebSocket from a page of another origin is refused. /svc/* with the service key makes, deletes, freezes and thaws projects, ends a person's grant or all their sessions (connections let go) and lists the sessions. Snapshots, restoring and copying move to F6 (they need the canonical doc.json and an epoch). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Orakel für die Eintrittskarte
Das Dashboard signiert die Eintrittskarte für Server F mit itsdangerous
(URLSafeTimedSerializer, Salz mdg-filius-ticket, 60 s), Server F prüft
sie in Node (packages/server/src/ticket.ts). Dieses Orakel lässt
itsdangerous selbst Karten ausstellen — bei fester Uhr — und hält fest, was
es beim Lesen zu einem Zeitpunkt antwortet: die Nutzlast, abgelaufen oder
falsch signiert.
./run.sh # schreibt packages/server/test/tickets.python.json
Braucht Python 3; itsdangerous kommt in der Version des Dashboards
(backend/requirements.txt) in ein eigenes .venv.
Fälle: gewöhnliche Karte (schon sie ist zlib-gepackt), Lesestufe, Umlaute und Emoji, lange Namen, genau 60 s alt, 61 s alt, aus der Zukunft, fremdes Geheimnis, Scratchs Salz, eine veränderte Nutzlast, ohne Signatur, Unsinn, leer, eine Liste statt eines Objekts (ungepackt), Karten ohne Stufe, mit unbekannter Stufe, mit einem Projekt, das keine UUID ist, ohne Namen, nur mit den Pflichtfeldern.