diff --git a/docs/Bilder-und-Ton-Nutzungsrechte.md b/docs/Bilder-und-Ton-Nutzungsrechte.md index eb49e99..d134d0e 100644 --- a/docs/Bilder-und-Ton-Nutzungsrechte.md +++ b/docs/Bilder-und-Ton-Nutzungsrechte.md @@ -45,20 +45,21 @@ Die notwendigen Arbeiten stehen in Vor verbindlicher Verwendung sind insbesondere diese Platzhalter zu ersetzen: -- vollständiger Name und Anschrift des tatsächlichen Betreibers als Lizenznehmer; +- Anschrift von Florian Zumpe als Betreiber und Lizenznehmer; - Rechtsgrundlagen, Empfänger, Hostinganbieter sowie Lösch- und Sicherungsfristen. Kontakt für Wegwichtel, Rechtefragen, Datenschutzanfragen, Widerruf und Entfernung: [info@wegwichtel.de](mailto:info@wegwichtel.de). Die Adresse ist eingerichtet -und ersetzt die bisherigen Kontaktplatzhalter. Die Kontaktdaten der Schule -und der Datenschutzstellen bleiben als Kontakte dieser Stellen erhalten. +und ersetzt die bisherigen Kontaktplatzhalter. -Außerdem müssen die Texte und das Zustimmungsverfahren zum tatsächlichen -Betriebsmodell der Schule passen und rechtlich geprüft werden. Die bereits -vorhandenen Schul- und Behördenkontakte im Impressum wurden nicht verändert; -die Kontaktadresse für Wegwichtel und die technische Verantwortung wurde ergänzt. Die frühere -pauschale Rechtezuordnung zur Schule wurde durch die Trennung von Urheberschaft -und Nutzungsrechten ersetzt. +Seit dem 17. Oktober 2026 ist Florian Zumpe als Projektinhaber, Betreiber und +Lizenznehmer für den Betrieb von Wegwichtel festgelegt. Er übernimmt Entwicklung, +Betrieb und Pflege. Die Grundschule Herpf soll eine gesonderte Nutzungsfreigabe +erhalten. Die bisherigen Schul- und Behördenkontakte wurden als Betreiberangaben +aus Impressum und Datenschutz entfernt. Die Anschrift von Florian Zumpe ist noch +zu ergänzen. Die Rechte an fremden Beiträgen und Envato-Grafiken bleiben bei den +jeweiligen Berechtigten. Texte und Zustimmungsverfahren müssen zum tatsächlichen +Betriebsmodell passen; siehe [Projektverantwortung.md](Projektverantwortung.md). ## HTTP-Rechtehinweise diff --git a/docs/CREATOR-ID.md b/docs/CREATOR-ID.md index 3a1452d..3b5f723 100644 --- a/docs/CREATOR-ID.md +++ b/docs/CREATOR-ID.md @@ -48,6 +48,32 @@ verlorenen HTTP-Erfolg nach serverseitigem POST ist zusätzlich eine spätere Idempotenzlösung erforderlich. Parallele Bearbeitung ist noch nicht freigegeben; die aktuelle Übertragung behandelt den lokalen Entwurf als vollständigen Stand. +## Fehlende Server-Strecke, Papierkorb und lokaler Status + +Beim Öffnen der Entwurfsliste werden lokale Strecken sofort angezeigt. Bereits +abgesandte Strecken werden im Hintergrund mit `includeDeleted=true` geprüft. +Liegt die Strecke im Papierkorb, wird lokal „Abgelehnt“ angezeigt. Existiert die +Server-ID auch mit dieser Abfrage nicht mehr (HTTP 404), erscheint „Entfernt“. +Der Status wird auf dem Gerät gespeichert und bleibt ohne Internet sichtbar. +Fehlende Berechtigung, Netzwerk- und Serverfehler verändern ihn nicht. +Eine erfolgreiche Abfrage nach manueller Wiederherstellung entfernt den alten +Ablehnungsstatus. Ungespeicherte Eingaben werden durch die Prüfung nicht ersetzt. + +Beim bewussten erneuten Einsenden einer entfernten oder abgelehnten Strecke +werden alte Server-Zuordnungen für Strecke, Stationen, Bilder und Ton entfernt. +Der lokale Inhalt und seine Dateireferenzen bleiben erhalten. Eine neue Strecke +mit neuer ID und derselben Erstellerkennung wird zur Prüfung angelegt. Der alte +Papierkorb-Eintrag wird nicht wiederhergestellt oder verändert. Die neue Strecke +muss erneut freigegeben werden. Bestätigte neue IDs werden auch bei einem späteren +Übertragungsfehler gespeichert; weitere Versuche setzen dort fort. + +Nach erfolgreicher neuer Einreichung wird der Status gelöscht und angezeigt: +„Die Strecke wurde neu angelegt und zur Prüfung gesendet.“ Eine vorhandene, +noch nicht freigegebene Strecke wird unter derselben ID aktualisiert und erhält +die normale Erfolgsmeldung. Freigegebene Strecken bleiben gegen Änderungen gesperrt. +Nur eine bestätigte 404-Antwort oder ein bestätigter Papierkorb-Status löst eine +neue Einreichung aus, keine Netzwerk-, Berechtigungs- oder anderen Serverfehler. + ## Datenbank und Betrieb Das Schema und die Startprüfung enthalten die nullable Spalte diff --git a/docs/PUBLICATION-CHECKLIST.md b/docs/PUBLICATION-CHECKLIST.md index caef136..b39ebc8 100644 --- a/docs/PUBLICATION-CHECKLIST.md +++ b/docs/PUBLICATION-CHECKLIST.md @@ -4,8 +4,8 @@ Die in der Anwendung enthaltenen Texte sind Vorlagen und ersetzen keine Prüfung ## Betreiber und Impressum -- vollständiger Name und Rechtsform der Betreiberin -- vertretungsberechtigte Person +- Betreiber und Projektinhaber: Florian Zumpe (festgelegt); gegebenenfalls erforderliche weitere Angaben zum tatsächlichen Betriebsmodell prüfen +- Vertretungsangaben nur, falls für das tatsächliche Betriebsmodell erforderlich - ladungsfähige Anschrift - eingerichtete Kontaktadresse für Wegwichtel: info@wegwichtel.de - weiterer unmittelbarer Kontaktweg @@ -14,7 +14,7 @@ Die in der Anwendung enthaltenen Texte sind Vorlagen und ersetzen keine Prüfung ## Datenschutz -- Verantwortliche Stelle und Datenschutzkontakt +- Verantwortliche Stelle für den App-Betrieb: Florian Zumpe; Kontakt info@wegwichtel.de; Anschrift ergänzen - Hostinganbieter und Ort der Verarbeitung - Art und Dauer der Serverprotokollierung - Rechtsgrundlagen für Serverbetrieb und freiwillige Browser-Speicherung diff --git a/docs/Projektverantwortung.md b/docs/Projektverantwortung.md new file mode 100644 index 0000000..a03bd55 --- /dev/null +++ b/docs/Projektverantwortung.md @@ -0,0 +1,16 @@ +# Projektverantwortung + +Projektinhaber und Betreiber von Wegwichtel ist Florian Zumpe. Er entwickelt +und erhält das Projekt und übernimmt Betrieb und Pflege. Kontakt: +info@wegwichtel.de. Seine ladungsfähige Anschrift ist in den statischen +Rechtstexten noch als Platzhalter eingetragen. + +Die Staatliche Grundschule Herpf soll nach einer gesonderten Freigabe die App +nutzen können. Umfang, Dauer und Bedingungen dieser Freigabe sind noch +festzulegen. Aus dieser Absicht folgt keine Übertragung des Projekts auf die +Schule. Im Impressum und für den App-Betrieb steht Florian Zumpe. + +Die Rechte an Beiträgen anderer Personen und an lizenzierten Grafiken bleiben +bei den jeweiligen Berechtigten. Die Betreiberangabe ersetzt keine Lizenz und +keinen Nachweis der Zustimmung. Die Texte von Impressum, Datenschutz und +Nutzungsvereinbarung bleiben statisch auf Deutsch in public/index.html. diff --git a/docs/agents/AGENTS.md b/docs/agents/AGENTS.md index bf719df..e625123 100644 --- a/docs/agents/AGENTS.md +++ b/docs/agents/AGENTS.md @@ -163,3 +163,13 @@ Bestätigter Ausgangsstand am 5. Oktober 2026: Commit erfolgreich; Quality Gate OK; alle 121 Findings CLOSED/FIXED; beide Security Hotspots REVIEWED/SAFE. Dieser Stand ist eine historische Referenz und ersetzt nicht die Prüfung einer neuen Analyse. + +## Projektinhaber und Betreiber + +Florian Zumpe ist Projektinhaber, Betreiber und Verantwortlicher für die +Entwicklung, den Betrieb und die Pflege von Wegwichtel. Die Grundschule Herpf +soll nach einer gesonderten Freigabe zur Nutzung berechtigt werden. Schule, +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. diff --git a/docs/agents/TODO-MEDIENRECHTE.md b/docs/agents/TODO-MEDIENRECHTE.md index bed82c1..7986fed 100644 --- a/docs/agents/TODO-MEDIENRECHTE.md +++ b/docs/agents/TODO-MEDIENRECHTE.md @@ -10,8 +10,8 @@ als offenen Platzhalter führen. ## Vor verbindlicher Verwendung und Freigabe zu erledigen -1. Den tatsächlichen Lizenznehmer, Rechtsgrundlagen und Fristen - ergänzen. Den Entwurf und die Zustimmung für Kinder rechtlich prüfen lassen. +1. Lizenznehmer für den Betrieb von Wegwichtel ist Florian Zumpe. Seine + Anschrift, Rechtsgrundlagen und Fristen ergänzen. Den Entwurf und die Zustimmung für Kinder rechtlich prüfen lassen. 2. Die relevante Vereinbarung vor dem Einsenden zugänglich machen und eine nicht vorausgewählte, ausdrückliche Zustimmung einholen. Eine bloße Datenschutzerklärung und eine zufällige Gerätekennung sind kein Rechtenachweis. diff --git a/docs/agents/TODO-MODERATION.md b/docs/agents/TODO-MODERATION.md index 03fef1b..1faacd2 100644 --- a/docs/agents/TODO-MODERATION.md +++ b/docs/agents/TODO-MODERATION.md @@ -18,3 +18,7 @@ Noch offen für gemeinsame Bearbeitung: Die Ersteller-ID ersetzt keine Anmeldung. Der Moderationszugang ist separat über Nginx und eine Passwortdatei geschützt (siehe [MODERATION-MEDIEN.md](../MODERATION-MEDIEN.md)). + +Zusätzlich vorgemerkt: [mögliche Streckenduplikate online prüfen](TODO-STRECKENDUPLIKATE.md). +Identische Dateien, ähnliche Wege und bewusst neue Einreichungen nach Ablehnung +oder Entfernung müssen getrennt beurteilt werden. diff --git a/docs/agents/TODO-STRECKENDUPLIKATE.md b/docs/agents/TODO-STRECKENDUPLIKATE.md new file mode 100644 index 0000000..d3410d6 --- /dev/null +++ b/docs/agents/TODO-STRECKENDUPLIKATE.md @@ -0,0 +1,30 @@ +# TODO: Mögliche Streckenduplikate in der Moderation prüfen + +Am 5. Oktober 2026 vorgemerkt, noch nicht implementiert. + +## Ziel + +Online mögliche Duplikate zur manuellen Moderation anzeigen. Erneute Einreichungen +nach Ablehnung oder Entfernung bleiben erlaubt. Ein Treffer darf nicht automatisch +eine Freigabe übernehmen, eine alte Strecke wiederherstellen oder einen Upload blockieren. + +## Lösungsansätze + +- SHA-256 der GPX-Datei für bytegenau identische Dateien berechnen. Änderungen an + XML-Schreibweise, Zeitstempeln oder Leerzeichen ändern bereits diese Prüfsumme. +- Zusätzlich eine stabile Darstellung der Routen- und Stationskoordinaten hashen. + XML-Schreibweise, Zeitstempel, Titel und interne IDs nicht als Wegidentität werten. + Reihenfolge, Rundung, fehlende Koordinaten und Stationsanker ausdrücklich definieren. +- Für GPS-Abweichungen einen geometrischen Ähnlichkeitsvergleich evaluieren. + Zunächst Kandidaten über die vorhandenen Min-/Max-Grenzen auswählen, dann + Wegverlauf, Start, Ende, Länge und Stationen mit festgelegter Toleranz vergleichen. +- Gleiche Wege und gleiche Inhalte unterscheiden: Derselbe Weg kann andere + Aufgaben, Bilder und Tonaufnahmen enthalten. +- Betroffene IDs, Status und Grund der Ähnlichkeit in der Moderation anzeigen. + Entscheiden, ob Papierkorb-Einträge in den Vergleich einbezogen werden. +- Fehlende GPS-Daten berücksichtigen; leere Dateien nicht pauschal als sinnvolle + Duplikate werten. Tests für identische Dateien, XML-/Zeitabweichungen, GPS-Rauschen, + Rückwege, andere Reihenfolge und Stationen sowie erneute Einreichungen vorsehen. + +Die GPX-Datei bleibt Datenquelle; keine zweite vollständige Geometrie in SQLite +ablegen. Hashes sind Vergleichswerte, kein Berechtigungs- oder Urhebernachweis. diff --git a/public/index.html b/public/index.html index 04d4baf..57ed63c 100644 --- a/public/index.html +++ b/public/index.html @@ -312,14 +312,10 @@
`))[0]; + assert.match(article, /Florian Zumpe/); + assert.match(article, /\[Anschrift von Florian Zumpe ergänzen\]/); + assert.match(article, /info@wegwichtel\.de/); + assert.doesNotMatch(article, /info@grundschule-herpf|Frau Wichert|Landkreis Schmalkalden|Staatliches Schulamt|data-i18n/); + } + assert.match(html, /Grundschule Herpf soll die App nach einer gesonderten Nutzungsfreigabe verwenden/); +}); diff --git a/test/local-routes.test.js b/test/local-routes.test.js index edf9aa1..b9a36a7 100644 --- a/test/local-routes.test.js +++ b/test/local-routes.test.js @@ -762,3 +762,16 @@ test('route selection reads metadata only and station media is loaded and releas assert.equal(await api.getAppPoi('missing', 0), null); assert.equal(api.get('lazy').pois[0].images[0].url, undefined); }); + +test('submission status persists with the server ID and rejects unknown status values', async () => { + const { api, localStorage } = await loadLocalRoutes(); + const id = api.createRouteId(); + for (const submissionStatus of ['rejected', 'removed', null, 'invalid']) { + const expected = submissionStatus === 'invalid' ? null : submissionStatus; + api.save({ id, gpx: api.emptyGpx('Waldweg'), route: { name: 'Waldweg', serverRouteId: 42, submissionStatus }, pois: [] }); + assert.equal(api.get(id).route.submissionStatus, expected); + assert.equal(api.get(id).route.serverRouteId, 42); + const stored = JSON.parse(localStorage.getItem(`${api.STORAGE_PREFIX}.${encodeURIComponent(id)}.json`)); + assert.equal(stored.route.submissionStatus, expected); + } +});