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
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.
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.
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.
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).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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 ProjekteLogin-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.
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.
Umgesetzt und gepusht als
8e4bb6e, Wiki alsc10fd83.Was jetzt da ist
auth/session,auth/login,auth/logout; alles andere antwortet ohne Session 401. Projekte tragen einenowner, ein fremdes Projekt kommt als 404 zurück. Konten indata/users.json(password_hash), Sessions als Datei indata/sessions/, 30 Tage gleitend — deshalb überlebt die Anmeldung einnpm run buildunter dem offenen Tab.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 seinbeforeunload, 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.e2e, die Demo-Projekte samt Playgrounduser,adminhat keine.adminundusermit den vereinbarten Platzhalter-Passwörtern, dazue2emit einem zufälligen Passwort indata/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
nockal.comdurch ihre eigene 418-Seite (von stein2 aus gemessen: 401, 404, 405, 422 kommen als 418 an, 200/204 nicht; überlocalhost:8080kommt der echte Code). Das ist nicht von diesem Issue verursacht, wirkt sich aber sichtbar aus: die Maske zeigt liveCould not sign in: … HTTP 418stattWrong user name or password. Sag Bescheid, ob du dazu ein eigenes Issue willst.Tests
windowund 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.HttpAuthStore(falsches Paar gegen kaputten Server gegen die 418-Seite der Brandmauer) und was eine Sitzung hinterlässt (tests/editor/session-teardown.test.ts).attachAutosave(...).stop()hat eine spätere Änderung wieder einen Save geplant. Behoben, der neue Test hält es fest.usersieht seine 3 Projekte, eine2e-Projekt gibt ihm 404, nach Logout wieder 401.Zwei Funde unterwegs
Widget.resize()layoutet nur bei geänderter Größe. Der Login-Screen hatterootschon auf Fenstergröße gesetzt, derresizeim Editor war danach ein No-Op — die Oberfläche lag unlayoutet in der Ecke. Behoben mitroot.resize(0, 0)beim Abräumen der Maske.Doku und Folge-Issues
Nachtrag: der CI-Lauf zu
8e4bb6ewar rot, behoben mit1ef497f.Gate war grün (Task 168), rot war die Suite (Task 169) mit genau 2 FAILs, beide im neuen Modul 45:
Ursache, kein Zufallsfehler: Beide Checks haben den Projektnamen gegen
E2E fixturegehalten. In CI heißt dasselbe Projekt aberfixture—tools/ci/project-shells.mjslegt die leere Datei mit dem Key ausPROJECTSals Namen an, und der Seeder behält bewusst den Namen, den er auf dem Server vorfindet (sonst würde aus "Jump and Run" wiederjumpRun). Anmeldung, Editor und Projekt haben also funktioniert; nur der Name war nie eine taugliche Messgröße. Die Checks prüfen jetzt die Projekt-idund den vom Seeder geschriebenen SzenennamenLevel 1, was in beiden Umgebungen gilt.Teapot aus: Die Brandmauer vor
nockal.comreicht seit heute die echten Statuscodes durch (gemessen: API ohne Session401 {"error":"Sign in first"}, falsches Passwort401 {"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=45frisch 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
1ef497fläuft noch (Gate Task 170 ist grün, Suite Task 171 läuft).