Ergänzung Datenschutzerklärung und Impressum, Fristenformular in Einstellungen
This commit is contained in:
116
README.md
116
README.md
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user