@mahmoud-auth/auth 0.0.0-stage → 0.1.1-beta.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.
Files changed (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -2
  3. package/dist/auth-guard/authorization-context.class.d.ts +17 -0
  4. package/dist/auth-guard/authorization-context.class.js +51 -0
  5. package/dist/auth-guard/index.d.ts +18 -0
  6. package/dist/auth-guard/index.js +101 -0
  7. package/dist/core/index.d.ts +1 -0
  8. package/dist/core/index.js +17 -0
  9. package/dist/core/resource.d.ts +5 -0
  10. package/dist/core/resource.js +15 -0
  11. package/dist/decorators/authorize.decorator.d.ts +8 -0
  12. package/dist/decorators/authorize.decorator.js +22 -0
  13. package/dist/decorators/index.d.ts +3 -0
  14. package/dist/decorators/index.js +19 -0
  15. package/dist/decorators/permission.decorator.d.ts +2 -0
  16. package/dist/decorators/permission.decorator.js +7 -0
  17. package/dist/decorators/policy.decorator.d.ts +3 -0
  18. package/dist/decorators/policy.decorator.js +7 -0
  19. package/dist/dsl/can.d.ts +2 -0
  20. package/dist/dsl/can.js +9 -0
  21. package/dist/dsl/condition.d.ts +2 -0
  22. package/dist/dsl/condition.js +9 -0
  23. package/dist/dsl/index.d.ts +3 -0
  24. package/dist/dsl/index.js +19 -0
  25. package/dist/dsl/trinary/and.d.ts +2 -0
  26. package/dist/dsl/trinary/and.js +8 -0
  27. package/dist/dsl/trinary/index.d.ts +3 -0
  28. package/dist/dsl/trinary/index.js +19 -0
  29. package/dist/dsl/trinary/not.d.ts +2 -0
  30. package/dist/dsl/trinary/not.js +8 -0
  31. package/dist/dsl/trinary/or.d.ts +2 -0
  32. package/dist/dsl/trinary/or.js +8 -0
  33. package/dist/errors/circular-policy.exception.d.ts +4 -0
  34. package/dist/errors/circular-policy.exception.js +10 -0
  35. package/dist/errors/duplicate-policy.exception.d.ts +4 -0
  36. package/dist/errors/duplicate-policy.exception.js +10 -0
  37. package/dist/errors/index.d.ts +4 -0
  38. package/dist/errors/index.js +20 -0
  39. package/dist/errors/missing-policy.exception.d.ts +4 -0
  40. package/dist/errors/missing-policy.exception.js +11 -0
  41. package/dist/errors/out-of-bounds-action.exception.d.ts +5 -0
  42. package/dist/errors/out-of-bounds-action.exception.js +13 -0
  43. package/dist/evaluation/index.d.ts +1 -0
  44. package/dist/evaluation/index.js +17 -0
  45. package/dist/evaluation/service.d.ts +16 -0
  46. package/dist/evaluation/service.js +125 -0
  47. package/dist/extensions/index.d.ts +1 -0
  48. package/dist/extensions/index.js +17 -0
  49. package/dist/extensions/token/index.d.ts +4 -0
  50. package/dist/extensions/token/index.js +10 -0
  51. package/dist/feature-shortcuts/index.d.ts +4 -0
  52. package/dist/feature-shortcuts/index.js +7 -0
  53. package/dist/index.d.ts +8 -0
  54. package/dist/index.js +24 -0
  55. package/dist/mahmoud.module.d.ts +16 -0
  56. package/dist/mahmoud.module.js +46 -0
  57. package/dist/policy/compiler.d.ts +12 -0
  58. package/dist/policy/compiler.js +65 -0
  59. package/dist/policy/index.d.ts +4 -0
  60. package/dist/policy/index.js +20 -0
  61. package/dist/policy/module.d.ts +9 -0
  62. package/dist/policy/module.js +42 -0
  63. package/dist/policy/permission-node.type.d.ts +5 -0
  64. package/dist/policy/permission-node.type.js +2 -0
  65. package/dist/policy/registry.d.ts +17 -0
  66. package/dist/policy/registry.js +113 -0
  67. package/dist/policy/scanner.d.ts +12 -0
  68. package/dist/policy/scanner.js +47 -0
  69. package/dist/policy/validator.d.ts +8 -0
  70. package/dist/policy/validator.js +61 -0
  71. package/dist/policy/visualizer/controller.d.ts +6 -0
  72. package/dist/policy/visualizer/controller.js +34 -0
  73. package/dist/policy/visualizer/index.d.ts +1 -0
  74. package/dist/policy/visualizer/index.js +17 -0
  75. package/dist/tracing/index.d.ts +2 -0
  76. package/dist/tracing/index.js +18 -0
  77. package/dist/tracing/module.d.ts +8 -0
  78. package/dist/tracing/module.js +35 -0
  79. package/dist/tracing/service.d.ts +17 -0
  80. package/dist/tracing/service.js +126 -0
  81. package/dist/tracing/tokens/activate-trace.token.d.ts +3 -0
  82. package/dist/tracing/tokens/activate-trace.token.js +10 -0
  83. package/dist/tracing/tokens/evaluation-id.token.d.ts +4 -0
  84. package/dist/tracing/tokens/evaluation-id.token.js +10 -0
  85. package/dist/tracing/tokens/index.d.ts +2 -0
  86. package/dist/tracing/tokens/index.js +18 -0
  87. package/package.json +46 -6
  88. package/public/policy-ui/assets/index-BwE3sQ6i.js +149 -0
  89. package/public/policy-ui/assets/index-CYyoke_2.css +1 -0
  90. package/public/policy-ui/favicon.svg +1 -0
  91. package/public/policy-ui/icons.svg +24 -0
  92. package/public/policy-ui/index.html +13 -0
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.EvaluationService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const common_2 = require("@mahmoud-auth/common");
15
+ const errors_1 = require("../errors");
16
+ const policy_1 = require("../policy");
17
+ const tracing_1 = require("../tracing");
18
+ let EvaluationService = class EvaluationService {
19
+ policyRegistry;
20
+ trace;
21
+ constructor(policyRegistry, trace) {
22
+ this.policyRegistry = policyRegistry;
23
+ this.trace = trace;
24
+ }
25
+ async can(resource, action, context, route) {
26
+ this.trace.policyEntered(resource.name, action, route);
27
+ try {
28
+ const entry = this.policyRegistry.getEntry(resource, action);
29
+ if (!entry) {
30
+ throw new errors_1.MissingPolicyException(resource.name, action, route);
31
+ }
32
+ const evaluation = await this.evaluate(entry.rule, context);
33
+ this.trace.policyLeft(resource.name, action, evaluation, route);
34
+ return evaluation;
35
+ }
36
+ catch (error) {
37
+ this.trace.policyFailed(resource.name, action, error, route);
38
+ throw error;
39
+ }
40
+ }
41
+ async evaluate(rule, context) {
42
+ if ((0, common_2.isPermissionRule)(rule)) {
43
+ return this.evaluatePermission(rule, context);
44
+ }
45
+ if ((0, common_2.isConditionRule)(rule)) {
46
+ return this.evaluateCondition(rule, context);
47
+ }
48
+ if ((0, common_2.isAndRule)(rule)) {
49
+ return this.evaluateAnd(rule, context);
50
+ }
51
+ if ((0, common_2.isOrRule)(rule)) {
52
+ return this.evaluateOr(rule, context);
53
+ }
54
+ if ((0, common_2.isNotRule)(rule)) {
55
+ return this.evaluateNot(rule, context);
56
+ }
57
+ return false;
58
+ }
59
+ async evaluatePermission(rule, context) {
60
+ return this.can(rule.resource, rule.action, context);
61
+ }
62
+ async evaluateCondition(rule, context) {
63
+ const ruleId = this.trace.ruleEntered('condition', [rule.description && `description: ${rule.description}`]);
64
+ try {
65
+ const resolvedCondition = await Promise.resolve(rule.execute(context));
66
+ this.trace.ruleResolved('condition', ruleId, resolvedCondition);
67
+ return resolvedCondition;
68
+ }
69
+ catch (error) {
70
+ this.trace.ruleFailed('condition', ruleId, error);
71
+ throw error;
72
+ }
73
+ }
74
+ async evaluateChildren(children, context, stop) {
75
+ for (const child of children) {
76
+ const result = await this.evaluate(child, context);
77
+ if (stop(result)) {
78
+ return result;
79
+ }
80
+ }
81
+ return !stop(true);
82
+ }
83
+ async evaluateAnd(rule, context) {
84
+ const ruleId = this.trace.ruleEntered('and');
85
+ try {
86
+ const resolvedAndRule = await this.evaluateChildren(rule.children, context, result => !result);
87
+ this.trace.ruleResolved('and', ruleId, resolvedAndRule);
88
+ return resolvedAndRule;
89
+ }
90
+ catch (error) {
91
+ this.trace.ruleFailed('and', ruleId, error);
92
+ throw error;
93
+ }
94
+ }
95
+ async evaluateOr(rule, context) {
96
+ const ruleId = this.trace.ruleEntered('or');
97
+ try {
98
+ const resolvedOrRule = await this.evaluateChildren(rule.children, context, result => result);
99
+ this.trace.ruleResolved('or', ruleId, resolvedOrRule);
100
+ return resolvedOrRule;
101
+ }
102
+ catch (error) {
103
+ this.trace.ruleFailed('or', ruleId, error);
104
+ throw error;
105
+ }
106
+ }
107
+ async evaluateNot(rule, context) {
108
+ const ruleId = this.trace.ruleEntered('not');
109
+ try {
110
+ const resolvedNotRule = !(await this.evaluate(rule.child, context));
111
+ this.trace.ruleResolved('not', ruleId, resolvedNotRule);
112
+ return resolvedNotRule;
113
+ }
114
+ catch (error) {
115
+ this.trace.ruleFailed('not', ruleId, error);
116
+ throw error;
117
+ }
118
+ }
119
+ };
120
+ exports.EvaluationService = EvaluationService;
121
+ exports.EvaluationService = EvaluationService = __decorate([
122
+ (0, common_1.Injectable)(),
123
+ __metadata("design:paramtypes", [policy_1.PolicyRegistry,
124
+ tracing_1.AuthorizationTraceService])
125
+ ], EvaluationService);
@@ -0,0 +1 @@
1
+ export * from './token';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./token"), exports);
@@ -0,0 +1,4 @@
1
+ import { IUseFactoryWithToken } from "@mahmoud-auth/utils";
2
+ export declare const MAHMOUD_EXTENSIONS: unique symbol;
3
+ export declare const InjectMahmoudExtensions: () => PropertyDecorator & ParameterDecorator;
4
+ export declare const useFactoryMahmoudExtensions: IUseFactoryWithToken;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useFactoryMahmoudExtensions = exports.InjectMahmoudExtensions = exports.MAHMOUD_EXTENSIONS = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const utils_1 = require("@mahmoud-auth/utils");
6
+ exports.MAHMOUD_EXTENSIONS = Symbol('MAHMOUD_EXTENSIONS');
7
+ const InjectMahmoudExtensions = () => (0, common_1.Inject)(exports.MAHMOUD_EXTENSIONS);
8
+ exports.InjectMahmoudExtensions = InjectMahmoudExtensions;
9
+ const useFactoryMahmoudExtensions = (...props) => (0, utils_1.useFactory)(exports.MAHMOUD_EXTENSIONS, ...props);
10
+ exports.useFactoryMahmoudExtensions = useFactoryMahmoudExtensions;
@@ -0,0 +1,4 @@
1
+ import { Type } from "@nestjs/common";
2
+ import { MahmoudAuthModule } from "..";
3
+ export declare const applyExtensions: typeof MahmoudAuthModule.forFeature;
4
+ export declare const applyGlobalExtensions: (...extensions: Type[]) => import("@nestjs/common").DynamicModule;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyGlobalExtensions = exports.applyExtensions = void 0;
4
+ const __1 = require("..");
5
+ exports.applyExtensions = __1.MahmoudAuthModule.forFeature;
6
+ const applyGlobalExtensions = (...extensions) => (0, exports.applyExtensions)({ extensions });
7
+ exports.applyGlobalExtensions = applyGlobalExtensions;
@@ -0,0 +1,8 @@
1
+ export * from './auth-guard';
2
+ export * from './core/resource';
3
+ export * from './decorators';
4
+ export * from './dsl';
5
+ export * from './errors';
6
+ export * from './evaluation';
7
+ export * from './mahmoud.module';
8
+ export * from './feature-shortcuts';
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./auth-guard"), exports);
18
+ __exportStar(require("./core/resource"), exports);
19
+ __exportStar(require("./decorators"), exports);
20
+ __exportStar(require("./dsl"), exports);
21
+ __exportStar(require("./errors"), exports);
22
+ __exportStar(require("./evaluation"), exports);
23
+ __exportStar(require("./mahmoud.module"), exports);
24
+ __exportStar(require("./feature-shortcuts"), exports);
@@ -0,0 +1,16 @@
1
+ import { DynamicModule, ModuleMetadata, Type } from "@nestjs/common";
2
+ interface MahmoudAuthModuleRootOptions {
3
+ inspector?: boolean;
4
+ resources: Type[];
5
+ global?: boolean;
6
+ activateTrace?: boolean;
7
+ }
8
+ export interface MahmoudAuthModuleFeatureOptions {
9
+ imports?: ModuleMetadata['imports'];
10
+ extensions: Type[];
11
+ }
12
+ export declare class MahmoudAuthModule {
13
+ static forRoot(options: MahmoudAuthModuleRootOptions): DynamicModule;
14
+ static forFeature({ imports, extensions }: MahmoudAuthModuleFeatureOptions): DynamicModule;
15
+ }
16
+ export {};
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var MahmoudAuthModule_1;
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.MahmoudAuthModule = void 0;
11
+ const common_1 = require("@nestjs/common");
12
+ const model_climbers_1 = require("@mahmoud-auth/model-climbers");
13
+ const tracing_1 = require("./tracing");
14
+ const utils_1 = require("@mahmoud-auth/utils");
15
+ const evaluation_1 = require("./evaluation");
16
+ const extensions_1 = require("./extensions");
17
+ const policy_1 = require("./policy");
18
+ let MahmoudAuthModule = MahmoudAuthModule_1 = class MahmoudAuthModule {
19
+ static forRoot(options) {
20
+ const { resources = [], inspector = false, global = false, activateTrace = false } = options;
21
+ return {
22
+ module: MahmoudAuthModule_1,
23
+ imports: [
24
+ tracing_1.TraceModule.forRoot({ activateTrace }),
25
+ model_climbers_1.TransitionModule,
26
+ policy_1.PolicyModule,
27
+ model_climbers_1.ResourceRelationsModule.forRoot(...resources)
28
+ ],
29
+ global,
30
+ providers: [evaluation_1.EvaluationService],
31
+ exports: [evaluation_1.EvaluationService, model_climbers_1.ResourceRelationsModule, model_climbers_1.TransitionModule, tracing_1.TraceModule]
32
+ };
33
+ }
34
+ static forFeature({ imports = [], extensions }) {
35
+ return {
36
+ module: MahmoudAuthModule_1,
37
+ imports,
38
+ providers: [(0, extensions_1.useFactoryMahmoudExtensions)(utils_1.getClassInstanceMap, { inject: extensions })],
39
+ exports: [extensions_1.MAHMOUD_EXTENSIONS],
40
+ };
41
+ }
42
+ };
43
+ exports.MahmoudAuthModule = MahmoudAuthModule;
44
+ exports.MahmoudAuthModule = MahmoudAuthModule = MahmoudAuthModule_1 = __decorate([
45
+ (0, common_1.Module)({})
46
+ ], MahmoudAuthModule);
@@ -0,0 +1,12 @@
1
+ import { Reflector } from '@nestjs/core';
2
+ import { PolicyRegistry } from './registry';
3
+ import { PolicyScanner } from './scanner';
4
+ export declare class PolicyCompiler {
5
+ private scanner;
6
+ private reflector;
7
+ private graph;
8
+ constructor(scanner: PolicyScanner, reflector: Reflector, graph: PolicyRegistry);
9
+ compilePolicies(): void;
10
+ private compilePolicy;
11
+ private mapPolicyMethodToEntry;
12
+ }
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PolicyCompiler = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ const common_2 = require("@mahmoud-auth/common");
16
+ const permission_decorator_1 = require("../decorators/permission.decorator");
17
+ const errors_1 = require("../errors");
18
+ const registry_1 = require("./registry");
19
+ const scanner_1 = require("./scanner");
20
+ let PolicyCompiler = class PolicyCompiler {
21
+ scanner;
22
+ reflector;
23
+ graph;
24
+ constructor(scanner, reflector, graph) {
25
+ this.scanner = scanner;
26
+ this.reflector = reflector;
27
+ this.graph = graph;
28
+ }
29
+ compilePolicies() {
30
+ this.scanner
31
+ .lookupPolicyProviders()
32
+ .flatMap(policy => this.compilePolicy(policy))
33
+ .forEach(entry => this.graph.registerEntry(entry));
34
+ this.graph.freeze();
35
+ }
36
+ compilePolicy({ instance, resource }) {
37
+ const prototype = Object.getPrototypeOf(instance);
38
+ return Object
39
+ .getOwnPropertyNames(prototype)
40
+ .filter(key => key !== 'constructor' && typeof Object.getOwnPropertyDescriptor(prototype, key)?.value === 'function')
41
+ .map(method => this.mapPolicyMethodToEntry({ resource, instance, method, prototype }))
42
+ .filter(common_2.isNotNull);
43
+ }
44
+ mapPolicyMethodToEntry({ resource, instance, method, prototype }) {
45
+ const implementation = Object.getOwnPropertyDescriptor(prototype, method)?.value;
46
+ if (typeof implementation !== 'function') {
47
+ return null;
48
+ }
49
+ const action = this.reflector.get(permission_decorator_1.PERMISSION_METADATA, implementation);
50
+ if (!action) {
51
+ return null;
52
+ }
53
+ if (!resource.actions.includes(action)) {
54
+ throw new errors_1.OutOfBoundsActionException(resource.name, action, resource.actions);
55
+ }
56
+ return { resource, action, rule: (implementation).call(instance) };
57
+ }
58
+ };
59
+ exports.PolicyCompiler = PolicyCompiler;
60
+ exports.PolicyCompiler = PolicyCompiler = __decorate([
61
+ (0, common_1.Injectable)(),
62
+ __metadata("design:paramtypes", [scanner_1.PolicyScanner,
63
+ core_1.Reflector,
64
+ registry_1.PolicyRegistry])
65
+ ], PolicyCompiler);
@@ -0,0 +1,4 @@
1
+ export * from './registry';
2
+ export * from './permission-node.type';
3
+ export * from './validator';
4
+ export * from './module';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./registry"), exports);
18
+ __exportStar(require("./permission-node.type"), exports);
19
+ __exportStar(require("./validator"), exports);
20
+ __exportStar(require("./module"), exports);
@@ -0,0 +1,9 @@
1
+ import { OnModuleInit } from "@nestjs/common";
2
+ import { PolicyCompiler } from "./compiler";
3
+ import { PolicyValidator } from "./validator";
4
+ export declare class PolicyModule implements OnModuleInit {
5
+ private readonly policyCompiler;
6
+ private readonly validator;
7
+ constructor(policyCompiler: PolicyCompiler, validator: PolicyValidator);
8
+ onModuleInit(): void;
9
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PolicyModule = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const compiler_1 = require("./compiler");
15
+ const registry_1 = require("./registry");
16
+ const scanner_1 = require("./scanner");
17
+ const core_1 = require("@nestjs/core");
18
+ const validator_1 = require("./validator");
19
+ const controller_1 = require("./visualizer/controller");
20
+ let PolicyModule = class PolicyModule {
21
+ policyCompiler;
22
+ validator;
23
+ constructor(policyCompiler, validator) {
24
+ this.policyCompiler = policyCompiler;
25
+ this.validator = validator;
26
+ }
27
+ onModuleInit() {
28
+ this.policyCompiler.compilePolicies();
29
+ this.validator.validatePolicies();
30
+ }
31
+ };
32
+ exports.PolicyModule = PolicyModule;
33
+ exports.PolicyModule = PolicyModule = __decorate([
34
+ (0, common_1.Module)({
35
+ imports: [core_1.DiscoveryModule],
36
+ providers: [registry_1.PolicyRegistry, scanner_1.PolicyScanner, compiler_1.PolicyCompiler, validator_1.PolicyValidator],
37
+ controllers: [controller_1.VisualizerController],
38
+ exports: [registry_1.PolicyRegistry]
39
+ }),
40
+ __metadata("design:paramtypes", [compiler_1.PolicyCompiler,
41
+ validator_1.PolicyValidator])
42
+ ], PolicyModule);
@@ -0,0 +1,5 @@
1
+ import { IResourceToken } from '@mahmoud-auth/common';
2
+ export interface IPermissionNode<T> {
3
+ resource: IResourceToken<T>;
4
+ action: string;
5
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,17 @@
1
+ import { IAuthorizationGraphDto, IResourceToken, RuleNode } from '@mahmoud-auth/common';
2
+ import { IPermissionNode } from './permission-node.type';
3
+ import { BaseMahmoudRegistry } from '@mahmoud-auth/base-registry';
4
+ export interface GraphEntry<T = unknown> extends IPermissionNode<T> {
5
+ rule: RuleNode;
6
+ }
7
+ export declare class PolicyRegistry extends BaseMahmoudRegistry<string, GraphEntry> {
8
+ constructor();
9
+ registerEntry(entry: GraphEntry): void;
10
+ getEntry<T>(resource: IResourceToken<T>, action: string): GraphEntry<unknown> | undefined;
11
+ hasEntry<T>(resource: IResourceToken<T>, action: string): boolean;
12
+ getValues(): GraphEntry<unknown>[];
13
+ toVisualizationDto(): IAuthorizationGraphDto;
14
+ private toVisualizationRule;
15
+ private collectPermissionEdges;
16
+ private permissionKey;
17
+ }
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PolicyRegistry = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const common_2 = require("@mahmoud-auth/common");
15
+ const core_1 = require("../core");
16
+ const errors_1 = require("../errors");
17
+ const base_registry_1 = require("@mahmoud-auth/base-registry");
18
+ let PolicyRegistry = class PolicyRegistry extends base_registry_1.BaseMahmoudRegistry {
19
+ constructor() {
20
+ super(new Map());
21
+ }
22
+ registerEntry(entry) {
23
+ this.checkIsFrozen(this.constructor.name);
24
+ if (this.entries.get((0, core_1.createResourceKey)(entry.resource, entry.action))) {
25
+ throw new errors_1.DuplicatePolicyException(entry.resource.name, entry.action);
26
+ }
27
+ this.entries.set((0, core_1.createResourceKey)(entry.resource, entry.action), entry);
28
+ }
29
+ getEntry(resource, action) {
30
+ return this.entries.get((0, core_1.createResourceKey)(resource, action));
31
+ }
32
+ hasEntry(resource, action) {
33
+ return this.entries.has((0, core_1.createResourceKey)(resource, action));
34
+ }
35
+ getValues() {
36
+ return [...this.entries.values()];
37
+ }
38
+ toVisualizationDto() {
39
+ const nodes = new Map();
40
+ const edges = [];
41
+ this.getValues()
42
+ .forEach(entry => {
43
+ const nodeId = this.permissionKey(entry.resource, entry.action);
44
+ nodes.set(nodeId, {
45
+ id: nodeId,
46
+ resource: entry.resource.name,
47
+ action: entry.action,
48
+ rule: this.toVisualizationRule(entry.rule),
49
+ });
50
+ this.collectPermissionEdges(entry.rule, nodeId, edges);
51
+ });
52
+ return {
53
+ nodes: [...nodes.values()],
54
+ edges,
55
+ };
56
+ }
57
+ toVisualizationRule(rule) {
58
+ if ((0, common_2.isConditionRule)(rule)) {
59
+ const conditionTreeNode = {
60
+ type: 'condition',
61
+ description: rule.description ?? 'No description found',
62
+ };
63
+ return conditionTreeNode;
64
+ }
65
+ if ((0, common_2.isPermissionRule)(rule)) {
66
+ const permissionTreeNode = {
67
+ type: 'permission',
68
+ target: this.permissionKey(rule.resource, rule.action),
69
+ };
70
+ return permissionTreeNode;
71
+ }
72
+ if ((0, common_2.isAndRule)(rule) || (0, common_2.isOrRule)(rule)) {
73
+ const treeNode = {
74
+ type: rule.type,
75
+ children: rule.children.map(child => this.toVisualizationRule(child)),
76
+ };
77
+ return treeNode;
78
+ }
79
+ if ((0, common_2.isNotRule)(rule)) {
80
+ const treeNotNode = {
81
+ type: 'not',
82
+ child: this.toVisualizationRule(rule.child),
83
+ };
84
+ return treeNotNode;
85
+ }
86
+ throw new common_1.InternalServerErrorException(`Unknown rule type: ${rule.type}`);
87
+ }
88
+ collectPermissionEdges(rule, source, edges) {
89
+ if ((0, common_2.isPermissionRule)(rule)) {
90
+ edges.push({
91
+ from: source,
92
+ to: this.permissionKey(rule.resource, rule.action),
93
+ type: 'requires',
94
+ });
95
+ return;
96
+ }
97
+ if ((0, common_2.isAndRule)(rule) || (0, common_2.isOrRule)(rule)) {
98
+ rule.children.forEach(child => this.collectPermissionEdges(child, source, edges));
99
+ return;
100
+ }
101
+ if ((0, common_2.isNotRule)(rule)) {
102
+ this.collectPermissionEdges(rule.child, source, edges);
103
+ }
104
+ }
105
+ permissionKey(resource, action) {
106
+ return `${resource.name}.${action}`;
107
+ }
108
+ };
109
+ exports.PolicyRegistry = PolicyRegistry;
110
+ exports.PolicyRegistry = PolicyRegistry = __decorate([
111
+ (0, common_1.Injectable)(),
112
+ __metadata("design:paramtypes", [])
113
+ ], PolicyRegistry);
@@ -0,0 +1,12 @@
1
+ import { DiscoveryService, Reflector } from '@nestjs/core';
2
+ import { IResourceToken } from '@mahmoud-auth/common';
3
+ export declare class PolicyScanner {
4
+ private discovery;
5
+ private reflector;
6
+ constructor(discovery: DiscoveryService, reflector: Reflector);
7
+ lookupPolicyProviders(): {
8
+ instance: object;
9
+ resource: IResourceToken<unknown, string[]>;
10
+ }[];
11
+ private getPolicyProviderMetadata;
12
+ }
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.PolicyScanner = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ const policy_decorator_1 = require("../decorators/policy.decorator");
16
+ const common_2 = require("@mahmoud-auth/common");
17
+ let PolicyScanner = class PolicyScanner {
18
+ discovery;
19
+ reflector;
20
+ constructor(discovery, reflector) {
21
+ this.discovery = discovery;
22
+ this.reflector = reflector;
23
+ }
24
+ lookupPolicyProviders() {
25
+ return this.discovery
26
+ .getProviders()
27
+ .map(provider => this.getPolicyProviderMetadata(provider))
28
+ .filter(common_2.isNotNull);
29
+ }
30
+ getPolicyProviderMetadata(provider) {
31
+ const instance = provider.instance;
32
+ if (typeof instance !== 'object' || instance === null) {
33
+ return null;
34
+ }
35
+ const resource = this.reflector.get(policy_decorator_1.RESOURCE_POLICY_METADATA, instance.constructor);
36
+ if (!resource) {
37
+ return null;
38
+ }
39
+ return { instance, resource };
40
+ }
41
+ };
42
+ exports.PolicyScanner = PolicyScanner;
43
+ exports.PolicyScanner = PolicyScanner = __decorate([
44
+ (0, common_1.Injectable)(),
45
+ __metadata("design:paramtypes", [core_1.DiscoveryService,
46
+ core_1.Reflector])
47
+ ], PolicyScanner);
@@ -0,0 +1,8 @@
1
+ import { PolicyRegistry } from "./registry";
2
+ export declare class PolicyValidator {
3
+ private readonly policies;
4
+ constructor(policies: PolicyRegistry);
5
+ validatePolicies(): void;
6
+ private validateCycles;
7
+ private getPermissionDependencies;
8
+ }