diff --git a/docs/compliance-implementation.md b/docs/compliance-implementation.md index c7c0a7c..4134c82 100644 --- a/docs/compliance-implementation.md +++ b/docs/compliance-implementation.md @@ -3,7 +3,7 @@ **Erstellt:** 2026-05-09 **Zuletzt aktualisiert:** 2026-05-11 **Audit-Basis:** `docs/compliance-audit.md` -**App-Version nach Umsetzung:** 0.8.83 +**App-Version nach Umsetzung:** 0.8.86 --- @@ -286,7 +286,9 @@ FastAPI lehnt Requests mit `new_password < 8 Zeichen` nun mit HTTP **422** (Pyda ### P-11 – Legal-Hold Lifecycle-Status ✅ -**Status:** Umgesetzt (2026-05-11, Version 0.8.84) +**Status:** Vollständig umgesetzt (2026-05-11, Version 0.8.84 + Nachfixe 0.8.85–0.8.86) + +#### P-11 Kernum­setzung (Version 0.8.84) **Betroffene Dateien:** - `backend/migrations/051_legal_hold.sql` – neue Spalten `legal_hold_active`, `legal_hold_reason_code`, `legal_hold_reason_note`, `legal_hold_set_by_profile_id`, `legal_hold_set_at`, `legal_hold_released_by_profile_id`, `legal_hold_released_at`, `legal_hold_release_note` in `media_assets`; Audit-Log-CHECK um `legal_hold_set`/`legal_hold_released` erweitert @@ -304,14 +306,36 @@ FastAPI lehnt Requests mit `new_password < 8 Zeichen` nun mit HTTP **422** (Pyda - `POST /api/admin/media-assets/{asset_id}/legal-hold/release` — Sofortsperre aufheben (release_note Pflicht) - `GET /api/admin/media-assets/legal-hold` — Liste aller aktuell gesperrten Assets -**Sicherheitsarchitektur:** +**Tests:** 15 Backend-Unit-Tests in `backend/tests/test_p11_legal_hold.py` — alle grün. + +#### P-11 Nachfixe – UI-Bugs und Sichtbarkeitskorrektur (Version 0.8.85–0.8.86) + +Nach Erstimplementierung wurden beim Testen weitere Mängel festgestellt und behoben: + +**Version 0.8.85 – UI-Bugfixes:** +- Fix: `submitLegalHold` rief `loadMedia()` statt `loadItems()` auf → "loadMedia is not a function" beim Sperren +- Fix: Listabfrage in `list_media_assets` enthielt `legal_hold_active`, `reason_code`, `reason_note`, `set_at` nicht → Badge und „Sperre aufheben"-Button im Modal waren nie sichtbar +- Fix: Journal-Renderpfad verwendete Keys `nw.legal_hold_reason_code/note` statt `nw.reason_code/note` (Audit-Log-Format) → Begründung und Kommentar nicht angezeigt +- Fix: Archiv-Picker (ExerciseFormPage, ExerciseInlineFileMediaModal) filterte Legal-Hold-Assets bereits client-seitig heraus + +**Version 0.8.86 – Vollständige Absicherung der Auslieferung:** + +Betroffene Dateien: +- `backend/routers/exercises.py` – `download_exercise_media_file()` gibt HTTP 451 zurück wenn `asset_legal_hold_active=TRUE` (Datei wird nicht ausgeliefert); `enrich_exercise_detail()` SELECT erweitert um `ma.legal_hold_active AS asset_legal_hold_active` +- `backend/routers/media_assets.py` – `list_media_assets` übergibt `include_legal_hold=is_sup` statt `include_legal_hold=(is_plat or is_sup)` — Legal-Hold-Assets nur noch für Superadmin sichtbar, nicht für alle Plattform-Admins +- `frontend/src/components/ExerciseMediaEmbed.jsx` – Zeigt „Medium nicht verfügbar (gesperrt)" statt Datei wenn `asset_legal_hold_active` +- `frontend/src/components/ExerciseMediaThumbTile.jsx` – Zeigt rot-markierte „Gesperrt"-Kachel statt Dateivorschau; kein Preview-Trigger +- `frontend/src/pages/ExerciseFormPage.jsx` – Vorschau-Modal zeigt Hinweis statt Datei wenn `asset_legal_hold_active` + +#### Sicherheitsarchitektur (vollständig) + - Legal-Hold ist orthogonal zum normalen Papierkorb-Lifecycle (P-03) — kein 30-Tage-Warten - `rights_status='blocked'` wird als Schnell-Spiegel gesetzt und bei Aufhebung basierend auf vorhandenen Deklarationen wiederhergestellt (`declared` wenn Deklaration vorhanden, sonst `legacy_unreviewed`) -- Nur Superadmin darf setzen/aufheben; Plattform-Admin sieht Assets in Listen; normale Nutzer nicht +- Nur Superadmin darf setzen/aufheben; nur Superadmin sieht Legal-Hold-Assets in der Medienliste; normale Nutzer sehen gesperrte Assets nicht - Retention-Job überspringt Legal-Hold-Assets (verhindert versehentliche Löschung unter laufender Sperrmaßnahme) - `assert_not_under_legal_hold()` blockiert das Verknüpfen von Legal-Hold-Assets mit Übungen - -**Tests:** 15 Backend-Unit-Tests in `backend/tests/test_p11_legal_hold.py` — alle grün. +- Dateiauslieferung (`download_exercise_media_file`) gibt HTTP 451 zurück — keine Umgehung via direkten File-Endpoint +- Frontend-Komponenten zeigen Placeholder statt Datei, auch wenn das Asset bereits in einer Übung verknüpft ist --- @@ -378,15 +402,16 @@ allow_headers=["Content-Type", "X-Auth-Token", "X-Active-Club-Id"], --- -## Test-Zusammenfassung (Stand 0.8.83) +## Test-Zusammenfassung (Stand 0.8.86) ``` tests/test_auth_password_reset_minlength.py 7 passed (neu, P-05b) tests/test_media_assets_copyright_promotion.py 7 passed (gehärtet, P-04) tests/test_media_rights_declaration.py 25 passed (neu, P-06a–P-06d) tests/test_security_release.py 9 passed (inkl. 2 P-07-Tests) +tests/test_p11_legal_hold.py 15 passed (neu, P-11) Weitere bestehende Tests: 81 passed, 6 skipped -Gesamt (Backend): 129 passed, 6 skipped, 1 failed +Gesamt (Backend): 144 passed, 6 skipped, 1 failed Fehlgeschlagener Test: test_list_media_assets_invalid_lifecycle_400 → Pre-existing: benötigt laufenden PostgreSQL-Container (Hostname "postgres") @@ -409,6 +434,11 @@ Anmerkung P-06+ Journal/Korrektur (0.8.82–0.8.83): → Journal-Endpoint und Korrektur-Endpoint durch manuellen API-Test (curl) auf Dev-System verifiziert. → Bugfix club_admin-Prüfung (has_club_role) verifiziert: 500 → 200 nach Fix. → Keine dedizierte Playwright-Testsuite für Journal-Modal und Korrektur-Formular (UI-Verifikation ausstehend). + +Anmerkung P-11 Frontend-Absicherung (0.8.85–0.8.86): +→ UI-Fixes (loadItems, Badge-Sichtbarkeit, Journal-Keys) manuell auf Dev-System verifiziert. +→ 15 Backend-Unit-Tests decken Services und Retention-Schutz ab. +→ Keine Playwright-Tests für Legal-Hold-Aktionen im Modal — manuelle UI-Verifikation. ``` --- @@ -506,7 +536,7 @@ Referenz: `docs/p06-upload-rights-spec.md` §10.5, §11.9. | P-08 | HSTS / externe Proxy-Sicherheit dokumentieren | offen | Scope ausgeschlossen (außerhalb Repo — Reverse-Proxy) | | P-09 | Admin-Audit-Log | offen | Scope ausgeschlossen | | P-10 | Mindestalter-Abfrage | offen | Scope ausgeschlossen | -| P-11 | Legal-Hold Lifecycle-Status | offen | Scope ausgeschlossen | +| P-11 | Legal-Hold Lifecycle-Status | ✅ umgesetzt | Version 0.8.84–0.8.86 — siehe §P-11 oben | | P-12 | sessionStorage bei Logout bereinigen | ✅ umgesetzt | Version 0.8.68 — siehe §P-12 oben | | P-13 | Content-Melde-Backend | offen | Scope ausgeschlossen (erst juristisch klären) | | P-14 | Moderations-UI | offen | Scope ausgeschlossen | @@ -523,7 +553,7 @@ Referenz: `docs/p06-upload-rights-spec.md` §10.5, §11.9. ## Re-Audit-Empfehlung -Operativ prüfen (Stand 0.8.83): +Operativ prüfen (Stand 0.8.86): 1. **P-03/P-03b**: `docker logs shinkan-retention-cron` — Job läuft täglich 03:00 Uhr; Retention-Zeiten: 30 → 30 Tage 2. **P-04**: Manuell: PATCH privates Medium auf `official` ohne `copyright_notice` → muss 400 liefern @@ -531,5 +561,6 @@ Operativ prüfen (Stand 0.8.83): 4. **P-24**: Browser DevTools Preflight → `Access-Control-Allow-Headers: content-type, x-auth-token, x-active-club-id` 5. **P-06**: Manuell: Upload ohne `rights_holder_confirmed` → muss 400 liefern; Journal-Endpoint für vorhandene Assets → muss 200 + `events[]` liefern; Korrektur-Endpoint → muss neue Deklaration mit `action_type='correction'` schreiben 6. **P-06 Audit-Log**: PATCH Sichtbarkeit eines Assets → `media_asset_audit_log` muss Eintrag `visibility_change` enthalten +7. **P-11**: Superadmin → Medium sperren → in Übung öffnen → Kachel zeigt „Gesperrt"; direkter Dateiaufruf `/exercises/{id}/media/{mid}/file` → muss HTTP 451 liefern; Plattform-Admin (kein Superadmin) → gesperrtes Medium darf in Medienliste nicht erscheinen Nächster vollständiger Re-Audit empfohlen nach juristischer Klärung P-06/KRIT-04 (Textfreigabe T1–T10) und nach Einpflegen der Rechtstexte P-01 durch Betreiber. diff --git a/docs/compliance-package-register.md b/docs/compliance-package-register.md index 8b466fb..0574a77 100644 --- a/docs/compliance-package-register.md +++ b/docs/compliance-package-register.md @@ -3,7 +3,7 @@ **Typ:** Kanonisches Referenzdokument **Erstellt:** 2026-05-10 **Basisdokument:** `docs/compliance-audit.md` (Initial-Audit 2026-05-09, App-Version 0.8.65) -**Letzte Aktualisierung:** 2026-05-11 (App-Version 0.8.84) +**Letzte Aktualisierung:** 2026-05-11 (App-Version 0.8.86) --- @@ -196,9 +196,9 @@ | **Findings** | MITT-02 | | **Etappe** | 2 | | **Status** | ✅ implemented | -| **Letzter Stand** | Vollständig umgesetzt in Version 0.8.84 (2026-05-11). Migration 051: neue Felder `legal_hold_active`, `legal_hold_reason_code`, `legal_hold_reason_note`, `legal_hold_set_by_profile_id`, `legal_hold_set_at`, `legal_hold_released_by_profile_id`, `legal_hold_released_at`, `legal_hold_release_note` in `media_assets`; Audit-Log-Ereignistypen `legal_hold_set`/`legal_hold_released`. Zentrales Service-Modul `media_legal_hold.py`. Retention-Job überspringt Legal-Hold-Assets. Nur Superadmin darf setzen/aufheben; Admins sehen Legal-Hold-Assets in Listen; normale Nutzer nicht. Frontend: Badge „Sofort gesperrt", Superadmin-Aktionen mit Pflichtfeldern und Bestätigungsdialog, Journal-Renderpfad. | -| **Verweise** | `docs/compliance-audit.md` §9.2, §16 (MITT-02), §17; `docs/compliance-implementation.md` §P-11; `backend/media_legal_hold.py`; `backend/routers/media_assets.py` (admin_legal_hold_router); `backend/migrations/051_legal_hold.sql`; `backend/tests/test_p11_legal_hold.py` | -| **Hinweise** | Orthogonal zum normalen Papierkorb-Lifecycle (P-03). `rights_status='blocked'` wird als Schnell-Spiegel gesetzt und bei Aufhebung basierend auf vorhandenen Deklarationen wiederhergestellt. Scope abgegrenzt: P-13 (Meldeverfahren), P-14 (DSA-Transparenz), P-15 (DSA-Moderationslog), P-16 (DSA-Beschwerdeweg) bleiben eigene Pakete. | +| **Letzter Stand** | Vollständig umgesetzt in Version 0.8.84 (2026-05-11), mit Nachfixen in 0.8.85–0.8.86. **Kernum­setzung (0.8.84):** Migration 051 (`legal_hold_active` + Metadatenfelder in `media_assets`; Audit-Log-Ereignistypen `legal_hold_set`/`legal_hold_released`); zentrales Service-Modul `media_legal_hold.py`; Retention-Job überspringt Legal-Hold-Assets; 3 Superadmin-API-Endpoints; Frontend-Badge + Bestätigungs-Dialog + Journal-Renderpfad; 15 Backend-Unit-Tests. **Nachfixe (0.8.85):** UI-Bugs behoben (loadItems, Badge-Sichtbarkeit, Journal-Keys). **Nachfixe (0.8.86):** `download_exercise_media_file` gibt HTTP 451 für Legal-Hold-Assets zurück; `enrich_exercise_detail` liefert `asset_legal_hold_active` mit; `ExerciseMediaEmbed` + `ExerciseMediaThumbTile` + `ExerciseFormPage` zeigen Placeholder statt Datei; Medienliste (`list_media_assets`) nur noch für Superadmin mit Legal-Hold-Einträgen (nicht mehr alle Plattform-Admins). | +| **Verweise** | `docs/compliance-audit.md` §9.2, §16 (MITT-02), §17; `docs/compliance-implementation.md` §P-11; `backend/media_legal_hold.py`; `backend/routers/media_assets.py` (admin_legal_hold_router); `backend/routers/exercises.py` (download_exercise_media_file, enrich_exercise_detail); `backend/migrations/051_legal_hold.sql`; `backend/tests/test_p11_legal_hold.py`; `frontend/src/components/ExerciseMediaEmbed.jsx`; `frontend/src/components/ExerciseMediaThumbTile.jsx` | +| **Hinweise** | Orthogonal zum normalen Papierkorb-Lifecycle (P-03). `rights_status='blocked'` wird als Schnell-Spiegel gesetzt und bei Aufhebung basierend auf vorhandenen Deklarationen wiederhergestellt. Dateiauslieferung über den exercise-Media-Endpoint gibt HTTP 451 zurück — keine Umgehung über direkten Download. Scope abgegrenzt: P-13 (Meldeverfahren), P-14 (DSA-Transparenz), P-15 (DSA-Moderationslog), P-16 (DSA-Beschwerdeweg) bleiben eigene Pakete. | --- @@ -404,7 +404,7 @@ | P-08 | HSTS / externe Proxy-Sicherheit dokumentieren | 2 | HOCH-02, SEC-01 | ❌ open | | P-09 | Admin-Audit-Log | 2 | HOCH-05, SEC-07 | ❌ open | | P-10 | Mindestalter-Abfrage | 2 | HOCH-06 | ❌ open | -| P-11 | Legal-Hold Lifecycle-Status | 2 | MITT-02 | ❌ open | +| P-11 | Legal-Hold Lifecycle-Status | 2 | MITT-02 | ✅ implemented | | P-12 | sessionStorage bei Logout bereinigen | 2 | MITT-05 | ✅ implemented | | P-13 | Content-Melde-Backend | 3 | KRIT-03 | ❌ open | | P-14 | Moderations-UI | 3 | KRIT-03 | ❌ open | @@ -423,11 +423,11 @@ ## Fortschritt -**Implementiert (vollständig):** P-03, P-03b, P-04, P-05, P-05b, P-07, P-12, P-23, P-24 — 9 Pakete (inkl. 2 Nacharbeiten) +**Implementiert (vollständig):** P-03, P-03b, P-04, P-05, P-05b, P-07, P-11, P-12, P-23, P-24 — 10 Pakete (inkl. 2 Nacharbeiten) **Teilweise implementiert:** P-01 (technischer Teil vollständig inkl. P-01b, P-01c, copy-as-draft, jsPDF; juristische Inhalte offen) — 1 Paket **Teilweise umgesetzt (KRIT offen):** P-06 (Upload-Einwilligungsdialog inkl. P-06+ Volljournal + Korrektur — KRIT-04 bis juristische Validierung ausstehend) -**Offen:** P-02, P-08, P-09, P-10, P-11, P-13, P-14, P-15, P-16, P-17, P-18, P-19, P-20, P-21, P-22 — 15 Pakete -**App-Version bei letzter Aktualisierung:** 0.8.83 +**Offen:** P-02, P-08, P-09, P-10, P-13, P-14, P-15, P-16, P-17, P-18, P-19, P-20, P-21, P-22 — 14 Pakete +**App-Version bei letzter Aktualisierung:** 0.8.86 **Letztes Umsetzungsdatum:** 2026-05-11 --- diff --git a/docs/compliance-roadmap.md b/docs/compliance-roadmap.md index 4e13874..8055735 100644 --- a/docs/compliance-roadmap.md +++ b/docs/compliance-roadmap.md @@ -2,7 +2,7 @@ **Typ:** Lebendes Steuerungsdokument **Erstellt:** 2026-05-10 -**App-Version:** 0.8.83 +**App-Version:** 0.8.86 **Zuletzt aktualisiert:** 2026-05-11 --- @@ -29,7 +29,7 @@ Diese Roadmap ist nach jedem Re-Audit zu aktualisieren. Abweichungen von der bis ## 2. Aktueller Stand (2026-05-11) -### App-Version: 0.8.83 +### App-Version: 0.8.86 ### Teilweise umgesetzte Pakete @@ -56,7 +56,7 @@ Diese Roadmap ist nach jedem Re-Audit zu aktualisieren. Abweichungen von der bis | P-01c+ | _Erweiterung:_ Als-Entwurf-kopieren (`copy-as-draft`) | 0.8.72 | | P-01c++ | _Erweiterung:_ Echter PDF-Download (jsPDF) + Abschnitts-Sortierung/-Einfügen | 0.8.74 | -**Vollständig abgeschlossen:** 8 Hauptpakete + 4 Nacharbeiten + 2 Erweiterungen = 14 Umsetzungseinheiten +**Vollständig abgeschlossen:** 9 Hauptpakete + 4 Nacharbeiten + 2 Erweiterungen = 15 Umsetzungseinheiten **Teilweise umgesetzt (technisch):** P-01, P-06 ### Offene Pakete (14) @@ -107,10 +107,10 @@ Die folgenden Pakete sind vor der Freigabe für allgemeine öffentliche Registri **Warum noch KRIT-04 offen:** Juristische Validierung der Einwilligungsformulierungen (§7.7), KUG-Anforderungen im Vereinskontext (§7.2), Minderjährigenschutz (§7.4) und Altbestand-Behandlung (§7.8) steht aus. Texte sind Arbeitsfassungen (`p06-v1-conservative`) ohne anwaltliche Freigabe. **Nächster Schritt:** Rechtsanwalt für juristische Prüfung der Feldtexte (T1–T10 in `docs/p06-upload-rights-spec.md` §10.3) und der offenen KUG/DSGVO-Fragen beauftragen. Nach Klärung: Textfreigabe eintragen → KRIT-04 kann geschlossen werden. -### ~~Blocker 3 — P-11: Legal-Hold Lifecycle-Status~~ ✅ Implementiert (v0.8.84) +### ~~Blocker 3 — P-11: Legal-Hold Lifecycle-Status~~ ✅ Implementiert (v0.8.84–0.8.86) **Finding:** MITT-02 -**Abgeschlossen:** 2026-05-11. Migration 051, `media_legal_hold.py`, Retention-Schutz, Superadmin-API + Frontend. Details: `docs/compliance-package-register.md` §P-11. +**Abgeschlossen:** 2026-05-11. Migration 051, `media_legal_hold.py`, Retention-Schutz, Superadmin-API + Frontend (0.8.84); UI-Bugfixes (0.8.85); vollständige Auslieferungssperre (`download_exercise_media_file` HTTP 451), Frontend-Placeholder in allen Übungskomponenten, Medienliste nur noch für Superadmin mit Legal-Hold-Einträgen (0.8.86). Details: `docs/compliance-package-register.md` §P-11. ### Blocker 3 (neu) — P-13: Content-Melde-Backend (Minimalversion) @@ -258,7 +258,7 @@ Folgende Bedingungen müssen **alle** erfüllt sein: | Impressum und Datenschutzerklärung mit juristisch geprüftem Inhalt | P-01 | ⚠️ Routen vorhanden — Inhalte durch Rechtsanwalt erforderlich | | Upload-Einwilligungsdialog aktiv | P-06 | Code | | DSGVO-Löschprozess spezifiziert (Spec akzeptiert, auch wenn nicht vollständig implementiert) | P-02 | Spezifikation | -| Legal-Hold-Status vorhanden | P-11 | ✅ Bereits erfüllt (Version 0.8.84) | +| Legal-Hold-Status vorhanden | P-11 | ✅ Bereits erfüllt (Version 0.8.84–0.8.86) | | Content-Melde-Backend (Minimalversion) aktiv | P-13 | Code | | HSTS am externen Reverse-Proxy nachgewiesen | P-08 | Betreiber | | Papierkorb-Retention-Job läuft (Monitoring aktiv) | P-03 | Bereits erfüllt | @@ -283,7 +283,7 @@ Bevor Inhalte mit `official`-Sichtbarkeit (plattformweit sichtbar, ohne Login) a |-----------|-------|-----| | Gate 1 vollständig erfüllt | — | Voraussetzung | | Upload-Einwilligungsdialog für Personenbilder aktiv | P-06 | Code | -| Legal-Hold-Status aktiv (Sofortsperrung möglich) | P-11 | ✅ Bereits erfüllt (Version 0.8.84) | +| Legal-Hold-Status aktiv (Sofortsperrung möglich) | P-11 | ✅ Bereits erfüllt (Version 0.8.84–0.8.86) | | Content-Melde-Backend aktiv | P-13 | Code | | Copyright-Pflicht bei Promotion aktiv und getestet | P-04 | Bereits erfüllt | | Moderationsprozess organisatorisch dokumentiert (wer, wie schnell, Eskalationspfad) | — | Betreiber | @@ -361,7 +361,7 @@ Diese Punkte liegen außerhalb des Code-Scopes und erfordern organisatorische Ma | ~~P-01b~~ | ~~„Freigabe zur Umsetzung P-01b: Mobile/PWA-Zugriff auf Rechtliches"~~ | ✅ historisch abgeschlossen (Version 0.8.70) | | ~~P-01c~~ | ~~„Freigabe zur Umsetzung P-01c: Admin-konfigurierbare Rechtstexte"~~ | ✅ historisch abgeschlossen (Version 0.8.71); Erweiterungen copy-as-draft (0.8.72) + jsPDF/Sortierung (0.8.74) | | **P-06** | **„Freigabe zur Umsetzung P-06 auf Basis konservativer Erstannahmen"** | ✅ erteilt + vollständig umgesetzt (2026-05-11, v0.8.75–0.8.83) — technisch umgesetzt unter `p06-v1-conservative` inkl. P-06+ Volljournal + Korrektur; KRIT-04 bleibt bis juristische Validierung | -| **P-11** | **„Freigabe zur Umsetzung P-11: Legal-Hold Lifecycle-Status"** | ✅ vollständig umgesetzt (2026-05-11, v0.8.84) — Migration 051, Retention-Schutz, Superadmin-API + Frontend; 15 Backend-Tests | +| **P-11** | **„Freigabe zur Umsetzung P-11: Legal-Hold Lifecycle-Status"** | ✅ vollständig umgesetzt (2026-05-11, v0.8.84–0.8.86) — Migration 051, Retention-Schutz, Superadmin-API + Frontend (0.8.84); UI-Bugfixes (0.8.85); Auslieferungssperre + Frontend-Placeholder + Superadmin-only Medienliste (0.8.86); 15 Backend-Tests | | P-13 | „Freigabe zur Umsetzung P-13: Content-Melde-Backend" | ⬅ nächste empfohlene Freigabe (nach juristischer Klärung P-06/KRIT-04 und Rechtstexten P-01) | | P-02 Spezifikation | „Freigabe zur Spezifikation P-02: DSGVO-Self-Service-Prozess" | offen | diff --git a/docs/p06-upload-rights-spec.md b/docs/p06-upload-rights-spec.md index a6ea565..a28c69f 100644 --- a/docs/p06-upload-rights-spec.md +++ b/docs/p06-upload-rights-spec.md @@ -5,7 +5,7 @@ **Dokument-Typ:** Spezifikation + Umsetzungsnachweis **Erstellt:** 2026-05-10 **App-Version bei Erstellung:** 0.8.74 -**Letzte Aktualisierung:** 2026-05-11 (App-Version 0.8.83, P-06+ Volljournal + Korrektur) +**Letzte Aktualisierung:** 2026-05-11 (App-Version 0.8.86, P-11 vollständig inkl. Auslieferungssperre + Frontend-Placeholder) **Status P-06:** ⚠️ technisch umgesetzt (P-06a–P-06d, P-06+) | KRIT-04 offen bis juristische Validierung **Rechtlicher Hinweis:** Alle als „juristisch zu prüfen" markierten Einschätzungen sind keine Rechtsberatung. Keine konkrete Textfassung von Erklärungen in diesem Dokument — Formulierungen obliegen dem Rechtsanwalt. @@ -498,9 +498,9 @@ P-06 führt keine copyright_notice-Redundanz ein. copyright_notice (P-04) = Attr --- -### Flow 10: Zusammenspiel mit P-11 (implementiert) und P-13 +### Flow 10: Zusammenspiel mit P-11 (vollständig implementiert) und P-13 -**P-11 Status: ✅ Implementiert (v0.8.84)** +**P-11 Status: ✅ Vollständig implementiert (v0.8.84–0.8.86)** | P-06-Element | P-11-Umsetzung | P-13-Anschluss | |-------------|---------------|---------------| @@ -509,12 +509,20 @@ P-06 führt keine copyright_notice-Redundanz ein. copyright_notice (P-04) = Attr | `contains_identifiable_persons` | Relevant für Löschbegründung (KUG), `reason_code=consent_withdrawn` | Relevanzmerkmal für Meldekategorie | | `contains_minors` | Höchste Priorität: `reason_code=youth_protection` | CSAM-Eskalationspfad in P-13 | -**Implementiertes Schnittstellenmodell P-06 ↔ P-11:** +**Implementiertes Schnittstellenmodell P-06 ↔ P-11 (komplett):** + +_Datenhaltung und Audit (v0.8.84):_ - `media_legal_hold.py`: `set_legal_hold()` schreibt `rights_status='blocked'` als Spiegel - `media_legal_hold.py`: `release_legal_hold()` stellt `rights_status` anhand vorhandener Deklarationen wieder her (`declared` wenn `COUNT(rights_holder_confirmed=TRUE)>0`, sonst `legacy_unreviewed`) - Audit-Log `media_asset_audit_log` protokolliert `legal_hold_set`/`legal_hold_released` als eigene Ereignistypen (orthogonal zu `copyright_change`, `visibility_change` etc.) -**P-13-Vorbereitung:** `set_legal_hold()` in `media_legal_hold.py` ist eine generische Funktion — P-13 ruft sie mit `reason_code` aus der Moderationsqueue auf, ohne eigene Sperr-Logik implementieren zu müssen. +_Sichtbarkeit und Auslieferungssperre (v0.8.85–0.8.86):_ +- `list_media_assets`: `include_legal_hold=is_sup` — nur Superadmin sieht gesperrte Assets in der Medienliste; Plattform-Admins ohne Superadmin-Rolle sehen sie nicht mehr +- `download_exercise_media_file` (v0.8.86): gibt HTTP **451 Unavailable For Legal Reasons** zurück wenn `asset_legal_hold_active=TRUE` — keine Dateiauslieferung, auch wenn das Asset bereits mit einer Übung verknüpft ist +- `enrich_exercise_detail` (v0.8.86): liefert `asset_legal_hold_active` im Media-Array mit — Frontend-Komponenten erhalten den Hold-Status ohne zusätzlichen API-Call +- `ExerciseMediaEmbed.jsx` + `ExerciseMediaThumbTile.jsx` + `ExerciseFormPage.jsx` (v0.8.86): zeigen „Medium nicht verfügbar / Gesperrt"-Placeholder statt Datei, wenn `asset_legal_hold_active=true` + +**P-13-Vorbereitung:** `set_legal_hold()` in `media_legal_hold.py` ist eine generische Funktion — P-13 ruft sie mit `reason_code` aus der Moderationsqueue auf, ohne eigene Sperr-Logik implementieren zu müssen. Die Auslieferungssperre (HTTP 451) greift dann automatisch für alle bereits verknüpften Medien. --- @@ -687,7 +695,7 @@ Alle folgenden Punkte müssen durch einen Rechtsanwalt oder Datenschutzbeauftrag | Vor MVP | §7.4 Minderjährige: Schwelle und Form | parental_consent MVP oder später | | Vor MVP | §7.5 Selbsterklärung oder Dokumenten-Upload? | Scope P-06c | | Zeitnah | §7.8 Altmedien club/official: Sperrpflicht? | P-06e Scope | -| Vor P-11 | §7.9 Widerruf: Fristen und Mechanismus | P-11-Design | +| ~~Vor P-11~~ ✅ | §7.9 Widerruf: Fristen und Mechanismus | P-11 implementiert: `set_legal_hold()` als Sperrmechanismus; juristische Frist-Frage bleibt offen | | Mittel | §7.10 Aufbewahrung Declaration-Log | Retention-Policy | ### 9.5 Empfohlene spätere Umsetzungsschritte