OciServe: sluit de drie aanroepen aan die de server van OciDeck verwacht (login-audit, 'les geopend', profielfoto) #2428

Closed
opened 2026-10-14 18:40:46 +00:00 by brenno · 2 comments
Owner

Wat wil je bereiken

Drie routes in het OciServe-contract zeggen uitdrukkelijk dat OciDeck ze aanroept. OciDeck doet dat niet. Daardoor missen auditgebeurtenissen en kan een cursist zijn foto niet wijzigen.

Wat mist er nu (origin/main 5802e9360)

Route Wat de spec zegt OciDeck
POST /api/v1/auth/ocideck-login (Idempotency-Key) "Records one privacy-bounded audit event after OciDeck completes its interactive PKCE login. Refresh and restored sessions do not call this route. Only a token issued to the configured OciDeck native client is accepted." → 204 nul aanroepen; Keiko doet het wel (keiko-login, login_audit_service.dart)
POST /organizations/{org}/me/course-versions/{version_id}/lessons/{lesson_id}/opened (Idempotency-Key) "OciDeck calls this only after the downloaded package passed local integrity checks and opened. The server revalidates the participant's enrollment before writing the privacy-bounded audit event." nul aanroepen; OciDeck meldt alleen afspeelsnapshots (reportPlayback)
PUT / DELETE /api/v1/me/avatar foto instellen en verwijderen OciDeck leest alleen (GET me/avatar, accountAvatar)

Gevolg: de auditstroom van de organisatie bevat nooit een OciDeck-aanmelding of "les geopend", terwijl Keiko-aanmeldingen er wel in staan; en een cursist kan zijn eigen foto niet beheren.

Gevraagd

  • Login-audit: na een geslaagde interactieve aanmelding eenmalig POST auth/ocideck-login (niet bij refresh of herstel van een sessie). Fouten zijn niet fataal: de aanmelding gaat door, de mislukte melding wordt niet herhaald met dezelfde sleutel in een lus.
  • Les geopend: nadat het pakket de lokale integriteitscontrole heeft doorstaan en de les is geopend, één POST …/lessons/{lesson_id}/opened per opening. Fire-and-forget, met de bestaande offline-wachtrij; nooit blokkerend voor het afspelen.
  • Profielfoto: wijzigen en verwijderen in het profielscherm met de bestaande begrenzing (_avatarCap, 5 MiB) en typecontrole (PNG, JPEG, WebP; digest-controle). Let op de serverkant: vervangen blobs worden nog niet opgeruimd (OciServe: docs/PROFILE_AUDIT_AND_SESSIONS.md), dus laat de cursist geen foto's op een lus herladen.
  • Geen nieuwe gegevens: de audit-routes zijn "privacy-bounded" en dragen geen inhoud.

Toets op de kernwaarden

Alleen actief voor wie bewust met een OciServe is verbonden (ongewijzigd); zonder server blijft OciDeck volledig lokaal werken. Geen telemetrie, geen wijziging van het bestandsformaat, geen nieuwe verplichte afhankelijkheid. De route staat al in de gepinde speckopie (test/fixtures/ociserve_openapi.yaml, OciServe 45d9a87), dus de pin hoeft niet omhoog; registreer de nieuwe aanroepen wel in test/ociserve_api_drift_test.dart (de contractpoort, #2042).

Acceptatiecriteria

  • Een aanmelding levert één auditregel op; refresh levert er geen (test op de gateway).
  • "Les geopend" gaat niet uit bij een mislukte integriteitscontrole.
  • Foto wijzigen en verwijderen werken; een afgewezen bestand krijgt een begrijpelijke zin.

Acceptatiecriteria (algemeen)

  • Nieuwe aanroepen staan in de contractpoort met de velden die OciDeck leest.
  • Nieuwe l10n.d('…')-teksten via make add-l10n (31 talen).
  • make check groen; docs/USER_GUIDE.md, docs/SOURCE_MAP.md en CHANGELOG.md bijgewerkt.

Gerelateerd

Overzicht: brenno/OciServe#659.


Keten-audit van 2026-10-14, getoetst aan OciServe 560f1ba, Keiko 093f679 en OciDeck 5802e9360. Overzicht: brenno/OciServe#659.

## Wat wil je bereiken Drie routes in het OciServe-contract zeggen uitdrukkelijk dat OciDeck ze aanroept. OciDeck doet dat niet. Daardoor missen auditgebeurtenissen en kan een cursist zijn foto niet wijzigen. ## Wat mist er nu (origin/main `5802e9360`) | Route | Wat de spec zegt | OciDeck | |---|---|---| | `POST /api/v1/auth/ocideck-login` (`Idempotency-Key`) | "Records one privacy-bounded audit event after OciDeck completes its interactive PKCE login. Refresh and restored sessions do not call this route. Only a token issued to the configured OciDeck native client is accepted." → 204 | nul aanroepen; Keiko doet het wel (`keiko-login`, `login_audit_service.dart`) | | `POST /organizations/{org}/me/course-versions/{version_id}/lessons/{lesson_id}/opened` (`Idempotency-Key`) | "OciDeck calls this only after the downloaded package passed local integrity checks and opened. The server revalidates the participant's enrollment before writing the privacy-bounded audit event." | nul aanroepen; OciDeck meldt alleen afspeelsnapshots (`reportPlayback`) | | `PUT` / `DELETE /api/v1/me/avatar` | foto instellen en verwijderen | OciDeck leest alleen (`GET me/avatar`, `accountAvatar`) | Gevolg: de auditstroom van de organisatie bevat nooit een OciDeck-aanmelding of "les geopend", terwijl Keiko-aanmeldingen er wel in staan; en een cursist kan zijn eigen foto niet beheren. ## Gevraagd - **Login-audit**: na een geslaagde interactieve aanmelding eenmalig `POST auth/ocideck-login` (niet bij refresh of herstel van een sessie). Fouten zijn niet fataal: de aanmelding gaat door, de mislukte melding wordt niet herhaald met dezelfde sleutel in een lus. - **Les geopend**: nadat het pakket de lokale integriteitscontrole heeft doorstaan en de les is geopend, één `POST …/lessons/{lesson_id}/opened` per opening. Fire-and-forget, met de bestaande offline-wachtrij; nooit blokkerend voor het afspelen. - **Profielfoto**: wijzigen en verwijderen in het profielscherm met de bestaande begrenzing (`_avatarCap`, 5 MiB) en typecontrole (PNG, JPEG, WebP; digest-controle). Let op de serverkant: vervangen blobs worden nog niet opgeruimd (OciServe: `docs/PROFILE_AUDIT_AND_SESSIONS.md`), dus laat de cursist geen foto's op een lus herladen. - Geen nieuwe gegevens: de audit-routes zijn "privacy-bounded" en dragen geen inhoud. ## Toets op de kernwaarden Alleen actief voor wie bewust met een OciServe is verbonden (ongewijzigd); zonder server blijft OciDeck volledig lokaal werken. Geen telemetrie, geen wijziging van het bestandsformaat, geen nieuwe verplichte afhankelijkheid. De route staat al in de gepinde speckopie (`test/fixtures/ociserve_openapi.yaml`, OciServe `45d9a87`), dus de pin hoeft niet omhoog; registreer de nieuwe aanroepen wel in `test/ociserve_api_drift_test.dart` (de contractpoort, #2042). ## Acceptatiecriteria - [ ] Een aanmelding levert één auditregel op; refresh levert er geen (test op de gateway). - [ ] "Les geopend" gaat niet uit bij een mislukte integriteitscontrole. - [ ] Foto wijzigen en verwijderen werken; een afgewezen bestand krijgt een begrijpelijke zin. ## Acceptatiecriteria (algemeen) - [ ] Nieuwe aanroepen staan in de contractpoort met de velden die OciDeck leest. - [ ] Nieuwe `l10n.d('…')`-teksten via `make add-l10n` (31 talen). - [ ] `make check` groen; `docs/USER_GUIDE.md`, `docs/SOURCE_MAP.md` en `CHANGELOG.md` bijgewerkt. ## Gerelateerd Overzicht: brenno/OciServe#659. --- _Keten-audit van 2026-10-14, getoetst aan OciServe `560f1ba`, Keiko `093f679` en OciDeck `5802e9360`. Overzicht: brenno/OciServe#659._
Author
Owner

Gemerged in #2444 (merge-commit 5446218c72). Na het samenvoegen met main is de per-bestand-dekking van de nieuwe provider-, dialoog- en bewijslagen met tests aangevuld; make check, check-secrets en sast zijn groen. #2424 was al gedekt door me/exam-results.

Gemerged in https://pawprint.vigilis.online/LibreKAT/Ocideck/pulls/2444 (merge-commit 5446218c72). Na het samenvoegen met main is de per-bestand-dekking van de nieuwe provider-, dialoog- en bewijslagen met tests aangevuld; make check, check-secrets en sast zijn groen. #2424 was al gedekt door me/exam-results.
Author
Owner

Nalevering in #d191e3d0d5 (PR #2447, commit 7efde5aaaf). De les-open-audit en de wachtrij-herhaling delen één idempotentiesleutel. Een 4xx komt niet in de wachtrij. Niet live bewezen: de auditregel in een echte OciServe.

Nalevering in #d191e3d0d569ba220ca640f5f8e08ce58fa99686 (PR https://pawprint.vigilis.online/LibreKAT/Ocideck/pulls/2447, commit 7efde5aaaf9f62622e16b282d1bfd0fd55b4fda4). De les-open-audit en de wachtrij-herhaling delen één idempotentiesleutel. Een 4xx komt niet in de wachtrij. Niet live bewezen: de auditregel in een echte OciServe.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#2428
No description provided.