permissions-contractx 1.0.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/LICENSE +21 -0
- package/README.md +1397 -0
- package/dist/constants/contractx-permissions.constants.d.ts +310 -0
- package/dist/constants/contractx-permissions.constants.d.ts.map +1 -0
- package/dist/constants/contractx-permissions.constants.js +1061 -0
- package/dist/constants/contractx-roles.constants.d.ts +295 -0
- package/dist/constants/contractx-roles.constants.d.ts.map +1 -0
- package/dist/constants/contractx-roles.constants.js +238 -0
- package/dist/constants/index.d.ts +3 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/constants/index.js +18 -0
- package/dist/constants/security.constants.d.ts +77 -0
- package/dist/constants/security.constants.d.ts.map +1 -0
- package/dist/constants/security.constants.js +139 -0
- package/dist/decorators/current-user.decorator.d.ts +73 -0
- package/dist/decorators/current-user.decorator.d.ts.map +1 -0
- package/dist/decorators/current-user.decorator.js +91 -0
- package/dist/decorators/index.d.ts +5 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +20 -0
- package/dist/decorators/permissions.decorator.d.ts +97 -0
- package/dist/decorators/permissions.decorator.d.ts.map +1 -0
- package/dist/decorators/permissions.decorator.js +106 -0
- package/dist/decorators/public.decorator.d.ts +18 -0
- package/dist/decorators/public.decorator.d.ts.map +1 -0
- package/dist/decorators/public.decorator.js +22 -0
- package/dist/decorators/roles.decorator.d.ts +79 -0
- package/dist/decorators/roles.decorator.d.ts.map +1 -0
- package/dist/decorators/roles.decorator.js +87 -0
- package/dist/guards/index.d.ts +4 -0
- package/dist/guards/index.d.ts.map +1 -0
- package/dist/guards/index.js +19 -0
- package/dist/guards/jwt-auth.guard.d.ts +21 -0
- package/dist/guards/jwt-auth.guard.d.ts.map +1 -0
- package/dist/guards/jwt-auth.guard.js +115 -0
- package/dist/guards/permissions.guard.d.ts +14 -0
- package/dist/guards/permissions.guard.d.ts.map +1 -0
- package/dist/guards/permissions.guard.js +77 -0
- package/dist/guards/roles.guard.d.ts +13 -0
- package/dist/guards/roles.guard.d.ts.map +1 -0
- package/dist/guards/roles.guard.js +59 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/interfaces/index.d.ts +2 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +17 -0
- package/dist/interfaces/jwt-payload.interface.d.ts +93 -0
- package/dist/interfaces/jwt-payload.interface.d.ts.map +1 -0
- package/dist/interfaces/jwt-payload.interface.js +2 -0
- package/dist/modules/index.d.ts +2 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/index.js +17 -0
- package/dist/modules/permissions-contractx.module.d.ts +41 -0
- package/dist/modules/permissions-contractx.module.d.ts.map +1 -0
- package/dist/modules/permissions-contractx.module.js +215 -0
- package/dist/services/contractx-authorization.service.d.ts +107 -0
- package/dist/services/contractx-authorization.service.d.ts.map +1 -0
- package/dist/services/contractx-authorization.service.js +362 -0
- package/dist/services/contractx-document-compliance.service.d.ts +85 -0
- package/dist/services/contractx-document-compliance.service.d.ts.map +1 -0
- package/dist/services/contractx-document-compliance.service.js +536 -0
- package/dist/services/contractx-validation.service.d.ts +76 -0
- package/dist/services/contractx-validation.service.d.ts.map +1 -0
- package/dist/services/contractx-validation.service.js +305 -0
- package/dist/services/index.d.ts +6 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +20 -0
- package/dist/services/user-context.service.d.ts +114 -0
- package/dist/services/user-context.service.d.ts.map +1 -0
- package/dist/services/user-context.service.js +199 -0
- package/dist/test-document-compliance.d.ts +7 -0
- package/dist/test-document-compliance.d.ts.map +1 -0
- package/dist/test-document-compliance.js +118 -0
- package/package.json +405 -0
|
@@ -0,0 +1,362 @@
|
|
|
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.ContractXAuthorizationService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const contractx_validation_service_1 = require("./contractx-validation.service");
|
|
15
|
+
const contractx_roles_constants_1 = require("../constants/contractx-roles.constants");
|
|
16
|
+
const contractx_permissions_constants_1 = require("../constants/contractx-permissions.constants");
|
|
17
|
+
let ContractXAuthorizationService = class ContractXAuthorizationService {
|
|
18
|
+
constructor(validationService) {
|
|
19
|
+
this.validationService = validationService;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Authorize a user for a specific action on a resource
|
|
23
|
+
*/
|
|
24
|
+
authorize(context) {
|
|
25
|
+
const { userRoles, userPermissions, requestedResource, requestedAction } = context;
|
|
26
|
+
// First validate the user context
|
|
27
|
+
const userValidation = this.validationService.validateUser(userRoles, userPermissions);
|
|
28
|
+
if (!userValidation.isValid) {
|
|
29
|
+
return {
|
|
30
|
+
granted: false,
|
|
31
|
+
reason: `Invalid user context: ${userValidation.errors.join(', ')}`,
|
|
32
|
+
level: 'denied',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// If no specific resource/action requested, just validate user
|
|
36
|
+
if (!requestedResource || !requestedAction) {
|
|
37
|
+
return {
|
|
38
|
+
granted: true,
|
|
39
|
+
reason: 'User context is valid',
|
|
40
|
+
level: 'system',
|
|
41
|
+
metadata: userValidation.metadata,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Check system-level access first
|
|
45
|
+
if (this.hasSystemLevelAccess(userRoles)) {
|
|
46
|
+
return {
|
|
47
|
+
granted: true,
|
|
48
|
+
reason: 'System-level access granted via role',
|
|
49
|
+
level: 'system',
|
|
50
|
+
metadata: { systemRole: true },
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
// Check role-based access
|
|
54
|
+
const roleAccess = this.checkRoleBasedAccess(userRoles, requestedResource, requestedAction);
|
|
55
|
+
if (roleAccess.granted) {
|
|
56
|
+
return roleAccess;
|
|
57
|
+
}
|
|
58
|
+
// Check permission-based access
|
|
59
|
+
const permissionAccess = this.checkPermissionBasedAccess(userPermissions, requestedResource, requestedAction);
|
|
60
|
+
if (permissionAccess.granted) {
|
|
61
|
+
return permissionAccess;
|
|
62
|
+
}
|
|
63
|
+
// Check if user has any access to the module
|
|
64
|
+
const moduleAccess = this.checkModuleAccess(userPermissions, requestedResource);
|
|
65
|
+
if (moduleAccess) {
|
|
66
|
+
return {
|
|
67
|
+
granted: false,
|
|
68
|
+
reason: `Access denied for action '${requestedAction}' on resource '${requestedResource}'. User has module access but not for this action.`,
|
|
69
|
+
level: 'denied',
|
|
70
|
+
metadata: { hasModuleAccess: true },
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
granted: false,
|
|
75
|
+
reason: `Access denied. No permissions found for resource '${requestedResource}'`,
|
|
76
|
+
level: 'denied',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check if user has system-level access
|
|
81
|
+
*/
|
|
82
|
+
hasSystemLevelAccess(userRoles) {
|
|
83
|
+
return userRoles.some(role => role === contractx_roles_constants_1.CONTRACTX_ROLES.SUPERADMIN ||
|
|
84
|
+
role === contractx_roles_constants_1.CONTRACTX_ROLES.SUPPORT ||
|
|
85
|
+
(0, contractx_roles_constants_1.isSystemRole)(role));
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Check role-based access for a resource and action
|
|
89
|
+
*/
|
|
90
|
+
checkRoleBasedAccess(userRoles, resource, action) {
|
|
91
|
+
// Get effective permissions for all user roles
|
|
92
|
+
const effectivePermissions = this.validationService.getEffectivePermissions(userRoles, []);
|
|
93
|
+
// Check if the effective permissions include the required permission
|
|
94
|
+
const requiredPermission = `${resource}:${action}`;
|
|
95
|
+
if (effectivePermissions.includes(requiredPermission)) {
|
|
96
|
+
return {
|
|
97
|
+
granted: true,
|
|
98
|
+
reason: `Access granted via role-based permissions`,
|
|
99
|
+
level: 'role',
|
|
100
|
+
metadata: { requiredPermission, effectivePermissions: effectivePermissions.length },
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// Check for wildcard permissions
|
|
104
|
+
const wildcardPermission = `${resource}:*`;
|
|
105
|
+
if (effectivePermissions.includes(wildcardPermission)) {
|
|
106
|
+
return {
|
|
107
|
+
granted: true,
|
|
108
|
+
reason: `Access granted via role-based wildcard permission`,
|
|
109
|
+
level: 'role',
|
|
110
|
+
metadata: { wildcardPermission },
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
granted: false,
|
|
115
|
+
reason: 'No role-based access found',
|
|
116
|
+
level: 'denied',
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Check permission-based access for a resource and action
|
|
121
|
+
*/
|
|
122
|
+
checkPermissionBasedAccess(userPermissions, resource, action) {
|
|
123
|
+
const requiredPermission = `${resource}:${action}`;
|
|
124
|
+
if (userPermissions.includes(requiredPermission)) {
|
|
125
|
+
return {
|
|
126
|
+
granted: true,
|
|
127
|
+
reason: `Access granted via explicit permission`,
|
|
128
|
+
level: 'permission',
|
|
129
|
+
metadata: { requiredPermission },
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
// Check for wildcard permissions
|
|
133
|
+
const wildcardPermission = `${resource}:*`;
|
|
134
|
+
if (userPermissions.includes(wildcardPermission)) {
|
|
135
|
+
return {
|
|
136
|
+
granted: true,
|
|
137
|
+
reason: `Access granted via wildcard permission`,
|
|
138
|
+
level: 'permission',
|
|
139
|
+
metadata: { wildcardPermission },
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return {
|
|
143
|
+
granted: false,
|
|
144
|
+
reason: 'No explicit permission found',
|
|
145
|
+
level: 'denied',
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Check if user has any access to a module
|
|
150
|
+
*/
|
|
151
|
+
checkModuleAccess(userPermissions, module) {
|
|
152
|
+
return (0, contractx_permissions_constants_1.hasAnyModuleAccess)(userPermissions, module);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Generate an access matrix for the user
|
|
156
|
+
*/
|
|
157
|
+
generateAccessMatrix(context) {
|
|
158
|
+
const { userRoles, userPermissions } = context;
|
|
159
|
+
// Get all role metadata
|
|
160
|
+
const roleMetadata = userRoles
|
|
161
|
+
.map(role => (0, contractx_roles_constants_1.getRoleMetadata)(role))
|
|
162
|
+
.filter(meta => meta !== null);
|
|
163
|
+
// Analyze access levels
|
|
164
|
+
const hasSystemAccess = userRoles.some(role => (0, contractx_roles_constants_1.isSystemRole)(role));
|
|
165
|
+
const hasClientAccess = userRoles.some(role => (0, contractx_roles_constants_1.isClientRole)(role));
|
|
166
|
+
const hasProviderAccess = userRoles.some(role => (0, contractx_roles_constants_1.isProviderRole)(role));
|
|
167
|
+
const hasAdminAccess = userRoles.some(role => (0, contractx_roles_constants_1.isAdminRole)(role));
|
|
168
|
+
// Get accessible modules
|
|
169
|
+
const accessibleModules = this.validationService.getUserModules(userPermissions);
|
|
170
|
+
// Calculate highest role level
|
|
171
|
+
const highestRoleLevel = Math.max(...roleMetadata.map(meta => meta?.level || 0), 0);
|
|
172
|
+
// Get effective permissions
|
|
173
|
+
const effectivePermissions = this.validationService.getEffectivePermissions(userRoles, userPermissions);
|
|
174
|
+
return {
|
|
175
|
+
hasSystemAccess,
|
|
176
|
+
hasClientAccess,
|
|
177
|
+
hasProviderAccess,
|
|
178
|
+
hasAdminAccess,
|
|
179
|
+
accessibleModules,
|
|
180
|
+
highestRoleLevel,
|
|
181
|
+
effectivePermissions,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Check if user can access a specific tenant
|
|
186
|
+
*/
|
|
187
|
+
canAccessTenant(userRoles, tenantType) {
|
|
188
|
+
// System roles can access all tenants
|
|
189
|
+
if (this.hasSystemLevelAccess(userRoles)) {
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
// Check specific tenant access
|
|
193
|
+
if (tenantType === 'client') {
|
|
194
|
+
return userRoles.some(role => (0, contractx_roles_constants_1.isClientRole)(role));
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
return userRoles.some(role => (0, contractx_roles_constants_1.isProviderRole)(role));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get user's accessible tenant types
|
|
202
|
+
*/
|
|
203
|
+
getAccessibleTenants(userRoles) {
|
|
204
|
+
const tenants = new Set();
|
|
205
|
+
if (this.hasSystemLevelAccess(userRoles)) {
|
|
206
|
+
tenants.add('system');
|
|
207
|
+
tenants.add('client');
|
|
208
|
+
tenants.add('provider');
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
if (userRoles.some(role => (0, contractx_roles_constants_1.isClientRole)(role))) {
|
|
212
|
+
tenants.add('client');
|
|
213
|
+
}
|
|
214
|
+
if (userRoles.some(role => (0, contractx_roles_constants_1.isProviderRole)(role))) {
|
|
215
|
+
tenants.add('provider');
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
return Array.from(tenants);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Filter resources based on user permissions
|
|
222
|
+
*/
|
|
223
|
+
filterAccessibleResources(userPermissions, resources, requiredAction = 'read') {
|
|
224
|
+
return resources.filter(resource => (0, contractx_permissions_constants_1.hasModuleAccess)(userPermissions, resource, requiredAction) ||
|
|
225
|
+
(0, contractx_permissions_constants_1.hasModuleAccess)(userPermissions, resource, '*'));
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Get user's permissions for a specific module
|
|
229
|
+
*/
|
|
230
|
+
getModulePermissions(userPermissions, module) {
|
|
231
|
+
return userPermissions
|
|
232
|
+
.filter(permission => {
|
|
233
|
+
const permModule = (0, contractx_permissions_constants_1.getModuleFromPermission)(permission);
|
|
234
|
+
return permModule === module;
|
|
235
|
+
})
|
|
236
|
+
.map(permission => (0, contractx_permissions_constants_1.getActionFromPermission)(permission))
|
|
237
|
+
.filter(action => action !== null);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Check if user has administrative access to a resource
|
|
241
|
+
*/
|
|
242
|
+
hasAdministrativeAccess(userRoles, _resource) {
|
|
243
|
+
// System-level access
|
|
244
|
+
if (this.hasSystemLevelAccess(userRoles)) {
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
// Check for admin roles specific to the resource
|
|
248
|
+
const adminRoles = [
|
|
249
|
+
contractx_roles_constants_1.CONTRACTX_ROLES.CLIENT_CONTRACT_ADMIN,
|
|
250
|
+
contractx_roles_constants_1.CONTRACTX_ROLES.PROVIDER_CONTRACT_ADMIN,
|
|
251
|
+
];
|
|
252
|
+
return userRoles.some(role => adminRoles.includes(role));
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Validate user context for multi-tenant environment
|
|
256
|
+
*/
|
|
257
|
+
validateMultiTenantAccess(context) {
|
|
258
|
+
const errors = [];
|
|
259
|
+
const warnings = [];
|
|
260
|
+
const { userRoles, tenantType, organizationId, projectId } = context;
|
|
261
|
+
// Validate tenant access
|
|
262
|
+
if (tenantType && !this.canAccessTenant(userRoles, tenantType)) {
|
|
263
|
+
errors.push(`User does not have access to ${tenantType} tenant`);
|
|
264
|
+
}
|
|
265
|
+
// Validate organization context
|
|
266
|
+
if (organizationId && !this.hasSystemLevelAccess(userRoles)) {
|
|
267
|
+
// In a real implementation, you'd check if user belongs to the organization
|
|
268
|
+
warnings.push(`Organization-specific access validation should be implemented`);
|
|
269
|
+
}
|
|
270
|
+
// Validate project context
|
|
271
|
+
if (projectId && !this.hasSystemLevelAccess(userRoles)) {
|
|
272
|
+
// In a real implementation, you'd check if user has project access
|
|
273
|
+
warnings.push(`Project-specific access validation should be implemented`);
|
|
274
|
+
}
|
|
275
|
+
return {
|
|
276
|
+
isValid: errors.length === 0,
|
|
277
|
+
errors,
|
|
278
|
+
warnings,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Get permission summary for logging/audit purposes
|
|
283
|
+
*/
|
|
284
|
+
getPermissionSummary(context) {
|
|
285
|
+
const accessMatrix = this.generateAccessMatrix(context);
|
|
286
|
+
const accessibleTenants = this.getAccessibleTenants(context.userRoles);
|
|
287
|
+
return {
|
|
288
|
+
userId: context.requestedResource, // Assuming this might be passed in context
|
|
289
|
+
roles: context.userRoles,
|
|
290
|
+
permissionCount: context.userPermissions.length,
|
|
291
|
+
effectivePermissionCount: accessMatrix.effectivePermissions.length,
|
|
292
|
+
accessLevel: accessMatrix.highestRoleLevel,
|
|
293
|
+
tenants: accessibleTenants,
|
|
294
|
+
modules: accessMatrix.accessibleModules,
|
|
295
|
+
hasSystemAccess: accessMatrix.hasSystemAccess,
|
|
296
|
+
hasAdminAccess: accessMatrix.hasAdminAccess,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Check if authorization is required for a resource
|
|
301
|
+
*/
|
|
302
|
+
isAuthorizationRequired(resource, action) {
|
|
303
|
+
// Define public resources that don't require authorization
|
|
304
|
+
const publicResources = ['health', 'status', 'version'];
|
|
305
|
+
const publicActions = ['read', 'view'];
|
|
306
|
+
if (publicResources.includes(resource) && publicActions.includes(action)) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Get minimum required role for a resource/action combination
|
|
313
|
+
*/
|
|
314
|
+
getMinimumRequiredRole(resource, action) {
|
|
315
|
+
// This would typically be configured based on your security requirements
|
|
316
|
+
const resourceRoleMap = {
|
|
317
|
+
contracts: {
|
|
318
|
+
create: [contractx_roles_constants_1.CONTRACTX_ROLES.CLIENT_CONTRACT_ADMIN, contractx_roles_constants_1.CONTRACTX_ROLES.PROVIDER_CONTRACT_ADMIN],
|
|
319
|
+
delete: [contractx_roles_constants_1.CONTRACTX_ROLES.CLIENT_CONTRACT_ADMIN, contractx_roles_constants_1.CONTRACTX_ROLES.PROVIDER_CONTRACT_ADMIN],
|
|
320
|
+
admin: [contractx_roles_constants_1.CONTRACTX_ROLES.SUPERADMIN, contractx_roles_constants_1.CONTRACTX_ROLES.SUPPORT],
|
|
321
|
+
},
|
|
322
|
+
projects: {
|
|
323
|
+
create: [contractx_roles_constants_1.CONTRACTX_ROLES.CLIENT_CONTRACT_ADMIN, contractx_roles_constants_1.CONTRACTX_ROLES.PROVIDER_CONTRACT_ADMIN],
|
|
324
|
+
delete: [contractx_roles_constants_1.CONTRACTX_ROLES.CLIENT_CONTRACT_ADMIN, contractx_roles_constants_1.CONTRACTX_ROLES.PROVIDER_CONTRACT_ADMIN],
|
|
325
|
+
},
|
|
326
|
+
security_control: {
|
|
327
|
+
'*': [contractx_roles_constants_1.CONTRACTX_ROLES.SUPERADMIN, contractx_roles_constants_1.CONTRACTX_ROLES.SUPPORT],
|
|
328
|
+
},
|
|
329
|
+
};
|
|
330
|
+
return resourceRoleMap[resource]?.[action] || resourceRoleMap[resource]?.['*'] || [];
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Check permission for a user (simpler interface for admin service)
|
|
334
|
+
*/
|
|
335
|
+
checkPermission(user, permission, context) {
|
|
336
|
+
const [resource, action] = permission.split(':');
|
|
337
|
+
const authContext = {
|
|
338
|
+
userRoles: user.role,
|
|
339
|
+
userPermissions: user.permissions,
|
|
340
|
+
requestedResource: resource,
|
|
341
|
+
requestedAction: action,
|
|
342
|
+
organizationId: context?.tenantId,
|
|
343
|
+
projectId: context?.resourceId,
|
|
344
|
+
};
|
|
345
|
+
return this.authorize(authContext);
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Generate access matrix for a user object (simpler interface)
|
|
349
|
+
*/
|
|
350
|
+
generateAccessMatrixForUser(user) {
|
|
351
|
+
const context = {
|
|
352
|
+
userRoles: user.role,
|
|
353
|
+
userPermissions: user.permissions,
|
|
354
|
+
};
|
|
355
|
+
return this.generateAccessMatrix(context);
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
exports.ContractXAuthorizationService = ContractXAuthorizationService;
|
|
359
|
+
exports.ContractXAuthorizationService = ContractXAuthorizationService = __decorate([
|
|
360
|
+
(0, common_1.Injectable)(),
|
|
361
|
+
__metadata("design:paramtypes", [contractx_validation_service_1.ContractXValidationService])
|
|
362
|
+
], ContractXAuthorizationService);
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ContractX Document Compliance Service
|
|
3
|
+
* Validates permissions-contractx package compliance with PermisosRoles.odt document requirements
|
|
4
|
+
*/
|
|
5
|
+
export interface ComplianceValidationResult {
|
|
6
|
+
isCompliant: boolean;
|
|
7
|
+
summary: {
|
|
8
|
+
totalRoles: number;
|
|
9
|
+
validatedRoles: number;
|
|
10
|
+
totalPermissions: number;
|
|
11
|
+
validatedPermissions: number;
|
|
12
|
+
compliantRoles: string[];
|
|
13
|
+
nonCompliantRoles: string[];
|
|
14
|
+
};
|
|
15
|
+
roleAnalysis: Array<{
|
|
16
|
+
role: string;
|
|
17
|
+
isCompliant: boolean;
|
|
18
|
+
expectedPermissions: string[];
|
|
19
|
+
actualPermissions: string[];
|
|
20
|
+
missingPermissions: string[];
|
|
21
|
+
extraPermissions: string[];
|
|
22
|
+
documentReference: string;
|
|
23
|
+
}>;
|
|
24
|
+
modulesCoverage: Array<{
|
|
25
|
+
module: string;
|
|
26
|
+
covered: boolean;
|
|
27
|
+
usedByRoles: string[];
|
|
28
|
+
}>;
|
|
29
|
+
warnings: string[];
|
|
30
|
+
errors: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface DocumentRequirement {
|
|
33
|
+
role: string;
|
|
34
|
+
category: 'system' | 'client' | 'provider';
|
|
35
|
+
permissions: Record<string, string[]>;
|
|
36
|
+
restrictions: string[];
|
|
37
|
+
}
|
|
38
|
+
export declare class ContractXDocumentComplianceService {
|
|
39
|
+
private readonly logger;
|
|
40
|
+
/**
|
|
41
|
+
* Document-based role requirements extracted from PermisosRoles.odt
|
|
42
|
+
*/
|
|
43
|
+
private readonly DOCUMENT_REQUIREMENTS;
|
|
44
|
+
/**
|
|
45
|
+
* Permission action mappings from document notation to system notation
|
|
46
|
+
*/
|
|
47
|
+
private readonly ACTION_MAPPINGS;
|
|
48
|
+
/**
|
|
49
|
+
* Validates complete package compliance with PermisosRoles.odt document
|
|
50
|
+
*/
|
|
51
|
+
validateDocumentCompliance(): Promise<ComplianceValidationResult>;
|
|
52
|
+
/**
|
|
53
|
+
* Validates a specific role against document requirements
|
|
54
|
+
*/
|
|
55
|
+
private validateRoleCompliance;
|
|
56
|
+
/**
|
|
57
|
+
* Converts document requirements to permission strings
|
|
58
|
+
*/
|
|
59
|
+
private convertRequirementsToPermissions;
|
|
60
|
+
/**
|
|
61
|
+
* Validates module coverage across all roles
|
|
62
|
+
*/
|
|
63
|
+
private validateModulesCoverage;
|
|
64
|
+
/**
|
|
65
|
+
* Finds roles that use a specific module
|
|
66
|
+
*/
|
|
67
|
+
private findRolesUsingModule;
|
|
68
|
+
/**
|
|
69
|
+
* Counts total validated permissions across all roles
|
|
70
|
+
*/
|
|
71
|
+
private countValidatedPermissions;
|
|
72
|
+
/**
|
|
73
|
+
* Adds warnings for roles present in package but not in document
|
|
74
|
+
*/
|
|
75
|
+
private addMissingRoleWarnings;
|
|
76
|
+
/**
|
|
77
|
+
* Gets the document section for a role
|
|
78
|
+
*/
|
|
79
|
+
private getRoleSection;
|
|
80
|
+
/**
|
|
81
|
+
* Generates a compliance report summary
|
|
82
|
+
*/
|
|
83
|
+
generateComplianceReport(validation: ComplianceValidationResult): string;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=contractx-document-compliance.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contractx-document-compliance.service.d.ts","sourceRoot":"","sources":["../../src/services/contractx-document-compliance.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,0BAA0B;IACzC,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,iBAAiB,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF,YAAY,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,OAAO,CAAC;QACrB,mBAAmB,EAAE,MAAM,EAAE,CAAC;QAC9B,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,kBAAkB,EAAE,MAAM,EAAE,CAAC;QAC7B,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;KAC3B,CAAC,CAAC;IACH,eAAe,EAAE,KAAK,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC,CAAC;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC3C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,qBACa,kCAAkC;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuD;IAE9E;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAwRpC;IAEF;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,eAAe,CAO9B;IAEF;;OAEG;IACG,0BAA0B,IAAI,OAAO,CAAC,0BAA0B,CAAC;IAuDvE;;OAEG;YACW,sBAAsB;IA+BpC;;OAEG;IACH,OAAO,CAAC,gCAAgC;IAexC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAgB/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAY5B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAWjC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;OAEG;IACH,OAAO,CAAC,cAAc;IA+BtB;;OAEG;IACH,wBAAwB,CAAC,UAAU,EAAE,0BAA0B,GAAG,MAAM;CA2DzE"}
|