group editor implemented
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
# 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
|
||||
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
|
||||
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
|
||||
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 eine Stunde. „Neuen Code anzeigen“ ersetzt ihn; bereits
|
||||
beigetretene Personen behalten ihren Zugang. Nur die eröffnende Person kann das.
|
||||
- „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. 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. Zurückgebliebene Sperren werden nicht zeitgesteuert gelöscht.
|
||||
|
||||
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.
|
||||
+3
-1
@@ -215,7 +215,7 @@ Die Oberfläche enthält rechts oben einen global verfügbaren Informationsbutto
|
||||
|
||||
Die enthaltenen Rechtstexte sind technische Vorlagen. Vor einer öffentlichen Bereitstellung müssen insbesondere Betreiber, ladungsfähige Anschrift, Kontakt, Hostinganbieter, Protokollierungsdauer, Datenschutzkontakt und zuständige Aufsicht ergänzt und rechtlich geprüft werden. Eine Checkliste steht in [`PUBLICATION-CHECKLIST.md`](PUBLICATION-CHECKLIST.md).
|
||||
|
||||
Wegwichtel setzt selbst keine Cookies und bindet keine Analyse-, Werbe- oder Trackingdienste ein. Der Startbildschirm weist darauf hin. Die freiwillige Speicherung des Streckenfortschritts wird getrennt gesteuert:
|
||||
Wegwichtel verwendet keine Werbe- oder Tracking-Cookies und bindet keine Analyse-, Werbe- oder Trackingdienste ein. Für die ausdrücklich gestartete Gruppenbearbeitung wird ein geschütztes Sitzungscookie mit höchstens 30 Tagen Laufzeit verwendet. Der Startbildschirm weist darauf hin. Die freiwillige Speicherung des Streckenfortschritts wird getrennt gesteuert:
|
||||
|
||||
- `wegwichtel.privacy.v1` speichert die gewählte Einstellung,
|
||||
- `wegwichtel.route-progress.v1` enthält bei aktivierter Funktion ein JSON-Objekt mit aktueller Route, Routenstatus, besuchten und angesehenen Stationen, abgespielten Audioeinträgen und Zeitstempeln,
|
||||
@@ -224,3 +224,5 @@ Wegwichtel setzt selbst keine Cookies und bindet keine Analyse-, Werbe- oder Tra
|
||||
- ohne aktivierte Speicherung bleiben alle Routen- und Stationsdaten ausschließlich im Arbeitsspeicher des geöffneten Browserfensters.
|
||||
|
||||
Der Initialisierungsbildschirm bleibt nach erfolgreichem Laden sichtbar. Erst eine bewusste Pointer- oder Tastaturaktion öffnet die eigentliche Anwendung. Das Informationsfenster und die Datenschutzeinstellungen können bereits auf dem Startbildschirm verwendet werden, ohne die Anwendung weiterzuschalten.
|
||||
|
||||
Gemeinsame Entwürfe und Wichtelcodes: [Gruppenbearbeitung.md](Gruppenbearbeitung.md).
|
||||
|
||||
@@ -864,3 +864,50 @@ Die Dateinamen und relativen Pfade unter `storage/` bleiben ausschließlich inte
|
||||
Unter `tools/python/` liegen interaktive Skripte für Anlegen, Ändern, Erweitern, Wiederherstellen und Löschen von Routen, POIs, Bildern und Audio. Sie verwenden ausschließlich die Python-Standardbibliothek. Fehlende Parameter werden abgefragt. Antwortet ein vorgeschalteter Webserver mit HTTP 401, fragt die gemeinsame Request-Schicht Benutzername und Passwort ab und wiederholt den ursprünglichen Request.
|
||||
|
||||
Details und Aufrufbeispiele stehen in [`Python-Werkzeuge.md`](Python-Werkzeuge.md).
|
||||
|
||||
## Gruppenbearbeitung
|
||||
|
||||
Siehe [Gruppenbearbeitung.md](Gruppenbearbeitung.md). Alle Gruppenantworten sind
|
||||
`no-store`. POST/DELETE prüfen einen übermittelten Origin gegen den Host.
|
||||
|
||||
| Methode und Pfad | Zweck |
|
||||
| --- | --- |
|
||||
| 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/:id/code | Als Besitzer neuen Einladungscode erzeugen |
|
||||
| DELETE /api/groups/:id | Als Besitzer Einladung und Mitbearbeiterzugänge widerrufen |
|
||||
|
||||
Der Server setzt `wegwichtel_group_session` als geschütztes Cookie auf `/api`.
|
||||
Nur Hashes werden gespeichert. Die creator_id allein erteilt keine Gruppenrechte.
|
||||
Gruppenantworten enthalten id, route, role, active und revision; nur das Erzeugen
|
||||
oder Erneuern liefert den Klartextcode und expiresAt (Unixsekunden).
|
||||
|
||||
Die bisherigen `/api/routes/:id/...`-Endpunkte prüfen auch den Gruppenzugang,
|
||||
einschließlich GPX, Bilder und Audio. Unveröffentlichte Gruppenkopien sind nicht
|
||||
öffentlich gelistet. GET liefert `X-Group-Route` und `X-Group-Revision`; Änderungen
|
||||
müssen die geladene Revision als `If-Match` senden. Überlappende oder veraltete
|
||||
Änderungen ergeben 409. Erfolgreiche Änderungen erhöhen die Revision. API-Clients
|
||||
müssen Cookies beibehalten; Gruppenmedien können damit auch als normale Bild- und
|
||||
Audio-Ressourcen abgerufen werden. Freigegebene Strecken bleiben schreibgeschützt.
|
||||
|
||||
### Stationssperren für gemeinsame Entwürfe
|
||||
|
||||
`POST /api/groups/routes/:routeId/pois/:poiId/lock` verwendet die berechtigte
|
||||
Gruppensitzung. `{}` beansprucht eine freie Station. Antwort: `token`, `version`,
|
||||
`mediaVersion`, `poi`. Eine vorhandene Bearbeitung ergibt 423 mit
|
||||
`details.code=point-locked` und `details.replace`. Nach einer bestätigten Rückfrage
|
||||
mit `{ "replace": "<angezeigter Schlüssel>" }` erneut senden. Eine inzwischen
|
||||
veränderte Sperre braucht eine neue Bestätigung. `{ "token": "<eigener Schlüssel>" }`
|
||||
aktualisiert den eigenen Inhaltsstand; `{ "release": true, "token": "…" }` gibt
|
||||
nur die eigene Sperre frei. Fremde creator_id-Angaben werden nicht übernommen.
|
||||
Laufende Schreibanfragen ergeben `point-busy` (423), ein verlorener Zugang zur
|
||||
Bearbeitung `point-lost` (423), ein veränderter Stationsinhalt `point-changed` (409).
|
||||
|
||||
Für Schreibzugriffe auf `/api/routes/:id/pois/:poiId` und dessen Bild-/Tonpfade
|
||||
sind `X-Poi-Lock: <token>` und `If-Poi-Match: <version>` erforderlich. Anstelle
|
||||
von If-Match wird dort der Stationsinhalt geprüft. Erfolgreiche Antworten liefern
|
||||
`X-Poi-Id` und `X-Poi-Version`, solange die Station existiert. Diese Version bei
|
||||
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.
|
||||
|
||||
@@ -173,3 +173,8 @@ Schulleitung, Schulträger und Schulamt nicht als Betreiber der Website führen.
|
||||
Die konkrete Nutzungsfreigabe für die Schule bleibt gesondert festzulegen.
|
||||
Kontakt: info@wegwichtel.de. Die Anschrift ist noch zu ergänzen.
|
||||
Rechte fremder Urheber und bestehende Lizenzen bleiben davon unberührt.
|
||||
|
||||
## Gemeinsame Entwürfe
|
||||
|
||||
Vor Änderungen an Gruppenrechten und Code-Eingabe zusätzlich
|
||||
`docs/agents/GRUPPENBEARBEITUNG.md` lesen und bei Übergaben ausdrücklich nennen.
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
# Agent-Hinweise zur Gruppenbearbeitung
|
||||
|
||||
Implementierter erster Stand: gemeinsame serverseitige Kopien von eigenen und
|
||||
veröffentlichten Strecken, acht Unicode-Wichtel im Einladungscode, Drehrad-Eingabe,
|
||||
Sitzungen, Rollen owner/member, Codewechsel und Widerruf. Bedienung und Einspielen:
|
||||
[Gruppenbearbeitung.md](../Gruppenbearbeitung.md).
|
||||
|
||||
## Beizubehalten
|
||||
|
||||
- Originale bleiben unverändert; keine Schreibrechte auf freigegebene Strecken
|
||||
öffnen. Neue gemeinsame Kopien brauchen erneut die normale Moderationsfreigabe.
|
||||
- creator_id bleibt Ersteller-Metadatum. Eigentums-/Mitgliedsrechte werden durch
|
||||
zufällige Sitzungsgeheimnisse geprüft. Niemals Rechte anhand einer frei
|
||||
ü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
|
||||
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,
|
||||
Exponentialschreibweise, Groß-/Kleinschreibung der Pfade) dürfen ihn nicht umgehen.
|
||||
- Gemeinsame Entwürfe aus öffentlichen Listen ausschließen. Änderungen verwenden
|
||||
die geladene Gruppenrevision als If-Match. Hintergrundlisten dürfen diese
|
||||
Bearbeitungsrevision nicht auf einen neueren Stand setzen. Konflikte zeigen,
|
||||
ohne ungespeicherte Eingaben zu ersetzen. Schreibanfragen bis zum Abschluss sperren.
|
||||
- Codewechsel entfernt nur die alte Einladung, Gruppenschließung entzieht auch
|
||||
bestehenden Mitbearbeitern Rechte. Besitzer behalten Zugriff. Gemeinsame
|
||||
Strecken nicht über die normalen Delete-/Restore-Endpunkte entfernen/wiederherstellen.
|
||||
- Gruppenzugang benötigt Internet. Lokale Entwürfe weiter sofort anzeigen und
|
||||
ihre Dateien erst bei Bedarf bzw. beim Übertragen laden.
|
||||
- Rechtliche Hinweise zu Sitzungs-Cookies und serverseitigen Gruppenentwürfen
|
||||
statisch auf Deutsch halten; Bedienung vollständig in Deutsch und Englisch.
|
||||
|
||||
## Weitere Aufgaben
|
||||
|
||||
- Wiederherstellung des eröffnenden Zugangs nach Cookie-/Geräteverlust und eine
|
||||
ausdrücklich autorisierte Eigentumsübertragung entwickeln.
|
||||
- Einzelne Mitglieder verwalten und gezielt entfernen; beigetretene Sitzungen
|
||||
sind derzeit nur gemeinsam über „Gruppe schließen“ widerrufbar.
|
||||
- Automatisches Zusammenführen bzw. feinere Konflikte und transaktionale
|
||||
Mehrdatei-Übertragungen evaluieren. Bereits erfolgreiche Teiländerungen können
|
||||
bei einem späteren Fehler bestehen bleiben. Neue Routen-POSTs sind noch nicht
|
||||
gegen verlorene Erfolgsantworten idempotent.
|
||||
- Expliziten unabhängigen Moderationszugang für private Gruppenmedien und einen
|
||||
Ablauf zum Anfordern ihrer Veröffentlichung ergänzen; keinen Rechte-Bypass
|
||||
anhand frei setzbarer Header oder beliebiger Basic-Auth-Header einführen.
|
||||
- Aufbewahrung und Bereinigung verwaister Gruppen, Sitzungen und Kopien sowie
|
||||
weitergehende Quoten und verteilte Sperren für einen Mehrprozessbetrieb planen.
|
||||
- Der Gruppen-Code ist eine Einladung, kein persönlicher Identitätsnachweis.
|
||||
Rechteprüfung für einzelne Inhalte bleibt eine getrennte offene Aufgabe.
|
||||
|
||||
## Stationssperren und zurückgehaltene Änderungen
|
||||
|
||||
- `src/services/point-locks.js` verwaltet atomare JSON-Sperrdateien pro Station
|
||||
mit creator_id, Sitzungshash und zufälligem Bearbeitungsschlüssel. Rechte nicht
|
||||
allein anhand der creator_id prüfen. Übernahmen brauchen eine bestätigte,
|
||||
vergleichende Ersetzung des gerade angezeigten Schlüssels; während laufender
|
||||
Speicherung weder freigeben noch übernehmen oder die Gruppe schließen.
|
||||
- Alle Stations-Schreibpfade einschließlich Bilder/Ton, Entfernung und Umordnung
|
||||
durch `guardPoint` schützen, auch bei alternativen URL-Schreibweisen.
|
||||
- `X-Poi-Lock` und `If-Poi-Match` sind Pflicht. Der Inhaltsabdruck berücksichtigt
|
||||
auch tatsächliche Dateibytes. Antwortheader `X-Poi-Version`/`X-Poi-Id` nach
|
||||
erfolgreichen Teiländerungen aktualisieren. Stations-Schreibzugriffe verwenden
|
||||
diese Prüfung anstelle des streckenweiten If-Match, damit verschiedene
|
||||
Stationen unabhängig bearbeitbar sind. Das Einprozessmodell bleibt erforderlich.
|
||||
- `public/js/group-points.js` sichert Entwürfe inklusive File/Blob und
|
||||
Entfernungsvormerkungen vor dem Senden in IndexedDB. Transaktionsabschluss
|
||||
abwarten; bei Quotenfehlern niemals erfolgreiche Sicherung behaupten.
|
||||
- Entwürfe auch ohne Netz bzw. nach verlorenem Zugang anzeigen. Erst nach
|
||||
erneutem Sperrerwerb und Inhaltsvergleich senden. Bei Abweichungen Vergleich
|
||||
mit ausdrücklicher Bestätigung; keine automatische Wiederholung/Überschreibung.
|
||||
- Datei-Entfernungen bei Gruppen zunächst vormerken. Bereits quittierte
|
||||
Übertragungen aus der Warteliste nehmen. Die ursprüngliche Vergleichsbasis
|
||||
behalten, bis sämtliche Änderungen erfolgreich übertragen wurden.
|
||||
- Weiter offen: atomare Mehrdatei-Übertragungen/Idempotenz bei verlorenen
|
||||
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.
|
||||
@@ -6,13 +6,21 @@ gezieltes Löschen nur nach ausdrücklicher Bestätigung und erneutes Einsenden
|
||||
nicht freigegebener Strecken. Beschreibung: [CREATOR-ID.md](../CREATOR-ID.md).
|
||||
Das GPX-Attribut `creator="Wegwichtel"` bezeichnet weiterhin nur das Programm.
|
||||
|
||||
Noch offen für gemeinsame Bearbeitung:
|
||||
Erster Gruppenstand umgesetzt: gemeinsame Kopien, Wichtelcodes, geschützte
|
||||
Sitzungen, owner/member-Rollen und Revisionsprüfung. Details und Grenzen:
|
||||
[GRUPPENBEARBEITUNG.md](GRUPPENBEARBEITUNG.md).
|
||||
|
||||
- Authentifizierte Eigentumszuordnung und Einladungen für Mitbearbeiter entwickeln.
|
||||
Eine frei übermittelte Gerätekennung allein beweist kein Eigentum.
|
||||
Noch offen für den weiteren Ausbau:
|
||||
|
||||
- Geräteübergreifende Anmeldung, Wiederherstellung und gezielte Mitgliederverwaltung
|
||||
ergänzen. Gruppenrechte und Einladungen bestehen bereits auf Sitzungsbasis;
|
||||
eine frei übermittelte Gerätekennung beweist weiterhin kein Eigentum.
|
||||
- Wiederherstellung nach verlorenen Browserdaten und bewussten Gerätewechsel planen.
|
||||
- Gleichzeitige Änderungen und Versionskonflikte erkennen; der derzeitige lokale
|
||||
Entwurf wird beim Einsenden als vollständiger Stand behandelt.
|
||||
- Automatisches Zusammenführen und feinere Konfliktauflösung ergänzen. Gemeinsame
|
||||
Entwürfe erkennen inzwischen veraltete Revisionen und sperren überlappende Writes.
|
||||
Stationssperren, bestätigte Übernahme und lokale Rückhaltung einschließlich
|
||||
Inhaltsvergleich beim erneuten Senden sind umgesetzt.
|
||||
Lokale Wieder-Einreichungen behandeln den Entwurf weiterhin als vollständigen Stand.
|
||||
- Idempotente POSTs auch bei verlorenem HTTP-Erfolg und Gesamtübertragungen mit
|
||||
mehreren Dateien absichern.
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# Platzhalter für die neun Gnom-Motive
|
||||
# Wichtel für Gruppencodes
|
||||
|
||||
Die PNGs sind vollständig transparente Platzhalter mit 256 × 256 Pixeln.
|
||||
Sie können direkt durch die echten Bilder ersetzt werden; der Dateiname muss
|
||||
beibehalten werden. Die Klasse leitet den Bildpfad direkt vom Unicode-Symbol ab.
|
||||
Die neun PNG-Dateien werden für Einladungen und die senkrechten Code-Drehräder
|
||||
verwendet. Ihre Unicode-Dateinamen bleiben unverändert. Bedienung und Grenzen:
|
||||
[Gruppenbearbeitung.md](Gruppenbearbeitung.md).
|
||||
|
||||
Die Reihenfolge entspricht der Vorlage: oben von links nach rechts, danach unten
|
||||
von links nach rechts.
|
||||
@@ -20,13 +20,12 @@ von links nach rechts.
|
||||
| 🎃.png | Gnom mit Kürbis | Symbol zeigt einen Halloween-Kürbis |
|
||||
|
||||
Alle Bilder liegen unter `public/images/group-symbols/`.
|
||||
Neun Motive sind vorbereitet; die spätere Gruppencode-Funktion wird hier noch nicht
|
||||
implementiert. `index.html` und die bestehenden Ansichten bleiben unverändert.
|
||||
Die Gruppenfunktion verwendet acht Symbole je Code. Bilder werden dafür nicht
|
||||
umbenannt oder neu erzeugt.
|
||||
|
||||
## Klasse
|
||||
|
||||
`public/js/group-symbols.js` registriert `Wegwichtel.GroupSymbols`, sobald das Script
|
||||
später ausdrücklich geladen wird. Die Initialisierung des Namensraums steht als
|
||||
`public/js/group-symbols.js` registriert `Wegwichtel.GroupSymbols`, beim Laden der App. Die Initialisierung des Namensraums steht als
|
||||
eigene Anweisung vor der Registrierung (Korrektur für Sonar javascript:S1121).
|
||||
|
||||
```js
|
||||
|
||||
@@ -57,3 +57,8 @@ Bei einem Sprachschalter müssen die aktuellen Ansichten zusätzlich neu gerende
|
||||
werden. Fehlende einzelne Übersetzungen und unbekannte Sprachen fallen auf
|
||||
Deutsch zurück. Ein fehlender deutscher Textschlüssel wirft einen internen
|
||||
Fehler, damit fehlerhafte Zuordnungen nicht unbemerkt bleiben.
|
||||
|
||||
Gruppen verwenden nach dem Öffnen oder Beitritt ein HttpOnly-/SameSite-Strict-
|
||||
Sitzungscookie, bei HTTPS mit Secure, Laufzeit höchstens 30 Tage. Die Datenbank
|
||||
hält nur den Hash sowie creator_id und Mitgliedschaften. Die deaktivierte
|
||||
Option für optionale Cookies betrifft keine notwendigen Gruppensitzungen.
|
||||
|
||||
Reference in New Issue
Block a user