@villedemontreal/jwt-validator 5.7.7

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 (104) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +313 -0
  3. package/dist/scripts/index.d.ts +6 -0
  4. package/dist/scripts/index.js +16 -0
  5. package/dist/scripts/index.js.map +1 -0
  6. package/dist/scripts/lint.d.ts +6 -0
  7. package/dist/scripts/lint.js +18 -0
  8. package/dist/scripts/lint.js.map +1 -0
  9. package/dist/scripts/lintFix.d.ts +6 -0
  10. package/dist/scripts/lintFix.js +21 -0
  11. package/dist/scripts/lintFix.js.map +1 -0
  12. package/dist/scripts/showCoverage.d.ts +13 -0
  13. package/dist/scripts/showCoverage.js +40 -0
  14. package/dist/scripts/showCoverage.js.map +1 -0
  15. package/dist/scripts/test.d.ts +13 -0
  16. package/dist/scripts/test.js +29 -0
  17. package/dist/scripts/test.js.map +1 -0
  18. package/dist/scripts/testUnits.d.ts +15 -0
  19. package/dist/scripts/testUnits.js +95 -0
  20. package/dist/scripts/testUnits.js.map +1 -0
  21. package/dist/scripts/watch.d.ts +14 -0
  22. package/dist/scripts/watch.js +96 -0
  23. package/dist/scripts/watch.js.map +1 -0
  24. package/dist/src/config/configs.d.ts +88 -0
  25. package/dist/src/config/configs.js +123 -0
  26. package/dist/src/config/configs.js.map +1 -0
  27. package/dist/src/config/constants.d.ts +56 -0
  28. package/dist/src/config/constants.js +66 -0
  29. package/dist/src/config/constants.js.map +1 -0
  30. package/dist/src/config/init.d.ts +15 -0
  31. package/dist/src/config/init.js +48 -0
  32. package/dist/src/config/init.js.map +1 -0
  33. package/dist/src/index.d.ts +10 -0
  34. package/dist/src/index.js +32 -0
  35. package/dist/src/index.js.map +1 -0
  36. package/dist/src/jwtValidator.d.ts +21 -0
  37. package/dist/src/jwtValidator.js +129 -0
  38. package/dist/src/jwtValidator.js.map +1 -0
  39. package/dist/src/jwtValidator.test.d.ts +1 -0
  40. package/dist/src/jwtValidator.test.js +500 -0
  41. package/dist/src/jwtValidator.test.js.map +1 -0
  42. package/dist/src/middleware/jwtMiddleware.d.ts +7 -0
  43. package/dist/src/middleware/jwtMiddleware.js +27 -0
  44. package/dist/src/middleware/jwtMiddleware.js.map +1 -0
  45. package/dist/src/models/customError.d.ts +11 -0
  46. package/dist/src/models/customError.js +38 -0
  47. package/dist/src/models/customError.js.map +1 -0
  48. package/dist/src/models/expressRequest.d.ts +15 -0
  49. package/dist/src/models/expressRequest.js +17 -0
  50. package/dist/src/models/expressRequest.js.map +1 -0
  51. package/dist/src/models/gluuUserType.d.ts +9 -0
  52. package/dist/src/models/gluuUserType.js +14 -0
  53. package/dist/src/models/gluuUserType.js.map +1 -0
  54. package/dist/src/models/jwtPayload.d.ts +30 -0
  55. package/dist/src/models/jwtPayload.js +19 -0
  56. package/dist/src/models/jwtPayload.js.map +1 -0
  57. package/dist/src/models/pagination.d.ts +16 -0
  58. package/dist/src/models/pagination.js +16 -0
  59. package/dist/src/models/pagination.js.map +1 -0
  60. package/dist/src/models/publicKey.d.ts +29 -0
  61. package/dist/src/models/publicKey.js +13 -0
  62. package/dist/src/models/publicKey.js.map +1 -0
  63. package/dist/src/repositories/cachedPublicKeyRepository.d.ts +53 -0
  64. package/dist/src/repositories/cachedPublicKeyRepository.js +102 -0
  65. package/dist/src/repositories/cachedPublicKeyRepository.js.map +1 -0
  66. package/dist/src/repositories/publicKeyRepository.d.ts +19 -0
  67. package/dist/src/repositories/publicKeyRepository.js +44 -0
  68. package/dist/src/repositories/publicKeyRepository.js.map +1 -0
  69. package/dist/src/userValidator.d.ts +30 -0
  70. package/dist/src/userValidator.js +35 -0
  71. package/dist/src/userValidator.js.map +1 -0
  72. package/dist/src/userValidator.test.d.ts +1 -0
  73. package/dist/src/userValidator.test.js +251 -0
  74. package/dist/src/userValidator.test.js.map +1 -0
  75. package/dist/src/utils/jwtMock.d.ts +31 -0
  76. package/dist/src/utils/jwtMock.js +221 -0
  77. package/dist/src/utils/jwtMock.js.map +1 -0
  78. package/dist/src/utils/logger.d.ts +11 -0
  79. package/dist/src/utils/logger.js +54 -0
  80. package/dist/src/utils/logger.js.map +1 -0
  81. package/dist/src/utils/testingConfigurations.d.ts +7 -0
  82. package/dist/src/utils/testingConfigurations.js +16 -0
  83. package/dist/src/utils/testingConfigurations.js.map +1 -0
  84. package/package.json +82 -0
  85. package/src/config/configs.ts +145 -0
  86. package/src/config/constants.ts +83 -0
  87. package/src/config/init.ts +58 -0
  88. package/src/index.ts +15 -0
  89. package/src/jwtValidator.test.ts +607 -0
  90. package/src/jwtValidator.ts +162 -0
  91. package/src/middleware/jwtMiddleware.ts +33 -0
  92. package/src/models/customError.ts +37 -0
  93. package/src/models/expressRequest.ts +27 -0
  94. package/src/models/gluuUserType.ts +9 -0
  95. package/src/models/jwtPayload.ts +58 -0
  96. package/src/models/pagination.ts +26 -0
  97. package/src/models/publicKey.ts +33 -0
  98. package/src/repositories/cachedPublicKeyRepository.ts +121 -0
  99. package/src/repositories/publicKeyRepository.ts +75 -0
  100. package/src/userValidator.test.ts +279 -0
  101. package/src/userValidator.ts +54 -0
  102. package/src/utils/jwtMock.ts +243 -0
  103. package/src/utils/logger.ts +60 -0
  104. package/src/utils/testingConfigurations.ts +12 -0
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserValidator = void 0;
4
+ const constants_1 = require("./config/constants");
5
+ const customError_1 = require("./models/customError");
6
+ const expressRequest_1 = require("./models/expressRequest");
7
+ /**
8
+ * User Validator
9
+ */
10
+ class UserValidator {
11
+ /**
12
+ * Create a new instance of UserValidator
13
+ * @param {express.Request} req
14
+ */
15
+ constructor(req) {
16
+ if (!(0, expressRequest_1.isRequestWithJwt)(req)) {
17
+ throw new Error(`Expecting a request with a '.jwt' here! : ${req}`);
18
+ }
19
+ this._request = req;
20
+ }
21
+ isUser(userId) {
22
+ return this._request.jwt.sub !== userId;
23
+ }
24
+ verifyUser(userId) {
25
+ if (this._request.jwt.sub !== userId && this._request.jwt.mtlIdentityId !== userId) {
26
+ throw (0, customError_1.createInvalidJwtError)({
27
+ code: constants_1.constants.errors.codes.UNAUTHORIZED_ACCESS,
28
+ target: 'jwt',
29
+ message: 'Unauthorized access',
30
+ });
31
+ }
32
+ }
33
+ }
34
+ exports.UserValidator = UserValidator;
35
+ //# sourceMappingURL=userValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userValidator.js","sourceRoot":"","sources":["../../src/userValidator.ts"],"names":[],"mappings":";;;AACA,kDAA+C;AAC/C,sDAA6D;AAC7D,4DAA4E;AAoB5E;;GAEG;AACH,MAAa,aAAa;IAGxB;;;OAGG;IACH,YAAmB,GAAoB;QACrC,IAAI,CAAC,IAAA,iCAAgB,EAAC,GAAG,CAAC,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,EAAE,CAAC,CAAC;SACrE;QACD,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;IACtB,CAAC;IAEM,MAAM,CAAC,MAAc;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,MAAM,CAAC;IAC1C,CAAC;IAEM,UAAU,CAAC,MAAc;QAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,KAAK,MAAM,EAAE;YAClF,MAAM,IAAA,mCAAqB,EAAC;gBAC1B,IAAI,EAAE,qBAAS,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB;gBAChD,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,qBAAqB;aAC/B,CAAC,CAAC;SACJ;IACH,CAAC;CACF;AA3BD,sCA2BC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const chai_1 = require("chai");
4
+ const nock = require("nock");
5
+ const validator = require("validator");
6
+ const configs_1 = require("./config/configs");
7
+ const publicKey_1 = require("./models/publicKey");
8
+ const cachedPublicKeyRepository_1 = require("./repositories/cachedPublicKeyRepository");
9
+ const userValidator_1 = require("./userValidator");
10
+ const testingConfigurations_1 = require("./utils/testingConfigurations");
11
+ // ==========================================
12
+ // Set Testing configurations
13
+ // ==========================================
14
+ (0, testingConfigurations_1.setTestingConfigurations)();
15
+ /*
16
+ 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
65
+ -----END RSA PRIVATE KEY-----`;
66
+ */
67
+ const nockPublicKey = `-----BEGIN PUBLIC KEY-----
68
+ MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzVZZXij6LgAUuH6ZcvGM
69
+ vskXj+a8T5uBkvFFEPnTdRN7dYdWrhxeqsDkvwpyxJehMRAANCP+AYXgLE2BA7qt
70
+ u0SCW+Hj+1+ZubQqwaD/EQtk72yU04rJw4YfDg6VyQbSdUQRQ7ktjVitglj4dBZA
71
+ x99O+4guId52bRZrqSLe4OUVeRSI6tSV6n7ta+vsvPxUdAylFI9mAlh2we7vAu18
72
+ X7cC/5Rzq4NIuHhWpkOwwE6h7RUu7oqWfpNYl+Ugzp7qgd/vosP4FtDTW0+N82Jj
73
+ iuKILc1bWicynv5ka22R4wNrGewPGDCyTckogxrUYkx80YFad4UBF2hGzTDfXng4
74
+ gIU61eJTiB5gy3t6AgHHaVbDPnGZIefPlE+4A35Ics4uIV1z5Kbmq2+aaP+YXE42
75
+ a/WoYJfkXqOHs1PjIJmVj/szVRKyKbpq9Qp3xIM+YZQlYUvgql/O6vbl5N1NbkV3
76
+ Cjpp+zknfYXmSUJ+0FGK/ZGcFRmOSeLyJnULeFS5EAF7CUnLMEfi0hFEiyOXSngT
77
+ BIPL2GKsvtliZvPS78ik2mfXyG0YJQiVM7hYyRV+AnudI0Pz/zjX2DvjM0s3jMeI
78
+ om+l3zpAZ4SmFDkKzhAvuxoSl2koH+VXm9QtsRFSZQwF3/K5l3Zx0yi1e16dMOWw
79
+ YPtMOiCbEausVW7wgzdoj+kCAwEAAQ==
80
+ -----END PUBLIC KEY-----`;
81
+ let date = new Date();
82
+ date.setHours(-1);
83
+ date.setMonth(date.getMonth() - 1);
84
+ const lastMonth = date.toISOString();
85
+ date.setMonth(date.getMonth() - 1);
86
+ const expiredDate = date.toISOString();
87
+ date = new Date();
88
+ date.setMonth(date.getMonth() + 1);
89
+ const newCreatedDate = date.toISOString();
90
+ date.setHours(date.getHours() + 1);
91
+ const newExpiredDate = date.toISOString();
92
+ const nocKPublicKeyExpired = {
93
+ id: 1,
94
+ algorithm: 'RSA256',
95
+ publicKey: nockPublicKey,
96
+ state: publicKey_1.PublicKeyState.EXPIRED,
97
+ createdAt: expiredDate,
98
+ expiresAt: lastMonth,
99
+ };
100
+ const nocKPublicKeyExpiredNotState = {
101
+ id: 2,
102
+ algorithm: 'RSA256',
103
+ publicKey: nockPublicKey,
104
+ state: publicKey_1.PublicKeyState.ACTIVE,
105
+ createdAt: expiredDate,
106
+ expiresAt: lastMonth,
107
+ };
108
+ const nocKPublicKeyRevoked = {
109
+ id: 3,
110
+ algorithm: 'RSA256',
111
+ publicKey: nockPublicKey,
112
+ state: publicKey_1.PublicKeyState.REVOKED,
113
+ createdAt: lastMonth,
114
+ expiresAt: newExpiredDate,
115
+ };
116
+ const nocKPublicKeyActiveOld = {
117
+ id: 4,
118
+ algorithm: 'RSA256',
119
+ publicKey: nockPublicKey,
120
+ state: publicKey_1.PublicKeyState.ACTIVE,
121
+ createdAt: lastMonth,
122
+ expiresAt: newExpiredDate,
123
+ };
124
+ const nocKPublicKeyActive = {
125
+ id: 5,
126
+ algorithm: 'RSA256',
127
+ publicKey: nockPublicKey,
128
+ state: publicKey_1.PublicKeyState.ACTIVE,
129
+ createdAt: newCreatedDate,
130
+ };
131
+ const nockListPublicKeys = {
132
+ paging: {
133
+ limit: 25,
134
+ offset: 0,
135
+ totalCount: 5,
136
+ },
137
+ items: [
138
+ nocKPublicKeyExpired,
139
+ nocKPublicKeyExpiredNotState,
140
+ nocKPublicKeyRevoked,
141
+ nocKPublicKeyActiveOld,
142
+ nocKPublicKeyActive,
143
+ ],
144
+ };
145
+ // ==========================================
146
+ // User Validator
147
+ // ==========================================
148
+ let publicKeys;
149
+ const regExpEscape = (s) => {
150
+ return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
151
+ };
152
+ const pathRegex = new RegExp(`${regExpEscape(configs_1.configs.getEndpoint())}(.*)`);
153
+ it('User Validator - init app & get jwt public key', async () => {
154
+ nock.cleanAll();
155
+ cachedPublicKeyRepository_1.cachedPublicKeyRepository.clearCache();
156
+ // Intercept request
157
+ nock(configs_1.configs.getHost()).get(pathRegex).reply(200, nockListPublicKeys);
158
+ publicKeys = await cachedPublicKeyRepository_1.cachedPublicKeyRepository.getAll();
159
+ chai_1.assert.match(publicKeys[1].publicKey, /^-----BEGIN PUBLIC KEY-----\n/m);
160
+ chai_1.assert.match(publicKeys[1].publicKey, /^-----BEGIN PUBLIC KEY-----\n/m);
161
+ chai_1.assert.match(publicKeys[1].publicKey, /\n-----END PUBLIC KEY-----$/m);
162
+ const key = publicKeys[1].publicKey
163
+ .replace(/^-----BEGIN PUBLIC KEY-----\n/m, '')
164
+ .replace(/\n-----END PUBLIC KEY-----$/m, '')
165
+ .split('\n')
166
+ .join('');
167
+ chai_1.assert.isTrue(validator.default.isBase64(key));
168
+ });
169
+ const mockRequest = require('mock-express-request');
170
+ it('should consider mtlIdentityId field when verifying user', async () => {
171
+ let hasThrown = false;
172
+ try {
173
+ const userId = 'voodoo';
174
+ const request = new mockRequest();
175
+ request.jwt = {
176
+ mtlIdentityId: 'voodoo',
177
+ };
178
+ const userValidator = new userValidator_1.UserValidator(request);
179
+ userValidator.verifyUser(userId);
180
+ }
181
+ catch (err) {
182
+ hasThrown = true;
183
+ }
184
+ chai_1.assert.isFalse(hasThrown);
185
+ });
186
+ it('should throw when either fields are matching', async () => {
187
+ let hasThrown = false;
188
+ try {
189
+ const userId = 'wrongVoodoo';
190
+ const request = new mockRequest();
191
+ request.jwt = {
192
+ mtlIdentityId: 'voodoo',
193
+ sub: 'voodoo',
194
+ };
195
+ const userValidator = new userValidator_1.UserValidator(request);
196
+ userValidator.verifyUser(userId);
197
+ }
198
+ catch (err) {
199
+ hasThrown = true;
200
+ }
201
+ chai_1.assert.isTrue(hasThrown);
202
+ });
203
+ /*
204
+ it('User Validator - verifyHeaderUser - should reject missing inum ', async function () {
205
+
206
+ let token: string = jwt.sign('{"a":"a", "keyId": 4}', nockPrivateKey, { algorithm: 'RS256' });
207
+
208
+ let response = await jwtValidator.verifyHeaderUser('Bearer ' + token, 'MyInum')
209
+ .catch((err) => {
210
+ assert.strictEqual(err.error.code, constants.errors.codes.INVALID_JWT);
211
+ assert.strictEqual(err.error.target, 'Authorization header');
212
+ assert.strictEqual(err.error.message, "Invalid JWT");
213
+ assert.strictEqual(err.error.details[0].code, constants.errors.codes.INVALID_VALUE);
214
+ assert.strictEqual(err.error.details[0].target, 'jwt');
215
+ assert.strictEqual(err.error.details[0].message, 'Invalid JWT content');
216
+ });
217
+
218
+ assert.isUndefined(response);
219
+ });
220
+
221
+ it('User Validator - verifyHeaderUser - should reject bad inum ', async function () {
222
+
223
+ let token: string = jwt.sign('{"inum":"a", "keyId": 4}', nockPrivateKey, { algorithm: 'RS256' });
224
+
225
+ let response = await jwtValidator.verifyHeaderUser('Bearer ' + token, 'MyInum')
226
+ .catch((err) => {
227
+ assert.strictEqual(err.error.code, constants.errors.codes.INVALID_JWT);
228
+ assert.strictEqual(err.error.target, 'Authorization header');
229
+ assert.strictEqual(err.error.message, "Invalid JWT");
230
+ assert.strictEqual(err.error.details[0].code, constants.errors.codes.UNAUTHORIZED_ACCESS);
231
+ assert.strictEqual(err.error.details[0].target, 'jwt');
232
+ assert.strictEqual(err.error.details[0].message, 'Unauthorized access');
233
+ });
234
+
235
+ assert.isUndefined(response);
236
+ });
237
+
238
+ it('User Validator - verifyHeaderUser - should accept good token ', async function () {
239
+
240
+ let payload: any = {
241
+ inum: "MyInum",
242
+ keyId: 4
243
+ };
244
+ let token: string = jwt.sign(JSON.stringify(payload), nockPrivateKey, { algorithm: 'RS256' });
245
+
246
+ let response = await jwtValidator.verifyHeaderUser('Bearer ' + token, 'MyInum');
247
+
248
+ assert.deepEqual(response, payload);
249
+ });
250
+ */
251
+ //# sourceMappingURL=userValidator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"userValidator.test.js","sourceRoot":"","sources":["../../src/userValidator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { IPublicKey } from '../models/publicKey';
2
+ /**
3
+ * Tools to mock JWT
4
+ */
5
+ export declare class JwtMock {
6
+ /**
7
+ * Return a public key from the mock db
8
+ */
9
+ getPublicKey(keyId: number): IPublicKey;
10
+ /**
11
+ * Return the public keys from the mock db
12
+ */
13
+ getPublicKeys(): IPublicKey[];
14
+ /**
15
+ * Return the private keys from the mock db
16
+ */
17
+ getPrivateKey(): string;
18
+ /**
19
+ * Flush the public keys in cache and add the mocked public keys
20
+ */
21
+ mockPublicKeys(options?: any): Promise<void>;
22
+ /**
23
+ * Generate a fake JWT signed with the mocked keys
24
+ */
25
+ generateJwt(jwtProperties?: {}): string;
26
+ /**
27
+ * Deletes all mocks and also clears the cache
28
+ */
29
+ cleanAll(): void;
30
+ }
31
+ export declare const jwtMock: JwtMock;
@@ -0,0 +1,221 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jwtMock = exports.JwtMock = void 0;
4
+ const jwt = require("jsonwebtoken");
5
+ const lodash_1 = require("lodash");
6
+ // import * as nock from 'nock';
7
+ const configs_1 = require("../config/configs");
8
+ const publicKey_1 = require("../models/publicKey");
9
+ const cachedPublicKeyRepository_1 = require("../repositories/cachedPublicKeyRepository");
10
+ let nock;
11
+ const nockPrivateKey = `-----BEGIN RSA PRIVATE KEY-----
12
+ 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
61
+ -----END RSA PRIVATE KEY-----`;
62
+ const nockPublicKey = `-----BEGIN PUBLIC KEY-----
63
+ MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAzVZZXij6LgAUuH6ZcvGM
64
+ vskXj+a8T5uBkvFFEPnTdRN7dYdWrhxeqsDkvwpyxJehMRAANCP+AYXgLE2BA7qt
65
+ u0SCW+Hj+1+ZubQqwaD/EQtk72yU04rJw4YfDg6VyQbSdUQRQ7ktjVitglj4dBZA
66
+ x99O+4guId52bRZrqSLe4OUVeRSI6tSV6n7ta+vsvPxUdAylFI9mAlh2we7vAu18
67
+ X7cC/5Rzq4NIuHhWpkOwwE6h7RUu7oqWfpNYl+Ugzp7qgd/vosP4FtDTW0+N82Jj
68
+ iuKILc1bWicynv5ka22R4wNrGewPGDCyTckogxrUYkx80YFad4UBF2hGzTDfXng4
69
+ gIU61eJTiB5gy3t6AgHHaVbDPnGZIefPlE+4A35Ics4uIV1z5Kbmq2+aaP+YXE42
70
+ a/WoYJfkXqOHs1PjIJmVj/szVRKyKbpq9Qp3xIM+YZQlYUvgql/O6vbl5N1NbkV3
71
+ Cjpp+zknfYXmSUJ+0FGK/ZGcFRmOSeLyJnULeFS5EAF7CUnLMEfi0hFEiyOXSngT
72
+ BIPL2GKsvtliZvPS78ik2mfXyG0YJQiVM7hYyRV+AnudI0Pz/zjX2DvjM0s3jMeI
73
+ om+l3zpAZ4SmFDkKzhAvuxoSl2koH+VXm9QtsRFSZQwF3/K5l3Zx0yi1e16dMOWw
74
+ YPtMOiCbEausVW7wgzdoj+kCAwEAAQ==
75
+ -----END PUBLIC KEY-----`;
76
+ let date = new Date();
77
+ date.setHours(-1);
78
+ date.setMonth(date.getMonth() - 1);
79
+ const lastMonth = date.toISOString();
80
+ date.setMonth(date.getMonth() - 1);
81
+ const expiredDate = date.toISOString();
82
+ date = new Date();
83
+ date.setMonth(date.getMonth() + 1);
84
+ const newCreatedDate = date.toISOString();
85
+ date.setHours(date.getHours() + 1);
86
+ const newExpiredDate = date.toISOString();
87
+ const nocKPublicKeyExpired = {
88
+ id: 1,
89
+ algorithm: 'RSA256',
90
+ publicKey: nockPublicKey,
91
+ state: publicKey_1.PublicKeyState.EXPIRED,
92
+ createdAt: expiredDate,
93
+ expiresAt: lastMonth,
94
+ };
95
+ const nocKPublicKeyExpiredNotState = {
96
+ id: 2,
97
+ algorithm: 'RSA256',
98
+ publicKey: nockPublicKey,
99
+ state: publicKey_1.PublicKeyState.ACTIVE,
100
+ createdAt: expiredDate,
101
+ expiresAt: lastMonth,
102
+ };
103
+ const nocKPublicKeyRevoked = {
104
+ id: 3,
105
+ algorithm: 'RSA256',
106
+ publicKey: nockPublicKey,
107
+ state: publicKey_1.PublicKeyState.REVOKED,
108
+ createdAt: lastMonth,
109
+ expiresAt: newExpiredDate,
110
+ };
111
+ const nocKPublicKeyActiveOld = {
112
+ id: 4,
113
+ algorithm: 'RSA256',
114
+ publicKey: nockPublicKey,
115
+ state: publicKey_1.PublicKeyState.ACTIVE,
116
+ createdAt: lastMonth,
117
+ expiresAt: newExpiredDate,
118
+ };
119
+ const nocKPublicKeyActive = {
120
+ id: 5,
121
+ algorithm: 'RSA256',
122
+ publicKey: nockPublicKey,
123
+ state: publicKey_1.PublicKeyState.ACTIVE,
124
+ createdAt: newCreatedDate,
125
+ };
126
+ const nockListPublicKeys = {
127
+ paging: {
128
+ limit: 25,
129
+ offset: 0,
130
+ totalCount: 5,
131
+ },
132
+ items: [
133
+ nocKPublicKeyExpired,
134
+ nocKPublicKeyExpiredNotState,
135
+ nocKPublicKeyRevoked,
136
+ nocKPublicKeyActiveOld,
137
+ nocKPublicKeyActive,
138
+ ],
139
+ };
140
+ const regExpEscape = (s) => {
141
+ return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
142
+ };
143
+ const pathRegex = new RegExp(`${regExpEscape(configs_1.configs.getEndpoint())}(.*)`);
144
+ /**
145
+ * Tools to mock JWT
146
+ */
147
+ class JwtMock {
148
+ /**
149
+ * Return a public key from the mock db
150
+ */
151
+ getPublicKey(keyId) {
152
+ const key = nockListPublicKeys.items[keyId - 1];
153
+ return key;
154
+ }
155
+ /**
156
+ * Return the public keys from the mock db
157
+ */
158
+ getPublicKeys() {
159
+ return nockListPublicKeys.items;
160
+ }
161
+ /**
162
+ * Return the private keys from the mock db
163
+ */
164
+ getPrivateKey() {
165
+ return nockPrivateKey;
166
+ }
167
+ /**
168
+ * Flush the public keys in cache and add the mocked public keys
169
+ */
170
+ async mockPublicKeys(options) {
171
+ cachedPublicKeyRepository_1.cachedPublicKeyRepository.clearCache();
172
+ // Intercept request
173
+ if (!nock) {
174
+ // Note that we lazy-load the nock module
175
+ // until we really need it, to avoid patching
176
+ // the http module for nothing.
177
+ nock = require('nock');
178
+ }
179
+ nock(configs_1.configs.getHost(), options).get(pathRegex).once().reply(200, nockListPublicKeys);
180
+ await cachedPublicKeyRepository_1.cachedPublicKeyRepository.getAll();
181
+ }
182
+ /**
183
+ * Generate a fake JWT signed with the mocked keys
184
+ */
185
+ generateJwt(jwtProperties = {}) {
186
+ const jwtPayload = (0, lodash_1.defaults)(jwtProperties, {
187
+ accessToken: 'c9ba5a95-d7f9-41f9-9a24-a7e41882f7ef',
188
+ iss: 'jwt-mock',
189
+ // From Introspect
190
+ exp: Date.now() + 3600,
191
+ iat: Date.now(),
192
+ keyId: 5,
193
+ // From ClientInfo
194
+ displayName: 'Service Account',
195
+ aud: '@!4025.CA62.9BB6.16C5!0001!2212.0010!0008!2212.0010',
196
+ // From UserInfo
197
+ name: 'Guillaume Smaha',
198
+ sub: '@!4025.CA62.9BB6.16C5!0001!2212.0010!0000!0000.0001',
199
+ inum: '@!4025.CA62.9BB6.16C5!0001!2212.0010!0000!0000.0001',
200
+ userName: 'xsmahgu@ville.montreal.qc.ca',
201
+ givenName: 'Guillaume',
202
+ familyName: 'Smaha',
203
+ userType: '',
204
+ mtlIdentityId: '100-qwerty-azerty-dvorak',
205
+ });
206
+ const jwtSigned = jwt.sign(jwtPayload, nockPrivateKey, {
207
+ algorithm: 'RS256',
208
+ });
209
+ return jwtSigned;
210
+ }
211
+ /**
212
+ * Deletes all mocks and also clears the cache
213
+ */
214
+ cleanAll() {
215
+ nock.cleanAll();
216
+ cachedPublicKeyRepository_1.cachedPublicKeyRepository.clearCache();
217
+ }
218
+ }
219
+ exports.JwtMock = JwtMock;
220
+ exports.jwtMock = new JwtMock();
221
+ //# sourceMappingURL=jwtMock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jwtMock.js","sourceRoot":"","sources":["../../../src/utils/jwtMock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { ILogger } from '@villedemontreal/logger';
2
+ /**
3
+ * Creates a Logger.
4
+ */
5
+ export declare function createLogger(name: string): ILogger;
6
+ /**
7
+ * A Logger that uses a dummy cid provider.
8
+ *
9
+ * Only use this when running the tests!
10
+ */
11
+ export declare function getTestingLoggerCreator(): (name: string) => ILogger;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTestingLoggerCreator = exports.createLogger = void 0;
4
+ const logger_1 = require("@villedemontreal/logger");
5
+ const configs_1 = require("../config/configs");
6
+ let testingLoggerLibInitialised = false;
7
+ /**
8
+ * Creates a Logger.
9
+ */
10
+ function createLogger(name) {
11
+ // ==========================================
12
+ // We use a LazyLogger so the real Logger
13
+ // is only created when the first
14
+ // log is actually performed... At that point,
15
+ // our "configs.loggerCreator" configuration
16
+ // must have been set by the code using our library!
17
+ //
18
+ // This pattern allows calling code to import
19
+ // modules from us in which a logger is
20
+ // created in the global scope :
21
+ //
22
+ // let logger = createLogger('someName');
23
+ //
24
+ // Without a Lazy Logger, the library configurations
25
+ // would at that moment *not* have been set yet
26
+ // (by the calling code) and an Error would be thrown
27
+ // because the "configs.loggerCreator" is required.
28
+ // ==========================================
29
+ return new logger_1.LazyLogger(name, (nameArg) => {
30
+ return configs_1.configs.loggerCreator(nameArg);
31
+ });
32
+ }
33
+ exports.createLogger = createLogger;
34
+ function initTestingLoggerConfigs() {
35
+ const loggerConfig = new logger_1.LoggerConfigs(() => 'test-cid');
36
+ loggerConfig.setLogLevel(logger_1.LogLevel.DEBUG);
37
+ (0, logger_1.initLogger)(loggerConfig);
38
+ }
39
+ /**
40
+ * A Logger that uses a dummy cid provider.
41
+ *
42
+ * Only use this when running the tests!
43
+ */
44
+ function getTestingLoggerCreator() {
45
+ return (name) => {
46
+ if (!testingLoggerLibInitialised) {
47
+ initTestingLoggerConfigs();
48
+ testingLoggerLibInitialised = true;
49
+ }
50
+ return new logger_1.Logger(name);
51
+ };
52
+ }
53
+ exports.getTestingLoggerCreator = getTestingLoggerCreator;
54
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":";;;AAAA,oDAOiC;AACjC,+CAA4C;AAE5C,IAAI,2BAA2B,GAAG,KAAK,CAAC;AAExC;;GAEG;AACH,SAAgB,YAAY,CAAC,IAAY;IACvC,6CAA6C;IAC7C,yCAAyC;IACzC,iCAAiC;IACjC,8CAA8C;IAC9C,4CAA4C;IAC5C,oDAAoD;IACpD,EAAE;IACF,6CAA6C;IAC7C,uCAAuC;IACvC,gCAAgC;IAChC,EAAE;IACF,yCAAyC;IACzC,EAAE;IACF,oDAAoD;IACpD,+CAA+C;IAC/C,qDAAqD;IACrD,mDAAmD;IACnD,6CAA6C;IAC7C,OAAO,IAAI,mBAAU,CAAC,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE;QAC9C,OAAO,iBAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAtBD,oCAsBC;AAED,SAAS,wBAAwB;IAC/B,MAAM,YAAY,GAAkB,IAAI,sBAAa,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;IACxE,YAAY,CAAC,WAAW,CAAC,iBAAQ,CAAC,KAAK,CAAC,CAAC;IACzC,IAAA,mBAAU,EAAC,YAAY,CAAC,CAAC;AAC3B,CAAC;AAED;;;;GAIG;AACH,SAAgB,uBAAuB;IACrC,OAAO,CAAC,IAAY,EAAW,EAAE;QAC/B,IAAI,CAAC,2BAA2B,EAAE;YAChC,wBAAwB,EAAE,CAAC;YAC3B,2BAA2B,GAAG,IAAI,CAAC;SACpC;QAED,OAAO,IAAI,eAAM,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;AACJ,CAAC;AATD,0DASC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Call this when your need to set
3
+ * *Testing* configurations to the current
4
+ * library, without the need for a calling code
5
+ * to do so.
6
+ */
7
+ export declare function setTestingConfigurations(): void;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setTestingConfigurations = void 0;
4
+ const init_1 = require("../config/init");
5
+ const logger_1 = require("../utils/logger");
6
+ /**
7
+ * Call this when your need to set
8
+ * *Testing* configurations to the current
9
+ * library, without the need for a calling code
10
+ * to do so.
11
+ */
12
+ function setTestingConfigurations() {
13
+ (0, init_1.init)((0, logger_1.getTestingLoggerCreator)(), () => 'test-cid', 'https://api.dev.interne.montreal.ca');
14
+ }
15
+ exports.setTestingConfigurations = setTestingConfigurations;
16
+ //# sourceMappingURL=testingConfigurations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testingConfigurations.js","sourceRoot":"","sources":["../../../src/utils/testingConfigurations.ts"],"names":[],"mappings":";;;AAAA,yCAAsC;AACtC,4CAA0D;AAE1D;;;;;GAKG;AACH,SAAgB,wBAAwB;IACtC,IAAA,WAAI,EAAC,IAAA,gCAAuB,GAAE,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,qCAAqC,CAAC,CAAC;AAC3F,CAAC;AAFD,4DAEC"}