group code popup
Sonarqube Scanner / Prepare environment (push) Successful in 6s
Sonarqube Scanner / Build and test (push) Successful in 27s
Sonarqube Scanner / SonarQube analysis (push) Failing after 1m14s
Sonarqube Scanner / Deploy to Server (push) Successful in 10s

This commit is contained in:
Florian Zumpe
2026-10-18 17:24:41 +02:00
parent 31768ae907
commit 0e4cdfbd54
18 changed files with 400 additions and 49 deletions
+25 -9
View File
@@ -1,15 +1,16 @@
# Gemeinsam bearbeiten
In „Strecken bearbeiten“ trägt jede Strecke eine Schaltfläche mit zwei Wichteln:
links der Vogel, rechts der Stein. „Gemeinsam bearbeiten“ legt einen gemeinsamen
In „Strecken bearbeiten“ öffnet der kleine Gruppenbutton zwischen Stift und
Löschen einen Dialog. Dort sind die beiden Wichtel groß zu sehen: links der Vogel,
rechts der Stein. Erst „Gemeinsamen Entwurf öffnen“ legt einen gemeinsamen
Entwurf auf der Website an. Das Original bleibt unverändert. Bei lokalen Entwürfen
fragt die App vorher, ob Weg, Stationen, Bilder und Ton übertragen werden dürfen.
Ein bereits eingesandter eigener Entwurf wird dabei zuerst aktualisiert.
Danach zeigt die App acht Wichtel als Gruppencode. Andere öffnen in der
Streckenverwaltung „Gruppencode eingeben“ und schieben die Bilder in den acht
Danach zeigt die App fünf Wichtel als Gruppencode. Andere öffnen in der
Streckenverwaltung „Gruppencode eingeben“ und schieben die Bilder in den fünf
Drehrädern nach oben oder unten. Es zählen die Wichtel in der Mitte, von links
nach rechts, zuerst in der oberen Reihe. Pfeiltasten und die Pfeilschaltflächen
nach rechts. Wiederholungen sind erlaubt. Pfeiltasten und die Pfeilschaltflächen
funktionieren ebenfalls. „Mitmachen“ öffnet den gemeinsamen Entwurf.
## Arbeiten und Einladungen
@@ -22,8 +23,12 @@ funktionieren ebenfalls. „Mitmachen“ öffnet den gemeinsamen Entwurf.
- Wenn jemand zwischenzeitlich gespeichert hat, weist die App den veralteten
Speicherversuch zurück. Die Eingaben bleiben stehen und können vor dem Laden
des neuen Stands gesichert werden. Es gibt noch keine automatische Zusammenführung.
- Der Einladungscode gilt eine Stunde. „Neuen Code anzeigen“ ersetzt ihn; bereits
beigetretene Personen behalten ihren Zugang. Nur die eröffnende Person kann das.
- Der Einladungscode gilt 30 Minuten. Anschließend erzeugt die Website automatisch
einen neuen Code, sobald keine Station mehr gesperrt ist. Ein abgelaufener Code
erlaubt auch während einer Bearbeitung keinen neuen Beitritt. Bereits beigetretene
Personen behalten ihren Zugang. Das geöffnete Codefenster prüft alle 30 Sekunden
auf einen neuen Code. Die eröffnende Person kann mit „Neuen Code anzeigen“ auch
früher wechseln; während einer Stationsbearbeitung wartet auch dieser Wechsel.
- „Gruppe schließen“ entfernt den Zugang der anderen Personen und den Code.
Die eröffnende Person behält ihren Entwurf und kann wieder einen Code erzeugen.
- Es sind höchstens 50 Zugänge je Gruppe und zwölf gleichzeitig offene Gruppen
@@ -88,7 +93,10 @@ Ist sie bereits geöffnet, fragt die App, ob die Bearbeitung übernommen werden
soll. Erst die Bestätigung ersetzt die bisherige Sperre. Das andere Gerät darf
danach nicht mehr speichern. Zwei Fenster desselben Geräts benötigen ebenfalls
eine bestätigte Übernahme, damit sie einander nicht unbemerkt überschreiben.
Beim Verlassen der Station wird ihre eigene Sperre entfernt. Bleibt nach einem
Beim Verlassen der Station wird ihre eigene Sperre entfernt. Eingaben sowie
Bedienaktionen in der Station melden bei bestehender Verbindung spätestens alle
30 Sekunden Aktivität. Das bloße Offenlassen des Fensters oder Abfragen des
Sperrstatus verlängert die Sperre nicht. Bleibt nach einem
Abbruch oder ohne Verbindung eine Sperre zurück, kann sie bestätigt übernommen
werden. Während eine Speicherung läuft, ist keine Übernahme möglich.
@@ -128,7 +136,9 @@ angegebenen Anfragefeld. Dateien werden atomar ersetzt und mit Modus 0600
angelegt. Dieser Ordner darf nicht unmittelbar durch Nginx ausgeliefert werden.
Schließen der Gruppe entfernt ihre Sperren; laufende Schreibanfragen müssen
zunächst fertig werden. Erfolgreiches Entfernen einer Station entfernt auch
ihre Sperrdatei. Zurückgebliebene Sperren werden nicht zeitgesteuert gelöscht.
ihre Sperrdatei. Sperren ohne gemeldete Aktivität werden nach 60 Minuten entfernt. Die Wartung
läuft beim App-Start und anschließend jede Minute; API-Zugriffe prüfen die Frist
zusätzlich unmittelbar.
Stationsänderungen prüfen zusätzlich einen SHA-256-Abdruck aus Stationsangaben
und den tatsächlichen Bild-/Tondateien. Andere Stationen können deshalb unabhängig
@@ -141,3 +151,9 @@ Die Sicherungen liegen in IndexedDB (`wegwichtel.group-point-drafts.v1`) und zä
zur vorhandenen Anzeige des belegten Gerätespeichers. Browserdaten-Löschung kann
sie entfernen. Sie enthalten nur die betroffene Station und neu ausgewählte
Dateien; vorhandene Aufnahmen werden hierfür nicht gesammelt heruntergeladen.
Einladungen werden dauerhaft weiterhin nur als Hash gespeichert. Den neu erzeugten
Klartext hält der App-Prozess im Arbeitsspeicher für die berechtigte Anzeige vor.
Nach einem App-Neustart bleibt der zuletzt gültige Code weiterhin bis zu seinem
Ablauf verwendbar. Falls er auf dem Gerät nicht mehr angezeigt wird, kann die
eröffnende Person bei freien Stationen einen neuen Code anfordern.
+25 -1
View File
@@ -874,7 +874,7 @@ Siehe [Gruppenbearbeitung.md](Gruppenbearbeitung.md). Alle Gruppenantworten sind
| --- | --- |
| GET /api/groups | Gruppen der Sitzung auflisten; ohne Sitzung leere Liste |
| POST /api/groups | Mit routeId und creator_id eine unabhängige Kopie öffnen |
| POST /api/groups/join | Mit code (Array aus acht Unicode-Symbolen) und creator_id beitreten |
| POST /api/groups/join | Mit code (Array aus fünf Unicode-Symbolen; Wiederholungen erlaubt) und creator_id beitreten |
| POST /api/groups/:id/code | Als Besitzer neuen Einladungscode erzeugen |
| DELETE /api/groups/:id | Als Besitzer Einladung und Mitbearbeiterzugänge widerrufen |
@@ -911,3 +911,27 @@ von If-Match wird dort der Stationsinhalt geprüft. Erfolgreiche Antworten liefe
mehreren Dateioperationen jeweils weiterverwenden. Eine neue Station wird über
den bisherigen POST angelegt und vor den weiteren Dateioperationen gesperrt.
Die Versionsabdrücke berücksichtigen Dateibytes, nicht bloß URLs oder Metadaten.
### Fristen, Aktivität und Status
`GET /api/groups/routes/:routeId/pois/:poiId/lock` prüft eine Station innerhalb
der berechtigten Gruppe und liefert ohne Antwortkörper **204** (frei) oder
**423** (gesperrt). Nicht vorhandene Strecken/Stationen ergeben **404**, fehlende
Anmeldung/Berechtigung weiterhin **401/403**. Die Abfrage verlängert keine Sperre.
`POST` auf denselben Pfad mit `{ "heartbeat": true, "token": "<eigener Schlüssel>" }`
verlängert nur die eigene noch gültige Sperre und liefert **204**. Abgelaufene
oder fremde Sperren ergeben **423**. Die App meldet nur tatsächliche Interaktion
mit der Station, gebündelt alle 30 Sekunden. Nach 60 Minuten ohne Aktivität wird
die Datei entfernt. Eine Wartung beim Start und jede Minute räumt sie auch ohne
weitere Client-Anfragen auf. Laufende Schreibanfragen bleiben bis zu ihrem
Abschluss geschützt.
`GET /api/groups/:id/invitation` ist ausschließlich für die eröffnende Sitzung.
Antwort: `group`, `busy`, `expired`, `expiresAt` und, wenn im Prozess verfügbar,
`code`. Nach 30 Minuten werden Codes automatisch ersetzt, sobald alle Stationen
frei sind. Während einer Stationssperre wird auch manuelles Erneuern mit **423**
(`group-editing`) zurückgewiesen. Der bisherige Code läuft trotzdem ab;
bestehende Mitglieder bleiben berechtigt. Die Wartung und dieser Abruf führen
die Erneuerung aus. Klartext-Codes stehen nur im Prozessspeicher, dauerhaft wird
ausschließlich ihr Hash gespeichert.
+18 -3
View File
@@ -1,7 +1,7 @@
# Agent-Hinweise zur Gruppenbearbeitung
Implementierter erster Stand: gemeinsame serverseitige Kopien von eigenen und
veröffentlichten Strecken, acht Unicode-Wichtel im Einladungscode, Drehrad-Eingabe,
veröffentlichten Strecken, fünf Unicode-Wichtel im Einladungscode, Drehrad-Eingabe,
Sitzungen, Rollen owner/member, Codewechsel und Widerruf. Bedienung und Einspielen:
[Gruppenbearbeitung.md](../Gruppenbearbeitung.md).
@@ -14,8 +14,10 @@ Sitzungen, Rollen owner/member, Codewechsel und Widerruf. Bedienung und Einspiel
übermittelten creator_id oder eines von einem Client behaupteten Rollenfelds vergeben.
- Sitzungsgeheimnisse nur als Hash serverseitig und als HttpOnly-/SameSite-Strict-
Cookie auf dem Client speichern; bei HTTPS zusätzlich Secure. Nicht ausgeben.
- Einladungscodes haben acht der vorhandenen neun Symbole, werden mit randomInt
gewählt und nur gehasht gespeichert. Gültigkeit eine Stunde; falsche Versuche
- Einladungscodes haben fünf Stellen mit den vorhandenen neun Symbolen.
Wiederholungen sind erlaubt; jede Stelle wird unabhängig mit randomInt
gewählt. Codes werden dauerhaft nur gehasht gespeichert; der aktuelle Klartext wird für
die Besitzeranzeige im Arbeitsspeicher des App-Prozesses gehalten. Gültigkeit 30 Minuten; falsche Versuche
sind begrenzt. Variationselektoren ändern die Unicode-Zuordnung nicht.
- Schutz auch auf den ursprünglichen /api/routes/...-Adressen für alle Gruppen-
Dateien durchsetzen. Anders geschriebene IDs (führende Nullen, Prozentkodierung,
@@ -77,3 +79,16 @@ Sitzungen, Rollen owner/member, Codewechsel und Widerruf. Bedienung und Einspiel
Erfolgsantworten, gezieltes Zusammenführen einzelner Felder und Auflösung
entfernter Stationen sowie verteilte Sperren. Eine nachfolgende Aufnahme
kann nicht ohne Einschränkungen zurückgerufen werden.
- Einladungscodes nach 30 Minuten automatisch erneuern, solange keine aktive
Stationssperre vorliegt. Abgelaufene Codes erlauben keinen neuen Beitritt, auch
wenn ihre Erneuerung wegen aktiver Stationen aufgeschoben ist. Mitgliedschaften
bleiben erhalten. Wartung im Serverprozess starten und beim Beenden stoppen.
- Sperren nach 60 Minuten ohne Aktivität entfernen; updated_at bei tatsächlicher
Bearbeitung/Speicherung aktualisieren. Reine Statusabfragen und unbenutzte
Fenster dürfen die Frist nicht verlängern. Laufende Schreibanfragen nicht
wegen Zeitablauf entsperren. Zeitprüfung auch vor dem endgültigen Speichern.
- GET auf den Stations-Sperrpfad liefert 204 für frei, 423 für gesperrt, 404 für
nicht vorhanden; bestehende Gruppenrechte gelten unverändert. Heartbeats sind
POSTs mit eigenem Bearbeitungsschlüssel und dürfen weder fremde noch bereits
abgelaufene Sperren übernehmen.
+1 -1
View File
@@ -20,7 +20,7 @@ von links nach rechts.
| 🎃.png | Gnom mit Kürbis | Symbol zeigt einen Halloween-Kürbis |
Alle Bilder liegen unter `public/images/group-symbols/`.
Die Gruppenfunktion verwendet acht Symbole je Code. Bilder werden dafür nicht
Die Gruppenfunktion verwendet fünf Symbole je Code; Wiederholungen sind erlaubt. Bilder werden dafür nicht
umbenannt oder neu erzeugt.
## Klasse