offene Aufgaben: sortiere die Aufgaben nach korrekter Reihenfolge, schreibe nach dieser zeile um für KI-Lesbarkeit, fertige aufgaben durchstreichen und als erledigt markieren. Reihenfolge unten nach Abhängigkeit/Aufwand sortiert (nicht nach ursprünglicher Nummerierung). - [x] ~~**1. KI-Claude-API-Block aus dem Backend entfernen**~~ *(erledigt)* - ~~Der gesamte "KI – Claude API"-Kartenblock in den Backend-Einstellungen (Karte, Eingabefeld, zugehöriger Code/Route) soll komplett verschwinden – wird nicht genutzt.~~ - [x] ~~**2. Backend "Betrieb"-Karte durch Rechtstexte ersetzen (Impressum, Datenschutz, Nutzungsbedingungen)**~~ *(erledigt, mit einer Abweichung)* - ~~Stattdessen: drei bearbeitbare Rechtstexte-Seiten (Impressum, Datenschutzerklärung, Nutzungsbedingungen), die der Admin im Backend pflegen kann.~~ - ~~Alle drei Seiten müssen für den Kunden (Nutzer) per 1-Klick erreichbar sein – am besten als fester Link-Block unten in der Sidebar.~~ - Abweichung: die "Betrieb"-Karte wurde **nicht** entfernt, da Firmenname/Logo/Adresse dort aktiv für Sidebar-Branding und die Fußzeile generierter PDFs (Musterbrief, Widerspruch, Pflegetagebuch, Patientenakte) verwendet werden – das Entfernen hätte eine echte Funktion ersatzlos gestrichen. Die Rechtstexte-Karte kam stattdessen in den frei gewordenen Slot der KI-Claude-API-Karte. Bei Bedarf bitte Rückmeldung, falls die Betrieb-Karte trotzdem weg soll (dann bräuchte die Branding-Pflege einen neuen Platz). - Umsetzung: 3 neue `einstellungen`-Schlüssel (`rechtstext_impressum`/`_datenschutz`/`_agb`), öffentlich abrufbar (kein Login nötig, wie bei Impressumspflicht üblich), Sidebar-Fußzeile mit 3 Links, von der Abo-Sperre ausgenommen. - [x] ~~**3. Nutzerverwaltung reparieren & Admin-Dashboard auf Nutzerverwaltung fokussieren**~~ *(erledigt)* - ~~Bug: bei einem manuell angelegten Test-Konto lassen sich aktuell keine Aktionen ausführen.~~ Ursache gefunden: Sperren/Löschen/Freimonate gab es nur im separaten Admin-Dashboard, nicht in der einfacheren "Nutzerverwaltung"-Karte im Backend, in der vermutlich nachgeschaut wurde – jetzt hat das Admin-Dashboard zusätzlich einen "Bearbeiten"-Button, damit dort alles an einem Ort ist. - ~~Für die Rolle Admin sind Leistungskatalog, Formulare & Recht usw. in der Sidebar irrelevant.~~ Sidebar blendet diese Bereiche für Admin jetzt aus, Admin landet nach Login direkt auf dem Admin-Dashboard. - ~~Nutzerverwaltung um zusätzliche Informationen je Konto erweitern.~~ Registriert-am, Letzter Login und IP-Adresse sind jetzt in der Konten-Tabelle sichtbar (Zahlungsstatus gab es über "Abo bis"/"abgelaufen"/"kein Zugang" schon vorher). - [x] ~~**4. Rechnungsanschrift & Rechnungserstellung**~~ *(erledigt, erweitert um Registrierung)* - ~~Admin braucht in der Nutzerverwaltung Einsicht in die hinterlegte Rechnungsanschrift jedes Kontos.~~ Teil des neuen "Bearbeiten"-Modals im Admin-Dashboard. - ~~Admin muss auf Kundenwunsch eine Rechnung für ein Konto erstellen können (PDF).~~ Neuer "Rechnung"-Button pro Konto, erzeugt clientseitig ein PDF (gleiche Technik wie Musterbrief/Widerspruch). - Registrierungs-Button auf dem Login-Bildschirm umgesetzt: "Noch kein Konto? Jetzt registrieren" öffnet ein Formular (Name, Zugangsdaten, Pflichtfeld Rechnungsanschrift), Konto wird direkt eingeloggt. - Nach der Registrierung ist Lesen/Ansehen sofort möglich, aber Briefe/Widersprüche, Leistungen-Zuweisung und Kalender-Einträge sind gesperrt, bis ein Abo vorliegt (unabhängig vom globalen Zahlungspflicht-Schalter) – Admin kann über "Freischalten" manuell freigeben. - Den Standard-Zugangsdaten-Hinweis (admin/admin) von der Login-Seite entfernt. - [x] ~~**5. 🔒 Sicherheits-Audit beheben (vor Live-Gang auf der Testbench)**~~ *(erledigt, ausser Session-Cookie-Punkt)* - Ergebnis eines Code-Reviews von `app.py` + `templates/index.html` am 2026-07-19, am 2026-07-19 direkt im Anschluss auch behoben und verifiziert (Server-Start, Login, Admin-Nutzerliste, Rate-Limit-Test). - ~~**Kritisch:**~~ - ~~`python app.py` (Direktstart) lief mit `debug=True` **und** `host="0.0.0.0"` – RCE-Risiko übers Netz.~~ Fix: `host="127.0.0.1"`. `start.py`/Docker unverändert (Gunicorn nutzt den `__main__`-Block nie). - ~~**Hoch:**~~ - ~~Kein Datei-Typ-Whitelist beim Brief-Upload~~ (`api_brief_speichern`) – jetzt gleiche `.pdf`-Prüfung wie beim Dokumenten-Upload. - ~~Ungeschätzte IP-Adresse im Admin-Dashboard (Stored-XSS über `X-Forwarded-For`)~~ – Frontend jetzt `escH(n.letzte_ip||'')`; zusätzlich serverseitig eine neue Hilfsfunktion `_client_ip()` (app.py), die den Header vor dem Speichern auf `[0-9a-fA-F.:]` beschränkt und auf 45 Zeichen kappt (IPv4/IPv6-safe), genutzt in `api_auth_login` und `api_auth_registrieren`. - ~~**Mittel:**~~ - ~~Keine Rate-Limits auf Login/Registrierung~~ – einfaches In-Memory-Rate-Limiting ergänzt (`_rate_limited()` in app.py, pro IP+Zweck): Login max. 10 Versuche/5 Min, Registrierung max. 5/10 Min, sonst HTTP 429. Bewusst ohne neue Abhängigkeit (kein `flask-limiter`), da nur ein einzelner Gunicorn-Prozess mit wenigen Workern läuft und ein einfacher Zähler reicht; Limit gilt pro Worker, nicht global über alle Worker hinweg – für die aktuelle Grössenordnung ausreichend. - ~~Keine Security-Header~~ – neuer `@app.after_request`-Hook `_security_headers()` setzt `X-Frame-Options: SAMEORIGIN`, `X-Content-Type-Options: nosniff`, `Content-Security-Policy: frame-ancestors 'self'`. Bewusst kein `script-src`/volles CSP, da `templates/index.html` durchgehend Inline-`