@wireapp/core 46.37.0 → 46.38.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.
@@ -91,6 +91,17 @@ export declare class ConversationService extends TypedEventEmitter<Events> {
91
91
  * @param conversationData
92
92
  */
93
93
  createMLSConversation(conversationData: NewConversation, selfUserId: QualifiedId, selfClientId: string): Promise<BaseCreateConversationResponse>;
94
+ /**
95
+ * Centralized handler for scenarios where an MLS conversation is detected as broken.
96
+ * It resets the conversation and then invokes the provided callback so callers can retry
97
+ * their original operation (e.g., re-adding/removing users, re-joining, etc.) with the new group id.
98
+ *
99
+ * Contract:
100
+ * - input: conversationId to reset; callback invoked after reset with the new group id
101
+ * - output: the value returned by the callback
102
+ * - error: throws if reset fails or new group id is missing
103
+ */
104
+ private handleBrokenMLSConversation;
94
105
  /**
95
106
  * Will create a conversation on backend and register it to CoreCrypto once created
96
107
  * @param conversationData
@@ -104,9 +115,14 @@ export declare class ConversationService extends TypedEventEmitter<Events> {
104
115
  * @param groupId Id of the group to which we want to add users
105
116
  * @param conversationId Id of the conversation to which we want to add users
106
117
  */
107
- addUsersToMLSConversation({ qualifiedUsers, groupId, conversationId, }: Required<AddUsersParams>): Promise<BaseCreateConversationResponse>;
108
- removeUsersFromMLSConversation({ groupId, conversationId, qualifiedUserIds, }: RemoveUsersParams): Promise<Conversation>;
109
- joinByExternalCommit(conversationId: QualifiedId): Promise<void>;
118
+ addUsersToMLSConversation({ qualifiedUsers, groupId, conversationId, shouldRetry, }: Required<AddUsersParams> & {
119
+ shouldRetry?: boolean;
120
+ }): Promise<BaseCreateConversationResponse>;
121
+ removeUsersFromMLSConversation({ groupId, conversationId, qualifiedUserIds, shouldRetry, }: RemoveUsersParams & {
122
+ shouldRetry?: boolean;
123
+ }): Promise<Conversation>;
124
+ joinByExternalCommit(conversationId: QualifiedId, shouldRetry?: boolean): Promise<void>;
125
+ private resetMLSConversation;
110
126
  /**
111
127
  * Will check if mls group exists locally.
112
128
  * @param groupId groupId of the conversation
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationService.d.ts","sourceRoot":"","sources":["../../../src/conversation/ConversationService/ConversationService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConversationService.d.ts","sourceRoot":"","sources":["../../../src/conversation/ConversationService/ConversationService.ts"],"names":[],"mappings":"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"}
@@ -206,6 +206,18 @@ class ConversationService extends commons_1.TypedEventEmitter {
206
206
  }
207
207
  return this.establishMLSGroupConversation(groupId, qualifiedUsers, selfUserId, selfClientId, qualifiedId);
208
208
  }
209
+ async handleBrokenMLSConversation(conversationId, afterReset) {
210
+ const { conversation: { group_id: newGroupId }, } = await this.resetMLSConversation(conversationId);
211
+ if (!newGroupId) {
212
+ const errorMessage = 'Tried to reset MLS conversation but no group_id found in response';
213
+ this.logger.error(errorMessage, { conversationId });
214
+ throw new Error(errorMessage);
215
+ }
216
+ if (afterReset) {
217
+ return afterReset(newGroupId);
218
+ }
219
+ return undefined;
220
+ }
209
221
  /**
210
222
  * Will create a conversation on backend and register it to CoreCrypto once created
211
223
  * @param conversationData
@@ -228,7 +240,15 @@ class ConversationService extends commons_1.TypedEventEmitter {
228
240
  const { payload, groupId, conversationId } = params;
229
241
  const groupIdBytes = bazinga64_1.Decoder.fromBase64(groupId).asBytes;
230
242
  // immediately execute pending commits before sending the message
231
- await this.mlsService.commitPendingProposals(groupId);
243
+ await this.mlsService.commitPendingProposals(groupId, true, params).catch(async (error) => {
244
+ if (mls_1.MLSService.isBrokenMLSConversationError(error)) {
245
+ this.logger.info('Failed to execute pending proposals because broken MLS conversation, triggering a reset', {
246
+ error,
247
+ groupId,
248
+ });
249
+ await this.handleBrokenMLSConversation(conversationId);
250
+ }
251
+ });
232
252
  const encrypted = await this.mlsService.encryptMessage(new core_crypto_1.ConversationId(groupIdBytes), protocol_messaging_1.GenericMessage.encode(payload).finish());
233
253
  let response = null;
234
254
  let sentAt = '';
@@ -266,31 +286,120 @@ class ConversationService extends commons_1.TypedEventEmitter {
266
286
  * @param groupId Id of the group to which we want to add users
267
287
  * @param conversationId Id of the conversation to which we want to add users
268
288
  */
269
- async addUsersToMLSConversation({ qualifiedUsers, groupId, conversationId, }) {
270
- const exisitingClientIdsInGroup = await this.mlsService.getClientIdsInGroup(groupId);
271
- const conversation = await this.getConversation(conversationId);
272
- const { keyPackages, failures: keysClaimingFailures } = await this.mlsService.getKeyPackagesPayload(qualifiedUsers, exisitingClientIdsInGroup);
273
- // We had cases where did not get any key packages, but still used core-crypto to call the backend (which results in failure).
274
- if (keyPackages && keyPackages.length > 0) {
275
- await this.mlsService.addUsersToExistingConversation(groupId, keyPackages);
276
- //We store the info when user was added (and key material was created), so we will know when to renew it
289
+ async addUsersToMLSConversation({ qualifiedUsers, groupId, conversationId, shouldRetry = true, }) {
290
+ try {
291
+ const exisitingClientIdsInGroup = await this.mlsService.getClientIdsInGroup(groupId);
292
+ const conversation = await this.getConversation(conversationId);
293
+ const { keyPackages, failures: keysClaimingFailures } = await this.mlsService.getKeyPackagesPayload(qualifiedUsers, exisitingClientIdsInGroup);
294
+ // We had cases where did not get any key packages, but still used core-crypto to call the backend (which results in failure).
295
+ if (keyPackages && keyPackages.length > 0) {
296
+ await this.mlsService.addUsersToExistingConversation(groupId, keyPackages);
297
+ //We store the info when user was added (and key material was created), so we will know when to renew it
298
+ await this.mlsService.resetKeyMaterialRenewal(groupId);
299
+ }
300
+ return {
301
+ conversation,
302
+ failedToAdd: keysClaimingFailures,
303
+ };
304
+ }
305
+ catch (error) {
306
+ if (mls_1.MLSService.isBrokenMLSConversationError(error)) {
307
+ if (!shouldRetry) {
308
+ this.logger.warn("Tried to add users to MLS conversation but it's still broken after reset", error);
309
+ throw error;
310
+ }
311
+ this.logger.warn("Tried to add users to MLS conversation but it's broken, resetting the conversation", error);
312
+ return this.handleBrokenMLSConversation(conversationId, newGroupId => this.addUsersToMLSConversation({ qualifiedUsers, groupId: newGroupId, conversationId, shouldRetry: false }));
313
+ }
314
+ throw error;
315
+ }
316
+ }
317
+ async removeUsersFromMLSConversation({ groupId, conversationId, qualifiedUserIds, shouldRetry = true, }) {
318
+ try {
319
+ const clientsToRemove = await this.apiClient.api.user.postListClients({ qualified_users: qualifiedUserIds });
320
+ const fullyQualifiedClientIds = (0, fullyQualifiedClientIdUtils_1.mapQualifiedUserClientIdsToFullyQualifiedClientIds)(clientsToRemove.qualified_user_map);
321
+ await this.mlsService.removeClientsFromConversation(groupId, fullyQualifiedClientIds);
322
+ // key material gets updated after removing a user from the group, so we can reset last key update time value in the store
277
323
  await this.mlsService.resetKeyMaterialRenewal(groupId);
324
+ return await this.getConversation(conversationId);
325
+ }
326
+ catch (error) {
327
+ if (mls_1.MLSService.isBrokenMLSConversationError(error)) {
328
+ if (!shouldRetry) {
329
+ this.logger.warn("Tried to remove users from MLS conversation but it's still broken after reset", error);
330
+ throw error;
331
+ }
332
+ this.logger.info("Tried to remove users from MLS conversation but it's broken, resetting the conversation", error);
333
+ return this.handleBrokenMLSConversation(conversationId, newGroupId => this.removeUsersFromMLSConversation({
334
+ groupId: newGroupId,
335
+ conversationId,
336
+ qualifiedUserIds,
337
+ shouldRetry: false,
338
+ }));
339
+ }
340
+ throw error;
278
341
  }
279
- return {
280
- conversation,
281
- failedToAdd: keysClaimingFailures,
282
- };
283
342
  }
284
- async removeUsersFromMLSConversation({ groupId, conversationId, qualifiedUserIds, }) {
285
- const clientsToRemove = await this.apiClient.api.user.postListClients({ qualified_users: qualifiedUserIds });
286
- const fullyQualifiedClientIds = (0, fullyQualifiedClientIdUtils_1.mapQualifiedUserClientIdsToFullyQualifiedClientIds)(clientsToRemove.qualified_user_map);
287
- await this.mlsService.removeClientsFromConversation(groupId, fullyQualifiedClientIds);
288
- //key material gets updated after removing a user from the group, so we can reset last key update time value in the store
289
- await this.mlsService.resetKeyMaterialRenewal(groupId);
290
- return await this.getConversation(conversationId);
343
+ async joinByExternalCommit(conversationId, shouldRetry = true) {
344
+ try {
345
+ await this.mlsService.joinByExternalCommit(() => this.apiClient.api.conversation.getGroupInfo(conversationId));
346
+ }
347
+ catch (error) {
348
+ if (mls_1.MLSService.isBrokenMLSConversationError(error)) {
349
+ this.logger.info("Failed to join MLS conversation via external commit because it's broken, resetting the conversation", error);
350
+ if (!shouldRetry) {
351
+ this.logger.warn("Tried to join MLS conversation but it's still broken after reset", error);
352
+ throw error;
353
+ }
354
+ return this.handleBrokenMLSConversation(conversationId);
355
+ }
356
+ throw error;
357
+ }
291
358
  }
292
- async joinByExternalCommit(conversationId) {
293
- return this.mlsService.joinByExternalCommit(() => this.apiClient.api.conversation.getGroupInfo(conversationId));
359
+ async resetMLSConversation(conversationId) {
360
+ this.logger.info(`Resetting MLS conversation with id ${conversationId.id}`);
361
+ // STEP 1: Fetch the conversation to retrieve the group ID & epoch
362
+ const conversation = await this.apiClient.api.conversation.getConversation(conversationId);
363
+ const { group_id: groupId, epoch } = conversation;
364
+ if (!groupId || !epoch) {
365
+ const errorMessage = 'Could not find group id or epoch for the conversation';
366
+ this.logger.error(errorMessage, { conversationId });
367
+ throw new Error(errorMessage);
368
+ }
369
+ // STEP 2: Request backend to reset the conversation
370
+ this.logger.info(`Requesting backend to reset the conversation (group_id: ${groupId}, epoch: ${String(epoch)})`);
371
+ await this.apiClient.api.conversation.resetMLSConversation({
372
+ epoch,
373
+ groupId,
374
+ });
375
+ // STEP 3: fetch self user info
376
+ this.logger.info(`Re-establishing the conversation by re-adding all members (conversation_id: ${conversationId.id})`);
377
+ const { validatedClientId: clientId, userId, domain } = this.apiClient;
378
+ if (!userId || !domain) {
379
+ const errorMessage = 'Could not find userId or domain of the self user';
380
+ this.logger.error(errorMessage, { conversationId });
381
+ throw new Error(errorMessage);
382
+ }
383
+ const selfUserQualifiedId = { id: userId, domain };
384
+ // STEP 4: Fetch the updated conversation data from backend to retrieve the new group ID
385
+ const updatedConversation = await this.apiClient.api.conversation.getConversation(conversationId);
386
+ const { group_id: newGroupId, members } = updatedConversation;
387
+ this.logger.info(`MLS conversation new group ID fetched from backend ${conversationId.id}`, {
388
+ newGroupId,
389
+ });
390
+ if (!newGroupId || !clientId) {
391
+ throw new Error(`Failed to recover MLS conversation: missing groupId (${newGroupId}), or clientId (${clientId})`);
392
+ }
393
+ const usersToReAdd = members.others.map(member => member.qualified_id).filter(userId => !!userId);
394
+ // STEP 5: Re-establish the conversation by re-adding all members
395
+ return await this.establishMLSGroupConversation(newGroupId, usersToReAdd, selfUserQualifiedId, clientId, conversationId).then(result => {
396
+ this.logger.info(`Successfully reset MLS conversation`, {
397
+ conversationId: conversationId.id,
398
+ oldGroupId: groupId,
399
+ newGroupId,
400
+ });
401
+ return result;
402
+ });
294
403
  }
295
404
  /**
296
405
  * Will check if mls group exists locally.
@@ -448,27 +557,33 @@ class ConversationService extends commons_1.TypedEventEmitter {
448
557
  * @param qualifiedUsers - list of qualified users to add to the group (should not include the self user)
449
558
  */
450
559
  async tryEstablishingMLSGroup({ groupId, conversationId, selfUserId, qualifiedUsers, }) {
451
- const wasGroupEstablishedBySelfClient = await this.mlsService.tryEstablishingMLSGroup(groupId);
452
- if (!wasGroupEstablishedBySelfClient) {
453
- this.logger.debug('Group was not established by self client, skipping adding users to the group.');
454
- return;
455
- }
456
- this.logger.debug('Group was established by self client, adding other users to the group...');
457
- const usersToAdd = [
458
- ...qualifiedUsers,
459
- { ...selfUserId, skipOwnClientId: this.apiClient.validatedClientId },
460
- ];
461
- const { conversation } = await this.addUsersToMLSConversation({
462
- conversationId,
463
- groupId,
464
- qualifiedUsers: usersToAdd,
465
- });
466
- const addedUsers = conversation.members.others;
467
- if (addedUsers.length > 0) {
468
- this.logger.debug(`Successfully added ${addedUsers} users to the group.`);
560
+ try {
561
+ const wasGroupEstablishedBySelfClient = await this.mlsService.tryEstablishingMLSGroup(groupId);
562
+ if (!wasGroupEstablishedBySelfClient) {
563
+ this.logger.debug('Group was not established by self client, skipping adding users to the group.');
564
+ return;
565
+ }
566
+ this.logger.debug('Group was established by self client, adding other users to the group...');
567
+ const usersToAdd = [
568
+ ...qualifiedUsers,
569
+ { ...selfUserId, skipOwnClientId: this.apiClient.validatedClientId },
570
+ ];
571
+ const { conversation } = await this.addUsersToMLSConversation({
572
+ conversationId,
573
+ groupId,
574
+ qualifiedUsers: usersToAdd,
575
+ });
576
+ const addedUsers = conversation.members.others;
577
+ if (addedUsers.length > 0) {
578
+ this.logger.debug(`Successfully added ${addedUsers} users to the group.`);
579
+ }
580
+ else {
581
+ this.logger.debug('No other users were added to the group.');
582
+ }
469
583
  }
470
- else {
471
- this.logger.debug('No other users were added to the group.');
584
+ catch (error) {
585
+ this.logger.error('Failed to establish MLS group', error);
586
+ throw error;
472
587
  }
473
588
  }
474
589
  async handleMLSMessageAddEvent(event) {
@@ -482,7 +597,7 @@ class ConversationService extends commons_1.TypedEventEmitter {
482
597
  if (!conversationId) {
483
598
  throw new Error('Qualified conversation id is missing in the event');
484
599
  }
485
- (0, conversationRejoinQueue_1.queueConversationRejoin)(conversationId.id, () => this.recoverMLSGroupFromEpochMismatch(conversationId, subconv));
600
+ void (0, conversationRejoinQueue_1.queueConversationRejoin)(conversationId.id, () => this.recoverMLSGroupFromEpochMismatch(conversationId, subconv));
486
601
  return null;
487
602
  }
488
603
  throw error;
@@ -6,7 +6,7 @@ import { CoreDatabase } from '../../../storage/CoreDB';
6
6
  import { StringifiedQualifiedId } from '../../../util/qualifiedIdUtil';
7
7
  import { RecurringTaskScheduler } from '../../../util/RecurringTaskScheduler';
8
8
  import { MLSService } from '../MLSService';
9
- export type DeviceIdentity = Omit<WireIdentity, 'free' | 'status'> & {
9
+ export type DeviceIdentity = Omit<WireIdentity, 'free' | 'status' | typeof Symbol.dispose> & {
10
10
  status?: DeviceStatus;
11
11
  deviceId: string;
12
12
  qualifiedUserId: QualifiedId;
@@ -1 +1 @@
1
- {"version":3,"file":"E2EIServiceExternal.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/mls/E2EIdentityService/E2EIServiceExternal.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AAIzD,OAAO,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AACnD,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,YAAY,EAIb,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,YAAY,EAAC,MAAM,yBAAyB,CAAC;AAGrD,OAAO,EAAC,sBAAsB,EAAuB,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAC,sBAAsB,EAAC,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAC,UAAU,EAAmB,MAAM,eAAe,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG;IACnE,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,WAAW,CAAC;CAC9B,CAAC;AAEF,KAAK,MAAM,GAAG;IACZ,UAAU,EAAE;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC;CAC9B,CAAC;AAGF,qBAAa,mBAAoB,SAAQ,iBAAiB,CAAC,MAAM,CAAC;IAK9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAR7B,OAAO,CAAC,YAAY,CAAC,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiD;gBAGhE,gBAAgB,EAAE,UAAU,EAC5B,YAAY,EAAE,YAAY,EAC1B,sBAAsB,EAAE,sBAAsB,EAC9C,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU;IAO5B,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC;IAKhD,gBAAgB;IAIV,oBAAoB,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAItF,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAI3B,0BAA0B,CACrC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,cAAc,EAAE,CAAC,GAAG,SAAS,CAAC;IAsBxD,kBAAkB,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,EAAE,GACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,cAAc,EAAE,CAAC,GAAG,SAAS,CAAC;IA0DxD,oBAAoB,CAC/B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAC1C,OAAO,CAAC,cAAc,EAAE,CAAC;IAiBf,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;YAKvC,4BAA4B;IAO1C;;;;;OAKG;IACU,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5D,OAAO,KAAK,WAAW,GAKtB;YAEa,+BAA+B;IAO7C;;;;;;;;;;;;OAYG;YACW,0BAA0B;IA2BxC,OAAO,CAAC,4BAA4B;YAStB,+BAA+B;YAQ/B,uBAAuB;YAKvB,0BAA0B;YAI1B,4BAA4B;YAO5B,WAAW;YAoBX,8BAA8B;CAM7C"}
1
+ {"version":3,"file":"E2EIServiceExternal.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/mls/E2EIdentityService/E2EIServiceExternal.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AAIzD,OAAO,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AACnD,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,YAAY,EACZ,YAAY,EAIb,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,YAAY,EAAC,MAAM,yBAAyB,CAAC;AAGrD,OAAO,EAAC,sBAAsB,EAAuB,MAAM,+BAA+B,CAAC;AAC3F,OAAO,EAAC,sBAAsB,EAAC,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAC,UAAU,EAAmB,MAAM,eAAe,CAAC;AAE3D,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG;IAC3F,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,WAAW,CAAC;CAC9B,CAAC;AAEF,KAAK,MAAM,GAAG;IACZ,UAAU,EAAE;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,CAAC;CAC9B,CAAC;AAGF,qBAAa,mBAAoB,SAAQ,iBAAiB,CAAC,MAAM,CAAC;IAK9D,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAR7B,OAAO,CAAC,YAAY,CAAC,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAiD;gBAGhE,gBAAgB,EAAE,UAAU,EAC5B,YAAY,EAAE,YAAY,EAC1B,sBAAsB,EAAE,sBAAsB,EAC9C,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU;IAO5B,sBAAsB,IAAI,OAAO,CAAC,OAAO,CAAC;IAKhD,gBAAgB;IAIV,oBAAoB,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAItF,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAI3B,0BAA0B,CACrC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,cAAc,EAAE,CAAC,GAAG,SAAS,CAAC;IAsBxD,kBAAkB,CAC7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,EAAE,GACrB,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,cAAc,EAAE,CAAC,GAAG,SAAS,CAAC;IA0DxD,oBAAoB,CAC/B,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAC1C,OAAO,CAAC,cAAc,EAAE,CAAC;IAiBf,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;YAKvC,4BAA4B;IAO1C;;;;;OAKG;IACU,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5D,OAAO,KAAK,WAAW,GAKtB;YAEa,+BAA+B;IAO7C;;;;;;;;;;;;OAYG;YACW,0BAA0B;IA2BxC,OAAO,CAAC,4BAA4B;YAStB,+BAA+B;YAQ/B,uBAAuB;YAKvB,0BAA0B;YAI1B,4BAA4B;YAO5B,WAAW;YAoBX,8BAA8B;CAM7C"}
@@ -57,6 +57,11 @@ export declare class MLSService extends TypedEventEmitter<Events> {
57
57
  private _config?;
58
58
  private readonly textEncoder;
59
59
  private readonly textDecoder;
60
+ static UPLOAD_COMMIT_BUNDLE_ABORT_REASONS: {
61
+ BROKEN_MLS_CONVERSATION: string;
62
+ OTHER: string;
63
+ };
64
+ static isBrokenMLSConversationError(error: unknown): boolean;
60
65
  constructor(apiClient: APIClient, coreCryptoClient: CoreCrypto, coreDatabase: CoreDatabase, recurringTaskScheduler: RecurringTaskScheduler);
61
66
  /**
62
67
  * return true if the MLS service if configured and ready to be used
@@ -230,7 +235,7 @@ export declare class MLSService extends TypedEventEmitter<Events> {
230
235
  *
231
236
  * @param groupId groupId of the conversation
232
237
  */
233
- commitPendingProposals(groupId: string, shouldRetry?: boolean): Promise<void>;
238
+ commitPendingProposals(groupId: string, shouldRetry?: boolean, params?: any): Promise<void>;
234
239
  /**
235
240
  * Get all pending proposals from the database and schedule them
236
241
  * Function must only be called once, after application start
@@ -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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"}
@@ -19,12 +19,14 @@
19
19
  */
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
21
  exports.MLSService = exports.MLSServiceEvents = exports.optionalToUint8Array = void 0;
22
+ const conversation_1 = require("@wireapp/api-client/lib/conversation");
23
+ const http_1 = require("@wireapp/api-client/lib/http");
22
24
  const bazinga64_1 = require("bazinga64");
23
25
  const commons_1 = require("@wireapp/commons");
24
26
  const core_crypto_1 = require("@wireapp/core-crypto");
25
27
  const ClientMLSError_1 = require("./ClientMLSError");
26
28
  const CoreCryptoMLSError_1 = require("./CoreCryptoMLSError");
27
- const conversation_1 = require("../../../conversation");
29
+ const conversation_2 = require("../../../conversation");
28
30
  const fullyQualifiedClientIdUtils_1 = require("../../../util/fullyQualifiedClientIdUtils");
29
31
  const numberToHex_1 = require("../../../util/numberToHex");
30
32
  const TaskScheduler_1 = require("../../../util/TaskScheduler");
@@ -39,7 +41,7 @@ const optionalToUint8Array = (array) => {
39
41
  };
40
42
  exports.optionalToUint8Array = optionalToUint8Array;
41
43
  const defaultConfig = {
42
- keyingMaterialUpdateThreshold: 1000 * 60 * 60 * 24 * 30, //30 days
44
+ keyingMaterialUpdateThreshold: commons_1.TimeUtil.TimeInMillis.DAY * 30,
43
45
  nbKeyPackages: 100,
44
46
  };
45
47
  var MLSServiceEvents;
@@ -58,6 +60,14 @@ class MLSService extends commons_1.TypedEventEmitter {
58
60
  _config;
59
61
  textEncoder = new TextEncoder();
60
62
  textDecoder = new TextDecoder();
63
+ static UPLOAD_COMMIT_BUNDLE_ABORT_REASONS = {
64
+ BROKEN_MLS_CONVERSATION: 'BROKEN_MLS_CONVERSATION',
65
+ OTHER: 'OTHER',
66
+ };
67
+ static isBrokenMLSConversationError(error) {
68
+ return ((0, core_crypto_1.isMlsMessageRejectedError)(error) &&
69
+ error.context.context.reason === MLSService.UPLOAD_COMMIT_BUNDLE_ABORT_REASONS.BROKEN_MLS_CONVERSATION);
70
+ }
61
71
  constructor(apiClient, coreCryptoClient, coreDatabase, recurringTaskScheduler) {
62
72
  super();
63
73
  this.apiClient = apiClient;
@@ -175,8 +185,17 @@ class MLSService extends commons_1.TypedEventEmitter {
175
185
  }
176
186
  catch (error) {
177
187
  this.logger.error(`Failed to upload commit bundle`, error);
188
+ if (http_1.HttpClient.isBackendError(error)) {
189
+ const mappedError = http_1.BackendErrorMapper.map(new http_1.BackendError(error.response.data.message, error.response.data.label, error.response.data.code));
190
+ if (mappedError instanceof conversation_1.MLSInvalidLeafNodeSignatureError ||
191
+ mappedError instanceof conversation_1.MLSInvalidLeafNodeIndexError) {
192
+ return {
193
+ abort: { reason: MLSService.UPLOAD_COMMIT_BUNDLE_ABORT_REASONS.BROKEN_MLS_CONVERSATION },
194
+ };
195
+ }
196
+ }
178
197
  return {
179
- abort: { reason: error instanceof Error ? error.message : 'unknown error' },
198
+ abort: { reason: error instanceof Error ? error.message : MLSService.UPLOAD_COMMIT_BUNDLE_ABORT_REASONS.OTHER },
180
199
  };
181
200
  }
182
201
  };
@@ -260,11 +279,11 @@ class MLSService extends commons_1.TypedEventEmitter {
260
279
  }, []);
261
280
  const failures = [];
262
281
  if (emptyKeyPackagesUsers.length > 0) {
263
- failures.push({ reason: conversation_1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG, users: emptyKeyPackagesUsers });
282
+ failures.push({ reason: conversation_2.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG, users: emptyKeyPackagesUsers });
264
283
  }
265
284
  if (failedToFetchKeyPackages.length > 0) {
266
285
  failures.push({
267
- reason: conversation_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
286
+ reason: conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
268
287
  users: failedToFetchKeyPackages,
269
288
  backends: failedToFetchKeyPackages.map(({ domain }) => domain),
270
289
  });
@@ -276,19 +295,27 @@ class MLSService extends commons_1.TypedEventEmitter {
276
295
  return this.coreCryptoClient.conversationEpoch(new core_crypto_1.ConversationId(groupIdBytes));
277
296
  }
278
297
  async joinByExternalCommit(getGroupInfo) {
279
- const credentialType = await this.getCredentialType();
280
- const groupInfo = await getGroupInfo();
281
- const welcomeBundle = await this.coreCryptoClient.transaction(cx => cx.joinByExternalCommit(new core_crypto_1.ConversationId(groupInfo), credentialType));
282
- await this.dispatchNewCrlDistributionPoints(welcomeBundle.crlNewDistributionPoints);
283
- if (welcomeBundle.id) {
284
- //after we've successfully joined via external commit, we schedule periodic key material renewal
285
- const groupIdStr = bazinga64_1.Encoder.toBase64(welcomeBundle.id.copyBytes()).asString;
286
- const newEpoch = await this.getEpoch(groupIdStr);
287
- // Schedule the next key material renewal
288
- await this.scheduleKeyMaterialRenewal(groupIdStr);
289
- // Notify subscribers about the new epoch
290
- this.emit(MLSServiceEvents.NEW_EPOCH, { groupId: groupIdStr, epoch: newEpoch });
291
- this.logger.info(`Joined MLS group with id ${groupIdStr} via external commit, new epoch: ${newEpoch}`);
298
+ try {
299
+ this.logger.info('Trying to join MLS group via external commit');
300
+ const credentialType = await this.getCredentialType();
301
+ const groupInfo = await getGroupInfo();
302
+ const welcomeBundle = await this.coreCryptoClient.transaction(cx => cx.joinByExternalCommit(new core_crypto_1.GroupInfo(groupInfo), credentialType));
303
+ await this.dispatchNewCrlDistributionPoints(welcomeBundle.crlNewDistributionPoints);
304
+ this.logger.info('welcome bundle after joining via external commit');
305
+ if (welcomeBundle.id) {
306
+ //after we've successfully joined via external commit, we schedule periodic key material renewal
307
+ const groupIdStr = bazinga64_1.Encoder.toBase64(welcomeBundle.id.copyBytes()).asString;
308
+ const newEpoch = await this.getEpoch(groupIdStr);
309
+ // Schedule the next key material renewal
310
+ await this.scheduleKeyMaterialRenewal(groupIdStr);
311
+ // Notify subscribers about the new epoch
312
+ this.emit(MLSServiceEvents.NEW_EPOCH, { groupId: groupIdStr, epoch: newEpoch });
313
+ this.logger.info(`Joined MLS group with id ${groupIdStr} via external commit, new epoch: ${newEpoch}`);
314
+ }
315
+ }
316
+ catch (error) {
317
+ this.logger.error('Failed to join MLS group via external commit', error);
318
+ throw error;
292
319
  }
293
320
  }
294
321
  async exportSecretKey(groupId, keyLength) {
@@ -413,7 +440,7 @@ class MLSService extends commons_1.TypedEventEmitter {
413
440
  // If we're missing key packages for the user we want to add, we can't register the conversation
414
441
  if (otherUserKeyPackages.length <= 0) {
415
442
  if (otherUserKeysClaimingFailures.length > 0 &&
416
- otherUserKeysClaimingFailures.some(({ reason }) => reason === conversation_1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG)) {
443
+ otherUserKeysClaimingFailures.some(({ reason }) => reason === conversation_2.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG)) {
417
444
  throw new ClientMLSError_1.ClientMLSError(ClientMLSError_1.ClientMLSErrorLabel.NO_KEY_PACKAGES_AVAILABLE);
418
445
  }
419
446
  }
@@ -450,6 +477,7 @@ class MLSService extends commons_1.TypedEventEmitter {
450
477
  return true;
451
478
  }
452
479
  catch (error) {
480
+ this.logger.warn("Couldn't establish the MLS group", error);
453
481
  // If conversation already existed, locally, nothing more to do, we've received a welcome message.
454
482
  if ((0, CoreCryptoMLSError_1.isCoreCryptoMLSConversationAlreadyExistsError)(error)) {
455
483
  this.logger.debug(`MLS Group with id ${groupId} already exists, skipping the initialisation.`);
@@ -680,7 +708,8 @@ class MLSService extends commons_1.TypedEventEmitter {
680
708
  *
681
709
  * @param groupId groupId of the conversation
682
710
  */
683
- async commitPendingProposals(groupId, shouldRetry = true) {
711
+ async commitPendingProposals(groupId, shouldRetry = true, params) {
712
+ this.logger.info(`Committing pending proposals for groupId ${groupId}`, { shouldRetry, params });
684
713
  const groupIdBytes = bazinga64_1.Decoder.fromBase64(groupId).asBytes;
685
714
  try {
686
715
  await this.coreCryptoClient.transaction(cx => cx.commitPendingProposals(new core_crypto_1.ConversationId(groupIdBytes)));
@@ -690,7 +719,18 @@ class MLSService extends commons_1.TypedEventEmitter {
690
719
  if (!shouldRetry) {
691
720
  throw error;
692
721
  }
693
- this.logger.warn('Failed to commit proposals, clearing the pending commit and retrying', error);
722
+ if ((0, core_crypto_1.isMlsMessageRejectedError)(error)) {
723
+ this.logger.warn('Failed to commit proposals, conversation is broken, letting the error bubble up', {
724
+ error,
725
+ groupId,
726
+ });
727
+ throw error;
728
+ }
729
+ this.logger.warn('Failed to commit proposals, clearing the pending commit and retrying', {
730
+ error,
731
+ groupId,
732
+ shouldRetry,
733
+ });
694
734
  return this.commitPendingProposals(groupId, false);
695
735
  }
696
736
  }
@@ -8,15 +8,10 @@ export declare const ProteusErrors: {
8
8
  readonly DuplicateMessage: 209;
9
9
  readonly Unknown: 999;
10
10
  };
11
- export declare const CORE_CRYPTO_PROTEUS_ERROR_NAMES: {
12
- ProteusErrorSessionNotFound: string;
13
- ProteusErrorRemoteIdentityChanged: string;
14
- ProteusErrorDuplicateMessage: string;
15
- };
16
11
  type SenderInfo = {
17
12
  clientId: string;
18
13
  userId: QualifiedId;
19
14
  };
20
- export declare const generateDecryptionError: (senderInfo: SenderInfo, error: any) => DecryptionError;
15
+ export declare const generateDecryptionError: (senderInfo: SenderInfo, error: unknown) => DecryptionError;
21
16
  export {};
22
17
  //# sourceMappingURL=DecryptionErrorGenerator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DecryptionErrorGenerator.d.ts","sourceRoot":"","sources":["../../../../../src/messagingProtocols/proteus/ProteusService/DecryptionErrorGenerator/DecryptionErrorGenerator.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AAIzD,OAAO,EAAC,eAAe,EAAC,MAAM,oCAAoC,CAAC;AAEnE,eAAO,MAAM,aAAa;;;;;;;CAOhB,CAAC;AAYX,eAAO,MAAM,+BAA+B;;;;CAI3C,CAAC;AAEF,KAAK,UAAU,GAAG;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAC,CAAC;AA0B1D,eAAO,MAAM,uBAAuB,eAAgB,UAAU,SAAS,GAAG,KAAG,eAS5E,CAAC"}
1
+ {"version":3,"file":"DecryptionErrorGenerator.d.ts","sourceRoot":"","sources":["../../../../../src/messagingProtocols/proteus/ProteusService/DecryptionErrorGenerator/DecryptionErrorGenerator.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AAUzD,OAAO,EAAC,eAAe,EAAC,MAAM,oCAAoC,CAAC;AAEnE,eAAO,MAAM,aAAa;;;;;;;CAOhB,CAAC;AAUX,KAAK,UAAU,GAAG;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,CAAA;CAAC,CAAC;AA8B1D,eAAO,MAAM,uBAAuB,eAAgB,UAAU,SAAS,OAAO,KAAG,eAWhF,CAAC"}
@@ -18,7 +18,8 @@
18
18
  *
19
19
  */
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.generateDecryptionError = exports.CORE_CRYPTO_PROTEUS_ERROR_NAMES = exports.ProteusErrors = void 0;
21
+ exports.generateDecryptionError = exports.ProteusErrors = void 0;
22
+ const core_crypto_1 = require("@wireapp/core-crypto");
22
23
  const DecryptionError_1 = require("../../../../errors/DecryptionError");
23
24
  exports.ProteusErrors = {
24
25
  SessionNotFound: 102,
@@ -28,40 +29,36 @@ exports.ProteusErrors = {
28
29
  DuplicateMessage: 209,
29
30
  Unknown: 999,
30
31
  };
31
- const isCoreCryptoError = (error) => {
32
- return 'proteusErrorCode' in error;
33
- };
34
- const isCryptoboxError = (error) => {
35
- return 'code' in error;
36
- };
37
- exports.CORE_CRYPTO_PROTEUS_ERROR_NAMES = {
38
- ProteusErrorSessionNotFound: 'ProteusErrorSessionNotFound',
39
- ProteusErrorRemoteIdentityChanged: 'ProteusErrorRemoteIdentityChanged',
40
- ProteusErrorDuplicateMessage: 'ProteusErrorDuplicateMessage',
41
- };
32
+ const isCryptoboxError = (error) => typeof error?.code === 'number';
33
+ const hasProteusErrorCode = (error) => typeof error?.proteusErrorCode === 'number';
42
34
  function getErrorCode(error) {
43
- if (isCoreCryptoError(error) && typeof error.proteusErrorCode === 'number') {
44
- return error.proteusErrorCode;
45
- }
46
- if (isCryptoboxError(error) && typeof error.code === 'number') {
47
- return error.code;
48
- }
49
- if (error.name === exports.CORE_CRYPTO_PROTEUS_ERROR_NAMES.ProteusErrorSessionNotFound) {
35
+ if ((0, core_crypto_1.isProteusSessionNotFoundError)(error)) {
50
36
  return exports.ProteusErrors.SessionNotFound;
51
37
  }
52
- if (error.name === exports.CORE_CRYPTO_PROTEUS_ERROR_NAMES.ProteusErrorRemoteIdentityChanged) {
38
+ if ((0, core_crypto_1.isProteusRemoteIdentityChangedError)(error)) {
53
39
  return exports.ProteusErrors.RemoteIdentityChanged;
54
40
  }
55
- if (error.name === exports.CORE_CRYPTO_PROTEUS_ERROR_NAMES.ProteusErrorDuplicateMessage) {
41
+ if ((0, core_crypto_1.isProteusDuplicateMessageError)(error)) {
56
42
  return exports.ProteusErrors.DuplicateMessage;
57
43
  }
44
+ if ((0, core_crypto_1.isProteusError)(error, core_crypto_1.ProteusErrorType.Other)) {
45
+ return exports.ProteusErrors.Unknown;
46
+ }
47
+ if (hasProteusErrorCode(error)) {
48
+ return error.proteusErrorCode;
49
+ }
50
+ if (isCryptoboxError(error)) {
51
+ return error.code;
52
+ }
58
53
  return exports.ProteusErrors.Unknown;
59
54
  }
60
55
  const generateDecryptionError = (senderInfo, error) => {
61
56
  const { clientId, userId } = senderInfo;
62
57
  const sender = `${userId.id} (${clientId})`;
63
58
  const code = getErrorCode(error);
64
- const message = `Decryption error from ${sender} (name: ${error.name}) (message: ${error.message})`;
59
+ const name = error?.name;
60
+ const text = error?.message ?? String(error);
61
+ const message = `Decryption error from ${sender} (name: ${name}) (message: ${text})`;
65
62
  return new DecryptionError_1.DecryptionError(message, code);
66
63
  };
67
64
  exports.generateDecryptionError = generateDecryptionError;
package/package.json CHANGED
@@ -11,16 +11,16 @@
11
11
  "./lib/cryptography/AssetCryptography/crypto.node": "./lib/cryptography/AssetCryptography/crypto.browser.js"
12
12
  },
13
13
  "dependencies": {
14
- "@wireapp/api-client": "^27.76.0",
14
+ "@wireapp/api-client": "^27.77.0",
15
15
  "@wireapp/commons": "^5.4.5",
16
- "@wireapp/core-crypto": "9.0.1",
16
+ "@wireapp/core-crypto": "9.1.0",
17
17
  "@wireapp/cryptobox": "12.8.0",
18
18
  "@wireapp/priority-queue": "^2.1.12",
19
19
  "@wireapp/promise-queue": "^2.4.5",
20
20
  "@wireapp/protocol-messaging": "1.53.0",
21
21
  "@wireapp/store-engine": "^5.1.12",
22
22
  "axios": "1.12.2",
23
- "bazinga64": "^6.5.2",
23
+ "bazinga64": "^6.5.3",
24
24
  "deepmerge-ts": "6.0.0",
25
25
  "hash.js": "1.1.7",
26
26
  "http-status-codes": "2.3.0",
@@ -39,7 +39,7 @@
39
39
  "@types/tough-cookie": "4.0.5",
40
40
  "@types/uuid": "9.0.8",
41
41
  "commander": "14.0.1",
42
- "cross-env": "10.0.0",
42
+ "cross-env": "10.1.0",
43
43
  "dotenv-defaults": "5.0.2",
44
44
  "fake-indexeddb": "^5.0.2",
45
45
  "jest": "^29.2.1",
@@ -61,6 +61,6 @@
61
61
  "test:coverage": "jest --coverage",
62
62
  "watch": "tsc --watch"
63
63
  },
64
- "version": "46.37.0",
65
- "gitHead": "50faeb13ed90b5965a0ec28ecbcbb2a20688dfa1"
64
+ "version": "46.38.0",
65
+ "gitHead": "90f4138a890f47d5527691a1e360df5157c2a8e6"
66
66
  }