@volontariapp/auth 3.1.0 → 3.2.1-snap-1ee6a7b
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/CHANGELOG.md +12 -0
- package/dist/guards/grpc-internal.guard.d.ts.map +1 -1
- package/dist/guards/grpc-internal.guard.js +3 -0
- package/dist/guards/grpc-internal.guard.js.map +1 -1
- package/dist/guards/roles.guard.d.ts.map +1 -1
- package/dist/guards/roles.guard.js +6 -1
- package/dist/guards/roles.guard.js.map +1 -1
- package/dist/test/unit/roles.guard.unit.spec.js +33 -4
- package/dist/test/unit/roles.guard.unit.spec.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc-internal.guard.d.ts","sourceRoot":"","sources":["../../src/guards/grpc-internal.guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAOxD,qBACa,iBAAkB,YAAW,WAAW;IAEvC,OAAO,CAAC,QAAQ,CAAC,UAAU;IADvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgE;gBAC1D,UAAU,EAAE,UAAU;IAE7C,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"grpc-internal.guard.d.ts","sourceRoot":"","sources":["../../src/guards/grpc-internal.guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAOxD,qBACa,iBAAkB,YAAW,WAAW;IAEvC,OAAO,CAAC,QAAQ,CAAC,UAAU;IADvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgE;gBAC1D,UAAU,EAAE,UAAU;IAE7C,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;CA0B/D"}
|
|
@@ -19,6 +19,9 @@ let GrpcInternalGuard = class GrpcInternalGuard {
|
|
|
19
19
|
this.jwtService = jwtService;
|
|
20
20
|
}
|
|
21
21
|
async canActivate(context) {
|
|
22
|
+
if (context.getType() !== 'rpc') {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
22
25
|
const rpcContext = context.switchToRpc().getContext();
|
|
23
26
|
const tokens = rpcContext.get(INTERNAL_TOKEN_METADATA_KEY);
|
|
24
27
|
const token = tokens[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc-internal.guard.js","sourceRoot":"","sources":["../../src/guards/grpc-internal.guard.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAE3F,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAIvC,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAEC;IADZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvF,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,EAAY,CAAC;QAChE,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YACjE,MAAM,sBAAsB,EAAE,CAAC;QACjC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAa,KAAK,CAAC,CAAC;YACrE,MAAM,GAAG,GAAG,UAA+C,CAAC;YAC5D,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YAEnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YACpE,MAAM,sBAAsB,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;CACF,CAAA;
|
|
1
|
+
{"version":3,"file":"grpc-internal.guard.js","sourceRoot":"","sources":["../../src/guards/grpc-internal.guard.ts"],"names":[],"mappings":";;;;;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAE3F,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAIvC,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAEC;IADZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvF,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEvD,KAAK,CAAC,WAAW,CAAC,OAAyB;QACzC,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,KAAK,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,EAAY,CAAC;QAChE,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAExB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YACjE,MAAM,sBAAsB,EAAE,CAAC;QACjC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,CAAa,KAAK,CAAC,CAAC;YACrE,MAAM,GAAG,GAAG,UAA+C,CAAC;YAC5D,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;YAEnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1E,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;YACpE,MAAM,sBAAsB,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;CACF,CAAA;AA9BY,iBAAiB;IAD7B,UAAU,EAAE;qCAG8B,UAAU;GAFxC,iBAAiB,CA8B7B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.guard.d.ts","sourceRoot":"","sources":["../../src/guards/roles.guard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"roles.guard.d.ts","sourceRoot":"","sources":["../../src/guards/roles.guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzC,qBACa,UAAW,YAAW,WAAW;IAEhC,OAAO,CAAC,QAAQ,CAAC,SAAS;IADtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyD;gBACnD,SAAS,EAAE,SAAS;IAEjD,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO;CA2ChD"}
|
|
@@ -10,6 +10,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
10
10
|
import { Injectable } from '@nestjs/common';
|
|
11
11
|
import { Reflector } from '@nestjs/core';
|
|
12
12
|
import { ROLES_KEY } from '../decorators/roles.decorator.js';
|
|
13
|
+
import { IS_PUBLIC_KEY } from '../constants/index.js';
|
|
13
14
|
import { INSUFFICIENT_PERMISSIONS, MISSING_AUTHENTICATED_USER } from '@volontariapp/errors-nest';
|
|
14
15
|
import { Logger } from '@volontariapp/logger';
|
|
15
16
|
let RolesGuard = class RolesGuard {
|
|
@@ -23,7 +24,11 @@ let RolesGuard = class RolesGuard {
|
|
|
23
24
|
context.getHandler(),
|
|
24
25
|
context.getClass(),
|
|
25
26
|
]);
|
|
26
|
-
|
|
27
|
+
const isPublic = this.reflector.getAllAndOverride(IS_PUBLIC_KEY, [
|
|
28
|
+
context.getHandler(),
|
|
29
|
+
context.getClass(),
|
|
30
|
+
]);
|
|
31
|
+
if (isPublic || !requiredRoles || requiredRoles.length === 0) {
|
|
27
32
|
return true;
|
|
28
33
|
}
|
|
29
34
|
let user;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.guard.js","sourceRoot":"","sources":["../../src/guards/roles.guard.ts"],"names":[],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"roles.guard.js","sourceRoot":"","sources":["../../src/guards/roles.guard.ts"],"names":[],"mappings":";;;;;;;;;AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAIvC,IAAM,UAAU,GAAhB,MAAM,UAAU;IAEQ;IADZ,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAChF,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAErD,WAAW,CAAC,OAAyB;QACnC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAW,SAAS,EAAE;YAC1E,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAU,aAAa,EAAE;YACxE,OAAO,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,QAAQ,EAAE;SACnB,CAAC,CAAC;QAEH,IAAI,QAAQ,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,IAA4B,CAAC;QAEjC,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,KAAK,EAAE,CAAC;YAChC,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,EAA2B,CAAC;YAC/E,IAAI,GAAG,UAAU,CAAC,MAAM,CAA2B,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAA2B,CAAC;YAC7E,IAAI,GAAG,OAAO,CAAC,MAAM,CAA2B,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YAC3E,MAAM,0BAA0B,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,QAAQ,IAAI,CAAC,EAAE,cAAc,IAAI,CAAC,IAAI,kCAAkC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnG,CAAC;YACF,MAAM,wBAAwB,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,QAAQ,IAAI,CAAC,EAAE,SAAS,IAAI,CAAC,IAAI,0BAA0B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACtF,CAAC;QAEF,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA/CY,UAAU;IADtB,UAAU,EAAE;qCAG6B,SAAS;GAFtC,UAAU,CA+CtB"}
|
|
@@ -3,7 +3,9 @@ import { ForbiddenError } from '@volontariapp/errors';
|
|
|
3
3
|
import { RolesGuard } from '../../guards/roles.guard.js';
|
|
4
4
|
import { createAuthUser } from '../factories/auth-user.factory.js';
|
|
5
5
|
import { createMock } from '@golevelup/ts-jest';
|
|
6
|
+
import { ROLES_KEY } from '../../decorators/roles.decorator.js';
|
|
6
7
|
import { UserRoles } from '@volontariapp/shared';
|
|
8
|
+
import { IS_PUBLIC_KEY } from '../../index.js';
|
|
7
9
|
describe('RolesGuard (Unit)', () => {
|
|
8
10
|
let guard;
|
|
9
11
|
let reflector;
|
|
@@ -16,13 +18,21 @@ describe('RolesGuard (Unit)', () => {
|
|
|
16
18
|
jest.spyOn(guard['logger'], 'error').mockImplementation(() => undefined);
|
|
17
19
|
});
|
|
18
20
|
it('should allow access if no roles are required', () => {
|
|
19
|
-
jest.spyOn(reflector, 'getAllAndOverride').
|
|
21
|
+
jest.spyOn(reflector, 'getAllAndOverride').mockImplementation((key) => {
|
|
22
|
+
if (key === ROLES_KEY)
|
|
23
|
+
return [];
|
|
24
|
+
return undefined;
|
|
25
|
+
});
|
|
20
26
|
const context = createMock();
|
|
21
27
|
expect(guard.canActivate(context)).toBe(true);
|
|
22
28
|
});
|
|
23
29
|
it('should allow access if user has the required role', () => {
|
|
24
30
|
const user = createAuthUser({ role: UserRoles.ADMIN });
|
|
25
|
-
jest.spyOn(reflector, 'getAllAndOverride').
|
|
31
|
+
jest.spyOn(reflector, 'getAllAndOverride').mockImplementation((key) => {
|
|
32
|
+
if (key === ROLES_KEY)
|
|
33
|
+
return [UserRoles.ADMIN];
|
|
34
|
+
return undefined;
|
|
35
|
+
});
|
|
26
36
|
const context = createMock({
|
|
27
37
|
switchToHttp: () => ({
|
|
28
38
|
getRequest: () => ({ user }),
|
|
@@ -32,7 +42,11 @@ describe('RolesGuard (Unit)', () => {
|
|
|
32
42
|
});
|
|
33
43
|
it('should throw 403 if user has insufficient role', () => {
|
|
34
44
|
const user = createAuthUser({ role: UserRoles.VOLUNTEER });
|
|
35
|
-
jest.spyOn(reflector, 'getAllAndOverride').
|
|
45
|
+
jest.spyOn(reflector, 'getAllAndOverride').mockImplementation((key) => {
|
|
46
|
+
if (key === ROLES_KEY)
|
|
47
|
+
return [UserRoles.ADMIN];
|
|
48
|
+
return undefined;
|
|
49
|
+
});
|
|
36
50
|
const context = createMock({
|
|
37
51
|
switchToHttp: () => ({
|
|
38
52
|
getRequest: () => ({ user }),
|
|
@@ -41,7 +55,11 @@ describe('RolesGuard (Unit)', () => {
|
|
|
41
55
|
expect(() => guard.canActivate(context)).toThrow(ForbiddenError);
|
|
42
56
|
});
|
|
43
57
|
it('should throw 403 if user is missing', () => {
|
|
44
|
-
jest.spyOn(reflector, 'getAllAndOverride').
|
|
58
|
+
jest.spyOn(reflector, 'getAllAndOverride').mockImplementation((key) => {
|
|
59
|
+
if (key === ROLES_KEY)
|
|
60
|
+
return [UserRoles.ADMIN];
|
|
61
|
+
return undefined;
|
|
62
|
+
});
|
|
45
63
|
const context = createMock({
|
|
46
64
|
switchToHttp: () => ({
|
|
47
65
|
getRequest: () => ({ user: undefined }),
|
|
@@ -49,5 +67,16 @@ describe('RolesGuard (Unit)', () => {
|
|
|
49
67
|
});
|
|
50
68
|
expect(() => guard.canActivate(context)).toThrow(ForbiddenError);
|
|
51
69
|
});
|
|
70
|
+
it('should allow access if route is public even if roles are specified', () => {
|
|
71
|
+
jest.spyOn(reflector, 'getAllAndOverride').mockImplementation((key) => {
|
|
72
|
+
if (key === ROLES_KEY)
|
|
73
|
+
return [UserRoles.ADMIN];
|
|
74
|
+
if (key === IS_PUBLIC_KEY)
|
|
75
|
+
return true;
|
|
76
|
+
return undefined;
|
|
77
|
+
});
|
|
78
|
+
const context = createMock();
|
|
79
|
+
expect(guard.canActivate(context)).toBe(true);
|
|
80
|
+
});
|
|
52
81
|
});
|
|
53
82
|
//# sourceMappingURL=roles.guard.unit.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.guard.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/roles.guard.unit.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"roles.guard.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/roles.guard.unit.spec.ts"],"names":[],"mappings":"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"}
|