User Management #177

Closed
opened 2026-09-20 11:33:08 +02:00 by admin · 3 comments

Wird Zeit für ein User Management. (Registrieren, Login, etc.)

Jeder User hat seine eigenen Projekte.
Vorerst reichen die Felder "username" und "password"

Im ersten Step soll es einfach nur 3 User geben:

  • admin => keine Projekte, der bekommt später auch die admin-rolle (admins können user verwalten, fremd-projekte sehen, etc.)
  • e2e => alle Projekte, die für den e2e test benötigt werden (bzw. geseedet sind)
  • user => alle anderen Projekte

Login-Screen auch in Pixi im Canvas (keine extra canvas, kein extra html)
Einloggen soll Pflicht sein. Login-Session soll build überleben.
Ausloggen soll auch möglich sein (rechtsoben ein button "Logout")

Wichtig: Migration einmalig, nicht in den Code einbauen.

Alles weitere in passende Folge-Issues: User Management durch Administatoren, Registrierung, Rollen, Geteilte Projekte, etc.

Wird Zeit für ein User Management. (Registrieren, Login, etc.) Jeder User hat seine eigenen Projekte. Vorerst reichen die Felder "username" und "password" Im ersten Step soll es einfach nur 3 User geben: - `admin` => keine Projekte, der bekommt später auch die admin-rolle (admins können user verwalten, fremd-projekte sehen, etc.) - `e2e` => alle Projekte, die für den e2e test benötigt werden (bzw. geseedet sind) - `user` => alle anderen Projekte Login-Screen auch in Pixi im Canvas (keine extra canvas, kein extra html) Einloggen soll Pflicht sein. Login-Session soll build überleben. Ausloggen soll auch möglich sein (rechtsoben ein button "Logout") Wichtig: Migration einmalig, nicht in den Code einbauen. Alles weitere in passende Folge-Issues: User Management durch Administatoren, Registrierung, Rollen, Geteilte Projekte, etc.
admin added this to the Development project 2026-09-20 11:33:08 +02:00
admin moved this to Next in Development on 2026-09-20 11:33:15 +02:00
Author

Es soll kein page reload oder canvas neubau oder ähnliches passieren beim einloggen oder ausloggen. es soll sich einfach nur das gerenderte ändern (login screen weg, editor da, und umgekehrt) - ich glaube von login screen zu editor ist es scheinbar schon korrekt, aber bei logout wird die page neu geladen.

Es soll kein page reload oder canvas neubau oder ähnliches passieren beim einloggen oder ausloggen. es soll sich einfach nur das gerenderte ändern (login screen weg, editor da, und umgekehrt) - ich glaube von login screen zu editor ist es scheinbar schon korrekt, aber bei logout wird die page neu geladen.
Owner

Umgesetzt und gepusht als 8e4bb6e, Wiki als c10fd83.

Was jetzt da ist

  • Anmeldung ist Pflicht. Der Sign-in-Screen ist im selben Canvas gezeichnet (kein zweites Canvas, kein HTML-Formular): Benutzername, Passwort als Bullets, Enter springt ins nächste Feld und schickt von dort ab. Der Editor wird erst danach gebaut, vorher wird kein Projekt geladen.
  • Server: neue Routen auth/session, auth/login, auth/logout; alles andere antwortet ohne Session 401. Projekte tragen einen owner, ein fremdes Projekt kommt als 404 zurück. Konten in data/users.json (password_hash), Sessions als Datei in data/sessions/, 30 Tage gleitend — deshalb überlebt die Anmeldung ein npm run build unter dem offenen Tab.
  • Abmelden ohne Reload (dein Kommentar): Editor.dispose() baut den Editor ab, während Seite und Canvas stehen bleiben. Dafür hat alles, was sich außerhalb registriert, einen Rückweg bekommen: Autosave-Timer und sein beforeunload, die Focus-Handler der Panels, die drei Fenster-Listener des TilemapPanel, die Shortcuts und die Plugins. Das Konsolenlog wird geleert, es gehört zur Sitzung.
  • Migration einmalig: Ein Wegwerfskript hat den Besitzer in die 7 Projektdateien geschrieben und wurde danach gelöscht. Die vier Testprojekte gehören e2e, die Demo-Projekte samt Playground user, admin hat keine.
  • Konten angelegt: admin und user mit den vereinbarten Platzhalter-Passwörtern, dazu e2e mit einem zufälligen Passwort in data/e2e-password.txt (git-ignoriert). Anlegen geht nur im Container: docker exec -u www-data web-php-fpm php /var/www/html/game-maker/tools/make-user.php <name> <pw>.

Zwei Dinge zum Wissen

  • Die Platzhalter-Passwörter stehen auf einer öffentlich erreichbaren Seite. Dafür gibt es #182.
  • Die Brandmauer ersetzt jede Nicht-2xx-Antwort von nockal.com durch ihre eigene 418-Seite (von stein2 aus gemessen: 401, 404, 405, 422 kommen als 418 an, 200/204 nicht; über localhost:8080 kommt der echte Code). Das ist nicht von diesem Issue verursacht, wirkt sich aber sichtbar aus: die Maske zeigt live Could not sign in: … HTTP 418 statt Wrong user name or password. Sag Bescheid, ob du dazu ein eigenes Issue willst.

Tests

npm run check                      → 118 Files, 1705 Tests, CHECK EXIT 0
npm run build                      → BUILD EXIT 0
GM_STEPS=45 (frisch geseedet)      → ALL PASSED – 11 checks
  • Modul 45 (11 Checks): Cookie weg → Maske statt Editor, leeres Passwort wird ohne Serverfrage abgelehnt, falsches Passwort lässt die Maske stehen, Passwort steht als Bullets, Anmelden bringt Editor samt Projekt, Logout bringt die Maske zurück, eine Marke auf window und auf dem Canvas-Element überlebt das Abmelden (das ist der Beweis, dass nicht neu geladen wird), erneutes Anmelden bringt den Editor zurück und die Oberfläche ist über das Fenster gelegt.
  • 14 neue Unit-Tests: HttpAuthStore (falsches Paar gegen kaputten Server gegen die 418-Seite der Brandmauer) und was eine Sitzung hinterlässt (tests/editor/session-teardown.test.ts).
  • Gefundene echte Lücke: Nach attachAutosave(...).stop() hat eine spätere Änderung wieder einen Save geplant. Behoben, der neue Test hält es fest.
  • Serverseite direkt gemessen (über nginx, an der Brandmauer vorbei): ohne Session 401, falsches Passwort 401, user sieht seine 3 Projekte, ein e2e-Projekt gibt ihm 404, nach Logout wieder 401.
  • Die volle Suite ist lokal nicht durchgelaufen — auf Wunsch abgebrochen, das macht CI. Die frühere Version dieses Stands hatte sie in 1116 Checks grün gemeldet, die zwei neuen Checks in 45 kommen obendrauf.
  • Check-Summe 1118 in README und Wiki: gerechnet (1116 + 2), noch nicht von CI bestätigt.

Zwei Funde unterwegs

  • Die Toolbar war bei 1280 px schon vorher 180 px zu breit — die fps-Anzeige lag außerhalb des Fensters. Das Notice-Label ist jetzt flexibel statt 260 px fest. Aus demselben Grund steht der Benutzername im Fenstertitel statt als weiteres Label in der Leiste.
  • Widget.resize() layoutet nur bei geänderter Größe. Der Login-Screen hatte root schon auf Fenstergröße gesetzt, der resize im Editor war danach ein No-Op — die Oberfläche lag unlayoutet in der Ecke. Behoben mit root.resize(0, 0) beim Abräumen der Maske.

Doku und Folge-Issues

  • Wiki: neue Seite Accounts, dazu API, Architecture, Concepts, Development, Home und Sidebar.
  • Folge-Issues: #178 Registrierung, #179 Benutzerverwaltung, #180 Rollen, #181 Geteilte Projekte, #182 Passwort ändern.
Umgesetzt und gepusht als `8e4bb6e`, Wiki als `c10fd83`. ## Was jetzt da ist - **Anmeldung ist Pflicht.** Der Sign-in-Screen ist im selben Canvas gezeichnet (kein zweites Canvas, kein HTML-Formular): Benutzername, Passwort als Bullets, Enter springt ins nächste Feld und schickt von dort ab. Der Editor wird erst danach gebaut, vorher wird kein Projekt geladen. - **Server:** neue Routen `auth/session`, `auth/login`, `auth/logout`; alles andere antwortet ohne Session **401**. Projekte tragen einen `owner`, ein fremdes Projekt kommt als **404** zurück. Konten in `data/users.json` (`password_hash`), Sessions als Datei in `data/sessions/`, **30 Tage gleitend** — deshalb überlebt die Anmeldung ein `npm run build` unter dem offenen Tab. - **Abmelden ohne Reload** (dein Kommentar): `Editor.dispose()` baut den Editor ab, während Seite und Canvas stehen bleiben. Dafür hat alles, was sich außerhalb registriert, einen Rückweg bekommen: Autosave-Timer und sein `beforeunload`, die Focus-Handler der Panels, die drei Fenster-Listener des TilemapPanel, die Shortcuts und die Plugins. Das Konsolenlog wird geleert, es gehört zur Sitzung. - **Migration einmalig:** Ein Wegwerfskript hat den Besitzer in die 7 Projektdateien geschrieben und wurde danach gelöscht. Die vier Testprojekte gehören `e2e`, die Demo-Projekte samt Playground `user`, `admin` hat keine. - **Konten angelegt:** `admin` und `user` mit den vereinbarten Platzhalter-Passwörtern, dazu `e2e` mit einem zufälligen Passwort in `data/e2e-password.txt` (git-ignoriert). Anlegen geht nur im Container: `docker exec -u www-data web-php-fpm php /var/www/html/game-maker/tools/make-user.php <name> <pw>`. ## Zwei Dinge zum Wissen - **Die Platzhalter-Passwörter stehen auf einer öffentlich erreichbaren Seite.** Dafür gibt es #182. - **Die Brandmauer ersetzt jede Nicht-2xx-Antwort von `nockal.com` durch ihre eigene 418-Seite** (von stein2 aus gemessen: 401, 404, 405, 422 kommen als 418 an, 200/204 nicht; über `localhost:8080` kommt der echte Code). Das ist nicht von diesem Issue verursacht, wirkt sich aber sichtbar aus: die Maske zeigt live `Could not sign in: … HTTP 418` statt `Wrong user name or password`. Sag Bescheid, ob du dazu ein eigenes Issue willst. ## Tests ``` npm run check → 118 Files, 1705 Tests, CHECK EXIT 0 npm run build → BUILD EXIT 0 GM_STEPS=45 (frisch geseedet) → ALL PASSED – 11 checks ``` - **Modul 45 (11 Checks):** Cookie weg → Maske statt Editor, leeres Passwort wird ohne Serverfrage abgelehnt, falsches Passwort lässt die Maske stehen, Passwort steht als Bullets, Anmelden bringt Editor samt Projekt, Logout bringt die Maske zurück, **eine Marke auf `window` und auf dem Canvas-Element überlebt das Abmelden** (das ist der Beweis, dass nicht neu geladen wird), erneutes Anmelden bringt den Editor zurück und die Oberfläche ist über das Fenster gelegt. - **14 neue Unit-Tests:** `HttpAuthStore` (falsches Paar gegen kaputten Server gegen die 418-Seite der Brandmauer) und was eine Sitzung hinterlässt (`tests/editor/session-teardown.test.ts`). - **Gefundene echte Lücke:** Nach `attachAutosave(...).stop()` hat eine spätere Änderung wieder einen Save geplant. Behoben, der neue Test hält es fest. - **Serverseite direkt gemessen** (über nginx, an der Brandmauer vorbei): ohne Session 401, falsches Passwort 401, `user` sieht seine 3 Projekte, ein `e2e`-Projekt gibt ihm 404, nach Logout wieder 401. - **Die volle Suite ist lokal nicht durchgelaufen** — auf Wunsch abgebrochen, das macht CI. Die frühere Version dieses Stands hatte sie in 1116 Checks grün gemeldet, die zwei neuen Checks in 45 kommen obendrauf. - **Check-Summe 1118** in README und Wiki: gerechnet (1116 + 2), noch nicht von CI bestätigt. ## Zwei Funde unterwegs - **Die Toolbar war bei 1280 px schon vorher 180 px zu breit** — die fps-Anzeige lag außerhalb des Fensters. Das Notice-Label ist jetzt flexibel statt 260 px fest. Aus demselben Grund steht der Benutzername im Fenstertitel statt als weiteres Label in der Leiste. - **`Widget.resize()` layoutet nur bei geänderter Größe.** Der Login-Screen hatte `root` schon auf Fenstergröße gesetzt, der `resize` im Editor war danach ein No-Op — die Oberfläche lag unlayoutet in der Ecke. Behoben mit `root.resize(0, 0)` beim Abräumen der Maske. ## Doku und Folge-Issues - **Wiki:** neue Seite **Accounts**, dazu API, Architecture, Concepts, Development, Home und Sidebar. - **Folge-Issues:** #178 Registrierung, #179 Benutzerverwaltung, #180 Rollen, #181 Geteilte Projekte, #182 Passwort ändern.
admin moved this to Done in Development on 2026-09-20 13:13:19 +02:00
Owner

Nachtrag: der CI-Lauf zu 8e4bb6e war rot, behoben mit 1ef497f.

Gate war grün (Task 168), rot war die Suite (Task 169) mit genau 2 FAILs, beide im neuen Modul 45:

FAIL  the right pair opens the editor, with the account in the window title
      {"editor":true,"project":"fixture","title":"Game Maker – e2e"}
FAIL  signing in again brings the editor back, with the project in it – fixture

Ursache, kein Zufallsfehler: Beide Checks haben den Projektnamen gegen E2E fixture gehalten. In CI heißt dasselbe Projekt aber fixture — tools/ci/project-shells.mjs legt die leere Datei mit dem Key aus PROJECTS als Namen an, und der Seeder behält bewusst den Namen, den er auf dem Server vorfindet (sonst würde aus "Jump and Run" wieder jumpRun). Anmeldung, Editor und Projekt haben also funktioniert; nur der Name war nie eine taugliche Messgröße. Die Checks prüfen jetzt die Projekt-id und den vom Seeder geschriebenen Szenennamen Level 1, was in beiden Umgebungen gilt.

Teapot aus: Die Brandmauer vor nockal.com reicht seit heute die echten Statuscodes durch (gemessen: API ohne Session 401 {"error":"Sign in first"}, falsches Passwort 401 {"error":"Wrong user name or password"}). Deshalb prüft e2e 45 den Wortlaut der Ablehnung wieder selbst statt nur "irgendeine Meldung". Der Unit-Test zu einer fremden Zwischenseite bleibt — die Regel "nur ein 401 der API heißt falsches Paar" ist davon unabhängig richtig —, er heißt nur nicht mehr nach der Brandmauer.

Lokal: ./check.sh → 118 Files, 1705 Tests, CHECK EXIT 0; npm run build → BUILD EXIT 0; GM_STEPS=45 frisch geseedet → ALL PASSED – 11 checks. Die Check-Summe bleibt 1118 und ist durch den roten Lauf sogar belegt: er hat 1118 Ergebniszeilen ausgegeben (1116 PASS + 2 FAIL).

Der CI-Lauf zu 1ef497f läuft noch (Gate Task 170 ist grün, Suite Task 171 läuft).

Nachtrag: der CI-Lauf zu `8e4bb6e` war rot, behoben mit `1ef497f`. **Gate war grün** (Task 168), **rot war die Suite** (Task 169) mit genau 2 FAILs, beide im neuen Modul 45: ``` FAIL the right pair opens the editor, with the account in the window title {"editor":true,"project":"fixture","title":"Game Maker – e2e"} FAIL signing in again brings the editor back, with the project in it – fixture ``` **Ursache, kein Zufallsfehler:** Beide Checks haben den Projekt*namen* gegen `E2E fixture` gehalten. In CI heißt dasselbe Projekt aber `fixture` — `tools/ci/project-shells.mjs` legt die leere Datei mit dem Key aus `PROJECTS` als Namen an, und der Seeder behält bewusst den Namen, den er auf dem Server vorfindet (sonst würde aus "Jump and Run" wieder `jumpRun`). Anmeldung, Editor und Projekt haben also funktioniert; nur der Name war nie eine taugliche Messgröße. Die Checks prüfen jetzt die Projekt-`id` und den vom Seeder geschriebenen Szenennamen `Level 1`, was in beiden Umgebungen gilt. **Teapot aus:** Die Brandmauer vor `nockal.com` reicht seit heute die echten Statuscodes durch (gemessen: API ohne Session `401 {"error":"Sign in first"}`, falsches Passwort `401 {"error":"Wrong user name or password"}`). Deshalb prüft e2e 45 den Wortlaut der Ablehnung wieder selbst statt nur "irgendeine Meldung". Der Unit-Test zu einer fremden Zwischenseite bleibt — die Regel "nur ein 401 der API heißt falsches Paar" ist davon unabhängig richtig —, er heißt nur nicht mehr nach der Brandmauer. **Lokal:** `./check.sh` → 118 Files, 1705 Tests, `CHECK EXIT 0`; `npm run build` → `BUILD EXIT 0`; `GM_STEPS=45` frisch geseedet → `ALL PASSED – 11 checks`. Die Check-Summe bleibt 1118 und ist durch den roten Lauf sogar belegt: er hat 1118 Ergebniszeilen ausgegeben (1116 PASS + 2 FAIL). Der CI-Lauf zu `1ef497f` läuft noch (Gate Task 170 ist grün, Suite Task 171 läuft).
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#177