dorfteich/apps/api/src
Claude Fable 5 6aac785841
All checks were successful
CI / Lint, typecheck, test (pull_request) Successful in 6m55s
CI / Build container images (pull_request) Successful in 3m0s
CI / Auth e2e pack (pull_request) Successful in 8m49s
CI / Import/export fidelity gate (pull_request) Successful in 58s
CD / Build and push images (push) Successful in 21s
CD / Deploy to Test (push) Successful in 14s
CD / Smoke tests against Test (push) Successful in 1m19s
CD / Promote to Int (push) Successful in 12s
CI / Lint, typecheck, test (push) Successful in 6m28s
CI / Build container images (push) Has been skipped
CI / Auth e2e pack (push) Successful in 8m15s
CI / Import/export fidelity gate (push) Successful in 59s
#217: map IdP groups and roles onto the permission model
Declarative instance setting idpMapping.rules turns ID-token claims into
pond roles and the site-admin flag on every OIDC login — configuration,
not code. Mapped grants travel through the SAME GrantsService path as
manual ones (permission cache invalidated, collab access notify fires so
live sessions revalidate — asserted by test), never raw rows.

Ownership makes precedence explicit: role_grants.origin marks mapped
rows, users.is_site_admin_managed marks a mapping-set admin flag. The
mapping only creates and revokes what it owns — manual wins: hand-made
grants and hand-promoted admins are never revoked by a missing claim (a
manual toggle clears the marker and takes ownership). Removal of a claim
revokes the mapped grant and the managed flag on the next login. Every
mapping-driven change is audited with origin idp_mapping.

Failure containment: unknown pond slugs and the last-Pond-Admin
protection log-and-skip — a mapping problem must never become a login
lockout. Tests drive real OIDC logins against the fake IdP with group
claims: grant + working access, revocation incl. notify, manual-wins,
managed site-admin promote/demote/hands-off.

Documented in permissions.md (own section), ADR 0021, data-model.md and
the hardening guide (care rule: same PR).

Refs #217.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AUtYMxwTCMHG9mVHnwbFg8
2026-07-31 13:09:11 +02:00
..
admin #217: map IdP groups and roles onto the permission model 2026-07-31 13:09:11 +02:00
audit #215: trusted reverse-proxy header / mTLS client-certificate path 2026-07-31 12:50:09 +02:00
auth #217: map IdP groups and roles onto the permission model 2026-07-31 13:09:11 +02:00
backup #192: deploy-level backup target allowlist 2026-07-30 12:17:14 +02:00
comments Notify watchers about page changes and comments, with an in-app center (#94) 2026-07-11 23:20:25 +02:00
common #197: security response headers and an explicitly restrictive CORS policy 2026-07-30 17:13:24 +02:00
compaction Fix compaction test Bytes typing for strict typecheck (#40) 2026-07-09 08:23:55 +02:00
config Add backup sidecar: nightly dump, volume archive, prune, status, restore (#83) 2026-07-11 17:29:15 +02:00
favorites Favorites: personal page stars, golden icons, sidebar filter (#132) 2026-07-16 12:03:55 +02:00
files #222: read-access trail for classified pages 2026-07-31 12:12:55 +02:00
grants #217: map IdP groups and roles onto the permission model 2026-07-31 13:09:11 +02:00
health Nextcloud backup target: admin-configured, manual + scheduled uploads, in-app restore (#103) 2026-07-12 10:39:18 +02:00
home Editable landing page for the Site Admin 2026-07-12 23:50:16 +02:00
i18n #154: Aufgabenübersicht als Kern-Block (Seite + Unterseiten) 2026-07-20 01:20:30 +02:00
import-export #222: read-access trail for classified pages 2026-07-31 12:12:55 +02:00
inspector Add effective-permissions inspector (#57) 2026-07-10 00:00:27 +02:00
labels Wire real permissions into collab tokens and revocation (#53) 2026-07-09 18:48:42 +02:00
legal Add instance legal pages with public rendering and footer links (#82) 2026-07-11 16:40:04 +02:00
links Fix latenten Flake in links.service.db.test (Phantom-Sortierung) 2026-07-19 06:12:55 +02:00
mail #234: retention for mail_outbox 2026-07-30 22:17:28 +02:00
mcp #222: read-access trail for classified pages 2026-07-31 12:12:55 +02:00
members Add Site-Admin system panel with persistent audit trail (#86) 2026-07-11 20:03:05 +02:00
notifications #188: purpose-bound token keys via HKDF, jose replaces the homegrown JWT 2026-07-30 06:41:11 +02:00
pages #222: read-access trail for classified pages 2026-07-31 12:12:55 +02:00
permissions #205: classification inherits down the tree; lowering is a guarded, audited act 2026-07-31 06:12:26 +02:00
plugins #200: hard instance-wide plugins.enabled kill switch 2026-07-31 04:42:42 +02:00
ponds #195: trashed content leaves the search index itself 2026-07-30 14:07:34 +02:00
prisma Add Prisma with PostgreSQL, automatic migrations, and /readyz 2026-07-04 19:16:44 +02:00
public #222: read-access trail for classified pages 2026-07-31 12:12:55 +02:00
public-api #222: read-access trail for classified pages 2026-07-31 12:12:55 +02:00
quotas Quota foundation: overrides, resolution, race-safe consumption (#22) 2026-07-05 20:55:59 +02:00
rate-limit Add DB-backed rate limiting with guard and decorator 2026-07-05 00:43:54 +02:00
read-trail #215: trusted reverse-proxy header / mTLS client-certificate path 2026-07-31 12:50:09 +02:00
scheduler Nextcloud backup target: admin-configured, manual + scheduled uploads, in-app restore (#103) 2026-07-12 10:39:18 +02:00
search #211: classification through feeds, public API, search and the no-JS shell 2026-07-31 07:23:53 +02:00
settings #217: map IdP groups and roles onto the permission model 2026-07-31 13:09:11 +02:00
setup #190: configurable session lifetime with a server-side idle timeout 2026-07-30 11:11:15 +02:00
testing #189: make the CSRF origin check fail closed 2026-07-30 09:34:44 +02:00
trash #195: trashed content leaves the search index itself 2026-07-30 14:07:34 +02:00
users #216: hard AUTH_LOCAL_ENABLED switch over every local credential flow 2026-07-31 12:58:07 +02:00
versions Editor shortcuts: "e" edits, the platform chord+S snapshots versions 2026-07-15 13:17:09 +02:00
watches Add watches: follow pages and ponds with auto-watch preferences (#93) 2026-07-11 22:59:11 +02:00
app.module.ts #222: read-access trail for classified pages 2026-07-31 12:12:55 +02:00
main.ts Remove an unused eslint-disable directive in main.ts 2026-07-12 20:45:29 +02:00