160 lines
9.9 KiB
Markdown
160 lines
9.9 KiB
Markdown
# Gemeinsam bearbeiten
|
|
|
|
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 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. Wiederholungen sind erlaubt. Pfeiltasten und die Pfeilschaltflächen
|
|
funktionieren ebenfalls. „Mitmachen“ öffnet den gemeinsamen Entwurf.
|
|
|
|
## Arbeiten und Einladungen
|
|
|
|
- Gemeinsame Entwürfe erscheinen im Bearbeitungsfenster in einer eigenen Liste.
|
|
- Änderungen an Strecke, Stationen, Bildern und Ton werden über die bestehenden
|
|
Editor-Funktionen direkt auf der Website gespeichert. Internet ist erforderlich.
|
|
- „Änderungen holen“ lädt den aktuellen Stand. Die App fragt vorher, weil dabei
|
|
noch nicht gespeicherte Eingaben ersetzt werden.
|
|
- 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 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
|
|
je eröffnendem Zugang vorgesehen. Fehlerhafte Codeversuche werden begrenzt.
|
|
|
|
Der Zugang wird mit einem geschützten Sitzungscookie für höchstens 30 Tage
|
|
aufbewahrt. Es wird erst beim Öffnen einer Gruppe oder beim Beitritt angelegt,
|
|
nicht beim bloßen Aufruf der App. Nach Ablauf oder Löschen der Browserdaten muss
|
|
man erneut eingeladen werden. Eine Wiederherstellung des eröffnenden Zugangs
|
|
nach Verlust dieses Cookies ist noch nicht enthalten. Die Gerätekennung allein
|
|
reicht dafür nicht. Wer den Code kennt, kann während seiner Gültigkeit beitreten;
|
|
Codes deshalb nur mit den gewünschten Personen teilen.
|
|
|
|
## Berechtigungen und Freigabe
|
|
|
|
Der gemeinsame Entwurf besitzt eine eigene Strecken-ID und eine Erstellerkennung.
|
|
Die eröffnende Person hat zusätzlich die Gruppenverwaltung. Mitbearbeiter ändern
|
|
diese Zuordnung nicht. Die Gerätekennung ist Metadatum; der tatsächliche Zugang
|
|
wird anhand einer geheimen Sitzung und ihrer Gruppenmitgliedschaft geprüft.
|
|
|
|
Gemeinsame Entwürfe erscheinen nicht in den öffentlichen Streckenlisten. Ihre
|
|
Strecken-, Bild-, Ton- und Wegdateien sind vor der Veröffentlichung nur mit einem
|
|
berechtigten Gruppenzugang abrufbar. Veröffentlichen erfolgt weiterhin durch die
|
|
vorhandene serverseitige Moderation. Eine Freigabe macht die Kopie öffentlich
|
|
und sperrt weitere Änderungen wie bei anderen freigegebenen Strecken.
|
|
|
|
Das reine Beenden der Gruppe veröffentlicht oder löscht den Entwurf nicht.
|
|
Nicht freigegebene Gruppenmedien benötigen auch bei der Prüfung einen
|
|
Gruppenzugang; der bisherige Nginx-Passwortschutz allein erteilt keine zusätzliche
|
|
Gruppenmitgliedschaft. Betreiber können auf dem Server die Dateien prüfen oder
|
|
sich während der gültigen Einladung beteiligen. Bereits geladene Inhalte können
|
|
beim Schließen einer Gruppe nicht aus fremden Geräten zurückgerufen werden.
|
|
|
|
## Einspielen auf dem Server
|
|
|
|
Nach dem Kopieren der Dateien und vor der Startprüfung bzw. dem Neustart:
|
|
|
|
```bash
|
|
npm run init-db
|
|
npm run test:runtime-db
|
|
systemctl --user restart wegwichtel.service
|
|
```
|
|
|
|
`init-db` legt die drei neuen STRICT-Tabellen an. Es verändert keine bestehenden
|
|
Streckentabellen und löscht keine Strecken. Eine Neuerzeugung oder das Löschen
|
|
der vorhandenen Datenbank ist hierfür nicht erforderlich.
|
|
|
|
Die normale Nginx-Weiterleitung an die App muss auch `/api/groups` erreichen.
|
|
HTTPS sowie die vorhandenen Header `Host` und `X-Forwarded-Proto` beibehalten.
|
|
Der Zugriffsschutz in der App muss alle Geräte auf dieselbe SQLite-Datenbank
|
|
und denselben App-Prozess führen. Die zusätzliche Schreibsperre für laufende
|
|
Anfragen gilt pro Prozess; ein verteilter Mehrprozessbetrieb benötigt dafür eine
|
|
gemeinsame Sperrverwaltung. Der vorhandene systemd-Betrieb mit einem Prozess ist
|
|
unterstützt. `X-Real-IP` wird zur Begrenzung falscher Codeversuche nur bei einem
|
|
lokalen Reverse Proxy ausgewertet und muss dort mit der tatsächlichen Client-IP
|
|
überschrieben werden.
|
|
|
|
## Stationen sperren und Änderungen aufbewahren
|
|
|
|
Beim Öffnen einer gemeinsamen Station übernimmt das Gerät ihre Bearbeitung.
|
|
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. 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.
|
|
|
|
Vor dem Senden sichert die App Texte, ausgewählte Bild- und Tondateien sowie
|
|
vorgemerkte Entfernungen auf diesem Gerät. Wird die Speicherung abgewiesen oder
|
|
unterbrochen, sind diese unter „Noch nicht gesendete Änderungen“ erreichbar,
|
|
auch ohne Verbindung und nach einem Neustart des Internetbrowsers. Das gilt auch
|
|
für die vorgemerkte Entfernung einer Station. „Verwerfen“ entfernt diesen
|
|
zurückgehaltenen Stand nach einer Rückfrage. Die Speicherung benötigt freien
|
|
Gerätespeicher; bei einem Speicherfehler bleibt das Formular offen und die App
|
|
behauptet nicht, dass die Sicherung gelungen sei. Bereits bestätigte einzelne
|
|
Dateiübertragungen werden aus der Warteliste genommen.
|
|
|
|
Zum erneuten Senden die Änderungen öffnen und „Speichern“ wählen. Die App
|
|
beansprucht die Station erneut, gegebenenfalls nach einer Übernahme-Rückfrage.
|
|
Sie vergleicht den Stand beim ursprünglichen Öffnen mit dem aktuellen Inhalt.
|
|
Geänderte Texte, Koordinaten, Reihenfolge sowie geänderte Bild- und Tondateien
|
|
lösen einen Vergleich aus. Unterschiedliche Dateiinhalte werden auch bei gleicher
|
|
Adresse und gleicher Dateianzahl erkannt. Eine Tabelle zeigt die ursprünglichen,
|
|
eigenen und aktuellen Angaben; aktuelle Aufnahmen können geprüft werden.
|
|
„Meine Änderungen senden“ übernimmt die eigenen Angaben und vorgemerkten
|
|
Dateiaktionen. „Auf diesem Gerät behalten“ sendet nichts. Ein weiterer Vergleich
|
|
direkt vor dem Schreiben verhindert ein Überschreiben nach dieser Rückfrage.
|
|
Es gibt kein unbeaufsichtigtes erneutes Senden oder automatisches Zusammenführen.
|
|
Wenn eine Station entfernt wurde oder der Gruppenzugang fehlt, bleibt der Entwurf
|
|
auf dem Gerät einsehbar; er wird nicht automatisch als neue Station angelegt.
|
|
|
|
### Hinweise zum Betrieb
|
|
|
|
Sperrdateien liegen unter `storage/active/routes/<Strecke>/locks/<Station>.json`
|
|
(bzw. dem konfigurierten `STORAGE_DIR`). Sie enthalten `creator_id`, den Hash der
|
|
Gruppensitzung, einen zufälligen Bearbeitungsschlüssel und den Erstellzeitpunkt.
|
|
Nur die passende Kennung **und** die berechtigte Sitzung mit dem richtigen
|
|
Bearbeitungsschlüssel dürfen schreiben oder ihre Sperre entfernen. Die Kennung
|
|
wird aus der bereits eingerichteten Sitzung übernommen, nicht aus einem frei
|
|
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. 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
|
|
vom alten Versionszähler der ganzen Strecke gespeichert werden. Änderungen der
|
|
Streckenangaben selbst verwenden weiter `If-Match`. Sperrübernahmen und Dateischreiben
|
|
sind im vorhandenen Einprozessbetrieb synchronisiert. Mehrprozessbetrieb ist
|
|
weiterhin nicht unterstützt.
|
|
|
|
Die Sicherungen liegen in IndexedDB (`wegwichtel.group-point-drafts.v1`) und zählen
|
|
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.
|