All checks were successful
CD / Build and push images (push) Successful in 3m14s
CI / Lint, typecheck, test (push) Successful in 2m31s
CI / Auth e2e pack (push) Successful in 3m21s
CI / Build container images (push) Has been skipped
CD / Deploy to Test (push) Successful in 9s
CD / Smoke tests against Test (push) Successful in 1m12s
CD / Promote to Int (push) Successful in 11s
Pond Admins can answer "what can X actually see/do here?" — load-bearing for trust in the grant system (permissions.md §UI obligations). - shared: `explainPageCapability` — the resolver's decision chain (deciding level + the single deciding grant), sharing one code path with the boolean `resolvePageCapability` (now a thin wrapper), so the trace can never diverge from real access. Unit-tested against the permissions.md worked examples. - api: `GET /ponds/:id/effective-permissions?subjectType=&subjectId=&pageId=` (Pond-Admin-gated, one pond only) resolves as the chosen subject (a user with their real Site-Admin flag, all signed-in users, or the public), optionally against a page, and returns the read + write outcome with the deciding rule enriched with subject/scope names. - web: `EffectivePermissionsInspector` in Pond Settings — pick a subject and optionally a page → see the resolved read/edit verdict, the level that decided it, and the deciding rule spelled out as a de/en sentence (reusing the #55 sentence renderer). Hidden from non-admins. - tests: explain-mode unit tests (worked examples + trace-matches-boolean); `inspector.e2e.db.test.ts` (deciding rule on a labelled page, pond-level base capability, public default-closed, Pond-Admin gating); a browser assertion in the access-rules pack. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EwZ4jR4KFAPvpjWevfUGX1
60 lines
2.2 KiB
JSON
60 lines
2.2 KiB
JSON
{
|
|
"title": "Zugriffsregeln",
|
|
"description": "Feingranulare Regeln zusätzlich zu den Basisrollen. Die spezifischere Regel gewinnt: eine Regel auf einer Seite schlägt eine auf einem Label, und die schlägt eine für den ganzen Teich.",
|
|
"subject": {
|
|
"user": "{{name}}",
|
|
"authenticated": "Angemeldete Personen",
|
|
"public": "Alle (öffentlich)"
|
|
},
|
|
"ability": {
|
|
"reader": "lesen",
|
|
"editor": "bearbeiten",
|
|
"pond_admin": "verwalten"
|
|
},
|
|
"scope": {
|
|
"pond": "alles in diesem Teich",
|
|
"label": "Seiten mit dem Label „{{name}}“",
|
|
"page": "die Seite „{{name}}“"
|
|
},
|
|
"sentence": {
|
|
"allow": "{{subject}} darf {{scope}} {{ability}}.",
|
|
"deny": "{{subject}} darf {{scope}} nicht {{ability}}."
|
|
},
|
|
"noRules": "Noch keine Regeln — es gelten nur die Basisrollen.",
|
|
"add": {
|
|
"title": "Regel hinzufügen",
|
|
"subject": "Wer",
|
|
"scopeType": "Wo",
|
|
"scopeLabel": "Label",
|
|
"scopePage": "Seite",
|
|
"role": "Recht",
|
|
"effect": "Wirkung",
|
|
"allow": "Erlauben",
|
|
"deny": "Verbieten",
|
|
"submit": "Regel hinzufügen",
|
|
"pickScope": "Wähle ein Label oder eine Seite.",
|
|
"shadowedWarning": "Eine spezifischere Regel für dieses Subjekt entscheidet hier bereits das Gegenteil — diese Regel bleibt womöglich wirkungslos.",
|
|
"publicWarning": "Damit werden Inhalte für alle im Internet sichtbar. Bist du sicher?",
|
|
"publicConfirm": "Ja, öffentlich machen"
|
|
},
|
|
"remove": "Entfernen",
|
|
"loadError": "Zugriffsregeln konnten nicht geladen werden.",
|
|
"inspector": {
|
|
"title": "Effektive Rechte",
|
|
"description": "Prüfe, was eine Person, alle Angemeldeten oder die Öffentlichkeit hier tatsächlich dürfen.",
|
|
"subject": "Wer",
|
|
"page": "Auf Seite (optional)",
|
|
"wholePond": "Der ganze Teich",
|
|
"read": "Lesen",
|
|
"write": "Bearbeiten",
|
|
"outcome": { "allow": "Erlaubt", "deny": "Verweigert" },
|
|
"decidedBy": {
|
|
"site-admin": "Site-Admin — umgeht alle Regeln",
|
|
"page": "entschieden durch eine Seiten-Regel",
|
|
"label": "entschieden durch eine Label-Regel",
|
|
"pond": "entschieden durch eine Teich-Regel",
|
|
"default": "keine Regel gewährt dies (Standard: verweigert)"
|
|
}
|
|
}
|
|
}
|