group code popup
This commit is contained in:
@@ -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
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user