Schreibgrenzen der Freigabestufe festgehalten

Lesen war geregelt, Schreiben nicht: bisher stand nirgends, dass jemand mit
Stufe 2 keine Stufe-4-Akte anlegen darf. Ohne die Regel erzeugt man Akten, die
man selbst nicht mehr sehen kann, und umgeht die Sichtbarkeitsprüfung.

Festgehalten in docs/03-auth-und-rechte.md, als Aufgaben in Phase 2:
Klassifizierung nie über der eigenen Stufe, Ändern und Löschen nur mit
Lesezugriff, Umklassifizierung mit SYSTEM-Eintrag und AuditLog. Eine
Herabstufung ist der heikelste Vorgang im System — sie macht Inhalte für Leute
sichtbar, die sie vorher nicht sehen durften.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Harlekin
2026-09-01 21:29:36 +02:00
co-authored by Claude Opus 5
parent 9c966b471e
commit 2003a3b75f
2 changed files with 39 additions and 0 deletions
+6
View File
@@ -45,6 +45,12 @@ Das ist der schwierigste Teil. Wenn er steht, ist der Rest Formularbau.
- [ ] Aktenansicht: Kopfdaten sofort, Verlauf und Chat in eigenen Suspense-Grenzen - [ ] Aktenansicht: Kopfdaten sofort, Verlauf und Chat in eigenen Suspense-Grenzen
- [ ] Vermerk anlegen, optimistisch, mit clientseitiger UUIDv7 - [ ] Vermerk anlegen, optimistisch, mit clientseitiger UUIDv7
- [ ] Statusübergänge mit Rechteprüfung und automatischem Systemeintrag - [ ] Statusübergänge mit Rechteprüfung und automatischem Systemeintrag
- [ ] Schreibgrenzen nach `docs/03-auth-und-rechte.md`: keine Akte über der eigenen Stufe
anlegen, Ändern und Löschen nur mit Lesezugriff, Klassifizierung nachträglich änderbar
bis zur eigenen Stufe
- [ ] Umklassifizierung erzeugt `SYSTEM`-Eintrag und `AuditLog` mit alter und neuer Stufe
- [ ] Negativtests dazu: Stufe 2 kann keine Stufe-4-Akte anlegen, nicht ändern, nicht
hochstufen, auch nicht über einen direkten Aufruf der Server Action
- [ ] Audit-Log für alle schreibenden Aktionen und Lesezugriffe ab Stufe 3 - [ ] Audit-Log für alle schreibenden Aktionen und Lesezugriffe ab Stufe 3
- [ ] Nachträgliche Änderungen an Verlaufseinträgen nach `docs/05-akten-und-vorlagen.md`: - [ ] Nachträgliche Änderungen an Verlaufseinträgen nach `docs/05-akten-und-vorlagen.md`:
`CaseEntryVersion`, Karenzzeit, Pflichtbegründung, `bearbeitet · vN` mit Diff-Historie `CaseEntryVersion`, Karenzzeit, Pflichtbegründung, `bearbeitet · vN` mit Diff-Historie
+33
View File
@@ -73,6 +73,39 @@ Kein Zugriff bedeutet:
- Ist die Stufe als `hiddenBelow` markiert: **404**, die Akte existiert für den Nutzer nicht. - Ist die Stufe als `hiddenBelow` markiert: **404**, die Akte existiert für den Nutzer nicht.
- Sonst: Eintrag in Listen sichtbar, Titel und Inhalt gesperrt, Detailseite zeigt Sperrhinweis. - Sonst: Eintrag in Listen sichtbar, Titel und Inhalt gesperrt, Detailseite zeigt Sperrhinweis.
## Schreibende Zugriffe und die eigene Stufe
Die Abschnitte oben regeln das Lesen. Fürs Schreiben gilt zusätzlich:
**Niemand legt eine Akte über der eigenen Freigabestufe an.** Wer Stufe 2 hat, legt Akten bis
Stufe 2 an, nicht bis Stufe 4. Sonst erzeugt man Akten, die man selbst nicht mehr sehen kann,
und umgeht nebenbei die Sichtbarkeitsregel.
**Ändern und Löschen setzt Lesezugriff voraus.** Was jemand nicht sehen darf, darf er nicht
anfassen — auch nicht über einen direkten Aufruf der Server Action. Die Prüfung ist dieselbe
wie beim Lesen (`visibleCaseWhere`), plus das nötige Recht.
**Die Klassifizierung ist nachträglich änderbar**, mit denselben Grenzen:
- die neue Stufe darf die eigene Stufe nicht übersteigen
- die Akte muss vorher lesbar gewesen sein
- es braucht das Recht `case.edit`
- die Änderung erzeugt einen `SYSTEM`-Eintrag im Verlauf **und** einen `AuditLog`-Eintrag mit
alter und neuer Stufe. Eine Herabstufung ist der heikelste Vorgang im ganzen System:
sie macht Inhalte für Leute sichtbar, die sie vorher nicht sehen durften, und muss deshalb
ohne Nachfragen nachvollziehbar sein.
Für Abschnitte und Verlaufseinträge gilt dasselbe eine Ebene tiefer: `minClearance` lässt sich
nicht über die eigene Stufe heben, und eine Erhöhung wirkt rückwirkend auf alle Versionen
(siehe `docs/05-akten-und-vorlagen.md`).
**Ausnahmsweiser Zugang** läuft über `CaseParticipant`: wer als Beteiligter eingetragen ist,
liest die Akte unabhängig von seiner Stufe. Das ist der vorgesehene Weg, jemanden gezielt
hinzuzuziehen, ohne ihm allgemein eine höhere Stufe zu geben. Beteiligte hinzuzufügen setzt
`case.edit` voraus und wird protokolliert.
Die Gegenprobe bleibt der `CaseExclusion`: er schlägt jede Stufe und auch den Admin.
## Umsetzung in Prisma ## Umsetzung in Prisma
Die Prüfung wird nie in JavaScript nachgelagert. `lib/access/caseFilter.ts` liefert ein Die Prüfung wird nie in JavaScript nachgelagert. `lib/access/caseFilter.ts` liefert ein