Anlass: Für den Reddit-Post sollen Leute den Editor ausprobieren können, ohne dass ich ihnen ein Konto anlege. Voraussetzung ist #427 (Härtung), denn mit Gästen wird die Seite zum ersten Mal wirklich öffentlich.
Stand heute
Ohne Konto steht man vor der Anmeldemaske. Konten entstehen nur per tools/make-user.php, eine Registrierung gibt es nicht (#178).
Die API antwortet ohne Session mit 401. Ausnahmen sind nur auth/* und releases/{token} (das öffentliche Spiel).
Hochgeladene Dateien (Texturen, Fonts, Sounds, Videos) liefert nginx statisch aus. Die Assets eines Demo-Projekts wären also auch ohne Login lesbar, die Projektdatei selbst nicht (0640).
Varianten
A: Gast ohne Schreibrecht auf dem Server (Vorschlag für den Anfang)
Auf der Anmeldemaske gibt es einen Knopf Try without account. Der Editor öffnet eine Kopie eines Demo-Projekts nur im Speicher.
Alles ist bedienbar: Szene, Grafik, Sound, Composition, Play, Aufnahme als Video. Autosave, Snapshots, Release und Uploads sind aus. Ein Hinweis sagt, dass nichts gespeichert wird.
Der Server bekommt nur eine neue, lesende Route für das freigegebene Demo-Projekt. Von Gästen schreibt er nichts. Damit ist die Angriffsfläche am kleinsten, und Quoten braucht es nicht.
Was die Aufnahme erzeugt, landet als Download beim Gast, nicht auf dem Server.
B: Temporäres Gastkonto auf dem Server
Ein Klick legt ein Konto guest-<zufall> mit eigener Rolle guest an. Der Gast kann speichern und hochladen.
Das braucht Quoten (Platz, Projekte, Uploads), eine Bremse für das Anlegen und ein Aufräumen abgelaufener Gastkonten samt Dateien.
Später ließe sich ein Gastkonto per Registrierung (#178) in ein echtes umwandeln.
C: wie A, aber im Browser gespeichert (IndexedDB). Dann übersteht die Arbeit einen Reload. Uploads blieben lokal. Das ist ein eigener Speicherweg neben HttpFileStore und deutlich mehr Bau.
Was für A gebaut werden muss
Server: Route GET ?r=demo (ohne Session) liefert das Projekt, das in einer Konfigurationsdatei als Demo eingetragen ist. Die Projekt-Id bleibt verborgen, so wie bei Releases.
Client: eine Gast-Sitzung, in der alle schreibenden Wege abgeschaltet sind, nicht nur ausgegraut: Autosave, Speichern, Snapshots, Release, Uploads, Konto-Menü. Die Regel „was darf diese Sitzung“ als reine Funktion, damit sie ohne Browser prüfbar ist.
Hinweis im Editor, dass nichts gespeichert wird, und ein Weg zurück zur Anmeldung.
Tests
Unit: die Rechte-Regel der Gast-Sitzung.
PHP: ?r=demo liefert ohne Session das Demo-Projekt und sonst nichts. Alle anderen Routen bleiben für einen Gast 401.
e2e: als Gast einsteigen, etwas ändern und abspielen. Der Server darf dabei keine einzige schreibende Anfrage bekommen (am Harness mitgezählt).
Rückfragen
Variante: A für den Anfang, B oder C später? Oder gleich B?
Welches Demo-Projekt? Ein eigenes, aufgeräumtes Schaufenster-Projekt oder eines der bestehenden? Es sollte klein genug sein, damit es auch auf schwächeren Rechnern schnell lädt.
Eigene Dateien für Gäste: Sollen sie Bilder oder Sounds lokal einbinden dürfen, nur im Speicher und ohne Upload? Oder bleibt das bei A ganz aus?
Leeres Projekt: Darf ein Gast statt der Demo auch mit einem leeren Projekt anfangen?
Anlass: Für den Reddit-Post sollen Leute den Editor ausprobieren können, ohne dass ich ihnen ein Konto anlege. Voraussetzung ist #427 (Härtung), denn mit Gästen wird die Seite zum ersten Mal wirklich öffentlich.
## Stand heute
- Ohne Konto steht man vor der Anmeldemaske. Konten entstehen nur per `tools/make-user.php`, eine Registrierung gibt es nicht (#178).
- Die API antwortet ohne Session mit 401. Ausnahmen sind nur `auth/*` und `releases/{token}` (das öffentliche Spiel).
- Hochgeladene Dateien (Texturen, Fonts, Sounds, Videos) liefert nginx statisch aus. Die Assets eines Demo-Projekts wären also auch ohne Login lesbar, die Projektdatei selbst nicht (0640).
## Varianten
**A: Gast ohne Schreibrecht auf dem Server (Vorschlag für den Anfang)**
- Auf der Anmeldemaske gibt es einen Knopf *Try without account*. Der Editor öffnet eine Kopie eines Demo-Projekts **nur im Speicher**.
- Alles ist bedienbar: Szene, Grafik, Sound, Composition, Play, Aufnahme als Video. Autosave, Snapshots, Release und Uploads sind aus. Ein Hinweis sagt, dass nichts gespeichert wird.
- Der Server bekommt nur eine neue, lesende Route für das freigegebene Demo-Projekt. Von Gästen schreibt er nichts. Damit ist die Angriffsfläche am kleinsten, und Quoten braucht es nicht.
- Was die Aufnahme erzeugt, landet als Download beim Gast, nicht auf dem Server.
**B: Temporäres Gastkonto auf dem Server**
- Ein Klick legt ein Konto `guest-<zufall>` mit eigener Rolle `guest` an. Der Gast kann speichern und hochladen.
- Das braucht Quoten (Platz, Projekte, Uploads), eine Bremse für das Anlegen und ein Aufräumen abgelaufener Gastkonten samt Dateien.
- Später ließe sich ein Gastkonto per Registrierung (#178) in ein echtes umwandeln.
**C: wie A, aber im Browser gespeichert** (IndexedDB). Dann übersteht die Arbeit einen Reload. Uploads blieben lokal. Das ist ein eigener Speicherweg neben `HttpFileStore` und deutlich mehr Bau.
## Was für A gebaut werden muss
- **Server:** Route `GET ?r=demo` (ohne Session) liefert das Projekt, das in einer Konfigurationsdatei als Demo eingetragen ist. Die Projekt-Id bleibt verborgen, so wie bei Releases.
- **Client:** eine Gast-Sitzung, in der alle schreibenden Wege abgeschaltet sind, nicht nur ausgegraut: Autosave, Speichern, Snapshots, Release, Uploads, Konto-Menü. Die Regel „was darf diese Sitzung“ als reine Funktion, damit sie ohne Browser prüfbar ist.
- **Hinweis** im Editor, dass nichts gespeichert wird, und ein Weg zurück zur Anmeldung.
## Tests
- Unit: die Rechte-Regel der Gast-Sitzung.
- PHP: `?r=demo` liefert ohne Session das Demo-Projekt und sonst nichts. Alle anderen Routen bleiben für einen Gast 401.
- e2e: als Gast einsteigen, etwas ändern und abspielen. Der Server darf dabei keine einzige schreibende Anfrage bekommen (am Harness mitgezählt).
## Rückfragen
1. **Variante:** A für den Anfang, B oder C später? Oder gleich B?
2. **Welches Demo-Projekt?** Ein eigenes, aufgeräumtes Schaufenster-Projekt oder eines der bestehenden? Es sollte klein genug sein, damit es auch auf schwächeren Rechnern schnell lädt.
3. **Eigene Dateien für Gäste:** Sollen sie Bilder oder Sounds lokal einbinden dürfen, nur im Speicher und ohne Upload? Oder bleibt das bei A ganz aus?
4. **Leeres Projekt:** Darf ein Gast statt der Demo auch mit einem leeren Projekt anfangen?
meleki
added the new label 2026-10-15 22:04:15 +02:00
ich würde die demo projekte gerne selbst im editor definieren können bzw. mit einem klick eine demo-kopie erstellen (kann nur der administrator)
bei A bleibt es ganz aus
leeres projekt wäre auch ok
zusatz: ich würde gerne demo materialien zur verfügung stellen können bei sounds, textures und videos
1. passt, variante A
2. ich würde die demo projekte gerne selbst im editor definieren können bzw. mit einem klick eine demo-kopie erstellen (kann nur der administrator)
3. bei A bleibt es ganz aus
4. leeres projekt wäre auch ok
zusatz: ich würde gerne demo materialien zur verfügung stellen können bei sounds, textures und videos
Danke, damit ist alles entschieden. Zusammengefasst, so baue ich es:
Variante A: Der Gast arbeitet nur im Speicher. Der Server schreibt für Gäste nichts, eigene Dateien gibt es nicht.
Demo-Projekte: Der Admin erstellt mit einem Klick eine Demo-Kopie eines Projekts. Das funktioniert wie ein Release (#266): eine eingefrorene Kopie, die sich erst beim nächsten Klick auf „Demo-Kopie aktualisieren“ ändert. Es kann mehrere Demos geben.
Auswahl für den Gast: Auf der Anmeldemaske gibt es Try without account. Danach wählt der Gast aus der Liste der Demos. Ein leeres Projekt ist einfach eine Demo, die leer ist, dafür braucht es keinen Sonderweg.
Demo-Materialien: Der Admin markiert Texturen, Sounds und Videos als Demo. Sie sind für alle sichtbar, also für Gäste und für jedes Konto, eine gemeinsame Bibliothek. Hochladen können Gäste nichts.
Abhängigkeit zu #427: Die Demo-Materialien stehen auf der Liste der Pfade, die ohne Login erreichbar bleiben.
Danke, damit ist alles entschieden. Zusammengefasst, so baue ich es:
- **Variante A:** Der Gast arbeitet nur im Speicher. Der Server schreibt für Gäste nichts, eigene Dateien gibt es nicht.
- **Demo-Projekte:** Der Admin erstellt mit einem Klick eine **Demo-Kopie** eines Projekts. Das funktioniert wie ein Release (#266): eine eingefrorene Kopie, die sich erst beim nächsten Klick auf „Demo-Kopie aktualisieren“ ändert. Es kann mehrere Demos geben.
- **Auswahl für den Gast:** Auf der Anmeldemaske gibt es *Try without account*. Danach wählt der Gast aus der Liste der Demos. Ein leeres Projekt ist einfach eine Demo, die leer ist, dafür braucht es keinen Sonderweg.
- **Demo-Materialien:** Der Admin markiert Texturen, Sounds und Videos als Demo. Sie sind **für alle** sichtbar, also für Gäste und für jedes Konto, eine gemeinsame Bibliothek. Hochladen können Gäste nichts.
- **Abhängigkeit zu #427:** Die Demo-Materialien stehen auf der Liste der Pfade, die ohne Login erreichbar bleiben.
Ich fange mit #427 an, weil #428 darauf aufbaut.
Erledigt mit 925a39a (Gastzugang) und 0d7672a (e2e 70 spielt die Demo auch ab). Doku im Wiki: Accounts → Trying it without an account, API → Demo copies and demo material, Architecture.
Umsetzung (Variante A, wie entschieden)
Anmeldemaske: Unter dem Formular steht Try without an account. Der Knopf öffnet die Liste der Demo-Projekte, und ein Klick öffnet den Editor als Gast.
Nur im Tab: Das Projekt des Gastes liegt in MemoryProjectStore. Jeder Store, der schreiben würde, lehnt schon im Tab ab, bevor eine Anfrage rausgeht. Das Autosave wird gar nicht erst angehängt. Der Server legt für Gäste nichts an: keine Sitzung, kein Ordner, keine Quote.
Was ein Gast nicht hat:New project, Open project…, Snapshots…, Release…, Upload und Delete in den Pickern, Drop/Paste von Dateien, Passwort und Logout. Im Account-Menü steht Sign in…. Eine Aufnahme landet als .mkv-Download.
Hinweis: Die Toolbar zeigt Guest – not saved, dazu kommt beim Start ein Hinweistext. Ein Reload oder Sign in… verwirft die Änderungen, und die Demo startet beim nächsten Mal wieder vom Original.
Regel als reine Funktion:sessionAllows() in src/editor/session.ts.
Deine Wünsche aus 4691
Demo-Kopie mit einem Klick: Als Admin findest du im Hauptmenü eines Projekts Demo copy…. Der Dialog macht eine eingefrorene Kopie wie ein Release, zeigt, wie alt sie ist und ob sich das Projekt seitdem geändert hat, und bietet Update demo copy und Remove.
Mehrere Demos samt leerem Projekt: Jede Demo-Kopie steht mit dem Projektnamen in der Liste. Ein leeres Projekt ist einfach eine Demo ohne Inhalt.
Demo-Materialien für alle: In allen vier Pickern (Bild, Font, Sound, Video) hast du als Admin Offer as demo bzw. Stop offering. Freigegebene Dateien sehen alle Konten und alle Gäste, mit dem Vermerk demo material. Solange eine Datei freigegeben ist, kann nur ein Admin sie löschen. Eine Datei, die eine Demo-Kopie verwendet, gilt als benutzt.
Erlaubte Pfade (#427): Die Demo-Dateien liegen in den normalen Upload-Ordnern, die nginx-Whitelist deckt sie schon ab. GET plugins geht jetzt auch ohne Sitzung, weil eine Demo ein Plugin einschalten kann. Die Route liest nur die Module, die auf dem Server liegen.
Server
GET demos, GET demos/{token} ohne Sitzung. GET/POST/DELETE projects/{id}/demo nur für Admins.
PATCH textures|fonts|sounds|videos/{file} mit {demo} nur für Admins. Abgemeldet enthalten die vier Listen nur das Demo-Material, ohne Besitzer.
Gespeichert in data/demos/ und data/demo-files.json, beides 0640.
Tests
Test
Ergebnis
Unit tests/core/guest.test.ts (Sitzungsregel, Tab-Speicher, Gast-Stores, Routen)
20 / 46 / 80 Checks grün. Die Matrix fragt jede neue Route als abgemeldet, Besitzer, Fremder und Admin ab
e2e 70 (atx): Admin macht die Kopie im Menü, Gast wählt sie, ändert, spielt ab, öffnet den Picker, meldet sich ab und wählt neu
ALL PASSED, 13 Checks, keine schreibende Anfrage
Gegenprobe: Autosave des Gastes geht doch zum Server
70f und 70g rot, der PUT wurde gefangen
Gate (atx)
CHECK EXIT 0, 314 Dateien, 4852 Tests
Fund beim Testen: Der Demo-Token landete in der Adresse (?project=…). Behoben in 925a39a, gefunden hat ihn e2e 70.
Live: gebaut. Es gibt aber noch keine Demo-Kopie. Ohne sie meldet der Knopf „There are no demo projects yet“. Bevor der Reddit-Post rausgeht, bitte mindestens eine Demo anlegen.
CI zu 925a39a: Gate 710 grün, Suite 709 grün (e2e ALL PASSED, 2101 Checks inklusive Modul 70, Smokes 24/19/21). Für 0d7672a habe ich den CI-Lauf nicht abgewartet.
Erledigt mit `925a39a` (Gastzugang) und `0d7672a` (e2e 70 spielt die Demo auch ab). Doku im Wiki: *Accounts → Trying it without an account*, *API → Demo copies and demo material*, *Architecture*.
## Umsetzung (Variante A, wie entschieden)
- **Anmeldemaske:** Unter dem Formular steht *Try without an account*. Der Knopf öffnet die Liste der Demo-Projekte, und ein Klick öffnet den Editor als Gast.
- **Nur im Tab:** Das Projekt des Gastes liegt in `MemoryProjectStore`. Jeder Store, der schreiben würde, lehnt schon im Tab ab, bevor eine Anfrage rausgeht. Das Autosave wird gar nicht erst angehängt. Der Server legt für Gäste nichts an: keine Sitzung, kein Ordner, keine Quote.
- **Was ein Gast nicht hat:** *New project*, *Open project…*, *Snapshots…*, *Release…*, Upload und Delete in den Pickern, Drop/Paste von Dateien, Passwort und Logout. Im Account-Menü steht *Sign in…*. Eine Aufnahme landet als `.mkv`-Download.
- **Hinweis:** Die Toolbar zeigt *Guest – not saved*, dazu kommt beim Start ein Hinweistext. Ein Reload oder *Sign in…* verwirft die Änderungen, und die Demo startet beim nächsten Mal wieder vom Original.
- **Regel als reine Funktion:** `sessionAllows()` in `src/editor/session.ts`.
## Deine Wünsche aus 4691
- **Demo-Kopie mit einem Klick:** Als Admin findest du im Hauptmenü eines Projekts *Demo copy…*. Der Dialog macht eine eingefrorene Kopie wie ein Release, zeigt, wie alt sie ist und ob sich das Projekt seitdem geändert hat, und bietet *Update demo copy* und *Remove*.
- **Mehrere Demos samt leerem Projekt:** Jede Demo-Kopie steht mit dem Projektnamen in der Liste. Ein leeres Projekt ist einfach eine Demo ohne Inhalt.
- **Demo-Materialien für alle:** In allen vier Pickern (Bild, Font, Sound, Video) hast du als Admin *Offer as demo* bzw. *Stop offering*. Freigegebene Dateien sehen alle Konten und alle Gäste, mit dem Vermerk *demo material*. Solange eine Datei freigegeben ist, kann nur ein Admin sie löschen. Eine Datei, die eine Demo-Kopie verwendet, gilt als benutzt.
- **Erlaubte Pfade (#427):** Die Demo-Dateien liegen in den normalen Upload-Ordnern, die nginx-Whitelist deckt sie schon ab. `GET plugins` geht jetzt auch ohne Sitzung, weil eine Demo ein Plugin einschalten kann. Die Route liest nur die Module, die auf dem Server liegen.
## Server
- `GET demos`, `GET demos/{token}` ohne Sitzung. `GET/POST/DELETE projects/{id}/demo` nur für Admins.
- `PATCH textures|fonts|sounds|videos/{file}` mit `{demo}` nur für Admins. Abgemeldet enthalten die vier Listen nur das Demo-Material, ohne Besitzer.
- Gespeichert in `data/demos/` und `data/demo-files.json`, beides 0640.
## Tests
| Test | Ergebnis |
|---|---|
| Unit `tests/core/guest.test.ts` (Sitzungsregel, Tab-Speicher, Gast-Stores, Routen) | 9 Tests grün |
| PHP `demos.test.php` / `files.test.php` / `rights.test.php` | 20 / 46 / 80 Checks grün. Die Matrix fragt jede neue Route als abgemeldet, Besitzer, Fremder und Admin ab |
| e2e 70 (atx): Admin macht die Kopie im Menü, Gast wählt sie, ändert, spielt ab, öffnet den Picker, meldet sich ab und wählt neu | ALL PASSED, 13 Checks, keine schreibende Anfrage |
| Gegenprobe: Autosave des Gastes geht doch zum Server | 70f und 70g rot, der `PUT` wurde gefangen |
| Gate (atx) | `CHECK EXIT 0`, 314 Dateien, 4852 Tests |
**Fund beim Testen:** Der Demo-Token landete in der Adresse (`?project=…`). Behoben in `925a39a`, gefunden hat ihn e2e 70.
**Live:** gebaut. Es gibt aber noch **keine Demo-Kopie**. Ohne sie meldet der Knopf „There are no demo projects yet“. Bevor der Reddit-Post rausgeht, bitte mindestens eine Demo anlegen.
**CI zu `925a39a`:** Gate 710 grün, Suite 709 grün (e2e ALL PASSED, 2101 Checks inklusive Modul 70, Smokes 24/19/21). Für `0d7672a` habe ich den CI-Lauf nicht abgewartet.
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.
Anlass: Für den Reddit-Post sollen Leute den Editor ausprobieren können, ohne dass ich ihnen ein Konto anlege. Voraussetzung ist #427 (Härtung), denn mit Gästen wird die Seite zum ersten Mal wirklich öffentlich.
Stand heute
tools/make-user.php, eine Registrierung gibt es nicht (#178).auth/*undreleases/{token}(das öffentliche Spiel).Varianten
A: Gast ohne Schreibrecht auf dem Server (Vorschlag für den Anfang)
B: Temporäres Gastkonto auf dem Server
guest-<zufall>mit eigener Rolleguestan. Der Gast kann speichern und hochladen.C: wie A, aber im Browser gespeichert (IndexedDB). Dann übersteht die Arbeit einen Reload. Uploads blieben lokal. Das ist ein eigener Speicherweg neben
HttpFileStoreund deutlich mehr Bau.Was für A gebaut werden muss
GET ?r=demo(ohne Session) liefert das Projekt, das in einer Konfigurationsdatei als Demo eingetragen ist. Die Projekt-Id bleibt verborgen, so wie bei Releases.Tests
?r=demoliefert ohne Session das Demo-Projekt und sonst nichts. Alle anderen Routen bleiben für einen Gast 401.Rückfragen
zusatz: ich würde gerne demo materialien zur verfügung stellen können bei sounds, textures und videos
Danke, damit ist alles entschieden. Zusammengefasst, so baue ich es:
Ich fange mit #427 an, weil #428 darauf aufbaut.
Erledigt mit
925a39a(Gastzugang) und0d7672a(e2e 70 spielt die Demo auch ab). Doku im Wiki: Accounts → Trying it without an account, API → Demo copies and demo material, Architecture.Umsetzung (Variante A, wie entschieden)
MemoryProjectStore. Jeder Store, der schreiben würde, lehnt schon im Tab ab, bevor eine Anfrage rausgeht. Das Autosave wird gar nicht erst angehängt. Der Server legt für Gäste nichts an: keine Sitzung, kein Ordner, keine Quote..mkv-Download.sessionAllows()insrc/editor/session.ts.Deine Wünsche aus 4691
GET pluginsgeht jetzt auch ohne Sitzung, weil eine Demo ein Plugin einschalten kann. Die Route liest nur die Module, die auf dem Server liegen.Server
GET demos,GET demos/{token}ohne Sitzung.GET/POST/DELETE projects/{id}/demonur für Admins.PATCH textures|fonts|sounds|videos/{file}mit{demo}nur für Admins. Abgemeldet enthalten die vier Listen nur das Demo-Material, ohne Besitzer.data/demos/unddata/demo-files.json, beides 0640.Tests
tests/core/guest.test.ts(Sitzungsregel, Tab-Speicher, Gast-Stores, Routen)demos.test.php/files.test.php/rights.test.phpPUTwurde gefangenCHECK EXIT 0, 314 Dateien, 4852 TestsFund beim Testen: Der Demo-Token landete in der Adresse (
?project=…). Behoben in925a39a, gefunden hat ihn e2e 70.Live: gebaut. Es gibt aber noch keine Demo-Kopie. Ohne sie meldet der Knopf „There are no demo projects yet“. Bevor der Reddit-Post rausgeht, bitte mindestens eine Demo anlegen.
CI zu
925a39a: Gate 710 grün, Suite 709 grün (e2e ALL PASSED, 2101 Checks inklusive Modul 70, Smokes 24/19/21). Für0d7672ahabe ich den CI-Lauf nicht abgewartet.