@zudojs/permissions 0.0.1
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 +41 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/ability/ability.core.d.ts +29 -0
- package/dist/ability/ability.core.d.ts.map +1 -0
- package/dist/ability/ability.core.js +38 -0
- package/dist/ability/ability.core.js.map +1 -0
- package/dist/ability/index.d.ts +7 -0
- package/dist/ability/index.d.ts.map +1 -0
- package/dist/ability/index.js +7 -0
- package/dist/ability/index.js.map +1 -0
- package/dist/actor/actor.core.d.ts +28 -0
- package/dist/actor/actor.core.d.ts.map +1 -0
- package/dist/actor/actor.core.js +40 -0
- package/dist/actor/actor.core.js.map +1 -0
- package/dist/actor/index.d.ts +7 -0
- package/dist/actor/index.d.ts.map +1 -0
- package/dist/actor/index.js +7 -0
- package/dist/actor/index.js.map +1 -0
- package/dist/cache/cache.core.d.ts +17 -0
- package/dist/cache/cache.core.d.ts.map +1 -0
- package/dist/cache/cache.core.js +51 -0
- package/dist/cache/cache.core.js.map +1 -0
- package/dist/cache/index.d.ts +7 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +7 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/conditions/conditions.core.d.ts +40 -0
- package/dist/conditions/conditions.core.d.ts.map +1 -0
- package/dist/conditions/conditions.core.js +78 -0
- package/dist/conditions/conditions.core.js.map +1 -0
- package/dist/conditions/index.d.ts +7 -0
- package/dist/conditions/index.d.ts.map +1 -0
- package/dist/conditions/index.js +7 -0
- package/dist/conditions/index.js.map +1 -0
- package/dist/evaluator/authorizationEngine.d.ts +47 -0
- package/dist/evaluator/authorizationEngine.d.ts.map +1 -0
- package/dist/evaluator/authorizationEngine.js +49 -0
- package/dist/evaluator/authorizationEngine.js.map +1 -0
- package/dist/evaluator/evaluator.core.d.ts +11 -0
- package/dist/evaluator/evaluator.core.d.ts.map +1 -0
- package/dist/evaluator/evaluator.core.js +57 -0
- package/dist/evaluator/evaluator.core.js.map +1 -0
- package/dist/evaluator/evaluator.explain.d.ts +12 -0
- package/dist/evaluator/evaluator.explain.d.ts.map +1 -0
- package/dist/evaluator/evaluator.explain.js +79 -0
- package/dist/evaluator/evaluator.explain.js.map +1 -0
- package/dist/evaluator/evaluator.pipeline.d.ts +28 -0
- package/dist/evaluator/evaluator.pipeline.d.ts.map +1 -0
- package/dist/evaluator/evaluator.pipeline.js +83 -0
- package/dist/evaluator/evaluator.pipeline.js.map +1 -0
- package/dist/evaluator/index.d.ts +8 -0
- package/dist/evaluator/index.d.ts.map +1 -0
- package/dist/evaluator/index.js +7 -0
- package/dist/evaluator/index.js.map +1 -0
- package/dist/http/httpHelpers.d.ts +28 -0
- package/dist/http/httpHelpers.d.ts.map +1 -0
- package/dist/http/httpHelpers.js +29 -0
- package/dist/http/httpHelpers.js.map +1 -0
- package/dist/http/httpMiddleware.core.d.ts +48 -0
- package/dist/http/httpMiddleware.core.d.ts.map +1 -0
- package/dist/http/httpMiddleware.core.js +81 -0
- package/dist/http/httpMiddleware.core.js.map +1 -0
- package/dist/http/httpTypes.d.ts +40 -0
- package/dist/http/httpTypes.d.ts.map +1 -0
- package/dist/http/httpTypes.js +10 -0
- package/dist/http/httpTypes.js.map +1 -0
- package/dist/http/index.d.ts +11 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +10 -0
- package/dist/http/index.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/observability/index.d.ts +7 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +7 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/observability.core.d.ts +41 -0
- package/dist/observability/observability.core.d.ts.map +1 -0
- package/dist/observability/observability.core.js +54 -0
- package/dist/observability/observability.core.js.map +1 -0
- package/dist/permission/index.d.ts +8 -0
- package/dist/permission/index.d.ts.map +1 -0
- package/dist/permission/index.js +8 -0
- package/dist/permission/index.js.map +1 -0
- package/dist/permission/permission.core.d.ts +30 -0
- package/dist/permission/permission.core.d.ts.map +1 -0
- package/dist/permission/permission.core.js +72 -0
- package/dist/permission/permission.core.js.map +1 -0
- package/dist/permission/permissionRegistry.d.ts +63 -0
- package/dist/permission/permissionRegistry.d.ts.map +1 -0
- package/dist/permission/permissionRegistry.js +88 -0
- package/dist/permission/permissionRegistry.js.map +1 -0
- package/dist/permissionErrors/index.d.ts +8 -0
- package/dist/permissionErrors/index.d.ts.map +1 -0
- package/dist/permissionErrors/index.js +8 -0
- package/dist/permissionErrors/index.js.map +1 -0
- package/dist/permissionErrors/permissionError.access.d.ts +39 -0
- package/dist/permissionErrors/permissionError.access.d.ts.map +1 -0
- package/dist/permissionErrors/permissionError.access.js +65 -0
- package/dist/permissionErrors/permissionError.access.js.map +1 -0
- package/dist/permissionErrors/permissionError.base.d.ts +19 -0
- package/dist/permissionErrors/permissionError.base.d.ts.map +1 -0
- package/dist/permissionErrors/permissionError.base.js +21 -0
- package/dist/permissionErrors/permissionError.base.js.map +1 -0
- package/dist/permissionErrors/permissionError.types.d.ts +6 -0
- package/dist/permissionErrors/permissionError.types.d.ts.map +1 -0
- package/dist/permissionErrors/permissionError.types.js +6 -0
- package/dist/permissionErrors/permissionError.types.js.map +1 -0
- package/dist/permissionErrors/permissionError.validation.d.ts +47 -0
- package/dist/permissionErrors/permissionError.validation.d.ts.map +1 -0
- package/dist/permissionErrors/permissionError.validation.js +78 -0
- package/dist/permissionErrors/permissionError.validation.js.map +1 -0
- package/dist/permissionTypes/index.d.ts +9 -0
- package/dist/permissionTypes/index.d.ts.map +1 -0
- package/dist/permissionTypes/index.js +9 -0
- package/dist/permissionTypes/index.js.map +1 -0
- package/dist/permissionTypes/permissionActor.d.ts +28 -0
- package/dist/permissionTypes/permissionActor.d.ts.map +1 -0
- package/dist/permissionTypes/permissionActor.js +7 -0
- package/dist/permissionTypes/permissionActor.js.map +1 -0
- package/dist/permissionTypes/policyTypes.d.ts +62 -0
- package/dist/permissionTypes/policyTypes.d.ts.map +1 -0
- package/dist/permissionTypes/policyTypes.js +7 -0
- package/dist/permissionTypes/policyTypes.js.map +1 -0
- package/dist/permissionTypes/ruleTypes.d.ts +50 -0
- package/dist/permissionTypes/ruleTypes.d.ts.map +1 -0
- package/dist/permissionTypes/ruleTypes.js +7 -0
- package/dist/permissionTypes/ruleTypes.js.map +1 -0
- package/dist/policy/index.d.ts +7 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +7 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/policyRegistry.d.ts +36 -0
- package/dist/policy/policyRegistry.d.ts.map +1 -0
- package/dist/policy/policyRegistry.js +57 -0
- package/dist/policy/policyRegistry.js.map +1 -0
- package/dist/resolvers/index.d.ts +7 -0
- package/dist/resolvers/index.d.ts.map +1 -0
- package/dist/resolvers/index.js +7 -0
- package/dist/resolvers/index.js.map +1 -0
- package/dist/resolvers/resolvers.core.d.ts +23 -0
- package/dist/resolvers/resolvers.core.d.ts.map +1 -0
- package/dist/resolvers/resolvers.core.js +46 -0
- package/dist/resolvers/resolvers.core.js.map +1 -0
- package/dist/role/index.d.ts +8 -0
- package/dist/role/index.d.ts.map +1 -0
- package/dist/role/index.js +8 -0
- package/dist/role/index.js.map +1 -0
- package/dist/role/roleHierarchy.d.ts +15 -0
- package/dist/role/roleHierarchy.d.ts.map +1 -0
- package/dist/role/roleHierarchy.js +48 -0
- package/dist/role/roleHierarchy.js.map +1 -0
- package/dist/role/roleRegistry.d.ts +45 -0
- package/dist/role/roleRegistry.d.ts.map +1 -0
- package/dist/role/roleRegistry.js +67 -0
- package/dist/role/roleRegistry.js.map +1 -0
- package/dist/rule/index.d.ts +8 -0
- package/dist/rule/index.d.ts.map +1 -0
- package/dist/rule/index.js +8 -0
- package/dist/rule/index.js.map +1 -0
- package/dist/rule/rule.core.d.ts +24 -0
- package/dist/rule/rule.core.d.ts.map +1 -0
- package/dist/rule/rule.core.js +79 -0
- package/dist/rule/rule.core.js.map +1 -0
- package/dist/rule/ruleCompiler.d.ts +27 -0
- package/dist/rule/ruleCompiler.d.ts.map +1 -0
- package/dist/rule/ruleCompiler.js +76 -0
- package/dist/rule/ruleCompiler.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/utils.helper.d.ts +37 -0
- package/dist/utils/utils.helper.d.ts.map +1 -0
- package/dist/utils/utils.helper.js +50 -0
- package/dist/utils/utils.helper.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actor.core.d.ts","sourceRoot":"","sources":["../../src/actor/actor.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD,GACA,eAAe,CAYjB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,GACjB,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAE7D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Actor helper functions for creating and inspecting permission actors.
|
|
3
|
+
*
|
|
4
|
+
* @module actor/actor
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create a permission actor.
|
|
8
|
+
*/
|
|
9
|
+
export function createPermissionActor(id, options) {
|
|
10
|
+
return Object.freeze({
|
|
11
|
+
id,
|
|
12
|
+
type: options?.type,
|
|
13
|
+
roles: options?.roles ? Object.freeze([...options.roles]) : undefined,
|
|
14
|
+
permissions: options?.permissions
|
|
15
|
+
? Object.freeze([...options.permissions])
|
|
16
|
+
: undefined,
|
|
17
|
+
deniedPermissions: options?.deniedPermissions
|
|
18
|
+
? Object.freeze([...options.deniedPermissions])
|
|
19
|
+
: undefined,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if an actor has a specific role.
|
|
24
|
+
*/
|
|
25
|
+
export function actorHasRole(actor, role) {
|
|
26
|
+
return actor.roles?.includes(role) ?? false;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Check if an actor has a direct permission.
|
|
30
|
+
*/
|
|
31
|
+
export function actorHasPermission(actor, permission) {
|
|
32
|
+
return actor.permissions?.includes(permission) ?? false;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if an actor is a system/service actor.
|
|
36
|
+
*/
|
|
37
|
+
export function isSystemActor(actor) {
|
|
38
|
+
return actor.type === "system" || actor.type === "service";
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=actor.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actor.core.js","sourceRoot":"","sources":["../../src/actor/actor.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACnC,EAAU,EACV,OAKC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,EAAE;QACF,IAAI,EAAE,OAAO,EAAE,IAAI;QACnB,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;QACrE,WAAW,EAAE,OAAO,EAAE,WAAW;YAC/B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;YACzC,CAAC,CAAC,SAAS;QACb,iBAAiB,EAAE,OAAO,EAAE,iBAAiB;YAC3C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;YAC/C,CAAC,CAAC,SAAS;KACd,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAsB,EAAE,IAAY;IAC/D,OAAO,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAsB,EACtB,UAAkB;IAElB,OAAO,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,KAAsB;IAClD,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC;AAC7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,aAAa,GACd,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/actor/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,qBAAqB,EACrB,YAAY,EACZ,kBAAkB,EAClB,aAAa,GACd,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory permission cache implementation.
|
|
3
|
+
*
|
|
4
|
+
* @module cache/cache
|
|
5
|
+
*/
|
|
6
|
+
import type { PermissionCache } from "../permissionTypes/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Create an in-memory permission cache.
|
|
9
|
+
*
|
|
10
|
+
* @param defaultTtlMs - Default TTL in milliseconds. Defaults to 60000 (1 minute).
|
|
11
|
+
*/
|
|
12
|
+
export declare function createMemoryPermissionCache(defaultTtlMs?: number): PermissionCache;
|
|
13
|
+
/**
|
|
14
|
+
* Generate a cache key for a permission check.
|
|
15
|
+
*/
|
|
16
|
+
export declare function permissionCacheKey(actorId: string, permission: string, resourceId?: string): string;
|
|
17
|
+
//# sourceMappingURL=cache.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.core.d.ts","sourceRoot":"","sources":["../../src/cache/cache.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,6BAA6B,CAAC;AAQrC;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,GAAE,MAAc,GAC3B,eAAe,CAuCjB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAGR"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory permission cache implementation.
|
|
3
|
+
*
|
|
4
|
+
* @module cache/cache
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create an in-memory permission cache.
|
|
8
|
+
*
|
|
9
|
+
* @param defaultTtlMs - Default TTL in milliseconds. Defaults to 60000 (1 minute).
|
|
10
|
+
*/
|
|
11
|
+
export function createMemoryPermissionCache(defaultTtlMs = 60000) {
|
|
12
|
+
const store = new Map();
|
|
13
|
+
return {
|
|
14
|
+
async get(key) {
|
|
15
|
+
const entry = store.get(key);
|
|
16
|
+
if (!entry)
|
|
17
|
+
return undefined;
|
|
18
|
+
if (entry.expiresAt && Date.now() > entry.expiresAt) {
|
|
19
|
+
store.delete(key);
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
return entry.value;
|
|
23
|
+
},
|
|
24
|
+
async set(key, value, options) {
|
|
25
|
+
const ttl = options?.ttl ?? defaultTtlMs;
|
|
26
|
+
store.set(key, {
|
|
27
|
+
value,
|
|
28
|
+
expiresAt: ttl > 0 ? Date.now() + ttl : undefined,
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
async delete(key) {
|
|
32
|
+
store.delete(key);
|
|
33
|
+
},
|
|
34
|
+
async invalidateActor(actorId) {
|
|
35
|
+
const prefix = `actor:${actorId}`;
|
|
36
|
+
for (const key of store.keys()) {
|
|
37
|
+
if (key.startsWith(prefix)) {
|
|
38
|
+
store.delete(key);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generate a cache key for a permission check.
|
|
46
|
+
*/
|
|
47
|
+
export function permissionCacheKey(actorId, permission, resourceId) {
|
|
48
|
+
const base = `actor:${actorId}:${permission}`;
|
|
49
|
+
return resourceId ? `${base}:${resourceId}` : base;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=cache.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.core.js","sourceRoot":"","sources":["../../src/cache/cache.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,YAAY,GAAW,KAAK;IAE5B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IAE5C,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,GAAW;YACnB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,KAAK;gBAAE,OAAO,SAAS,CAAC;YAC7B,IAAI,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpD,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,CAAC;QAED,KAAK,CAAC,GAAG,CACP,GAAW,EACX,KAAyB,EACzB,OAAmC;YAEnC,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,YAAY,CAAC;YACzC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBACb,KAAK;gBACL,SAAS,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS;aAClD,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,GAAW;YACtB,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,OAAe;YACnC,MAAM,MAAM,GAAG,SAAS,OAAO,EAAE,CAAC;YAClC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3B,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAe,EACf,UAAkB,EAClB,UAAmB;IAEnB,MAAM,IAAI,GAAG,SAAS,OAAO,IAAI,UAAU,EAAE,CAAC;IAC9C,OAAO,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,UAAU,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,GACnB,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Condition combinators for composing authorization policies.
|
|
3
|
+
*
|
|
4
|
+
* @module conditions/conditions
|
|
5
|
+
*/
|
|
6
|
+
import type { PermissionConditionFn } from "../permissionTypes/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* All conditions must return true.
|
|
9
|
+
*/
|
|
10
|
+
export declare function allOf(...conditions: readonly PermissionConditionFn[]): PermissionConditionFn;
|
|
11
|
+
/**
|
|
12
|
+
* At least one condition must return true.
|
|
13
|
+
*/
|
|
14
|
+
export declare function anyOf(...conditions: readonly PermissionConditionFn[]): PermissionConditionFn;
|
|
15
|
+
/**
|
|
16
|
+
* Negate a condition.
|
|
17
|
+
*/
|
|
18
|
+
export declare function not(condition: PermissionConditionFn): PermissionConditionFn;
|
|
19
|
+
/**
|
|
20
|
+
* Always allow — unconditional pass.
|
|
21
|
+
*/
|
|
22
|
+
export declare function always(): PermissionConditionFn;
|
|
23
|
+
/**
|
|
24
|
+
* Always deny — unconditional fail.
|
|
25
|
+
*/
|
|
26
|
+
export declare function never(): PermissionConditionFn;
|
|
27
|
+
/**
|
|
28
|
+
* Check that the actor owns the resource.
|
|
29
|
+
*
|
|
30
|
+
* @param ownerField - The field on the resource that holds the owner's ID. Defaults to "ownerId".
|
|
31
|
+
*/
|
|
32
|
+
export declare function isOwner(ownerField?: string): PermissionConditionFn;
|
|
33
|
+
/**
|
|
34
|
+
* Enforce tenant isolation — actor and resource must share the same tenant.
|
|
35
|
+
*
|
|
36
|
+
* @param actorTenantField - Field on actor metadata holding tenant ID. Defaults to "tenantId".
|
|
37
|
+
* @param resourceTenantField - Field on resource holding tenant ID. Defaults to "tenantId".
|
|
38
|
+
*/
|
|
39
|
+
export declare function tenantIsolation(actorTenantField?: string, resourceTenantField?: string): PermissionConditionFn;
|
|
40
|
+
//# sourceMappingURL=conditions.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditions.core.d.ts","sourceRoot":"","sources":["../../src/conditions/conditions.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,qBAAqB,EAEtB,MAAM,6BAA6B,CAAC;AAErC;;GAEG;AACH,wBAAgB,KAAK,CACnB,GAAG,UAAU,EAAE,SAAS,qBAAqB,EAAE,GAC9C,qBAAqB,CAOvB;AAED;;GAEG;AACH,wBAAgB,KAAK,CACnB,GAAG,UAAU,EAAE,SAAS,qBAAqB,EAAE,GAC9C,qBAAqB,CAOvB;AAED;;GAEG;AACH,wBAAgB,GAAG,CAAC,SAAS,EAAE,qBAAqB,GAAG,qBAAqB,CAE3E;AAED;;GAEG;AACH,wBAAgB,MAAM,IAAI,qBAAqB,CAE9C;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,qBAAqB,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,UAAU,GAAE,MAAkB,GAAG,qBAAqB,CAO7E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,gBAAgB,GAAE,MAAmB,EACrC,mBAAmB,GAAE,MAAmB,GACvC,qBAAqB,CAQvB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Condition combinators for composing authorization policies.
|
|
3
|
+
*
|
|
4
|
+
* @module conditions/conditions
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* All conditions must return true.
|
|
8
|
+
*/
|
|
9
|
+
export function allOf(...conditions) {
|
|
10
|
+
return async (context) => {
|
|
11
|
+
for (const condition of conditions) {
|
|
12
|
+
if (!(await condition(context)))
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* At least one condition must return true.
|
|
20
|
+
*/
|
|
21
|
+
export function anyOf(...conditions) {
|
|
22
|
+
return async (context) => {
|
|
23
|
+
for (const condition of conditions) {
|
|
24
|
+
if (await condition(context))
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Negate a condition.
|
|
32
|
+
*/
|
|
33
|
+
export function not(condition) {
|
|
34
|
+
return async (context) => !(await condition(context));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Always allow — unconditional pass.
|
|
38
|
+
*/
|
|
39
|
+
export function always() {
|
|
40
|
+
return () => true;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Always deny — unconditional fail.
|
|
44
|
+
*/
|
|
45
|
+
export function never() {
|
|
46
|
+
return () => false;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Check that the actor owns the resource.
|
|
50
|
+
*
|
|
51
|
+
* @param ownerField - The field on the resource that holds the owner's ID. Defaults to "ownerId".
|
|
52
|
+
*/
|
|
53
|
+
export function isOwner(ownerField = "ownerId") {
|
|
54
|
+
return (context) => {
|
|
55
|
+
if (!context.resource || typeof context.resource !== "object")
|
|
56
|
+
return false;
|
|
57
|
+
const resource = context.resource;
|
|
58
|
+
const ownerId = resource[ownerField];
|
|
59
|
+
return ownerId === context.actor.id;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Enforce tenant isolation — actor and resource must share the same tenant.
|
|
64
|
+
*
|
|
65
|
+
* @param actorTenantField - Field on actor metadata holding tenant ID. Defaults to "tenantId".
|
|
66
|
+
* @param resourceTenantField - Field on resource holding tenant ID. Defaults to "tenantId".
|
|
67
|
+
*/
|
|
68
|
+
export function tenantIsolation(actorTenantField = "tenantId", resourceTenantField = "tenantId") {
|
|
69
|
+
return (context) => {
|
|
70
|
+
const actorTenant = context.metadata?.get(actorTenantField);
|
|
71
|
+
if (!context.resource || typeof context.resource !== "object")
|
|
72
|
+
return false;
|
|
73
|
+
const resource = context.resource;
|
|
74
|
+
const resourceTenant = resource[resourceTenantField];
|
|
75
|
+
return actorTenant !== undefined && actorTenant === resourceTenant;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=conditions.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conditions.core.js","sourceRoot":"","sources":["../../src/conditions/conditions.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;GAEG;AACH,MAAM,UAAU,KAAK,CACnB,GAAG,UAA4C;IAE/C,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK,CACnB,GAAG,UAA4C;IAE/C,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE;QACvB,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,MAAM,SAAS,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC5C,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,GAAG,CAAC,SAAgC;IAClD,OAAO,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM;IACpB,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,UAAU,GAAW,SAAS;IACpD,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAmC,CAAC;QAC7D,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACrC,OAAO,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,gBAAgB,GAAW,UAAU,EACrC,mBAAmB,GAAW,UAAU;IAExC,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC5E,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAmC,CAAC;QAC7D,MAAM,cAAc,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QACrD,OAAO,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,cAAc,CAAC;IACrE,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conditions/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,EACL,KAAK,EACL,GAAG,EACH,MAAM,EACN,KAAK,EACL,OAAO,EACP,eAAe,GAChB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conditions/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,KAAK,EACL,KAAK,EACL,GAAG,EACH,MAAM,EACN,KAAK,EACL,OAAO,EACP,eAAe,GAChB,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authorization engine — the main public API for permission checks.
|
|
3
|
+
*
|
|
4
|
+
* @module evaluator/authorizationEngine
|
|
5
|
+
*/
|
|
6
|
+
import type { PermissionActor, PermissionDecision, ExplainResult, PermissionPolicyDefinition, AuthorizationOptions } from "../permissionTypes/index.js";
|
|
7
|
+
import type { RoleDefinition } from "../permissionTypes/index.js";
|
|
8
|
+
import { type Ability } from "../ability/ability.core.js";
|
|
9
|
+
/** Configuration for the permission engine. */
|
|
10
|
+
export interface PermissionEngineOptions {
|
|
11
|
+
/** Roles available to the engine. */
|
|
12
|
+
readonly roles?: readonly RoleDefinition[];
|
|
13
|
+
/** Policies to evaluate during authorization. */
|
|
14
|
+
readonly policies?: readonly PermissionPolicyDefinition[];
|
|
15
|
+
/** Default timeout for async policy evaluation (ms). */
|
|
16
|
+
readonly policyTimeout?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* The public permission engine API.
|
|
20
|
+
*/
|
|
21
|
+
export interface PermissionEngine {
|
|
22
|
+
/**
|
|
23
|
+
* Check if the actor can perform the action. Returns boolean.
|
|
24
|
+
*/
|
|
25
|
+
can(actor: PermissionActor, permission: string, resource?: unknown, options?: AuthorizationOptions): Promise<boolean>;
|
|
26
|
+
/**
|
|
27
|
+
* Full authorization check with decision details.
|
|
28
|
+
*/
|
|
29
|
+
check(actor: PermissionActor, permission: string, resource?: unknown, options?: AuthorizationOptions): Promise<PermissionDecision>;
|
|
30
|
+
/**
|
|
31
|
+
* Throw PermissionDeniedError if the actor is not authorized.
|
|
32
|
+
*/
|
|
33
|
+
authorize(actor: PermissionActor, permission: string, resource?: unknown, options?: AuthorizationOptions): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Explain the authorization decision with step-by-step trace.
|
|
36
|
+
*/
|
|
37
|
+
explain(actor: PermissionActor, permission: string, resource?: unknown, options?: AuthorizationOptions): Promise<ExplainResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Create a pre-resolved Ability for an actor.
|
|
40
|
+
*/
|
|
41
|
+
createAbility(actor: PermissionActor): Ability;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Create a permission engine.
|
|
45
|
+
*/
|
|
46
|
+
export declare function createPermissionEngine(options?: PermissionEngineOptions): PermissionEngine;
|
|
47
|
+
//# sourceMappingURL=authorizationEngine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorizationEngine.d.ts","sourceRoot":"","sources":["../../src/evaluator/authorizationEngine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EAClB,aAAa,EAEb,0BAA0B,EAC1B,oBAAoB,EACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAGlE,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAGzE,+CAA+C;AAC/C,MAAM,WAAW,uBAAuB;IACtC,qCAAqC;IACrC,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,0BAA0B,EAAE,CAAC;IAC1D,wDAAwD;IACxD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,GAAG,CACD,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,OAAO,EAClB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB;;OAEG;IACH,KAAK,CACH,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,OAAO,EAClB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE/B;;OAEG;IACH,SAAS,CACP,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,OAAO,EAClB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;OAEG;IACH,OAAO,CACL,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,OAAO,EAClB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,aAAa,CAAC,CAAC;IAE1B;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC;CAChD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,CAAC,EAAE,uBAAuB,GAChC,gBAAgB,CAsFlB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authorization engine — the main public API for permission checks.
|
|
3
|
+
*
|
|
4
|
+
* @module evaluator/authorizationEngine
|
|
5
|
+
*/
|
|
6
|
+
import { evaluate, evaluateWithExplain } from "./evaluator.core.js";
|
|
7
|
+
import { createAbility } from "../ability/ability.core.js";
|
|
8
|
+
import { PermissionDeniedError } from "../permissionErrors/index.js";
|
|
9
|
+
/**
|
|
10
|
+
* Create a permission engine.
|
|
11
|
+
*/
|
|
12
|
+
export function createPermissionEngine(options) {
|
|
13
|
+
const roleMap = new Map();
|
|
14
|
+
if (options?.roles) {
|
|
15
|
+
for (const role of options.roles) {
|
|
16
|
+
roleMap.set(role.name, role);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const evaluatorOptions = {
|
|
20
|
+
getRole: (name) => roleMap.get(name),
|
|
21
|
+
policies: options?.policies,
|
|
22
|
+
policyTimeout: options?.policyTimeout,
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
async can(actor, permission, resource, authOptions) {
|
|
26
|
+
const decision = await evaluate(actor, permission, resource, evaluatorOptions, authOptions);
|
|
27
|
+
return decision.allowed;
|
|
28
|
+
},
|
|
29
|
+
async check(actor, permission, resource, authOptions) {
|
|
30
|
+
return evaluate(actor, permission, resource, evaluatorOptions, authOptions);
|
|
31
|
+
},
|
|
32
|
+
async authorize(actor, permission, resource, authOptions) {
|
|
33
|
+
const decision = await evaluate(actor, permission, resource, evaluatorOptions, authOptions);
|
|
34
|
+
if (!decision.allowed) {
|
|
35
|
+
throw new PermissionDeniedError(decision.reason ?? "Access denied", {
|
|
36
|
+
actorId: actor.id,
|
|
37
|
+
permission,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
async explain(actor, permission, resource, authOptions) {
|
|
42
|
+
return evaluateWithExplain(actor, permission, resource, evaluatorOptions, authOptions);
|
|
43
|
+
},
|
|
44
|
+
createAbility(actor) {
|
|
45
|
+
return createAbility(actor, evaluatorOptions);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=authorizationEngine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorizationEngine.js","sourceRoot":"","sources":["../../src/evaluator/authorizationEngine.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAgB,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AA8DrE;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAAiC;IAEjC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAClD,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;QACnB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAqB;QACzC,OAAO,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAC5C,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC3B,aAAa,EAAE,OAAO,EAAE,aAAa;KACtC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,GAAG,CACP,KAAsB,EACtB,UAAkB,EAClB,QAAkB,EAClB,WAAkC;YAElC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,KAAK,EACL,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,WAAW,CACZ,CAAC;YACF,OAAO,QAAQ,CAAC,OAAO,CAAC;QAC1B,CAAC;QAED,KAAK,CAAC,KAAK,CACT,KAAsB,EACtB,UAAkB,EAClB,QAAkB,EAClB,WAAkC;YAElC,OAAO,QAAQ,CACb,KAAK,EACL,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,WAAW,CACZ,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,SAAS,CACb,KAAsB,EACtB,UAAkB,EAClB,QAAkB,EAClB,WAAkC;YAElC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,KAAK,EACL,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,WAAW,CACZ,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACtB,MAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,MAAM,IAAI,eAAe,EAAE;oBAClE,OAAO,EAAE,KAAK,CAAC,EAAE;oBACjB,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAO,CACX,KAAsB,EACtB,UAAkB,EAClB,QAAkB,EAClB,WAAkC;YAElC,OAAO,mBAAmB,CACxB,KAAK,EACL,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,WAAW,CACZ,CAAC;QACJ,CAAC;QAED,aAAa,CAAC,KAAsB;YAClC,OAAO,aAAa,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAChD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core permission evaluator — resolves actor permissions and evaluates rules + policies.
|
|
3
|
+
*/
|
|
4
|
+
import type { PermissionActor, PermissionDecision, AuthorizationOptions } from "../permissionTypes/index.js";
|
|
5
|
+
import type { EvaluatorOptions } from "./evaluator.pipeline.js";
|
|
6
|
+
export { evaluateWithExplain } from "./evaluator.explain.js";
|
|
7
|
+
/**
|
|
8
|
+
* Evaluate a single permission check and return a decision.
|
|
9
|
+
*/
|
|
10
|
+
export declare function evaluate(actor: PermissionActor, permissionStr: string, resource: unknown, options: EvaluatorOptions, authOptions?: AuthorizationOptions): Promise<PermissionDecision>;
|
|
11
|
+
//# sourceMappingURL=evaluator.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.core.d.ts","sourceRoot":"","sources":["../../src/evaluator/evaluator.core.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,eAAe,EAGf,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,6BAA6B,CAAC;AAQrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,gBAAgB,EACzB,WAAW,CAAC,EAAE,oBAAoB,GACjC,OAAO,CAAC,kBAAkB,CAAC,CA8D7B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core permission evaluator — resolves actor permissions and evaluates rules + policies.
|
|
3
|
+
*/
|
|
4
|
+
import { parsePermission, matches } from "../permission/permission.core.js";
|
|
5
|
+
import { compileRules, findMatchingRules } from "../rule/ruleCompiler.js";
|
|
6
|
+
import { evaluateRules } from "../rule/rule.core.js";
|
|
7
|
+
import { resolveActorPermissions, evaluatePolicies, } from "./evaluator.pipeline.js";
|
|
8
|
+
export { evaluateWithExplain } from "./evaluator.explain.js";
|
|
9
|
+
/**
|
|
10
|
+
* Evaluate a single permission check and return a decision.
|
|
11
|
+
*/
|
|
12
|
+
export async function evaluate(actor, permissionStr, resource, options, authOptions) {
|
|
13
|
+
const permission = parsePermission(permissionStr);
|
|
14
|
+
if (actor.deniedPermissions) {
|
|
15
|
+
for (const denied of actor.deniedPermissions) {
|
|
16
|
+
if (denied === permissionStr ||
|
|
17
|
+
denied === `${permission.resource}:*` ||
|
|
18
|
+
denied === "*:*") {
|
|
19
|
+
return Object.freeze({
|
|
20
|
+
allowed: false,
|
|
21
|
+
reason: "explicit_deny",
|
|
22
|
+
matchedPermission: denied,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const allPermissions = resolveActorPermissions(actor, options);
|
|
28
|
+
const matchingPermissions = allPermissions.filter((p) => matches(p, permissionStr));
|
|
29
|
+
const rules = matchingPermissions.map((p) => {
|
|
30
|
+
const parsed = parsePermission(p);
|
|
31
|
+
return {
|
|
32
|
+
effect: "allow",
|
|
33
|
+
action: parsed.action,
|
|
34
|
+
resource: parsed.resource,
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
const compiled = compileRules(rules);
|
|
38
|
+
const matching = findMatchingRules(compiled, permission);
|
|
39
|
+
const ruleResult = evaluateRules(matching, permission);
|
|
40
|
+
if (!ruleResult.allowed) {
|
|
41
|
+
const ctx = { actor, permission, resource };
|
|
42
|
+
const policyResult = await evaluatePolicies(ctx, options.policies ?? [], authOptions);
|
|
43
|
+
if (policyResult !== null)
|
|
44
|
+
return policyResult;
|
|
45
|
+
return Object.freeze({ allowed: false, reason: "no_matching_rule" });
|
|
46
|
+
}
|
|
47
|
+
const ctx = { actor, permission, resource };
|
|
48
|
+
const policyResult = await evaluatePolicies(ctx, options.policies ?? [], authOptions);
|
|
49
|
+
if (policyResult !== null)
|
|
50
|
+
return policyResult;
|
|
51
|
+
return Object.freeze({
|
|
52
|
+
allowed: true,
|
|
53
|
+
reason: "role_permission",
|
|
54
|
+
matchedPermission: permissionStr,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=evaluator.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.core.js","sourceRoot":"","sources":["../../src/evaluator/evaluator.core.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EACL,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,KAAsB,EACtB,aAAqB,EACrB,QAAiB,EACjB,OAAyB,EACzB,WAAkC;IAElC,MAAM,UAAU,GAAG,eAAe,CAAC,aAAa,CAAC,CAAC;IAElD,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;QAC5B,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,iBAAiB,EAAE,CAAC;YAC7C,IACE,MAAM,KAAK,aAAa;gBACxB,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,IAAI;gBACrC,MAAM,KAAK,KAAK,EAChB,CAAC;gBACD,OAAO,MAAM,CAAC,MAAM,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,eAAe;oBACvB,iBAAiB,EAAE,MAAM;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,cAAc,GAAG,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE/D,MAAM,mBAAmB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACtD,OAAO,CAAC,CAAC,EAAE,aAAa,CAAC,CAC1B,CAAC;IACF,MAAM,KAAK,GAAqB,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5D,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO;YACL,MAAM,EAAE,OAAgB;YACxB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEvD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,GAAG,GAAsB,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QAC/D,MAAM,YAAY,GAAG,MAAM,gBAAgB,CACzC,GAAG,EACH,OAAO,CAAC,QAAQ,IAAI,EAAE,EACtB,WAAW,CACZ,CAAC;QACF,IAAI,YAAY,KAAK,IAAI;YAAE,OAAO,YAAY,CAAC;QAE/C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,GAAG,GAAsB,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IAC/D,MAAM,YAAY,GAAG,MAAM,gBAAgB,CACzC,GAAG,EACH,OAAO,CAAC,QAAQ,IAAI,EAAE,EACtB,WAAW,CACZ,CAAC;IACF,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,YAAY,CAAC;IAE/C,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,iBAAiB;QACzB,iBAAiB,EAAE,aAAa;KACjC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission evaluator with full explain trace.
|
|
3
|
+
*
|
|
4
|
+
* Records each evaluation step for debugging and auditing.
|
|
5
|
+
*/
|
|
6
|
+
import type { PermissionActor, ExplainResult, AuthorizationOptions } from "../permissionTypes/index.js";
|
|
7
|
+
import type { EvaluatorOptions } from "./evaluator.pipeline.js";
|
|
8
|
+
/**
|
|
9
|
+
* Evaluate with full explain trace.
|
|
10
|
+
*/
|
|
11
|
+
export declare function evaluateWithExplain(actor: PermissionActor, permissionStr: string, resource: unknown, options: EvaluatorOptions, authOptions?: AuthorizationOptions): Promise<ExplainResult>;
|
|
12
|
+
//# sourceMappingURL=evaluator.explain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.explain.d.ts","sourceRoot":"","sources":["../../src/evaluator/evaluator.explain.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EAIf,aAAa,EACb,oBAAoB,EACrB,MAAM,6BAA6B,CAAC;AAQrC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,eAAe,EACtB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,gBAAgB,EACzB,WAAW,CAAC,EAAE,oBAAoB,GACjC,OAAO,CAAC,aAAa,CAAC,CAoFxB"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission evaluator with full explain trace.
|
|
3
|
+
*
|
|
4
|
+
* Records each evaluation step for debugging and auditing.
|
|
5
|
+
*/
|
|
6
|
+
import { parsePermission, matches } from "../permission/permission.core.js";
|
|
7
|
+
import { compileRules, findMatchingRules } from "../rule/ruleCompiler.js";
|
|
8
|
+
import { evaluateRules } from "../rule/rule.core.js";
|
|
9
|
+
import { resolveActorPermissions, evaluatePolicies, } from "./evaluator.pipeline.js";
|
|
10
|
+
/**
|
|
11
|
+
* Evaluate with full explain trace.
|
|
12
|
+
*/
|
|
13
|
+
export async function evaluateWithExplain(actor, permissionStr, resource, options, authOptions) {
|
|
14
|
+
const permission = parsePermission(permissionStr);
|
|
15
|
+
const steps = [];
|
|
16
|
+
if (actor.deniedPermissions) {
|
|
17
|
+
for (const denied of actor.deniedPermissions) {
|
|
18
|
+
if (denied === permissionStr ||
|
|
19
|
+
denied === `${permission.resource}:*` ||
|
|
20
|
+
denied === "*:*") {
|
|
21
|
+
steps.push({
|
|
22
|
+
type: "deny",
|
|
23
|
+
detail: `Explicit deny: ${denied}`,
|
|
24
|
+
matched: true,
|
|
25
|
+
});
|
|
26
|
+
return Object.freeze({ allowed: false, steps });
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const allPermissions = resolveActorPermissions(actor, options);
|
|
31
|
+
if (actor.roles) {
|
|
32
|
+
for (const role of actor.roles) {
|
|
33
|
+
steps.push({ type: "role", detail: `Role: ${role}`, matched: true });
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const matchingPermissions = allPermissions.filter((p) => matches(p, permissionStr));
|
|
37
|
+
const rules = matchingPermissions.map((p) => {
|
|
38
|
+
const parsed = parsePermission(p);
|
|
39
|
+
return {
|
|
40
|
+
effect: "allow",
|
|
41
|
+
action: parsed.action,
|
|
42
|
+
resource: parsed.resource,
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
const compiled = compileRules(rules);
|
|
46
|
+
const matching = findMatchingRules(compiled, permission);
|
|
47
|
+
const ruleResult = evaluateRules(matching, permission);
|
|
48
|
+
for (const perm of allPermissions) {
|
|
49
|
+
const matched = matches(perm, permissionStr);
|
|
50
|
+
steps.push({ type: "permission", detail: `Permission: ${perm}`, matched });
|
|
51
|
+
}
|
|
52
|
+
if (!ruleResult.allowed) {
|
|
53
|
+
const ctx = { actor, permission, resource };
|
|
54
|
+
const policyResult = await evaluatePolicies(ctx, options.policies ?? [], authOptions);
|
|
55
|
+
if (policyResult !== null) {
|
|
56
|
+
steps.push({
|
|
57
|
+
type: "policy",
|
|
58
|
+
detail: `Policy: ${policyResult.reason ?? "unknown"}`,
|
|
59
|
+
matched: policyResult.allowed,
|
|
60
|
+
});
|
|
61
|
+
return Object.freeze({ allowed: policyResult.allowed, steps });
|
|
62
|
+
}
|
|
63
|
+
steps.push({ type: "deny", detail: "No matching rule", matched: false });
|
|
64
|
+
return Object.freeze({ allowed: false, steps });
|
|
65
|
+
}
|
|
66
|
+
const ctx = { actor, permission, resource };
|
|
67
|
+
const policyResult = await evaluatePolicies(ctx, options.policies ?? [], authOptions);
|
|
68
|
+
if (policyResult !== null) {
|
|
69
|
+
steps.push({
|
|
70
|
+
type: "policy",
|
|
71
|
+
detail: `Policy: ${policyResult.reason ?? "unknown"}`,
|
|
72
|
+
matched: policyResult.allowed,
|
|
73
|
+
});
|
|
74
|
+
return Object.freeze({ allowed: policyResult.allowed, steps });
|
|
75
|
+
}
|
|
76
|
+
steps.push({ type: "permission", detail: "Rule matched", matched: true });
|
|
77
|
+
return Object.freeze({ allowed: true, steps });
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=evaluator.explain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.explain.js","sourceRoot":"","sources":["../../src/evaluator/evaluator.explain.ts"],"names":[],"mappings":"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"}
|