Ergänzung Datenschutzerklärung und Impressum, Fristenformular in Einstellungen

This commit is contained in:
2026-08-10 06:44:11 +02:00
parent 8ffbda875e
commit 777e3e5447
25 changed files with 1310 additions and 139 deletions

116
README.md
View File

@@ -1128,16 +1128,69 @@ anderen Administratoren und vor sich selbst. Sonst könnte sich die Verwaltung
aussperren. Wer einen Administrator entfernen will, nimmt ihm zuerst die Rechte;
das geht bewusst nur direkt in der Datenbank.
### Automatische Bereinigung
### Fristen
Vier Fristen, in der Verwaltung einstellbar:
**Alle** Fristen der Anwendung stehen unter *Einstellungen →
Benutzerverwaltung → Fristen* und lassen sich dort einsehen und ändern.
Zentral hinterlegt in `backend/app/runtime_settings.py`, Rangfolge:
| Einstellung | Voreinstellung | Wirkung |
```
Einstellungstabelle → Umgebungsvariable → Vorgabewert im Quelltext
```
Die Umgebungsvariable ist also der Startwert; sobald in der Verwaltung etwas
geändert wird, gilt der gespeicherte Wert.
| Gruppe | Frist | Vorgabe |
|---|---|---|
| Konto deaktivieren nach … Monaten ohne Anmeldung | 12 | Konto wird gesperrt, Person bekommt eine Nachricht |
| Konto löschen nach … Monaten Deaktivierung | 12 | Konto wird endgültig entfernt |
| Liste archivieren nach … Monaten ohne Öffnen | 12 | **Je Person** die Liste verschwindet nur aus deren Übersicht |
| Liste löschen nach … Monaten im Archiv | 12 | Nur nach dem Archivdatum des **Eigentümers** |
| Konten | deaktivieren nach … Monaten ohne Anmeldung | 12 |
| | löschen nach … Monaten Deaktivierung | 12 |
| Listen | archivieren nach … Monaten ohne Öffnen | 12 |
| | löschen nach … Monaten im Archiv | 12 |
| Aufbewahrung | Gelöschtes endgültig entfernen nach … Tagen | 30 |
| | Quittungen der Warteschlange … Tage | 7 |
| | Produktabfragen gültig … Tage | 180 |
| Sitzungen und Links | angemeldet bleiben … Tage | 30 |
| | Einladung gültig … Tage | 14 |
| | Willkommenslink gültig … Tage | 14 |
| | Bestätigungslink gültig … Stunden | 24 |
| | Passwortlink gültig … Stunden | 1 |
| | Adresswechsel bestätigen binnen … Stunden | 48 |
Nicht dort einstellbar und deshalb in der Oberfläche gesondert aufgeführt:
die 24 Stunden der Missbrauchsabwehr, der Abstand der Aufräumläufe
(`CLEANUP_INTERVAL_HOURS`) und die Aufbewahrung der Webserver-Protokolle
Letztere ist Sache der Protokollrotation auf dem Server.
```bash
python3 tools/check-retention.py
```
Prüft dreierlei: dass jede einstellbare Frist auch tatsächlich irgendwo
angewandt wird (eine Einstellung ohne Wirkung ist schlimmer als keine sie
behauptet eine), dass jede Tabelle mit Ablaufzeitpunkt vom Aufräumlauf erfasst
wird, und dass dort keine festen Zahlen mehr stehen.
### Was der Aufräumlauf tut
Einmal täglich, im `api`-Container:
| Was | Wann |
|---|---|
| Abgelaufene Sitzungen | sofort nach Ablauf |
| Verbrauchte Mail-Token | 7 Tage nach Ablauf |
| Zähler der Missbrauchsabwehr | nach 24 Stunden |
| Quittungen der Warteschlange | nach `cleanup_ops_days` |
| Abgelaufene Einladungen und öffentliche Links | `cleanup_deleted_days` **nach Ablauf** |
| Abgeschlossene Adresswechsel | `cleanup_deleted_days` nach Ablauf |
| Weich gelöschte Listen, Einträge, Artikel, Märkte, Warengruppen | `cleanup_deleted_days` nach dem Löschen |
| Produktzwischenspeicher | doppelte Gültigkeit, mindestens 1 Jahr |
| Konten deaktivieren und löschen | `auto_deactivate_months`, `auto_delete_months` |
| Listen archivieren, vorwarnen und löschen | `auto_archive_months`, `archive_delete_months` |
**Achtung bei den Einladungen:** Die Frist läuft *nach Ablauf*, nicht ab
Versand. Eine Einladung mit 14 Tagen Gültigkeit verschwindet also erst nach
44 Tagen aus der Datenbank das gehört so in die Datenschutzerklärung.
**0 bedeutet abgeschaltet, nicht „sofort".** Ein Tippfehler soll nicht dazu
führen, dass beim nächsten Durchlauf alle Konten verschwinden.
@@ -1283,6 +1336,55 @@ Der Eintrag in `alembic_version` am Ende ist wichtig: Ohne ihn würde Alembic
beim nächsten Start alle Migrationen erneut anwenden und an den vorhandenen
Tabellen scheitern.
## Rechtliche Seiten
`web/html/impressum.html` und `web/html/datenschutz.html` **Entwürfe**, die
vor der Veröffentlichung ausgefüllt und geprüft werden müssen. Alle offenen
Stellen sind mit `[…]` markiert; die Kästen mit der Klasse `draft` und die
Erläuterungen mit der Klasse `hint` gehören danach entfernt.
Verlinkt sind beide in einer Fußzeile, die **außerhalb von `#app`** in
`index.html` steht. Dadurch erscheint sie in jeder Ansicht auch auf der
Anmeldeseite und in der öffentlichen Listenansicht ohne dass jede Ansicht
sie selbst einbauen müsste. Im Ausdruck und über dem Kamerasucher ist sie
ausgeblendet.
Die Datenschutzerklärung beschreibt, was diese Anwendung tatsächlich tut, nicht
was üblicherweise in solchen Texten steht. Enthalten sind unter anderem: die
beiden technisch notwendigen Cookies, die lokale Speicherung in IndexedDB, die
Verarbeitung fremder E-Mail-Adressen bei Einladungen, die Push-Dienste der
Browserhersteller als Empfänger in Drittländern, Open Food Facts als
serverseitig aufgerufener Dienst, die vollständige Aufstellung der
Speicherfristen und der Hinweis, dass Listeninhalte in den Bereich des
Art. 9 DSGVO geraten können, wenn dort Medikamente stehen.
Auszufüllen sind: Verantwortlicher, Hosting-Anbieter, SMTP-Anbieter,
Aufsichtsbehörde des Bundeslandes und die Fristen, falls du sie in der
Verwaltung anders eingestellt hast.
## Datensparsamkeit im Betrieb
Drei Stellen, an denen bewusst weniger gespeichert wird, als technisch möglich
wäre:
**Keine externen Schriften.** Verwendet wird die Systemschrift des Geräts
(`system-ui`). Es wird nichts von fremden Servern nachgeladen die CSP führt
`font-src 'self'` ausdrücklich auf, obwohl `default-src` es schon abdeckt,
damit die Sperre beim Lesen der Datei erkennbar ist.
**Zugriffsprotokolle mit gekürzter IP-Adresse.** Der letzte Block wird auf Null
gesetzt (`map` in `nginx.conf`). Der `Referer` wird gar nicht protokolliert
bei einem öffentlichen Listenlink stünde dort der Zugangsschlüssel, sobald
jemand von dort aus weiterklickt.
**Missbrauchsbremse ohne Klartextadressen.** Die Zähler brauchen einen
gleichbleibenden Schlüssel je Absender, keinen lesbaren. Verwendet wird ein
Streuwert aus IP- beziehungsweise E-Mail-Adresse und einem zufälligen,
installationsweiten Zusatz. Das ist Pseudonymisierung, keine Anonymisierung
wer Datenbank samt Zusatz hat, könnte eine vermutete Adresse nachrechnen. Es
verhindert aber, dass beim Blick in die Tabelle Adressen mitgelesen werden, und
die Werte verschwinden ohnehin nach 24 Stunden.
## Sicherheit
`docs/sicherheit.md` Ergebnisse der Prüfung auf SQL-Injection, XSS,