Fix #23: Verweise auf fremde Akten an einer Stelle prüfen #34

Merged
florian.wilde merged 1 commits from fix/23-fremdschluessel-pruefen into main 2026-08-23 21:21:40 +00:00
Owner

Alle 22 Dateien unter src/server/actions/ durchgesehen. Das Ergebnis ist besser als befürchtet: Bis auf eine Stelle war jeder Verweis geprüft.

Stelle Befund
Buchung: kontoId, belegId, vertragId war geprüft
Buchung: vorgangId ungeprüft — die eine Lücke
Vermögensposten, Saldostand, Wertstand, Nachweisdokument geprüft
Kontaktprotokoll, Dokumentverknüpfungen, Fristen geprüft
Genehmigung, Beschlussdokument, Schreiben geprüft
Belegmappe: vorgangId sicher durch Einschränkung der Abfrage

Die Prüfung liegt jetzt an einer Stelle (src/lib/auth/verweise.ts). Die acht erlaubten Ziele sind eine ausgeschriebene Aufzählung statt eines dynamischen Tabellenzugriffs: So sieht der Typprüfer jede Abfrage, und welche Tabellen erreichbar sind, ist eine Entscheidung und keine Nebenwirkung. Mehrere Verweise laufen nebeneinander — bei vier Verweisen eine Wartezeit statt vier.

Nicht angefasst wurden Stellen mit eigener, passenderer Form — etwa das Kontaktprotokoll, das beide Verweise parallel lädt und feldgenaue Meldungen zurückgibt.

Zum Test, in Klartext: Mein erster Entwurf rief die Server Action per fetch nach. Der wäre auch ohne jede Prüfung grün gewesen, weil Next einen Aufruf ohne gültige Action-Id ohnehin ablehnt — er hätte nichts bewiesen. Der jetzige schiebt dem echten Auswahlfeld einen Eintrag mit fremder Id unter und schickt das Formular normal ab. Gegenprobe mit ausgebauter Prüfung: fällt um, wie er soll.

Zur Testsuite, ebenfalls in Klartext: Der volle Lauf meldete zunächst 6 Fehlschläge von 137, ein zweiter Lauf 3, ein dritter 0. Alle waren Zeitüberschreitungen beim ersten Aufruf einer Route — der Entwicklungsserver übersetzt sie dann (15–25 s je Route, gemessen im Log; warm antwortet dieselbe Seite in 0,3 s). Keiner der Fehlschläge war ein falsches Ergebnis, und alle betrafen Bereiche, die diese Änderung nicht berührt. Die drei zuletzt verbliebenen laufen warm in 9–25 s grün.

655 Unit-Tests grün, Typecheck und Lint sauber. Weder Changelog noch Version — für die Anwendung ändert sich nichts Sichtbares.

Closes #23

Alle 22 Dateien unter `src/server/actions/` durchgesehen. Das Ergebnis ist besser als befürchtet: Bis auf **eine** Stelle war jeder Verweis geprüft. | Stelle | Befund | |---|---| | Buchung: `kontoId`, `belegId`, `vertragId` | war geprüft | | **Buchung: `vorgangId`** | **ungeprüft — die eine Lücke** | | Vermögensposten, Saldostand, Wertstand, Nachweisdokument | geprüft | | Kontaktprotokoll, Dokumentverknüpfungen, Fristen | geprüft | | Genehmigung, Beschlussdokument, Schreiben | geprüft | | Belegmappe: `vorgangId` | sicher durch Einschränkung der Abfrage | **Die Prüfung liegt jetzt an einer Stelle** (`src/lib/auth/verweise.ts`). Die acht erlaubten Ziele sind eine ausgeschriebene Aufzählung statt eines dynamischen Tabellenzugriffs: So sieht der Typprüfer jede Abfrage, und welche Tabellen erreichbar sind, ist eine Entscheidung und keine Nebenwirkung. Mehrere Verweise laufen nebeneinander — bei vier Verweisen eine Wartezeit statt vier. Nicht angefasst wurden Stellen mit eigener, passenderer Form — etwa das Kontaktprotokoll, das beide Verweise parallel lädt und feldgenaue Meldungen zurückgibt. **Zum Test, in Klartext:** Mein erster Entwurf rief die Server Action per `fetch` nach. Der wäre auch ohne jede Prüfung grün gewesen, weil Next einen Aufruf ohne gültige Action-Id ohnehin ablehnt — er hätte nichts bewiesen. Der jetzige schiebt dem echten Auswahlfeld einen Eintrag mit fremder Id unter und schickt das Formular normal ab. Gegenprobe mit ausgebauter Prüfung: fällt um, wie er soll. **Zur Testsuite, ebenfalls in Klartext:** Der volle Lauf meldete zunächst 6 Fehlschläge von 137, ein zweiter Lauf 3, ein dritter 0. Alle waren Zeitüberschreitungen beim ersten Aufruf einer Route — der Entwicklungsserver übersetzt sie dann (15–25 s je Route, gemessen im Log; warm antwortet dieselbe Seite in 0,3 s). Keiner der Fehlschläge war ein falsches Ergebnis, und alle betrafen Bereiche, die diese Änderung nicht berührt. Die drei zuletzt verbliebenen laufen warm in 9–25 s grün. 655 Unit-Tests grün, Typecheck und Lint sauber. Weder Changelog noch Version — für die Anwendung ändert sich nichts Sichtbares. Closes #23
florian.wilde added 1 commit 2026-08-23 21:21:28 +00:00
Wenn ein Formular einen Fremdschluessel mitschickt, kommt der aus einer
Auswahlliste im Browser. Der Server darf sich darauf nicht verlassen -
eine veraenderte Anfrage kann jede beliebige Id enthalten.

Alle 22 Dateien unter src/server/actions/ durchgesehen. Das Ergebnis ist
besser als befuerchtet: Bis auf eine Stelle war jeder Verweis geprueft.

  buchung.vorgangId ging ungeprueft durch. Konto, Beleg und Vertrag
  wurden geprueft, der Vorgang nicht.

Die Pruefung liegt jetzt in lib/auth/verweise.ts statt verstreut in den
Aktionen. Die acht erlaubten Ziele sind eine ausgeschriebene Aufzaehlung
und kein dynamischer Tabellenzugriff: So sieht der Typpruefer jede
Abfrage, und welche Tabellen erreichbar sind, ist eine Entscheidung und
keine Nebenwirkung. Mehrere Verweise laufen nebeneinander - bei vier
Verweisen eine Wartezeit statt vier.

Umgestellt: die vier Einzelpruefungen der Buchung, die drei des
Vermoegenspostens, die eigene Hilfsfunktion fuer den Ansprechpartner.
Nicht angefasst wurden die Stellen, die ihre eigene, passendere Form
haben - etwa das Kontaktprotokoll, das beide Verweise parallel laedt und
feldgenaue Meldungen zurueckgibt.

Zum Test: Der erste Entwurf rief die Server Action per fetch nach. Der
waere auch ohne jede Pruefung gruen gewesen, weil Next einen Aufruf ohne
gueltige Action-Id ohnehin ablehnt - er haette nichts bewiesen. Der
jetzige schiebt dem echten Auswahlfeld einen Eintrag mit fremder Id
unter und schickt das Formular normal ab. Gegenprobe mit ausgebauter
Pruefung: faellt um, wie er soll.

Refs #23
florian.wilde merged commit d75eb185d5 into main 2026-08-23 21:21:40 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: florian.wilde/betreuungs-cockpit#34