@webda/core 2.0.0-beta.2 → 2.0.0-beta.3

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 (117) hide show
  1. package/lib/application.d.ts +0 -16
  2. package/lib/application.js.map +1 -1
  3. package/lib/core.d.ts +26 -23
  4. package/lib/core.js +51 -39
  5. package/lib/core.js.map +1 -1
  6. package/lib/core.spec.js +21 -12
  7. package/lib/core.spec.js.map +1 -1
  8. package/lib/index.d.ts +3 -0
  9. package/lib/index.js +4 -0
  10. package/lib/index.js.map +1 -1
  11. package/lib/models/aclmodel.spec.js +1 -0
  12. package/lib/models/aclmodel.spec.js.map +1 -1
  13. package/lib/models/coremodel.d.ts +6 -3
  14. package/lib/models/coremodel.js.map +1 -1
  15. package/lib/models/ownermodel.js +1 -1
  16. package/lib/models/ownermodel.js.map +1 -1
  17. package/lib/models/ownermodel.spec.js +15 -13
  18. package/lib/models/ownermodel.spec.js.map +1 -1
  19. package/lib/models/rolemodel.d.ts +1 -1
  20. package/lib/models/rolemodel.spec.js +2 -0
  21. package/lib/models/rolemodel.spec.js.map +1 -1
  22. package/lib/queues/queueservice.d.ts +1 -1
  23. package/lib/queues/queueservice.js +1 -0
  24. package/lib/queues/queueservice.js.map +1 -1
  25. package/lib/services/authentication.d.ts +6 -7
  26. package/lib/services/authentication.js +12 -18
  27. package/lib/services/authentication.js.map +1 -1
  28. package/lib/services/authentication.spec.js +15 -15
  29. package/lib/services/authentication.spec.js.map +1 -1
  30. package/lib/services/binary.d.ts +1 -1
  31. package/lib/services/binary.js +1 -0
  32. package/lib/services/binary.js.map +1 -1
  33. package/lib/services/configuration.d.ts +5 -2
  34. package/lib/services/configuration.js +2 -0
  35. package/lib/services/configuration.js.map +1 -1
  36. package/lib/services/cryptoservice.d.ts +253 -0
  37. package/lib/services/cryptoservice.js +346 -0
  38. package/lib/services/cryptoservice.js.map +1 -0
  39. package/lib/services/cryptoservice.spec.d.ts +1 -0
  40. package/lib/services/cryptoservice.spec.js +164 -0
  41. package/lib/services/cryptoservice.spec.js.map +1 -0
  42. package/lib/services/filebinary.d.ts +6 -1
  43. package/lib/services/filebinary.js +18 -7
  44. package/lib/services/filebinary.js.map +1 -1
  45. package/lib/services/filebinary.spec.js +3 -4
  46. package/lib/services/filebinary.spec.js.map +1 -1
  47. package/lib/services/fileconfiguration.d.ts +1 -1
  48. package/lib/services/fileconfiguration.js +1 -0
  49. package/lib/services/fileconfiguration.js.map +1 -1
  50. package/lib/services/invitationservice.d.ts +2 -2
  51. package/lib/services/invitationservice.js +2 -0
  52. package/lib/services/invitationservice.js.map +1 -1
  53. package/lib/services/invitationservice.spec.js +1 -1
  54. package/lib/services/invitationservice.spec.js.map +1 -1
  55. package/lib/services/kubernetesconfiguration.d.ts +1 -1
  56. package/lib/services/kubernetesconfiguration.js +1 -0
  57. package/lib/services/kubernetesconfiguration.js.map +1 -1
  58. package/lib/services/notificationservice.d.ts +1 -1
  59. package/lib/services/notificationservice.js +2 -0
  60. package/lib/services/notificationservice.js.map +1 -1
  61. package/lib/services/oauth.d.ts +28 -2
  62. package/lib/services/oauth.js +18 -8
  63. package/lib/services/oauth.js.map +1 -1
  64. package/lib/services/oauth.spec.js +19 -13
  65. package/lib/services/oauth.spec.js.map +1 -1
  66. package/lib/services/proxy.d.ts +78 -0
  67. package/lib/services/proxy.js +139 -0
  68. package/lib/services/proxy.js.map +1 -0
  69. package/lib/services/proxy.spec.d.ts +1 -0
  70. package/lib/services/proxy.spec.js +78 -0
  71. package/lib/services/proxy.spec.js.map +1 -0
  72. package/lib/services/service.d.ts +3 -3
  73. package/lib/services/service.js +2 -0
  74. package/lib/services/service.js.map +1 -1
  75. package/lib/stores/aggregator.d.ts +1 -1
  76. package/lib/stores/aggregator.js +1 -0
  77. package/lib/stores/aggregator.js.map +1 -1
  78. package/lib/stores/mapper.d.ts +1 -1
  79. package/lib/stores/mapper.js +1 -0
  80. package/lib/stores/mapper.js.map +1 -1
  81. package/lib/stores/memory.d.ts +64 -3
  82. package/lib/stores/memory.js +85 -1
  83. package/lib/stores/memory.js.map +1 -1
  84. package/lib/stores/memory.spec.d.ts +1 -0
  85. package/lib/stores/memory.spec.js +43 -0
  86. package/lib/stores/memory.spec.js.map +1 -1
  87. package/lib/stores/store.d.ts +14 -0
  88. package/lib/stores/store.js +33 -0
  89. package/lib/stores/store.js.map +1 -1
  90. package/lib/stores/store.spec.d.ts +1 -0
  91. package/lib/stores/store.spec.js +25 -0
  92. package/lib/stores/store.spec.js.map +1 -1
  93. package/lib/test.js +8 -1
  94. package/lib/test.js.map +1 -1
  95. package/lib/unpackedapplication.js +2 -2
  96. package/lib/unpackedapplication.js.map +1 -1
  97. package/lib/utils/context.d.ts +55 -25
  98. package/lib/utils/context.js +54 -40
  99. package/lib/utils/context.js.map +1 -1
  100. package/lib/utils/context.spec.js +27 -12
  101. package/lib/utils/context.spec.js.map +1 -1
  102. package/lib/utils/cookie.d.ts +65 -44
  103. package/lib/utils/cookie.js +75 -145
  104. package/lib/utils/cookie.js.map +1 -1
  105. package/lib/utils/cookie.spec.js +199 -195
  106. package/lib/utils/cookie.spec.js.map +1 -1
  107. package/lib/utils/httpcontext.js +2 -2
  108. package/lib/utils/httpcontext.js.map +1 -1
  109. package/lib/utils/session.d.ts +120 -0
  110. package/lib/utils/session.js +177 -0
  111. package/lib/utils/session.js.map +1 -0
  112. package/lib/utils/session.spec.d.ts +1 -0
  113. package/lib/utils/session.spec.js +79 -0
  114. package/lib/utils/session.spec.js.map +1 -0
  115. package/package.json +9 -6
  116. package/test/config.json +2 -1
  117. package/webda.module.json +3 -2
@@ -0,0 +1,346 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10
+ return new (P || (P = Promise))(function (resolve, reject) {
11
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
12
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15
+ });
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.CryptoService = exports.CryptoServiceParameters = void 0;
19
+ const crypto_1 = require("crypto");
20
+ const jwt = require("jsonwebtoken");
21
+ const pem_jwk_1 = require("pem-jwk");
22
+ const serializers_1 = require("../utils/serializers");
23
+ const service_1 = require("./service");
24
+ class CryptoServiceParameters extends service_1.ServiceParameters {
25
+ constructor(params) {
26
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
27
+ var _p, _q, _r, _s, _t, _u, _v, _w;
28
+ super(params);
29
+ (_a = this.symetricKeyLength) !== null && _a !== void 0 ? _a : (this.symetricKeyLength = 256);
30
+ (_b = this.symetricCipher) !== null && _b !== void 0 ? _b : (this.symetricCipher = "aes-256-ctr");
31
+ (_c = this.asymetricType) !== null && _c !== void 0 ? _c : (this.asymetricType = "rsa");
32
+ (_d = this.asymetricOptions) !== null && _d !== void 0 ? _d : (this.asymetricOptions = {});
33
+ (_e = (_p = this.asymetricOptions).modulusLength) !== null && _e !== void 0 ? _e : (_p.modulusLength = 2048);
34
+ (_f = (_q = this.asymetricOptions).privateKeyEncoding) !== null && _f !== void 0 ? _f : (_q.privateKeyEncoding = {});
35
+ (_g = (_r = this.asymetricOptions.privateKeyEncoding).format) !== null && _g !== void 0 ? _g : (_r.format = "pem");
36
+ (_h = (_s = this.asymetricOptions.privateKeyEncoding).type) !== null && _h !== void 0 ? _h : (_s.type = "pkcs8");
37
+ (_j = (_t = this.asymetricOptions).publicKeyEncoding) !== null && _j !== void 0 ? _j : (_t.publicKeyEncoding = {});
38
+ (_k = (_u = this.asymetricOptions.publicKeyEncoding).format) !== null && _k !== void 0 ? _k : (_u.format = "pem");
39
+ (_l = (_v = this.asymetricOptions.publicKeyEncoding).type) !== null && _l !== void 0 ? _l : (_v.type = "spki");
40
+ (_m = this.jwt) !== null && _m !== void 0 ? _m : (this.jwt = {});
41
+ (_o = (_w = this.jwt).algorithm) !== null && _o !== void 0 ? _o : (_w.algorithm = "HS256");
42
+ }
43
+ }
44
+ exports.CryptoServiceParameters = CryptoServiceParameters;
45
+ /**
46
+ * @WebdaModda
47
+ */
48
+ class CryptoService extends service_1.Service {
49
+ constructor() {
50
+ super(...arguments);
51
+ /**
52
+ * JWKS cache
53
+ */
54
+ this.jwks = {};
55
+ }
56
+ /**
57
+ * @override
58
+ */
59
+ loadParameters(params) {
60
+ return new CryptoServiceParameters(params);
61
+ }
62
+ /**
63
+ * @override
64
+ */
65
+ init() {
66
+ const _super = Object.create(null, {
67
+ init: { get: () => super.init }
68
+ });
69
+ return __awaiter(this, void 0, void 0, function* () {
70
+ yield _super.init.call(this);
71
+ // Load keys
72
+ if (!(yield this.load()) && this.parameters.autoRotate) {
73
+ yield this.rotate();
74
+ }
75
+ if (this.parameters.expose) {
76
+ this.addRoute(this.parameters.expose, ["GET"], this.serveJWKS);
77
+ }
78
+ return this;
79
+ });
80
+ }
81
+ /**
82
+ *
83
+ */
84
+ serveJWKS(context) {
85
+ return __awaiter(this, void 0, void 0, function* () {
86
+ context.write({
87
+ keys: Object.keys(this.keys).map(k => {
88
+ if (!this.jwks[k]) {
89
+ /*
90
+ when Node >= 16
91
+ this.jwks[k] = createPublicKey(this.keys[k].publicKey).export({ format: "jwk" });
92
+ and remove pem-jwk
93
+ */
94
+ this.jwks[k] = (0, pem_jwk_1.pem2jwk)(this.keys[k].publicKey);
95
+ }
96
+ return {
97
+ kty: "RSA",
98
+ kid: k,
99
+ n: this.jwks[k].n,
100
+ e: this.jwks[k].e
101
+ };
102
+ })
103
+ });
104
+ });
105
+ }
106
+ /**
107
+ * Load keys from registry
108
+ */
109
+ load() {
110
+ return __awaiter(this, void 0, void 0, function* () {
111
+ let load = yield this.registry.get("keys");
112
+ if (!load) {
113
+ return false;
114
+ }
115
+ this.keys = {};
116
+ Object.keys(load)
117
+ .filter(k => k.startsWith("key_"))
118
+ .forEach(k => {
119
+ this.keys[k.substring(4)] = load[k];
120
+ });
121
+ this.current = load.current.startsWith("init-") ? undefined : load.current;
122
+ this.age = parseInt(this.current, 36);
123
+ return true;
124
+ });
125
+ }
126
+ /**
127
+ * Generate asymetric key
128
+ * @returns
129
+ */
130
+ generateAsymetricKeys() {
131
+ const { publicKey, privateKey } = (0, crypto_1.generateKeyPairSync)(
132
+ // @ts-ignore
133
+ this.parameters.asymetricType, this.parameters.asymetricOptions);
134
+ return { publicKey, privateKey };
135
+ }
136
+ /**
137
+ * Generate symetric key
138
+ * @returns
139
+ */
140
+ generateSymetricKey() {
141
+ return (0, crypto_1.randomBytes)(this.parameters.symetricKeyLength / 8).toString("base64");
142
+ }
143
+ /**
144
+ * Return current key set
145
+ */
146
+ getCurrentKeys() {
147
+ return __awaiter(this, void 0, void 0, function* () {
148
+ if (!this.keys || !this.current || !this.keys[this.current]) {
149
+ throw new Error("CryptoService not initialized");
150
+ }
151
+ return { keys: this.keys[this.current], id: this.current };
152
+ });
153
+ }
154
+ /**
155
+ * Retrieve a HMAC for a string
156
+ * @param data
157
+ * @param keyId to use
158
+ * @returns
159
+ */
160
+ hmac(data, keyId) {
161
+ return __awaiter(this, void 0, void 0, function* () {
162
+ if (typeof data !== "string") {
163
+ data = serializers_1.JSONUtils.stringify(data);
164
+ }
165
+ let key = keyId ? { id: keyId, keys: this.keys[keyId] } : yield this.getCurrentKeys();
166
+ return key.id + "." + (0, crypto_1.createHmac)("sha256", key.keys.symetric).update(data).digest("hex");
167
+ });
168
+ }
169
+ /**
170
+ * Verify a HMAC for a string
171
+ * @param data
172
+ * @returns
173
+ */
174
+ hmacVerify(data, hmac) {
175
+ return __awaiter(this, void 0, void 0, function* () {
176
+ if (typeof data !== "string") {
177
+ data = serializers_1.JSONUtils.stringify(data);
178
+ }
179
+ let [keyId, mac] = hmac.split(".");
180
+ if (!(yield this.checkKey(keyId))) {
181
+ return false;
182
+ }
183
+ return (0, crypto_1.createHmac)("sha256", this.keys[keyId].symetric).update(data).digest("hex") === mac;
184
+ });
185
+ }
186
+ /**
187
+ * JWT token generation
188
+ */
189
+ jwtSign(data, options) {
190
+ return __awaiter(this, void 0, void 0, function* () {
191
+ let res = Object.assign(Object.assign({}, this.parameters.jwt), options);
192
+ let key = res.secretOrPublicKey;
193
+ // Default to our current private key
194
+ if (!res.secretOrPublicKey) {
195
+ let keyInfo = yield this.getCurrentKeys();
196
+ // Depending on the algo fallback to the right key
197
+ if (res.algorithm.startsWith("HS")) {
198
+ key = keyInfo.keys.symetric;
199
+ res.keyid = "S" + keyInfo.id;
200
+ }
201
+ else {
202
+ key = keyInfo.keys.privateKey;
203
+ res.keyid = "A" + keyInfo.id;
204
+ }
205
+ }
206
+ delete res.secretOrPublicKey;
207
+ return jwt.sign(data, key, res);
208
+ });
209
+ }
210
+ /**
211
+ *
212
+ * @param keyId
213
+ * @returns
214
+ */
215
+ checkKey(keyId) {
216
+ return __awaiter(this, void 0, void 0, function* () {
217
+ if (!this.keys[keyId]) {
218
+ // Key is more recent than current one so try to reload
219
+ if (parseInt(keyId, 36) > this.age) {
220
+ yield this.load();
221
+ }
222
+ // Key is still not found
223
+ if (!this.keys[keyId]) {
224
+ return false;
225
+ }
226
+ }
227
+ return true;
228
+ });
229
+ }
230
+ /**
231
+ * Get JWT key based on kid
232
+ */
233
+ getJWTKey(header, callback) {
234
+ return __awaiter(this, void 0, void 0, function* () {
235
+ if (!header.kid) {
236
+ callback(new Error("Unknown key"));
237
+ return;
238
+ }
239
+ let keyId = header.kid.substring(1);
240
+ if (!(yield this.checkKey(keyId))) {
241
+ callback(new Error("Unknown key"));
242
+ return;
243
+ }
244
+ // Check first letter that define Symetric or Asymetric
245
+ if (header.kid.startsWith("S")) {
246
+ callback(null, this.keys[keyId].symetric);
247
+ }
248
+ else if (header.kid.startsWith("A")) {
249
+ callback(null, this.keys[keyId].publicKey);
250
+ }
251
+ else {
252
+ callback(new Error("Unknown key"));
253
+ }
254
+ });
255
+ }
256
+ /**
257
+ * JWT token verification
258
+ */
259
+ jwtVerify(token, options) {
260
+ return __awaiter(this, void 0, void 0, function* () {
261
+ return new Promise((resolve, reject) => {
262
+ jwt.verify(token, (options === null || options === void 0 ? void 0 : options.secretOrPublicKey) || this.getJWTKey.bind(this), Object.assign(Object.assign({}, options), { secretOrPublicKey: undefined }), (err, result) => {
263
+ if (err) {
264
+ reject(err);
265
+ }
266
+ else {
267
+ resolve(result);
268
+ }
269
+ });
270
+ });
271
+ });
272
+ }
273
+ /**
274
+ * Encrypt data
275
+ */
276
+ encrypt(data) {
277
+ return __awaiter(this, void 0, void 0, function* () {
278
+ let key = yield this.getCurrentKeys();
279
+ // Initialization Vector
280
+ let iv = (0, crypto_1.randomBytes)(16);
281
+ let cipher = (0, crypto_1.createCipheriv)(this.parameters.symetricCipher, Buffer.from(key.keys.symetric, "base64"), iv);
282
+ let encrypted = Buffer.concat([iv, cipher.update(Buffer.from(JSON.stringify(data))), cipher.final()]).toString("base64");
283
+ return this.jwtSign(encrypted, { keyid: `S${key.id}`, secretOrPublicKey: key.keys.symetric });
284
+ });
285
+ }
286
+ /**
287
+ * Parse the JWT header section
288
+ */
289
+ getJWTHeader(token) {
290
+ return JSON.parse(Buffer.from(token.split(".")[0], "base64").toString());
291
+ }
292
+ /**
293
+ * Decrypt data
294
+ */
295
+ decrypt(token) {
296
+ return __awaiter(this, void 0, void 0, function* () {
297
+ let input = Buffer.from(yield this.jwtVerify(token), "base64");
298
+ let header = this.getJWTHeader(token);
299
+ let iv = input.slice(0, 16);
300
+ let decipher = (0, crypto_1.createDecipheriv)(this.parameters.symetricCipher, Buffer.from(this.keys[header.kid.substring(1)].symetric, "base64"), iv);
301
+ return JSON.parse(decipher.update(input.slice(16)).toString() + decipher.final().toString());
302
+ });
303
+ }
304
+ /**
305
+ * Get next id
306
+ */
307
+ getNextId() {
308
+ // Should be good for years as 8char
309
+ let age = Math.floor(Date.now() / 1000);
310
+ return { age, id: age.toString(36) };
311
+ }
312
+ /**
313
+ * Rotate keys
314
+ */
315
+ rotate() {
316
+ var _a;
317
+ return __awaiter(this, void 0, void 0, function* () {
318
+ const { age, id } = this.getNextId();
319
+ let next = {
320
+ current: id,
321
+ rotationInstance: this.getWebda().getInstanceId()
322
+ };
323
+ next[`key_${id}`] = Object.assign(Object.assign({}, this.generateAsymetricKeys()), { symetric: this.generateSymetricKey() });
324
+ if (!(yield this.registry.exists("keys"))) {
325
+ this.current = `init-${this.getWebda().getInstanceId()}`;
326
+ yield this.registry.put("keys", { current: this.current });
327
+ }
328
+ if (yield this.registry.conditionalPatch("keys", next, "current", this.current)) {
329
+ (_a = this.keys) !== null && _a !== void 0 ? _a : (this.keys = {});
330
+ this.keys[id] = next[`key_${id}`];
331
+ this.current = id;
332
+ this.age = age;
333
+ }
334
+ else {
335
+ // Reload as something else has modified
336
+ yield this.load();
337
+ }
338
+ });
339
+ }
340
+ }
341
+ __decorate([
342
+ (0, service_1.Inject)("Registry")
343
+ ], CryptoService.prototype, "registry", void 0);
344
+ exports.default = CryptoService;
345
+ exports.CryptoService = CryptoService;
346
+ //# sourceMappingURL=cryptoservice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cryptoservice.js","sourceRoot":"","sources":["../../src/services/cryptoservice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,164 @@
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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10
+ return new (P || (P = Promise))(function (resolve, reject) {
11
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
12
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15
+ });
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ const mocha_1 = require("@testdeck/mocha");
19
+ const assert = require("assert");
20
+ const jwt = require("jsonwebtoken");
21
+ const sinon = require("sinon");
22
+ const test_1 = require("../test");
23
+ const serializers_1 = require("../utils/serializers");
24
+ /**
25
+ *
26
+ */
27
+ let CryptoServiceTest = class CryptoServiceTest extends test_1.WebdaTest {
28
+ hmac() {
29
+ return __awaiter(this, void 0, void 0, function* () {
30
+ let hmac = yield this.webda.getCrypto().hmac({ test: "plop" });
31
+ let hmacString = yield this.webda.getCrypto().hmac(serializers_1.JSONUtils.stringify({ test: "plop" }));
32
+ assert.strictEqual(hmac, hmacString);
33
+ yield this.webda.getCrypto().hmacVerify({ test: "plop" }, hmac);
34
+ yield this.webda.getCrypto().hmacVerify(serializers_1.JSONUtils.stringify({ test: "plop" }), hmac);
35
+ });
36
+ }
37
+ encryption() {
38
+ return __awaiter(this, void 0, void 0, function* () {
39
+ let encrypted = yield this.webda.getCrypto().encrypt({ test: "plop" });
40
+ let decrypted = yield this.webda.getCrypto().decrypt(encrypted);
41
+ assert.strictEqual(decrypted.test, "plop");
42
+ });
43
+ }
44
+ rotate() {
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ const crypto = this.webda.getCrypto();
47
+ let encrypted = yield crypto.encrypt({ test: "plop" });
48
+ let oldKey = crypto.current;
49
+ let hmac = yield crypto.hmac({ test: "plop" });
50
+ sinon.stub(crypto, "getNextId").callsFake(this.nextIdStub(crypto));
51
+ yield crypto.rotate();
52
+ let decrypted = yield crypto.decrypt(encrypted);
53
+ assert.strictEqual(decrypted.test, "plop");
54
+ yield crypto.hmacVerify({ test: "plop" }, hmac);
55
+ assert.strictEqual(yield crypto.hmac({ test: "plop" }, oldKey), hmac);
56
+ });
57
+ }
58
+ failedRotation() {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ // Check failed rotate
61
+ yield this.webda.getRegistry().patch({ uuid: "keys", current: "123" });
62
+ yield this.webda.getCrypto().rotate();
63
+ });
64
+ }
65
+ /**
66
+ * Increment by one every time
67
+ */
68
+ nextIdStub(crypto) {
69
+ return () => {
70
+ let age = parseInt(crypto.current, 36) + 10;
71
+ return {
72
+ id: age.toString(36),
73
+ age
74
+ };
75
+ };
76
+ }
77
+ jwks() {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ const crypto = this.webda.getCrypto();
80
+ crypto.getParameters().expose = "/jwk";
81
+ yield crypto.init();
82
+ let ctx = yield this.newContext();
83
+ yield this.execute(ctx, "test.webda.io", "GET", "/jwk");
84
+ let body = JSON.parse(ctx.getResponseBody());
85
+ sinon.stub(crypto, "getNextId").callsFake(this.nextIdStub(crypto));
86
+ assert.strictEqual(body.keys.length, 1);
87
+ yield crypto.rotate();
88
+ yield this.execute(ctx, "test.webda.io", "GET", "/jwk");
89
+ body = JSON.parse(ctx.getResponseBody());
90
+ assert.strictEqual(body.keys.length, 2);
91
+ });
92
+ }
93
+ unknownKeys() {
94
+ return __awaiter(this, void 0, void 0, function* () {
95
+ const crypto = this.webda.getCrypto();
96
+ // Custom made JWT
97
+ let jwtToken = jwt.sign("TEST", "test");
98
+ yield assert.rejects(() => crypto.jwtVerify(jwtToken), /Unknown key/);
99
+ jwtToken = jwt.sign("TEST", "test", { keyid: "B" + crypto.current });
100
+ yield assert.rejects(() => crypto.jwtVerify(jwtToken), /Unknown key/);
101
+ assert.ok(!(yield crypto.hmacVerify("mydata", "md.ss")));
102
+ let oldKey = crypto.current;
103
+ sinon.stub(crypto, "getNextId").callsFake(this.nextIdStub(crypto));
104
+ yield crypto.rotate();
105
+ let encrypted = yield this.webda.getCrypto().encrypt({ test: "plop" });
106
+ delete crypto.keys[crypto.current];
107
+ crypto.current = oldKey;
108
+ crypto.age = parseInt(oldKey, 36); // It should be reloaded
109
+ assert.strictEqual((yield this.webda.getCrypto().decrypt(encrypted)).test, "plop");
110
+ // Remove again but remove it from the registry now
111
+ yield this.webda.getRegistry().removeAttribute("keys", `key_${crypto.current}`);
112
+ delete crypto.keys[crypto.current];
113
+ crypto.current = oldKey;
114
+ crypto.age = parseInt(oldKey, 36);
115
+ yield assert.rejects(() => this.webda.getCrypto().decrypt(encrypted), /err/);
116
+ });
117
+ }
118
+ jwt() {
119
+ return __awaiter(this, void 0, void 0, function* () {
120
+ // Test asymetric JWT
121
+ const crypto = this.webda.getCrypto();
122
+ let token = yield crypto.jwtSign("plop", { algorithm: "PS256" });
123
+ assert.strictEqual(yield crypto.jwtVerify(token), "plop");
124
+ token = yield crypto.jwtSign("plop");
125
+ assert.strictEqual(yield crypto.jwtVerify(token), "plop");
126
+ token = yield crypto.jwtSign("plop", { algorithm: "HS256" });
127
+ assert.strictEqual(yield crypto.jwtVerify(token), "plop");
128
+ });
129
+ }
130
+ cov() {
131
+ return __awaiter(this, void 0, void 0, function* () {
132
+ this.webda.getCrypto().keys = undefined;
133
+ yield assert.rejects(() => this.webda.getCrypto().getCurrentKeys(), /not initialized/);
134
+ });
135
+ }
136
+ };
137
+ __decorate([
138
+ mocha_1.test
139
+ ], CryptoServiceTest.prototype, "hmac", null);
140
+ __decorate([
141
+ mocha_1.test
142
+ ], CryptoServiceTest.prototype, "encryption", null);
143
+ __decorate([
144
+ mocha_1.test
145
+ ], CryptoServiceTest.prototype, "rotate", null);
146
+ __decorate([
147
+ mocha_1.test
148
+ ], CryptoServiceTest.prototype, "failedRotation", null);
149
+ __decorate([
150
+ mocha_1.test
151
+ ], CryptoServiceTest.prototype, "jwks", null);
152
+ __decorate([
153
+ mocha_1.test
154
+ ], CryptoServiceTest.prototype, "unknownKeys", null);
155
+ __decorate([
156
+ mocha_1.test
157
+ ], CryptoServiceTest.prototype, "jwt", null);
158
+ __decorate([
159
+ mocha_1.test
160
+ ], CryptoServiceTest.prototype, "cov", null);
161
+ CryptoServiceTest = __decorate([
162
+ mocha_1.suite
163
+ ], CryptoServiceTest);
164
+ //# sourceMappingURL=cryptoservice.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cryptoservice.spec.js","sourceRoot":"","sources":["../../src/services/cryptoservice.spec.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { Readable } from "stream";
3
3
  import { CloudBinary, CloudBinaryParameters, CoreModel } from "..";
4
4
  import { Context } from "../utils/context";
5
5
  import { Binary, BinaryFile, BinaryMap } from "./binary";
6
+ import CryptoService from "./cryptoservice";
6
7
  import { ServiceParameters } from "./service";
7
8
  export declare class FileBinaryParameters extends CloudBinaryParameters {
8
9
  /**
@@ -32,6 +33,10 @@ export declare class FileBinaryParameters extends CloudBinaryParameters {
32
33
  * @WebdaModda
33
34
  */
34
35
  export declare class FileBinary<T extends FileBinaryParameters = FileBinaryParameters> extends CloudBinary<T> {
36
+ /**
37
+ * Used for hmac
38
+ */
39
+ cryptoService: CryptoService;
35
40
  /**
36
41
  * Load parameters
37
42
  *
@@ -69,7 +74,7 @@ export declare class FileBinary<T extends FileBinaryParameters = FileBinaryParam
69
74
  * @param ctx
70
75
  * @param expiresIn
71
76
  */
72
- getToken(hash: string, method: "PUT" | "GET", expiresIn?: number): any;
77
+ getToken(hash: string, method: "PUT" | "GET", expiresIn?: number): Promise<string>;
73
78
  /**
74
79
  * Get put URL
75
80
  * @param ctx
@@ -1,4 +1,10 @@
1
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
+ };
2
8
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
9
  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
10
  return new (P || (P = Promise))(function (resolve, reject) {
@@ -11,10 +17,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
11
17
  Object.defineProperty(exports, "__esModule", { value: true });
12
18
  exports.FileBinary = exports.FileBinaryParameters = void 0;
13
19
  const fs = require("fs");
14
- const jwt = require("jsonwebtoken");
15
20
  const path_1 = require("path");
16
21
  const __1 = require("..");
17
22
  const binary_1 = require("./binary");
23
+ const service_1 = require("./service");
18
24
  class FileBinaryParameters extends __1.CloudBinaryParameters {
19
25
  constructor(params, service) {
20
26
  var _a;
@@ -114,7 +120,7 @@ class FileBinary extends __1.CloudBinary {
114
120
  const { hash } = ctx.getPathParameters();
115
121
  // Verify token
116
122
  try {
117
- let dt = jwt.verify(ctx.parameter("token"), this.getWebda().getSecret());
123
+ let dt = yield this.cryptoService.jwtVerify(ctx.parameter("token"));
118
124
  if (dt.hash !== hash) {
119
125
  throw 403;
120
126
  }
@@ -153,7 +159,7 @@ class FileBinary extends __1.CloudBinary {
153
159
  return __awaiter(this, void 0, void 0, function* () {
154
160
  return `${context
155
161
  .getHttpContext()
156
- .getAbsoluteUrl(this.parameters.expose.url + "/download/data/" + map.hash)}?token=${this.getToken(map.hash, "GET", expires)}&content-type=${map.mimetype}&content-disposition=attachment`;
162
+ .getAbsoluteUrl(this.parameters.expose.url + "/download/data/" + map.hash)}?token=${yield this.getToken(map.hash, "GET", expires)}&content-type=${map.mimetype}&content-disposition=attachment`;
157
163
  });
158
164
  }
159
165
  /**
@@ -184,8 +190,10 @@ class FileBinary extends __1.CloudBinary {
184
190
  * @param expiresIn
185
191
  */
186
192
  getToken(hash, method, expiresIn = 60) {
187
- return jwt.sign({ hash, method }, this.getWebda().getSecret(), {
188
- expiresIn
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ return this.cryptoService.jwtSign({ hash, method }, {
195
+ expiresIn
196
+ });
189
197
  });
190
198
  }
191
199
  /**
@@ -198,7 +206,7 @@ class FileBinary extends __1.CloudBinary {
198
206
  let body = yield ctx.getRequestBody();
199
207
  // Get a full URL, this method should be in a Route Object
200
208
  // Add a JWT token for 60s
201
- let token = this.getToken(body.hash, "PUT");
209
+ let token = yield this.getToken(body.hash, "PUT");
202
210
  return ctx
203
211
  .getHttpContext()
204
212
  .getAbsoluteUrl(this.parameters.expose.url + "/upload/data/" + body.hash + `?token=${token}`);
@@ -262,7 +270,7 @@ class FileBinary extends __1.CloudBinary {
262
270
  }
263
271
  // Verify token
264
272
  try {
265
- let dt = jwt.verify(ctx.parameter("token"), this.getWebda().getSecret());
273
+ let dt = yield this.cryptoService.jwtVerify(ctx.parameter("token"));
266
274
  if (dt.hash !== result.hash) {
267
275
  this.log("WARN", "JWT hash differ", ctx.parameter("hash"), "!==", result.hash);
268
276
  throw 403;
@@ -395,5 +403,8 @@ class FileBinary extends __1.CloudBinary {
395
403
  });
396
404
  }
397
405
  }
406
+ __decorate([
407
+ (0, service_1.Inject)("CryptoService")
408
+ ], FileBinary.prototype, "cryptoService", void 0);
398
409
  exports.FileBinary = FileBinary;
399
410
  //# sourceMappingURL=filebinary.js.map