permissions-contractx 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +53 -1346
- package/dist/constants/contractx-permissions.constants.d.ts +84 -92
- package/dist/constants/contractx-permissions.constants.d.ts.map +1 -1
- package/dist/constants/contractx-permissions.constants.js +2 -2
- package/dist/constants/contractx-roles.constants.d.ts +150 -254
- package/dist/constants/contractx-roles.constants.d.ts.map +1 -1
- package/dist/constants/contractx-roles.constants.js +2 -2
- package/dist/constants/index.d.ts +1 -0
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +1 -0
- package/dist/constants/permission-names.constants.d.ts +310 -0
- package/dist/constants/permission-names.constants.d.ts.map +1 -0
- package/dist/constants/permission-names.constants.js +209 -0
- package/dist/constants/security.constants.d.ts +49 -49
- package/dist/constants/security.constants.d.ts.map +1 -1
- package/dist/constants/security.constants.js +2 -2
- package/dist/decorators/current-user.decorator.d.ts +5 -53
- package/dist/decorators/current-user.decorator.d.ts.map +1 -1
- package/dist/decorators/current-user.decorator.js +4 -51
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/decorators/index.js +1 -0
- package/dist/decorators/permission-writes.decorator.d.ts +14 -0
- package/dist/decorators/permission-writes.decorator.d.ts.map +1 -0
- package/dist/decorators/permission-writes.decorator.js +18 -0
- package/dist/decorators/permissions.decorator.d.ts +0 -58
- package/dist/decorators/permissions.decorator.d.ts.map +1 -1
- package/dist/decorators/permissions.decorator.js +0 -58
- package/dist/decorators/public.decorator.d.ts +0 -0
- package/dist/decorators/public.decorator.d.ts.map +0 -0
- package/dist/decorators/public.decorator.js +0 -0
- package/dist/decorators/roles.decorator.d.ts +4 -57
- package/dist/decorators/roles.decorator.d.ts.map +1 -1
- package/dist/decorators/roles.decorator.js +6 -57
- package/dist/guards/authorization.guard.d.ts +37 -0
- package/dist/guards/authorization.guard.d.ts.map +1 -0
- package/dist/guards/authorization.guard.js +150 -0
- package/dist/guards/index.d.ts +1 -0
- package/dist/guards/index.d.ts.map +1 -1
- package/dist/guards/index.js +1 -0
- package/dist/guards/jwt-auth.guard.d.ts +0 -0
- package/dist/guards/jwt-auth.guard.d.ts.map +1 -1
- package/dist/guards/jwt-auth.guard.js +0 -0
- package/dist/guards/permissions.guard.d.ts +0 -0
- package/dist/guards/permissions.guard.d.ts.map +1 -1
- package/dist/guards/permissions.guard.js +8 -2
- package/dist/guards/roles.guard.d.ts +0 -0
- package/dist/guards/roles.guard.d.ts.map +1 -1
- package/dist/guards/roles.guard.js +1 -1
- package/dist/index.d.ts +0 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -6
- package/dist/interfaces/index.d.ts +1 -0
- package/dist/interfaces/index.d.ts.map +1 -1
- package/dist/interfaces/index.js +1 -0
- package/dist/interfaces/jwt-payload.interface.d.ts +46 -9
- package/dist/interfaces/jwt-payload.interface.d.ts.map +1 -1
- package/dist/interfaces/jwt-payload.interface.js +19 -0
- package/dist/interfaces/permission-mode.enum.d.ts +22 -0
- package/dist/interfaces/permission-mode.enum.d.ts.map +1 -0
- package/dist/interfaces/permission-mode.enum.js +25 -0
- package/dist/modules/index.d.ts +0 -0
- package/dist/modules/index.d.ts.map +0 -0
- package/dist/modules/index.js +0 -0
- package/dist/modules/permissions-contractx.module.d.ts +0 -0
- package/dist/modules/permissions-contractx.module.d.ts.map +1 -1
- package/dist/modules/permissions-contractx.module.js +4 -2
- package/dist/services/contractx-authorization.service.d.ts +198 -27
- package/dist/services/contractx-authorization.service.d.ts.map +1 -1
- package/dist/services/contractx-authorization.service.js +2 -0
- package/dist/services/contractx-validation.service.d.ts +93 -12
- package/dist/services/contractx-validation.service.d.ts.map +1 -1
- package/dist/services/contractx-validation.service.js +1 -0
- package/dist/services/index.d.ts +0 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -0
- package/dist/services/user-context.service.d.ts +29 -34
- package/dist/services/user-context.service.d.ts.map +1 -1
- package/dist/services/user-context.service.js +65 -44
- package/package.json +5 -24
- package/dist/services/contractx-document-compliance.service.d.ts +0 -85
- package/dist/services/contractx-document-compliance.service.d.ts.map +0 -1
- package/dist/services/contractx-document-compliance.service.js +0 -536
- package/dist/test-document-compliance.d.ts +0 -7
- package/dist/test-document-compliance.d.ts.map +0 -1
- package/dist/test-document-compliance.js +0 -118
|
@@ -16,8 +16,70 @@ exports.UserContextService = void 0;
|
|
|
16
16
|
const common_1 = require("@nestjs/common");
|
|
17
17
|
const core_1 = require("@nestjs/core");
|
|
18
18
|
const contractx_roles_constants_1 = require("../constants/contractx-roles.constants");
|
|
19
|
+
function coerceStringOrNumber(...vals) {
|
|
20
|
+
for (const v of vals) {
|
|
21
|
+
if (typeof v === 'string' && v.length > 0)
|
|
22
|
+
return v;
|
|
23
|
+
if (typeof v === 'number')
|
|
24
|
+
return v;
|
|
25
|
+
}
|
|
26
|
+
return '';
|
|
27
|
+
}
|
|
28
|
+
function coerceString(...vals) {
|
|
29
|
+
for (const v of vals)
|
|
30
|
+
if (typeof v === 'string' && v.length > 0)
|
|
31
|
+
return v;
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
function coerceStringArray(...vals) {
|
|
35
|
+
for (const v of vals) {
|
|
36
|
+
if (Array.isArray(v)) {
|
|
37
|
+
const arr = v.filter((x) => typeof x === 'string');
|
|
38
|
+
if (arr.length > 0)
|
|
39
|
+
return arr;
|
|
40
|
+
}
|
|
41
|
+
if (typeof v === 'string' && v.length > 0)
|
|
42
|
+
return [v];
|
|
43
|
+
}
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
function coerceOptionalString(...vals) {
|
|
47
|
+
for (const v of vals)
|
|
48
|
+
if (typeof v === 'string' && v.length > 0)
|
|
49
|
+
return v;
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
function coerceOptionalNumber(v) {
|
|
53
|
+
return typeof v === 'number' ? v : undefined;
|
|
54
|
+
}
|
|
55
|
+
function normalizeToPayload(raw) {
|
|
56
|
+
return {
|
|
57
|
+
sub: coerceStringOrNumber(raw.sub, raw.id, raw.user_id),
|
|
58
|
+
role: coerceStringArray(raw.role, raw.roles),
|
|
59
|
+
permissions: coerceStringArray(raw.permissions),
|
|
60
|
+
permissionsView: Array.isArray(raw.permissionsView)
|
|
61
|
+
? raw.permissionsView.filter((x) => typeof x === 'string')
|
|
62
|
+
: undefined,
|
|
63
|
+
fullName: coerceString(raw.fullName, raw.full_name, raw.username),
|
|
64
|
+
email: coerceOptionalString(raw.email),
|
|
65
|
+
clientId: coerceStringArray(raw.clientId, raw.client_id),
|
|
66
|
+
providerId: coerceOptionalString(raw.providerId),
|
|
67
|
+
tenantContext: (() => {
|
|
68
|
+
const t = raw.tenantContext;
|
|
69
|
+
return t === 'client' || t === 'provider' || t === 'system' ? t : undefined;
|
|
70
|
+
})(),
|
|
71
|
+
key_client: coerceStringArray(raw.key_client),
|
|
72
|
+
sessionId: coerceOptionalString(raw.sessionId, raw.session_id),
|
|
73
|
+
iat: coerceOptionalNumber(raw.iat),
|
|
74
|
+
exp: coerceOptionalNumber(raw.exp),
|
|
75
|
+
iss: coerceOptionalString(raw.iss),
|
|
76
|
+
aud: coerceOptionalString(raw.aud),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
19
79
|
let UserContextService = class UserContextService {
|
|
20
80
|
constructor(request) {
|
|
81
|
+
this.user = null;
|
|
82
|
+
this.autoInitialized = false;
|
|
21
83
|
this.request = request;
|
|
22
84
|
this.user = null;
|
|
23
85
|
this.autoInitialized = false;
|
|
@@ -40,31 +102,7 @@ let UserContextService = class UserContextService {
|
|
|
40
102
|
// Try to get user from request.user (populated by JWT middleware)
|
|
41
103
|
if (this.request?.user) {
|
|
42
104
|
try {
|
|
43
|
-
|
|
44
|
-
const requestUser = this.request.user;
|
|
45
|
-
// Convert to JwtPayload format
|
|
46
|
-
const payload = {
|
|
47
|
-
sub: requestUser.sub || requestUser.id || requestUser.user_id,
|
|
48
|
-
role: requestUser.role || requestUser.roles || [],
|
|
49
|
-
permissions: requestUser.permissions || [],
|
|
50
|
-
fullName: requestUser.fullName || requestUser.full_name || requestUser.username || '',
|
|
51
|
-
email: requestUser.email,
|
|
52
|
-
clientId: Array.isArray(requestUser.clientId)
|
|
53
|
-
? requestUser.clientId[0]
|
|
54
|
-
: (requestUser.clientId || requestUser.client_id),
|
|
55
|
-
sessionId: requestUser.sessionId || requestUser.session_id,
|
|
56
|
-
iat: requestUser.iat,
|
|
57
|
-
exp: requestUser.exp,
|
|
58
|
-
iss: requestUser.iss,
|
|
59
|
-
aud: requestUser.aud,
|
|
60
|
-
};
|
|
61
|
-
// Copy any additional properties
|
|
62
|
-
Object.keys(requestUser).forEach(key => {
|
|
63
|
-
if (!(key in payload)) {
|
|
64
|
-
payload[key] = requestUser[key];
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
this.user = payload;
|
|
105
|
+
this.user = normalizeToPayload(this.request.user);
|
|
68
106
|
return;
|
|
69
107
|
}
|
|
70
108
|
catch (error) {
|
|
@@ -74,25 +112,7 @@ let UserContextService = class UserContextService {
|
|
|
74
112
|
// Fallback: try to get user from request.tenant (if populated by custom middleware)
|
|
75
113
|
if (this.request?.tenant) {
|
|
76
114
|
try {
|
|
77
|
-
|
|
78
|
-
const payload = {
|
|
79
|
-
sub: tenant.user_id || tenant.sub || tenant.id,
|
|
80
|
-
role: tenant.roles || [tenant.role].filter(Boolean),
|
|
81
|
-
permissions: tenant.permissions || [],
|
|
82
|
-
fullName: tenant.fullName || tenant.full_name || tenant.username || '',
|
|
83
|
-
email: tenant.email,
|
|
84
|
-
clientId: Array.isArray(tenant.clientId)
|
|
85
|
-
? tenant.clientId[0]
|
|
86
|
-
: (tenant.clientId || tenant.client_id),
|
|
87
|
-
sessionId: tenant.sessionId || tenant.session_id,
|
|
88
|
-
};
|
|
89
|
-
// Copy additional properties
|
|
90
|
-
Object.keys(tenant).forEach(key => {
|
|
91
|
-
if (!(key in payload)) {
|
|
92
|
-
payload[key] = tenant[key];
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
this.user = payload;
|
|
115
|
+
this.user = normalizeToPayload(this.request.tenant);
|
|
96
116
|
return;
|
|
97
117
|
}
|
|
98
118
|
catch (error) {
|
|
@@ -312,3 +332,4 @@ exports.UserContextService = UserContextService = __decorate([
|
|
|
312
332
|
__param(0, (0, common_1.Inject)(core_1.REQUEST)),
|
|
313
333
|
__metadata("design:paramtypes", [Object])
|
|
314
334
|
], UserContextService);
|
|
335
|
+
;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "permissions-contractx",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Enterprise-grade authentication and authorization package for NestJS microservices with role-based and permission-based access control",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -36,14 +36,6 @@
|
|
|
36
36
|
],
|
|
37
37
|
"author": "ContractX Development Team",
|
|
38
38
|
"license": "MIT",
|
|
39
|
-
"homepage": "https://github.com/your-org/permissions-contractx#readme",
|
|
40
|
-
"repository": {
|
|
41
|
-
"type": "git",
|
|
42
|
-
"url": "git+https://github.com/your-org/permissions-contractx.git"
|
|
43
|
-
},
|
|
44
|
-
"bugs": {
|
|
45
|
-
"url": "https://github.com/your-org/permissions-contractx/issues"
|
|
46
|
-
},
|
|
47
39
|
"engines": {
|
|
48
40
|
"node": ">=16.0.0",
|
|
49
41
|
"npm": ">=7.0.0"
|
|
@@ -53,30 +45,19 @@
|
|
|
53
45
|
"@nestjs/config": "^4.0.2",
|
|
54
46
|
"@nestjs/core": "^11.1.6",
|
|
55
47
|
"@nestjs/jwt": "^11.0.0",
|
|
48
|
+
"express": "^5.0.0",
|
|
56
49
|
"jsonwebtoken": "^9.0.0",
|
|
57
50
|
"reflect-metadata": "^0.1.13",
|
|
58
51
|
"rxjs": "^7.0.0"
|
|
59
52
|
},
|
|
60
53
|
"devDependencies": {
|
|
61
54
|
"@nestjs/platform-express": "^11.1.6",
|
|
62
|
-
"@nestjs/testing": "^11.1.6",
|
|
63
55
|
"@types/express": "^5.0.3",
|
|
64
|
-
"@types/jest": "^
|
|
65
|
-
"@types/jsonwebtoken": "^9.0.0",
|
|
56
|
+
"@types/jest": "^30.0.0",
|
|
66
57
|
"@types/node": "^20.0.0",
|
|
67
|
-
"
|
|
68
|
-
"@typescript-eslint/eslint-plugin": "^8.43.0",
|
|
69
|
-
"@typescript-eslint/parser": "^8.43.0",
|
|
70
|
-
"eslint": "^9.35.0",
|
|
71
|
-
"jest": "^30.1.3",
|
|
58
|
+
"jest": "^30.4.2",
|
|
72
59
|
"rimraf": "^5.0.0",
|
|
73
|
-
"
|
|
74
|
-
"ts-jest": "^28.0.5",
|
|
75
|
-
"ts-node": "^10.9.0",
|
|
60
|
+
"ts-jest": "^29.4.11",
|
|
76
61
|
"typescript": "^5.0.0"
|
|
77
|
-
},
|
|
78
|
-
"directories": {
|
|
79
|
-
"example": "examples",
|
|
80
|
-
"test": "test"
|
|
81
62
|
}
|
|
82
63
|
}
|
|
@@ -1,85 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|