@wireapp/core 42.3.4 → 42.4.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/lib/Account.js CHANGED
@@ -209,7 +209,7 @@ class Account extends TypedEventEmitter_1.TypedEventEmitter {
209
209
  // initialize schedulers for pending mls proposals once client is initialized
210
210
  await this.service.mls.checkExistingPendingProposals();
211
211
  // initialize scheduler for syncing key packages with backend
212
- this.service.mls.checkForKeyPackagesBackendSync();
212
+ this.service.mls.schedulePeriodicKeyPackagesBackendSync(validClient.id);
213
213
  // leave stale conference subconversations (e.g after a crash)
214
214
  await this.service.mls.leaveStaleConferenceSubconversations();
215
215
  }
@@ -407,7 +407,7 @@ class ConversationService extends TypedEventEmitter_1.TypedEventEmitter {
407
407
  }
408
408
  }
409
409
  async handleMLSWelcomeMessageEvent(event) {
410
- return this.mlsService.handleMLSWelcomeMessageEvent(event);
410
+ return this.mlsService.handleMLSWelcomeMessageEvent(event, this.apiClient.validatedClientId);
411
411
  }
412
412
  async handleOtrMessageAddEvent(event) {
413
413
  return this.proteusService.handleOtrMessageAddEvent(event);
@@ -154,11 +154,18 @@ export declare class MLSService extends TypedEventEmitter<Events> {
154
154
  */
155
155
  schedulePeriodicKeyMaterialRenewals(groupIds: string[]): void;
156
156
  /**
157
- * Get date of last key packages count query and schedule a task to sync it with backend
157
+ * Schedules a task to periodically (every 24h) check if new key packages should be generated and uploaded to backend.
158
158
  * Function must only be called once, after application start
159
+ * @param clientId id of the client
159
160
  */
160
- checkForKeyPackagesBackendSync(): void;
161
- private syncKeyPackages;
161
+ schedulePeriodicKeyPackagesBackendSync(clientId: string): void;
162
+ /**
163
+ * Checks if there are enough key packages locally and if not,
164
+ * checks the number of keys available on backend and (if needed) generates new keys and uploads them.
165
+ * @param clientId id of the client
166
+ */
167
+ private verifyLocalMLSKeyPackagesAmount;
168
+ private verifyRemoteMLSKeyPackagesAmount;
162
169
  private getRemoteMLSKeyPackageCount;
163
170
  /**
164
171
  * Will update the given client on backend with its public key.
@@ -209,7 +216,7 @@ export declare class MLSService extends TypedEventEmitter<Events> {
209
216
  domain: string;
210
217
  }[]>;
211
218
  handleMLSMessageAddEvent(event: ConversationMLSMessageAddEvent): Promise<import("../../../notification").HandledEventPayload | undefined>;
212
- handleMLSWelcomeMessageEvent(event: ConversationMLSWelcomeEvent): Promise<import("../../../notification").HandledEventPayload>;
219
+ handleMLSWelcomeMessageEvent(event: ConversationMLSWelcomeEvent, clientId: string): Promise<import("../../../notification").HandledEventPayload>;
213
220
  }
214
221
  export {};
215
222
  //# sourceMappingURL=MLSService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MLSService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/mls/MLSService/MLSService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MLSService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/mls/MLSService/MLSService.ts"],"names":[],"mappings":"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"}
@@ -82,7 +82,7 @@ class MLSService extends TypedEventEmitter_1.TypedEventEmitter {
82
82
  await this.coreCryptoClient.mlsInit(this.textEncoder.encode(qualifiedClientId), [this.config.defaultCiphersuite]);
83
83
  // We need to make sure keypackages and public key are uploaded to the backend
84
84
  await this.uploadMLSPublicKeys(client);
85
- await this.uploadMLSKeyPackages(client.id);
85
+ await this.verifyRemoteMLSKeyPackagesAmount(client.id);
86
86
  }
87
87
  async uploadCommitBundle(groupId, commitBundle, { regenerateCommitBundle, isExternalCommit } = {}) {
88
88
  const { commit, groupInfo, welcome } = commitBundle;
@@ -451,23 +451,37 @@ class MLSService extends TypedEventEmitter_1.TypedEventEmitter {
451
451
  }
452
452
  }
453
453
  /**
454
- * Get date of last key packages count query and schedule a task to sync it with backend
454
+ * Schedules a task to periodically (every 24h) check if new key packages should be generated and uploaded to backend.
455
455
  * Function must only be called once, after application start
456
+ * @param clientId id of the client
456
457
  */
457
- checkForKeyPackagesBackendSync() {
458
+ schedulePeriodicKeyPackagesBackendSync(clientId) {
458
459
  (0, RecurringTaskScheduler_1.registerRecurringTask)({
459
460
  every: commons_1.TimeUtil.TimeInMillis.DAY,
460
461
  key: 'try-key-packages-backend-sync',
461
- task: () => this.syncKeyPackages(),
462
+ task: () => this.verifyRemoteMLSKeyPackagesAmount(clientId),
462
463
  });
463
464
  }
464
- async syncKeyPackages() {
465
- const validKeyPackagesCount = await this.clientValidKeypackagesCount();
466
- if (validKeyPackagesCount <= this.config.minRequiredNumberOfAvailableKeyPackages) {
467
- const clientId = this.apiClient.validatedClientId;
468
- await this.uploadMLSKeyPackages(clientId);
465
+ /**
466
+ * Checks if there are enough key packages locally and if not,
467
+ * checks the number of keys available on backend and (if needed) generates new keys and uploads them.
468
+ * @param clientId id of the client
469
+ */
470
+ async verifyLocalMLSKeyPackagesAmount(clientId) {
471
+ const keyPackagesCount = await this.clientValidKeypackagesCount();
472
+ if (keyPackagesCount <= this.config.minRequiredNumberOfAvailableKeyPackages) {
473
+ return this.verifyRemoteMLSKeyPackagesAmount(clientId);
469
474
  }
470
475
  }
476
+ async verifyRemoteMLSKeyPackagesAmount(clientId) {
477
+ const backendKeyPackagesCount = await this.getRemoteMLSKeyPackageCount(clientId);
478
+ // If we have enough keys uploaded on backend, there's no need to upload more.
479
+ if (backendKeyPackagesCount > this.config.minRequiredNumberOfAvailableKeyPackages) {
480
+ return;
481
+ }
482
+ const keyPackages = await this.clientKeypackages(this.config.nbKeyPackages);
483
+ return this.uploadMLSKeyPackages(clientId, keyPackages);
484
+ }
471
485
  async getRemoteMLSKeyPackageCount(clientId) {
472
486
  return this.apiClient.api.client.getMLSKeyPackageCount(clientId, (0, numberToHex_1.numberToHex)(this.config.defaultCiphersuite));
473
487
  }
@@ -488,14 +502,8 @@ class MLSService extends TypedEventEmitter_1.TypedEventEmitter {
488
502
  mls_public_keys: { ed25519: btoa(bazinga64_1.Converter.arrayBufferViewToBaselineString(publicKey)) },
489
503
  });
490
504
  }
491
- async uploadMLSKeyPackages(clientId) {
492
- const backendKeyPackagesCount = await this.getRemoteMLSKeyPackageCount(clientId);
493
- // If we have enough keys uploaded on backend, there's no need to upload more.
494
- if (backendKeyPackagesCount > this.config.minRequiredNumberOfAvailableKeyPackages) {
495
- return;
496
- }
497
- const keyPackages = await this.clientKeypackages(this.config.nbKeyPackages);
498
- return this.apiClient.api.client.uploadMLSKeyPackages(clientId, keyPackages.map(keypackage => btoa(bazinga64_1.Converter.arrayBufferViewToBaselineString(keypackage))));
505
+ async uploadMLSKeyPackages(clientId, keyPackages) {
506
+ return this.apiClient.api.client.uploadMLSKeyPackages(clientId, keyPackages.map(keyPackage => btoa(bazinga64_1.Converter.arrayBufferViewToBaselineString(keyPackage))));
499
507
  }
500
508
  async wipeConversation(groupId) {
501
509
  const doesConversationExist = await this.conversationExists(groupId);
@@ -601,7 +609,17 @@ class MLSService extends TypedEventEmitter_1.TypedEventEmitter {
601
609
  async handleMLSMessageAddEvent(event) {
602
610
  return (0, events_1.handleMLSMessageAdd)({ event, mlsService: this });
603
611
  }
604
- async handleMLSWelcomeMessageEvent(event) {
612
+ async handleMLSWelcomeMessageEvent(event, clientId) {
613
+ // Every time we've received a welcome message, it means that our key package was consumed,
614
+ // we need to verify if we need to upload new ones.
615
+ // Note that this has to be done before we even process the welcome message (even if it fails),
616
+ // receiving a welcome message means that one of our key packages on backend was claimed.
617
+ try {
618
+ await this.verifyLocalMLSKeyPackagesAmount(clientId);
619
+ }
620
+ catch (_a) {
621
+ this.logger.error('Failed to verify the amount of MLS key packages');
622
+ }
605
623
  return (0, events_1.handleMLSWelcomeMessage)({ event, mlsService: this });
606
624
  }
607
625
  }
@@ -19,6 +19,7 @@
19
19
  */
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
21
  const client_1 = require("@wireapp/api-client/lib/client");
22
+ const event_1 = require("@wireapp/api-client/lib/event");
22
23
  const crypto_1 = require("crypto");
23
24
  const api_client_1 = require("@wireapp/api-client");
24
25
  const MLSService_1 = require("./MLSService");
@@ -36,6 +37,7 @@ describe('MLSService', () => {
36
37
  clientKeypackages: jest.fn(),
37
38
  mlsInit: jest.fn(),
38
39
  clientPublicKey: jest.fn(),
40
+ processWelcomeMessage: jest.fn(),
39
41
  };
40
42
  describe('registerConversation', () => {
41
43
  let mlsService;
@@ -146,4 +148,79 @@ describe('MLSService', () => {
146
148
  expect(apiClient.api.client.putClient).not.toHaveBeenCalled();
147
149
  });
148
150
  });
151
+ describe('handleMLSWelcomeMessageEvent', () => {
152
+ it("before processing welcome it verifies that there's enough key packages locally", async () => {
153
+ const mlsService = new MLSService_1.MLSService(apiClient, mockCoreCrypto, {});
154
+ const mockClientId = 'client-1';
155
+ const mockClient = { mls_public_keys: { ed25519: 'key' }, id: mockClientId };
156
+ apiClient.context = { clientType: client_1.ClientType.PERMANENT, clientId: mockClientId, userId: '' };
157
+ const mockedClientKeyPackages = [new Uint8Array()];
158
+ jest.spyOn(mockCoreCrypto, 'clientKeypackages').mockResolvedValueOnce(mockedClientKeyPackages);
159
+ const numberOfKeysBelowThreshold = mlsService.config.minRequiredNumberOfAvailableKeyPackages - 1;
160
+ jest.spyOn(apiClient.api.client, 'getMLSKeyPackageCount').mockResolvedValueOnce(numberOfKeysBelowThreshold);
161
+ jest.spyOn(mockCoreCrypto, 'clientValidKeypackagesCount').mockResolvedValueOnce(numberOfKeysBelowThreshold);
162
+ jest.spyOn(apiClient.api.client, 'uploadMLSKeyPackages').mockResolvedValueOnce(undefined);
163
+ jest.spyOn(mockCoreCrypto, 'processWelcomeMessage').mockResolvedValueOnce(new Uint8Array());
164
+ jest.spyOn(mlsService, 'scheduleKeyMaterialRenewal').mockImplementation(jest.fn());
165
+ const mockedMLSWelcomeEvent = {
166
+ type: event_1.CONVERSATION_EVENT.MLS_WELCOME_MESSAGE,
167
+ conversation: '',
168
+ data: '',
169
+ from: '',
170
+ time: '',
171
+ };
172
+ await mlsService.handleMLSWelcomeMessageEvent(mockedMLSWelcomeEvent, mockClient.id);
173
+ expect(mockCoreCrypto.processWelcomeMessage).toHaveBeenCalled();
174
+ expect(apiClient.api.client.uploadMLSKeyPackages).toHaveBeenCalledWith(mockClientId, expect.anything());
175
+ });
176
+ it('before processing welcome it does not generate new keys if there is enough key packages locally', async () => {
177
+ const mlsService = new MLSService_1.MLSService(apiClient, mockCoreCrypto, {});
178
+ const mockClientId = 'client-1';
179
+ const mockClient = { mls_public_keys: { ed25519: 'key' }, id: mockClientId };
180
+ apiClient.context = { clientType: client_1.ClientType.PERMANENT, clientId: mockClientId, userId: '' };
181
+ const mockedClientKeyPackages = [new Uint8Array()];
182
+ jest.spyOn(mockCoreCrypto, 'clientKeypackages').mockResolvedValueOnce(mockedClientKeyPackages);
183
+ const numberOfKeysAboveThreshold = mlsService.config.minRequiredNumberOfAvailableKeyPackages + 1;
184
+ jest.spyOn(mockCoreCrypto, 'clientValidKeypackagesCount').mockResolvedValueOnce(numberOfKeysAboveThreshold);
185
+ jest.spyOn(apiClient.api.client, 'getMLSKeyPackageCount').mockResolvedValueOnce(numberOfKeysAboveThreshold);
186
+ jest.spyOn(apiClient.api.client, 'uploadMLSKeyPackages').mockResolvedValueOnce(undefined);
187
+ jest.spyOn(mockCoreCrypto, 'processWelcomeMessage').mockResolvedValueOnce(new Uint8Array());
188
+ jest.spyOn(mlsService, 'scheduleKeyMaterialRenewal').mockImplementation(jest.fn());
189
+ const mockedMLSWelcomeEvent = {
190
+ type: event_1.CONVERSATION_EVENT.MLS_WELCOME_MESSAGE,
191
+ conversation: '',
192
+ data: '',
193
+ from: '',
194
+ time: '',
195
+ };
196
+ await mlsService.handleMLSWelcomeMessageEvent(mockedMLSWelcomeEvent, mockClient.id);
197
+ expect(mockCoreCrypto.processWelcomeMessage).toHaveBeenCalled();
198
+ expect(apiClient.api.client.uploadMLSKeyPackages).not.toHaveBeenCalled();
199
+ });
200
+ it('before processing welcome it does not generate new keys if there is enough key packages uploaded to backend', async () => {
201
+ const mlsService = new MLSService_1.MLSService(apiClient, mockCoreCrypto, {});
202
+ const mockClientId = 'client-1';
203
+ const mockClient = { mls_public_keys: { ed25519: 'key' }, id: mockClientId };
204
+ apiClient.context = { clientType: client_1.ClientType.PERMANENT, clientId: mockClientId, userId: '' };
205
+ const mockedClientKeyPackages = [new Uint8Array()];
206
+ jest.spyOn(mockCoreCrypto, 'clientKeypackages').mockResolvedValueOnce(mockedClientKeyPackages);
207
+ const numberOfKeysBelowThreshold = mlsService.config.minRequiredNumberOfAvailableKeyPackages - 1;
208
+ const numberOfKeysAboveThreshold = mlsService.config.minRequiredNumberOfAvailableKeyPackages + 1;
209
+ jest.spyOn(mockCoreCrypto, 'clientValidKeypackagesCount').mockResolvedValueOnce(numberOfKeysBelowThreshold);
210
+ jest.spyOn(apiClient.api.client, 'getMLSKeyPackageCount').mockResolvedValueOnce(numberOfKeysAboveThreshold);
211
+ jest.spyOn(apiClient.api.client, 'uploadMLSKeyPackages').mockResolvedValueOnce(undefined);
212
+ jest.spyOn(mockCoreCrypto, 'processWelcomeMessage').mockResolvedValueOnce(new Uint8Array());
213
+ jest.spyOn(mlsService, 'scheduleKeyMaterialRenewal').mockImplementation(jest.fn());
214
+ const mockedMLSWelcomeEvent = {
215
+ type: event_1.CONVERSATION_EVENT.MLS_WELCOME_MESSAGE,
216
+ conversation: '',
217
+ data: '',
218
+ from: '',
219
+ time: '',
220
+ };
221
+ await mlsService.handleMLSWelcomeMessageEvent(mockedMLSWelcomeEvent, mockClient.id);
222
+ expect(mockCoreCrypto.processWelcomeMessage).toHaveBeenCalled();
223
+ expect(apiClient.api.client.uploadMLSKeyPackages).not.toHaveBeenCalled();
224
+ });
225
+ });
149
226
  });
package/package.json CHANGED
@@ -60,6 +60,6 @@
60
60
  "test:coverage": "jest --coverage",
61
61
  "watch": "tsc --watch"
62
62
  },
63
- "version": "42.3.4",
64
- "gitHead": "e481cad1781f82d870be7f1ad0590d4052771fe5"
63
+ "version": "42.4.0",
64
+ "gitHead": "f5b86dd2964932c725c061089c8546b7d796ebb2"
65
65
  }