@seifer-webapp-factory/authorization 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/backend/templates/cache/ttl-cache.ts +41 -0
- package/backend/templates/config/config-fragment.ts +41 -0
- package/backend/templates/nestjs/authz.controller.ts +253 -0
- package/backend/templates/nestjs/authz.module.ts +158 -0
- package/backend/templates/nestjs/tokens.ts +41 -0
- package/backend/templates/persistence/migrations/0001_authz.sql +45 -0
- package/backend/templates/persistence/migrations/index.ts +84 -0
- package/backend/templates/persistence/pg-policy-store.ts +193 -0
- package/backend/templates/persistence/seed.ts +60 -0
- package/dist/backend/src/index.d.ts +10 -0
- package/dist/backend/src/index.d.ts.map +1 -0
- package/dist/backend/src/index.js +9 -0
- package/dist/backend/src/index.js.map +1 -0
- package/dist/backend/src/policy.d.ts +13 -0
- package/dist/backend/src/policy.d.ts.map +1 -0
- package/dist/backend/src/policy.js +49 -0
- package/dist/backend/src/policy.js.map +1 -0
- package/dist/backend/src/ports.d.ts +90 -0
- package/dist/backend/src/ports.d.ts.map +1 -0
- package/dist/backend/src/ports.js +2 -0
- package/dist/backend/src/ports.js.map +1 -0
- package/dist/backend/src/services.d.ts +81 -0
- package/dist/backend/src/services.d.ts.map +1 -0
- package/dist/backend/src/services.js +234 -0
- package/dist/backend/src/services.js.map +1 -0
- package/dist/contract/endpoints.d.ts +433 -0
- package/dist/contract/endpoints.d.ts.map +1 -0
- package/dist/contract/endpoints.js +57 -0
- package/dist/contract/endpoints.js.map +1 -0
- package/dist/contract/errors.d.ts +33 -0
- package/dist/contract/errors.d.ts.map +1 -0
- package/dist/contract/errors.js +51 -0
- package/dist/contract/errors.js.map +1 -0
- package/dist/contract/events.d.ts +50 -0
- package/dist/contract/events.d.ts.map +1 -0
- package/dist/contract/events.js +13 -0
- package/dist/contract/events.js.map +1 -0
- package/dist/contract/index.d.ts +10 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +10 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/contract/permissions.d.ts +35 -0
- package/dist/contract/permissions.d.ts.map +1 -0
- package/dist/contract/permissions.js +37 -0
- package/dist/contract/permissions.js.map +1 -0
- package/dist/contract/schemas.d.ts +288 -0
- package/dist/contract/schemas.d.ts.map +1 -0
- package/dist/contract/schemas.js +91 -0
- package/dist/contract/schemas.js.map +1 -0
- package/dist/frontend/src/client.d.ts +31 -0
- package/dist/frontend/src/client.d.ts.map +1 -0
- package/dist/frontend/src/client.js +83 -0
- package/dist/frontend/src/client.js.map +1 -0
- package/dist/frontend/src/composables.d.ts +62 -0
- package/dist/frontend/src/composables.d.ts.map +1 -0
- package/dist/frontend/src/composables.js +170 -0
- package/dist/frontend/src/composables.js.map +1 -0
- package/dist/frontend/src/guards.d.ts +12 -0
- package/dist/frontend/src/guards.d.ts.map +1 -0
- package/dist/frontend/src/guards.js +10 -0
- package/dist/frontend/src/guards.js.map +1 -0
- package/dist/frontend/src/index.d.ts +12 -0
- package/dist/frontend/src/index.d.ts.map +1 -0
- package/dist/frontend/src/index.js +9 -0
- package/dist/frontend/src/index.js.map +1 -0
- package/dist/manifest.d.ts +56 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +100 -0
- package/dist/manifest.js.map +1 -0
- package/dist/scaffolder/core/config.d.ts +86 -0
- package/dist/scaffolder/core/config.d.ts.map +1 -0
- package/dist/scaffolder/core/config.js +92 -0
- package/dist/scaffolder/core/config.js.map +1 -0
- package/dist/scaffolder/core/errors.d.ts +46 -0
- package/dist/scaffolder/core/errors.d.ts.map +1 -0
- package/dist/scaffolder/core/errors.js +60 -0
- package/dist/scaffolder/core/errors.js.map +1 -0
- package/dist/scaffolder/core/extend.d.ts +86 -0
- package/dist/scaffolder/core/extend.d.ts.map +1 -0
- package/dist/scaffolder/core/extend.js +94 -0
- package/dist/scaffolder/core/extend.js.map +1 -0
- package/dist/scaffolder/core/materialize.d.ts +71 -0
- package/dist/scaffolder/core/materialize.d.ts.map +1 -0
- package/dist/scaffolder/core/materialize.js +47 -0
- package/dist/scaffolder/core/materialize.js.map +1 -0
- package/dist/scaffolder/core/ports.d.ts +39 -0
- package/dist/scaffolder/core/ports.d.ts.map +1 -0
- package/dist/scaffolder/core/ports.js +33 -0
- package/dist/scaffolder/core/ports.js.map +1 -0
- package/dist/scaffolder/core/presence.d.ts +34 -0
- package/dist/scaffolder/core/presence.d.ts.map +1 -0
- package/dist/scaffolder/core/presence.js +29 -0
- package/dist/scaffolder/core/presence.js.map +1 -0
- package/dist/scaffolder/core/three-way-merge.d.ts +113 -0
- package/dist/scaffolder/core/three-way-merge.d.ts.map +1 -0
- package/dist/scaffolder/core/three-way-merge.js +184 -0
- package/dist/scaffolder/core/three-way-merge.js.map +1 -0
- package/dist/scaffolder/index.d.ts +25 -0
- package/dist/scaffolder/index.d.ts.map +1 -0
- package/dist/scaffolder/index.js +24 -0
- package/dist/scaffolder/index.js.map +1 -0
- package/frontend/templates/components/PermissionMatrix.vue +134 -0
- package/frontend/templates/i18n/en.json +61 -0
- package/frontend/templates/i18n/nl.json +61 -0
- package/frontend/templates/middleware/permission.ts +54 -0
- package/frontend/templates/pages/access-assignments.vue +151 -0
- package/frontend/templates/pages/role-editor.vue +169 -0
- package/frontend/templates/pages/roles-list.vue +84 -0
- package/frontend/templates/plugins/authz.client.ts +108 -0
- package/frontend/templates/runtime.ts +60 -0
- package/package.json +76 -0
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* authorization — de capability-MANIFEST (US-Z0801/Z0802).
|
|
3
|
+
*
|
|
4
|
+
* De machine-leesbare descriptor die de scaffolder leest om de module te assembleren, te wiren en te
|
|
5
|
+
* upgraden. Nieuw t.o.v. authentication: `requires.modules: ['authentication']` — de eerste
|
|
6
|
+
* module→module-afhankelijkheid. `backendRoutes` wordt uit de endpoint-catalogus afgeleid zodat
|
|
7
|
+
* manifest en contract niet kunnen driften. Bevat GEEN mechanisme: puur declaratief + een validator.
|
|
8
|
+
*/
|
|
9
|
+
import { AUTHZ_ENDPOINTS } from './contract/index.js';
|
|
10
|
+
/**
|
|
11
|
+
* Backend-routes afgeleid uit de endpoint-catalogus (dedupliceerd: `/authz/roles` en `/authz/roles/:id`
|
|
12
|
+
* blijven apart, maar dubbele paden — bv. assignments POST+DELETE op hetzelfde pad — komen één keer voor).
|
|
13
|
+
*/
|
|
14
|
+
const backendRoutes = [...new Set(Object.values(AUTHZ_ENDPOINTS).map((ep) => ep.path))];
|
|
15
|
+
/** De concrete manifest van de authorization-module. */
|
|
16
|
+
export const authorizationManifest = {
|
|
17
|
+
name: 'authorization',
|
|
18
|
+
version: '0.1.0',
|
|
19
|
+
templateVersion: '0.1.0',
|
|
20
|
+
provides: {
|
|
21
|
+
routes: ['/admin/roles', '/admin/roles/:id', '/admin/access'],
|
|
22
|
+
backendRoutes,
|
|
23
|
+
capabilities: ['role.manage', 'role.assign', 'access.check', 'permission.list'],
|
|
24
|
+
},
|
|
25
|
+
requires: {
|
|
26
|
+
kits: {
|
|
27
|
+
backend: ['access-control', 'persistence', 'http-kernel', 'cache', 'audit-log', 'config', 'i18n'],
|
|
28
|
+
frontend: ['access-control', 'http-client', 'data', 'forms', 'notifications', 'i18n', 'app-kernel'],
|
|
29
|
+
},
|
|
30
|
+
ports: ['PolicyStore', 'SubjectProvider', 'Database', 'DesignSystem'],
|
|
31
|
+
modules: ['authentication'],
|
|
32
|
+
},
|
|
33
|
+
contract: './contract/index.ts',
|
|
34
|
+
config: undefined,
|
|
35
|
+
migrations: ['authz_roles', 'authz_permissions', 'authz_role_permissions', 'authz_role_assignments'],
|
|
36
|
+
surface: ['backend/templates/**', 'frontend/templates/**'],
|
|
37
|
+
mechanism: ['backend/src/**', 'frontend/src/**', 'contract/**'],
|
|
38
|
+
};
|
|
39
|
+
/** Zoekt de eerste dubbele waarde; geeft `undefined` als alles uniek is. */
|
|
40
|
+
function findDuplicate(names) {
|
|
41
|
+
const seen = new Set();
|
|
42
|
+
for (const name of names) {
|
|
43
|
+
if (seen.has(name))
|
|
44
|
+
return name;
|
|
45
|
+
seen.add(name);
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Valideert een capability-module-manifest. Naast de bekende checks (verplichte velden, geen dubbele
|
|
51
|
+
* kit binnen een stack) borgt deze variant dat een opgegeven `requires.modules` niet-leeg en uniek is
|
|
52
|
+
* (US-Z0801) — het is de basis voor de scaffolder-presence-check (US-Z0803).
|
|
53
|
+
*/
|
|
54
|
+
export function validateManifest(m) {
|
|
55
|
+
if (m.name.trim() === '')
|
|
56
|
+
throw new Error('Manifest ongeldig: "name" mag niet leeg zijn.');
|
|
57
|
+
if (m.version.trim() === '')
|
|
58
|
+
throw new Error('Manifest ongeldig: "version" mag niet leeg zijn.');
|
|
59
|
+
if (m.templateVersion.trim() === '')
|
|
60
|
+
throw new Error('Manifest ongeldig: "templateVersion" mag niet leeg zijn.');
|
|
61
|
+
if (m.provides.routes.length === 0)
|
|
62
|
+
throw new Error('Manifest ongeldig: "provides.routes" mag niet leeg zijn.');
|
|
63
|
+
if (m.provides.backendRoutes.length === 0)
|
|
64
|
+
throw new Error('Manifest ongeldig: "provides.backendRoutes" mag niet leeg zijn.');
|
|
65
|
+
if (m.provides.capabilities.length === 0)
|
|
66
|
+
throw new Error('Manifest ongeldig: "provides.capabilities" mag niet leeg zijn.');
|
|
67
|
+
if (m.requires.kits.backend.length === 0)
|
|
68
|
+
throw new Error('Manifest ongeldig: "requires.kits.backend" mag niet leeg zijn.');
|
|
69
|
+
if (m.requires.kits.frontend.length === 0)
|
|
70
|
+
throw new Error('Manifest ongeldig: "requires.kits.frontend" mag niet leeg zijn.');
|
|
71
|
+
if (m.requires.ports.length === 0)
|
|
72
|
+
throw new Error('Manifest ongeldig: "requires.ports" mag niet leeg zijn.');
|
|
73
|
+
if (m.contract.trim() === '')
|
|
74
|
+
throw new Error('Manifest ongeldig: "contract" mag niet leeg zijn.');
|
|
75
|
+
if (m.migrations.length === 0)
|
|
76
|
+
throw new Error('Manifest ongeldig: "migrations" mag niet leeg zijn.');
|
|
77
|
+
if (m.surface.length === 0)
|
|
78
|
+
throw new Error('Manifest ongeldig: "surface" mag niet leeg zijn.');
|
|
79
|
+
if (m.mechanism.length === 0)
|
|
80
|
+
throw new Error('Manifest ongeldig: "mechanism" mag niet leeg zijn.');
|
|
81
|
+
const dubbelBackend = findDuplicate(m.requires.kits.backend);
|
|
82
|
+
if (dubbelBackend !== undefined) {
|
|
83
|
+
throw new Error(`Manifest ongeldig: kit-naam "${dubbelBackend}" komt dubbel voor in requires.kits.backend.`);
|
|
84
|
+
}
|
|
85
|
+
const dubbelFrontend = findDuplicate(m.requires.kits.frontend);
|
|
86
|
+
if (dubbelFrontend !== undefined) {
|
|
87
|
+
throw new Error(`Manifest ongeldig: kit-naam "${dubbelFrontend}" komt dubbel voor in requires.kits.frontend.`);
|
|
88
|
+
}
|
|
89
|
+
if (m.requires.modules !== undefined) {
|
|
90
|
+
if (m.requires.modules.length === 0) {
|
|
91
|
+
throw new Error('Manifest ongeldig: "requires.modules" is aanwezig maar leeg.');
|
|
92
|
+
}
|
|
93
|
+
const dubbelModule = findDuplicate(m.requires.modules);
|
|
94
|
+
if (dubbelModule !== undefined) {
|
|
95
|
+
throw new Error(`Manifest ongeldig: module "${dubbelModule}" komt dubbel voor in requires.modules.`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return m;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config — niveau 1 van de divergentie-ladder: CONFIGUREREN (US-Z1001).
|
|
3
|
+
*
|
|
4
|
+
* `resolveAuthzConfig(overrides)` legt het autorisatie-model, de enforcement-modus, de cache-TTL, de
|
|
5
|
+
* default-rollen en de first-admin over veilige defaults vast, gevalideerd met zod. Ongeldige waarden
|
|
6
|
+
* falen bij het opstarten met veld + reden (nooit halverwege een flow). Configureren is volledig
|
|
7
|
+
* upgrade-veilig: er wordt niets gematerialiseerd of geëjecteerd.
|
|
8
|
+
*
|
|
9
|
+
* De belangrijkste toggle is `model`: onder `'rbac'` valt de héle ReBAC-surface (relatie-resolvers,
|
|
10
|
+
* relatie-endpoint/pagina's) uit de te materialiseren set (US-Z0505 / US-Z1001), onder `'rbac+rebac'`
|
|
11
|
+
* blijft ze staan. `filterSurfaceByConfig` past dit toe op padniveau (paden met `rebac`/`relations`).
|
|
12
|
+
* Puur & deterministisch; geen module-globale mutable state.
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import type { FileDescriptor } from './ports.js';
|
|
16
|
+
/**
|
|
17
|
+
* Het zod-schema voor het config-fragment. Elk veld heeft een default zodat een partieel override
|
|
18
|
+
* geldig is; `.strict()` weigert typefouten in sleutels.
|
|
19
|
+
*/
|
|
20
|
+
export declare const authzConfigSchema: z.ZodEffects<z.ZodObject<{
|
|
21
|
+
/** Het autorisatie-model. `'rbac'` = alleen rollen/permissies; `'rbac+rebac'` = ook relaties. */
|
|
22
|
+
model: z.ZodDefault<z.ZodEnum<["rbac", "rbac+rebac"]>>;
|
|
23
|
+
/** `'enforce'` blokkeert bij een deny; `'shadow'` logt alleen (voor gefaseerde uitrol). */
|
|
24
|
+
enforcementMode: z.ZodDefault<z.ZodEnum<["enforce", "shadow"]>>;
|
|
25
|
+
/** Levensduur van de gecachete decision/permissie-resolutie in seconden. */
|
|
26
|
+
cacheTtlSeconds: z.ZodDefault<z.ZodNumber>;
|
|
27
|
+
/** De rollen die de seed standaard aanmaakt. Mag niet leeg zijn en geen dubbele sleutels bevatten. */
|
|
28
|
+
defaultRoles: z.ZodDefault<z.ZodArray<z.ZodString, "atleastone">>;
|
|
29
|
+
/** Optioneel: het subject dat bij de seed de bootstrap-permissie (`authz.manage`) krijgt. */
|
|
30
|
+
firstAdminSubjectId: z.ZodOptional<z.ZodString>;
|
|
31
|
+
}, "strict", z.ZodTypeAny, {
|
|
32
|
+
model: "rbac" | "rbac+rebac";
|
|
33
|
+
enforcementMode: "enforce" | "shadow";
|
|
34
|
+
cacheTtlSeconds: number;
|
|
35
|
+
defaultRoles: [string, ...string[]];
|
|
36
|
+
firstAdminSubjectId?: string | undefined;
|
|
37
|
+
}, {
|
|
38
|
+
model?: "rbac" | "rbac+rebac" | undefined;
|
|
39
|
+
enforcementMode?: "enforce" | "shadow" | undefined;
|
|
40
|
+
cacheTtlSeconds?: number | undefined;
|
|
41
|
+
defaultRoles?: [string, ...string[]] | undefined;
|
|
42
|
+
firstAdminSubjectId?: string | undefined;
|
|
43
|
+
}>, {
|
|
44
|
+
model: "rbac" | "rbac+rebac";
|
|
45
|
+
enforcementMode: "enforce" | "shadow";
|
|
46
|
+
cacheTtlSeconds: number;
|
|
47
|
+
defaultRoles: [string, ...string[]];
|
|
48
|
+
firstAdminSubjectId?: string | undefined;
|
|
49
|
+
}, {
|
|
50
|
+
model?: "rbac" | "rbac+rebac" | undefined;
|
|
51
|
+
enforcementMode?: "enforce" | "shadow" | undefined;
|
|
52
|
+
cacheTtlSeconds?: number | undefined;
|
|
53
|
+
defaultRoles?: [string, ...string[]] | undefined;
|
|
54
|
+
firstAdminSubjectId?: string | undefined;
|
|
55
|
+
}>;
|
|
56
|
+
/** De effectieve, gevalideerde authz-config (output-type met defaults toegepast). */
|
|
57
|
+
export type EffectiveAuthzConfig = z.infer<typeof authzConfigSchema>;
|
|
58
|
+
/** De surface/routes die door de config uit de set vallen. */
|
|
59
|
+
export interface AffectedSurface {
|
|
60
|
+
readonly removedRoutes: readonly string[];
|
|
61
|
+
readonly removedBackendRoutes: readonly string[];
|
|
62
|
+
/**
|
|
63
|
+
* De padpatronen die de ReBAC-surface identificeren. Onder `model: 'rbac'` worden bestanden waarvan
|
|
64
|
+
* het pad één van deze fragmenten bevat uit de te materialiseren set gefilterd (padniveau, want de
|
|
65
|
+
* concrete bestanden zijn niet statisch bekend).
|
|
66
|
+
*/
|
|
67
|
+
readonly removedPathFragments: readonly string[];
|
|
68
|
+
}
|
|
69
|
+
/** Resultaat van `resolveAuthzConfig`: de effectieve config + de geraakte surface. */
|
|
70
|
+
export interface ResolvedAuthzConfig {
|
|
71
|
+
readonly config: EffectiveAuthzConfig;
|
|
72
|
+
readonly affected: AffectedSurface;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Valideert en resolveet het config-fragment over de defaults.
|
|
76
|
+
*
|
|
77
|
+
* @throws AuthzConfigValidationError met veld + reden bij ongeldige/incompatibele waarden
|
|
78
|
+
*/
|
|
79
|
+
export declare function resolveAuthzConfig(overrides?: unknown): ResolvedAuthzConfig;
|
|
80
|
+
/**
|
|
81
|
+
* Filtert een surface-set aan de hand van de geresolvede config: onder `model: 'rbac'` vallen de
|
|
82
|
+
* ReBAC-surface-bestanden (paden met `rebac`/`relations`) weg; onder `'rbac+rebac'` blijft alles staan.
|
|
83
|
+
* Pure functie — retourneert een nieuwe array, muteert de invoer niet.
|
|
84
|
+
*/
|
|
85
|
+
export declare function filterSurfaceByConfig(surfaceFiles: readonly FileDescriptor[], resolved: ResolvedAuthzConfig): FileDescriptor[];
|
|
86
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../scaffolder/core/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGjD;;;GAGG;AACH,eAAO,MAAM,iBAAiB;IAE1B,iGAAiG;;IAEjG,2FAA2F;;IAE3F,4EAA4E;;IAE5E,sGAAsG;;IAEtG,6FAA6F;;;;;;;;;;;;;;;;;;;;;;;;;;EAiB7F,CAAC;AAEL,qFAAqF;AACrF,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAErE,8DAA8D;AAC9D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IACjD;;;;OAIG;IACH,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;CAClD;AAED,sFAAsF;AACtF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;CACpC;AASD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAqB3E;AAOD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,SAAS,cAAc,EAAE,EACvC,QAAQ,EAAE,mBAAmB,GAC5B,cAAc,EAAE,CAGlB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config — niveau 1 van de divergentie-ladder: CONFIGUREREN (US-Z1001).
|
|
3
|
+
*
|
|
4
|
+
* `resolveAuthzConfig(overrides)` legt het autorisatie-model, de enforcement-modus, de cache-TTL, de
|
|
5
|
+
* default-rollen en de first-admin over veilige defaults vast, gevalideerd met zod. Ongeldige waarden
|
|
6
|
+
* falen bij het opstarten met veld + reden (nooit halverwege een flow). Configureren is volledig
|
|
7
|
+
* upgrade-veilig: er wordt niets gematerialiseerd of geëjecteerd.
|
|
8
|
+
*
|
|
9
|
+
* De belangrijkste toggle is `model`: onder `'rbac'` valt de héle ReBAC-surface (relatie-resolvers,
|
|
10
|
+
* relatie-endpoint/pagina's) uit de te materialiseren set (US-Z0505 / US-Z1001), onder `'rbac+rebac'`
|
|
11
|
+
* blijft ze staan. `filterSurfaceByConfig` past dit toe op padniveau (paden met `rebac`/`relations`).
|
|
12
|
+
* Puur & deterministisch; geen module-globale mutable state.
|
|
13
|
+
*/
|
|
14
|
+
import { z } from 'zod';
|
|
15
|
+
import { AuthzConfigValidationError } from './errors.js';
|
|
16
|
+
/**
|
|
17
|
+
* Het zod-schema voor het config-fragment. Elk veld heeft een default zodat een partieel override
|
|
18
|
+
* geldig is; `.strict()` weigert typefouten in sleutels.
|
|
19
|
+
*/
|
|
20
|
+
export const authzConfigSchema = z
|
|
21
|
+
.object({
|
|
22
|
+
/** Het autorisatie-model. `'rbac'` = alleen rollen/permissies; `'rbac+rebac'` = ook relaties. */
|
|
23
|
+
model: z.enum(['rbac', 'rbac+rebac']).default('rbac'),
|
|
24
|
+
/** `'enforce'` blokkeert bij een deny; `'shadow'` logt alleen (voor gefaseerde uitrol). */
|
|
25
|
+
enforcementMode: z.enum(['enforce', 'shadow']).default('enforce'),
|
|
26
|
+
/** Levensduur van de gecachete decision/permissie-resolutie in seconden. */
|
|
27
|
+
cacheTtlSeconds: z.number().int().nonnegative().default(30),
|
|
28
|
+
/** De rollen die de seed standaard aanmaakt. Mag niet leeg zijn en geen dubbele sleutels bevatten. */
|
|
29
|
+
defaultRoles: z.array(z.string().min(1)).nonempty().default(['admin', 'member']),
|
|
30
|
+
/** Optioneel: het subject dat bij de seed de bootstrap-permissie (`authz.manage`) krijgt. */
|
|
31
|
+
firstAdminSubjectId: z.string().min(1).optional(),
|
|
32
|
+
})
|
|
33
|
+
.strict()
|
|
34
|
+
.superRefine((cfg, ctx) => {
|
|
35
|
+
// Dubbele default-rollen zijn een configuratiefout: de seed zou dan twee keer dezelfde rol maken.
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
for (const role of cfg.defaultRoles) {
|
|
38
|
+
if (seen.has(role)) {
|
|
39
|
+
ctx.addIssue({
|
|
40
|
+
code: z.ZodIssueCode.custom,
|
|
41
|
+
path: ['defaultRoles'],
|
|
42
|
+
message: `dubbele rol-sleutel "${role}" in defaultRoles.`,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
seen.add(role);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
/** De padfragmenten die een surface-bestand als ReBAC-only markeren (US-Z0505 toggle-poort). */
|
|
49
|
+
const REBAC_PATH_FRAGMENTS = ['rebac', 'relations'];
|
|
50
|
+
/** De routes/endpoints die uitsluitend bij het ReBAC-model horen. */
|
|
51
|
+
const REBAC_ROUTES = ['/admin/access/relations'];
|
|
52
|
+
const REBAC_BACKEND_ROUTES = ['/authz/relations'];
|
|
53
|
+
/**
|
|
54
|
+
* Valideert en resolveet het config-fragment over de defaults.
|
|
55
|
+
*
|
|
56
|
+
* @throws AuthzConfigValidationError met veld + reden bij ongeldige/incompatibele waarden
|
|
57
|
+
*/
|
|
58
|
+
export function resolveAuthzConfig(overrides) {
|
|
59
|
+
const result = authzConfigSchema.safeParse(overrides ?? {});
|
|
60
|
+
if (!result.success) {
|
|
61
|
+
const violations = result.error.issues.map((issue) => ({
|
|
62
|
+
path: issue.path.length > 0 ? issue.path.join('.') : '(root)',
|
|
63
|
+
message: issue.message,
|
|
64
|
+
}));
|
|
65
|
+
throw new AuthzConfigValidationError(violations);
|
|
66
|
+
}
|
|
67
|
+
const config = result.data;
|
|
68
|
+
const rebacUit = config.model === 'rbac';
|
|
69
|
+
return {
|
|
70
|
+
config,
|
|
71
|
+
affected: {
|
|
72
|
+
removedRoutes: rebacUit ? [...REBAC_ROUTES] : [],
|
|
73
|
+
removedBackendRoutes: rebacUit ? [...REBAC_BACKEND_ROUTES] : [],
|
|
74
|
+
removedPathFragments: rebacUit ? [...REBAC_PATH_FRAGMENTS] : [],
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/** True als een pad tot de ReBAC-surface hoort (bevat `rebac` of `relations`). */
|
|
79
|
+
function isRebacSurface(path) {
|
|
80
|
+
return REBAC_PATH_FRAGMENTS.some((fragment) => path.includes(fragment));
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Filtert een surface-set aan de hand van de geresolvede config: onder `model: 'rbac'` vallen de
|
|
84
|
+
* ReBAC-surface-bestanden (paden met `rebac`/`relations`) weg; onder `'rbac+rebac'` blijft alles staan.
|
|
85
|
+
* Pure functie — retourneert een nieuwe array, muteert de invoer niet.
|
|
86
|
+
*/
|
|
87
|
+
export function filterSurfaceByConfig(surfaceFiles, resolved) {
|
|
88
|
+
if (resolved.config.model === 'rbac+rebac')
|
|
89
|
+
return [...surfaceFiles];
|
|
90
|
+
return surfaceFiles.filter((file) => !isRebacSurface(file.path));
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../scaffolder/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fouttypes voor de authorization-scaffolder. Draag altijd genoeg context voor een expliciete
|
|
3
|
+
* melding (paden, poorten, modules, velden, versies), maar NOOIT invoerwaarden of secrets.
|
|
4
|
+
* Deterministisch: geen timestamps/random. Alle meldingen zijn Nederlandstalig.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Geworpen door `materializeAuthzModule` wanneer te materialiseren surface-bestanden al in het
|
|
8
|
+
* project bestaan en `overwrite` niet gezet is. Benoemt ALLE conflicterende paden; er wordt niets
|
|
9
|
+
* (ook niet gedeeltelijk) weggeschreven — een gedivergeerd projectbestand wordt nooit stil overschreven.
|
|
10
|
+
*/
|
|
11
|
+
export declare class AuthzMaterializationConflictError extends Error {
|
|
12
|
+
readonly paths: readonly string[];
|
|
13
|
+
constructor(paths: readonly string[]);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Geworpen wanneer het project een door het manifest vereiste requires-port niet levert. De
|
|
17
|
+
* materialisatie weigert dan te starten (US-Z0803 AC3), zodat er geen half-gewirede surface achterblijft.
|
|
18
|
+
*/
|
|
19
|
+
export declare class MissingRequiredPortError extends Error {
|
|
20
|
+
readonly missing: readonly string[];
|
|
21
|
+
constructor(missing: readonly string[]);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Geworpen door `checkRequiredModules` wanneer een door het manifest vereiste capability-module
|
|
25
|
+
* (US-Z0803: de eerste module→module-afhankelijkheid) niet aanwezig is in de assemblage. De
|
|
26
|
+
* scaffolder weigert te assembleren; benoemt ÁLLE ontbrekende modules. Bevat geen invoerwaarden.
|
|
27
|
+
*/
|
|
28
|
+
export declare class MissingRequiredModuleError extends Error {
|
|
29
|
+
readonly missing: readonly string[];
|
|
30
|
+
constructor(missing: readonly string[]);
|
|
31
|
+
}
|
|
32
|
+
/** Eén config-validatie-overtreding: pad naar het veld + reden (Nederlands). */
|
|
33
|
+
export interface AuthzConfigViolation {
|
|
34
|
+
readonly path: string;
|
|
35
|
+
readonly message: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Geworpen door `resolveAuthzConfig` wanneer het config-fragment ongeldig is (onbekend model,
|
|
39
|
+
* negatieve TTL, lege rol-set, ...). Faalt bij het opstarten met veld + reden (US-Z1001), niet
|
|
40
|
+
* halverwege een flow. Bevat geen secret-waarden.
|
|
41
|
+
*/
|
|
42
|
+
export declare class AuthzConfigValidationError extends Error {
|
|
43
|
+
readonly violations: readonly AuthzConfigViolation[];
|
|
44
|
+
constructor(violations: readonly AuthzConfigViolation[]);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../scaffolder/core/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,qBAAa,iCAAkC,SAAQ,KAAK;IAC1D,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;gBAEtB,KAAK,EAAE,SAAS,MAAM,EAAE;CAQrC;AAED;;;GAGG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;gBAExB,OAAO,EAAE,SAAS,MAAM,EAAE;CAOvC;AAED;;;;GAIG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;gBAExB,OAAO,EAAE,SAAS,MAAM,EAAE;CAQvC;AAED,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;gBAEzC,UAAU,EAAE,SAAS,oBAAoB,EAAE;CAMxD"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fouttypes voor de authorization-scaffolder. Draag altijd genoeg context voor een expliciete
|
|
3
|
+
* melding (paden, poorten, modules, velden, versies), maar NOOIT invoerwaarden of secrets.
|
|
4
|
+
* Deterministisch: geen timestamps/random. Alle meldingen zijn Nederlandstalig.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Geworpen door `materializeAuthzModule` wanneer te materialiseren surface-bestanden al in het
|
|
8
|
+
* project bestaan en `overwrite` niet gezet is. Benoemt ALLE conflicterende paden; er wordt niets
|
|
9
|
+
* (ook niet gedeeltelijk) weggeschreven — een gedivergeerd projectbestand wordt nooit stil overschreven.
|
|
10
|
+
*/
|
|
11
|
+
export class AuthzMaterializationConflictError extends Error {
|
|
12
|
+
paths;
|
|
13
|
+
constructor(paths) {
|
|
14
|
+
super(`Materialisatie gestopt: ${paths.length} surface-bestand(en) bestaan al en zouden overschreven ` +
|
|
15
|
+
`worden zonder overwrite-vlag: ${paths.join(', ')}`);
|
|
16
|
+
this.name = 'AuthzMaterializationConflictError';
|
|
17
|
+
this.paths = paths;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Geworpen wanneer het project een door het manifest vereiste requires-port niet levert. De
|
|
22
|
+
* materialisatie weigert dan te starten (US-Z0803 AC3), zodat er geen half-gewirede surface achterblijft.
|
|
23
|
+
*/
|
|
24
|
+
export class MissingRequiredPortError extends Error {
|
|
25
|
+
missing;
|
|
26
|
+
constructor(missing) {
|
|
27
|
+
super(`Materialisatie geweigerd: de host levert niet alle vereiste ports. Ontbrekend: ${missing.join(', ')}`);
|
|
28
|
+
this.name = 'MissingRequiredPortError';
|
|
29
|
+
this.missing = missing;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Geworpen door `checkRequiredModules` wanneer een door het manifest vereiste capability-module
|
|
34
|
+
* (US-Z0803: de eerste module→module-afhankelijkheid) niet aanwezig is in de assemblage. De
|
|
35
|
+
* scaffolder weigert te assembleren; benoemt ÁLLE ontbrekende modules. Bevat geen invoerwaarden.
|
|
36
|
+
*/
|
|
37
|
+
export class MissingRequiredModuleError extends Error {
|
|
38
|
+
missing;
|
|
39
|
+
constructor(missing) {
|
|
40
|
+
super(`Assemblage geweigerd: deze module vereist andere capability-module(s) die niet aanwezig zijn. ` +
|
|
41
|
+
`Ontbrekend: ${missing.join(', ')}`);
|
|
42
|
+
this.name = 'MissingRequiredModuleError';
|
|
43
|
+
this.missing = missing;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Geworpen door `resolveAuthzConfig` wanneer het config-fragment ongeldig is (onbekend model,
|
|
48
|
+
* negatieve TTL, lege rol-set, ...). Faalt bij het opstarten met veld + reden (US-Z1001), niet
|
|
49
|
+
* halverwege een flow. Bevat geen secret-waarden.
|
|
50
|
+
*/
|
|
51
|
+
export class AuthzConfigValidationError extends Error {
|
|
52
|
+
violations;
|
|
53
|
+
constructor(violations) {
|
|
54
|
+
const summary = violations.map((v) => `${v.path}: ${v.message}`).join('; ');
|
|
55
|
+
super(`Ongeldige authz-config: ${summary}`);
|
|
56
|
+
this.name = 'AuthzConfigValidationError';
|
|
57
|
+
this.violations = violations;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../scaffolder/core/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,OAAO,iCAAkC,SAAQ,KAAK;IACjD,KAAK,CAAoB;IAElC,YAAY,KAAwB;QAClC,KAAK,CACH,2BAA2B,KAAK,CAAC,MAAM,yDAAyD;YAC9F,iCAAiC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtD,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,mCAAmC,CAAC;QAChD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACxC,OAAO,CAAoB;IAEpC,YAAY,OAA0B;QACpC,KAAK,CACH,kFAAkF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC1C,OAAO,CAAoB;IAEpC,YAAY,OAA0B;QACpC,KAAK,CACH,gGAAgG;YAC9F,eAAe,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtC,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAQD;;;;GAIG;AACH,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC1C,UAAU,CAAkC;IAErD,YAAY,UAA2C;QACrD,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5E,KAAK,CAAC,2BAA2B,OAAO,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;QACzC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { PermissionCatalog, PermissionDescriptor } from '../../contract/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Definieert een additieve permissie-catalogus-extensie. Valideert de entries via het contract's
|
|
4
|
+
* `mergeCatalog` (weigert dubbele sleutels fail-fast) en weigert het overschrijven van een
|
|
5
|
+
* gereserveerde bootstrap-sleutel. Retourneert een bevroren catalogus — pure data.
|
|
6
|
+
*
|
|
7
|
+
* @throws Error als een entry een lege of gereserveerde sleutel heeft, of bij dubbele sleutels
|
|
8
|
+
*/
|
|
9
|
+
export declare function definePermissionExtension(entries: readonly PermissionDescriptor[]): PermissionCatalog;
|
|
10
|
+
/**
|
|
11
|
+
* De context die een post-decision-hook krijgt. Bewust ZONDER policy-interne details of secrets: een
|
|
12
|
+
* hook mag audit/telemetrie doen op de uitkomst, maar krijgt nooit de reden-interne policy-evaluatie
|
|
13
|
+
* (security-invariant, US-Z1002).
|
|
14
|
+
*/
|
|
15
|
+
export interface PolicyDecisionContext {
|
|
16
|
+
readonly subjectId: string;
|
|
17
|
+
/** De gecheckte action of permissie-sleutel. */
|
|
18
|
+
readonly action: string;
|
|
19
|
+
/** De uitkomst van de beslissing. */
|
|
20
|
+
readonly allowed: boolean;
|
|
21
|
+
/** Optionele resource waarop de beslissing sloeg (type/id), voor ReBAC/ownership. */
|
|
22
|
+
readonly resource?: {
|
|
23
|
+
readonly id: string;
|
|
24
|
+
readonly type?: string;
|
|
25
|
+
};
|
|
26
|
+
/** Tijdstip van de beslissing, geïnjecteerd door de caller (geen Date.now → deterministisch/testbaar). */
|
|
27
|
+
readonly at: string;
|
|
28
|
+
}
|
|
29
|
+
/** Een post-decision-hook. Mag async zijn; een fout hierin mag de beslissing niet beïnvloeden. */
|
|
30
|
+
export type PolicyHook = (ctx: PolicyDecisionContext) => void | Promise<void>;
|
|
31
|
+
/** Uitkomst van het draaien van alle hooks. */
|
|
32
|
+
export interface PolicyHookRunResult {
|
|
33
|
+
/** Namen van hooks die (geslaagd) gedraaid hebben, in registratievolgorde. */
|
|
34
|
+
readonly ran: readonly string[];
|
|
35
|
+
/** Hooks die faalden, met hun foutmelding — de beslissing is desondanks gerespecteerd. */
|
|
36
|
+
readonly failed: readonly {
|
|
37
|
+
readonly name: string;
|
|
38
|
+
readonly error: string;
|
|
39
|
+
}[];
|
|
40
|
+
}
|
|
41
|
+
/** Een per-instantie post-decision-hook-registry. */
|
|
42
|
+
export interface PolicyHookRegistry {
|
|
43
|
+
/** Registreert een hook onder een unieke naam. */
|
|
44
|
+
register(name: string, hook: PolicyHook): void;
|
|
45
|
+
/** De geregistreerde hooknamen in registratievolgorde. */
|
|
46
|
+
list(): readonly string[];
|
|
47
|
+
/**
|
|
48
|
+
* Draait alle hooks precies één keer in registratievolgorde. Vangt fouten per hook op zodat een
|
|
49
|
+
* falende/trage hook de kern-beslissing niet breekt; retourneert wat er liep en wat faalde.
|
|
50
|
+
*/
|
|
51
|
+
run(ctx: PolicyDecisionContext): Promise<PolicyHookRunResult>;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Maakt een verse, geïsoleerde post-decision-hook-registry. Factory (geen module-globale mutable state):
|
|
55
|
+
* elke app-factory/aanroep krijgt zijn eigen registry, wat SSR/hydratie-veilig is.
|
|
56
|
+
*/
|
|
57
|
+
export declare function createPolicyHookRegistry(): PolicyHookRegistry;
|
|
58
|
+
/**
|
|
59
|
+
* De invoer voor een custom relatie-resolver. `resolve` beantwoordt: heeft `subjectId` de relatie
|
|
60
|
+
* `relation` met het object van type `objectType` en id `objectId`? Puur; mag async zijn.
|
|
61
|
+
*/
|
|
62
|
+
export interface RelationResolverSpec {
|
|
63
|
+
/** De relatie-naam, bv. `owner` of `member`. */
|
|
64
|
+
readonly relation: string;
|
|
65
|
+
/** Het objecttype waarop de relatie slaat, bv. `document`. */
|
|
66
|
+
readonly objectType: string;
|
|
67
|
+
/** De resolutie-functie (waar/onwaar). Geïnjecteerd → geen fs/mechanisme hier. */
|
|
68
|
+
readonly resolve: (input: RelationResolverInput) => boolean | Promise<boolean>;
|
|
69
|
+
}
|
|
70
|
+
/** De invoer die een relatie-resolver bij een check krijgt. */
|
|
71
|
+
export interface RelationResolverInput {
|
|
72
|
+
readonly subjectId: string;
|
|
73
|
+
readonly objectId: string;
|
|
74
|
+
}
|
|
75
|
+
/** Een bevroren, benoemde relatie-resolver-descriptor die het mechanisme kan registreren. */
|
|
76
|
+
export interface RelationResolverDescriptor extends RelationResolverSpec {
|
|
77
|
+
/** Samengestelde, unieke naam: `objectType#relation`. */
|
|
78
|
+
readonly name: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Definieert een named custom ReBAC-relatie-resolver (bevroren descriptor).
|
|
82
|
+
*
|
|
83
|
+
* @throws Error bij een lege relatie-naam of een leeg objecttype
|
|
84
|
+
*/
|
|
85
|
+
export declare function defineRelationResolver(spec: RelationResolverSpec): RelationResolverDescriptor;
|
|
86
|
+
//# sourceMappingURL=extend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../../../scaffolder/core/extend.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAOvF;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,SAAS,oBAAoB,EAAE,GACvC,iBAAiB,CAcnB;AAID;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qCAAqC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,qFAAqF;IACrF,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,kGAAkG;AAClG,MAAM,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,qBAAqB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9E,+CAA+C;AAC/C,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/E;AAED,qDAAqD;AACrD,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/C,0DAA0D;IAC1D,IAAI,IAAI,SAAS,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC/D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,kBAAkB,CA4B7D;AAID;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,kFAAkF;IAClF,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChF;AAED,+DAA+D;AAC/D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,6FAA6F;AAC7F,MAAM,WAAW,0BAA2B,SAAQ,oBAAoB;IACtE,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,0BAA0B,CAa7F"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* extend — niveau 2 van de divergentie-ladder: UITBREIDEN (additief, upgrade-veilig) — US-Z1002.
|
|
3
|
+
*
|
|
4
|
+
* Biedt drie additieve uitbreidingspunten die de autorisatie-surface honoreert zonder eject:
|
|
5
|
+
* 1. `definePermissionExtension` — voegt app-permissies additief toe aan de permissie-catalogus,
|
|
6
|
+
* gevalideerd via het contract's `mergeCatalog` (dubbele sleutels = fout, bootstrap-sleutel
|
|
7
|
+
* `authz.manage` is gereserveerd).
|
|
8
|
+
* 2. `createPolicyHookRegistry` — een per-instantie registry van post-decision-hooks die ná een
|
|
9
|
+
* autorisatiebeslissing draaien (audit/telemetrie); een falende/trage hook laat de beslissing
|
|
10
|
+
* zelf onaangetast. De hook-context bevat NOOIT policy-interne details of secrets.
|
|
11
|
+
* 3. `defineRelationResolver` — een named custom ReBAC-relatie-resolver-descriptor (bv. `owner`,
|
|
12
|
+
* `member`) die het access-control-mechanisme achter de `rbac+rebac`-toggle kan registreren.
|
|
13
|
+
*
|
|
14
|
+
* Alles is pure data / factory-gemaakte registries: geen module-globale mutable state, geen fs.
|
|
15
|
+
* Omdat de uitbreidingen additief zijn, blijft de upgrade fully upgrade-safe.
|
|
16
|
+
*/
|
|
17
|
+
import { AUTHZ_MANAGE, mergeCatalog } from '../../contract/index.js';
|
|
18
|
+
// --- 1. Permissie-catalogus-extensie -----------------------------------------------------------
|
|
19
|
+
/** De permissie-sleutels die de module zelf bezit en die een extensie niet mag overschrijven. */
|
|
20
|
+
const RESERVED_PERMISSION_KEYS = new Set([AUTHZ_MANAGE]);
|
|
21
|
+
/**
|
|
22
|
+
* Definieert een additieve permissie-catalogus-extensie. Valideert de entries via het contract's
|
|
23
|
+
* `mergeCatalog` (weigert dubbele sleutels fail-fast) en weigert het overschrijven van een
|
|
24
|
+
* gereserveerde bootstrap-sleutel. Retourneert een bevroren catalogus — pure data.
|
|
25
|
+
*
|
|
26
|
+
* @throws Error als een entry een lege of gereserveerde sleutel heeft, of bij dubbele sleutels
|
|
27
|
+
*/
|
|
28
|
+
export function definePermissionExtension(entries) {
|
|
29
|
+
for (const entry of entries) {
|
|
30
|
+
if (entry.key.trim() === '') {
|
|
31
|
+
throw new Error('Permissie-extensie ongeldig: "key" mag niet leeg zijn.');
|
|
32
|
+
}
|
|
33
|
+
if (RESERVED_PERMISSION_KEYS.has(entry.key)) {
|
|
34
|
+
throw new Error(`Permissie-extensie ongeldig: "${entry.key}" is een gereserveerde bootstrap-sleutel en mag niet worden overschreven.`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// mergeCatalog dedupliceert/valideert en gooit fail-fast bij dubbele sleutels binnen de extensie.
|
|
38
|
+
const merged = mergeCatalog(entries);
|
|
39
|
+
return Object.freeze(merged.map((descriptor) => Object.freeze({ ...descriptor })));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Maakt een verse, geïsoleerde post-decision-hook-registry. Factory (geen module-globale mutable state):
|
|
43
|
+
* elke app-factory/aanroep krijgt zijn eigen registry, wat SSR/hydratie-veilig is.
|
|
44
|
+
*/
|
|
45
|
+
export function createPolicyHookRegistry() {
|
|
46
|
+
const hooks = [];
|
|
47
|
+
return {
|
|
48
|
+
register(name, hook) {
|
|
49
|
+
if (name.trim() === '')
|
|
50
|
+
throw new Error('Policy-hook ongeldig: "name" mag niet leeg zijn.');
|
|
51
|
+
if (hooks.some((h) => h.name === name)) {
|
|
52
|
+
throw new Error(`Policy-hook ongeldig: naam "${name}" is al geregistreerd.`);
|
|
53
|
+
}
|
|
54
|
+
hooks.push({ name, hook });
|
|
55
|
+
},
|
|
56
|
+
list() {
|
|
57
|
+
return hooks.map((h) => h.name);
|
|
58
|
+
},
|
|
59
|
+
async run(ctx) {
|
|
60
|
+
const ran = [];
|
|
61
|
+
const failed = [];
|
|
62
|
+
for (const { name, hook } of hooks) {
|
|
63
|
+
try {
|
|
64
|
+
await hook(ctx);
|
|
65
|
+
ran.push(name);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
failed.push({ name, error: err instanceof Error ? err.message : String(err) });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return { ran, failed };
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Definieert een named custom ReBAC-relatie-resolver (bevroren descriptor).
|
|
77
|
+
*
|
|
78
|
+
* @throws Error bij een lege relatie-naam of een leeg objecttype
|
|
79
|
+
*/
|
|
80
|
+
export function defineRelationResolver(spec) {
|
|
81
|
+
if (spec.relation.trim() === '') {
|
|
82
|
+
throw new Error('Relatie-resolver ongeldig: "relation" mag niet leeg zijn.');
|
|
83
|
+
}
|
|
84
|
+
if (spec.objectType.trim() === '') {
|
|
85
|
+
throw new Error('Relatie-resolver ongeldig: "objectType" mag niet leeg zijn.');
|
|
86
|
+
}
|
|
87
|
+
return Object.freeze({
|
|
88
|
+
name: `${spec.objectType}#${spec.relation}`,
|
|
89
|
+
relation: spec.relation,
|
|
90
|
+
objectType: spec.objectType,
|
|
91
|
+
resolve: spec.resolve,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=extend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extend.js","sourceRoot":"","sources":["../../../scaffolder/core/extend.ts"],"names":[],"mappings":"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"}
|