@wireapp/core 17.21.1 → 17.24.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.
@@ -52,7 +52,10 @@ class MessageService {
52
52
  return await this.apiClient.conversation.api.postOTRMessage(sendingClientId, conversationId, message, ignoreMissing);
53
53
  }
54
54
  catch (error) {
55
- const reEncryptedMessage = await this.onClientMismatch(error, Object.assign(Object.assign({}, message), { data: base64CipherText ? bazinga64_1.Decoder.fromBase64(base64CipherText).asBytes : undefined, recipients }), plainTextArray);
55
+ if (!this.isClientMismatchError(error)) {
56
+ throw error;
57
+ }
58
+ const reEncryptedMessage = await this.onClientMismatch(error.response.data, Object.assign(Object.assign({}, message), { data: base64CipherText ? bazinga64_1.Decoder.fromBase64(base64CipherText).asBytes : undefined, recipients }), plainTextArray);
56
59
  return await this.apiClient.broadcast.api.postBroadcastMessage(sendingClientId, {
57
60
  data: reEncryptedMessage.data ? bazinga64_1.Encoder.toBase64(reEncryptedMessage.data).asString : undefined,
58
61
  recipients: cryptography_1.CryptographyService.convertArrayRecipientsToBase64(reEncryptedMessage.recipients),
@@ -73,8 +76,12 @@ class MessageService {
73
76
  'missing',
74
77
  'redundant',
75
78
  ];
79
+ const allFailed = Object.assign(Object.assign(Object.assign(Object.assign({}, messageSendingStatus.deleted), messageSendingStatus.failed_to_send), messageSendingStatus.missing), messageSendingStatus.redundant);
80
+ const hasDiffs = Object.keys(allFailed).length;
81
+ if (!hasDiffs) {
82
+ return null;
83
+ }
76
84
  if ((_b = (_a = messageData.ignoreOnly) === null || _a === void 0 ? void 0 : _a.userIds) === null || _b === void 0 ? void 0 : _b.length) {
77
- const allFailed = Object.assign(Object.assign(Object.assign(Object.assign({}, messageSendingStatus.deleted), messageSendingStatus.failed_to_send), messageSendingStatus.missing), messageSendingStatus.redundant);
78
85
  for (const [domainFailed, userClientsFailed] of Object.entries(allFailed)) {
79
86
  for (const userIdMissing of Object.keys(userClientsFailed)) {
80
87
  const userIsIgnored = messageData.ignoreOnly.userIds.find(({ domain: domainIgnore, id: userIdIgnore }) => {
@@ -107,8 +114,9 @@ class MessageService {
107
114
  }
108
115
  return updatedMessageSendingStatus;
109
116
  }
110
- async sendFederatedOTRMessage(sendingClientId, conversationId, conversationDomain, recipients, plainTextArray, assetData, reportMissing) {
111
- const qualifiedUserEntries = Object.entries(recipients).map(([domain, otrRecipients]) => {
117
+ async sendFederatedOTRMessage(sendingClientId, { id: conversationId, domain }, recipients, plainTextArray, options = {}) {
118
+ const otrRecipients = await this.cryptographyService.encryptQualified(plainTextArray, recipients);
119
+ const qualifiedUserEntries = Object.entries(otrRecipients).map(([domain, otrRecipients]) => {
112
120
  const userEntries = Object.entries(otrRecipients).map(([userId, otrClientMap]) => {
113
121
  const clientEntries = Object.entries(otrClientMap).map(([clientId, payload]) => {
114
122
  return {
@@ -133,34 +141,40 @@ class MessageService {
133
141
  client: long_1.default.fromString(sendingClientId, 16),
134
142
  },
135
143
  });
136
- if (assetData) {
137
- protoMessage.blob = assetData;
144
+ if (options.assetData) {
145
+ protoMessage.blob = options.assetData;
138
146
  }
139
147
  /*
140
148
  * When creating the PreKey bundles we already found out to which users we want to send a message, so we can ignore
141
149
  * missing clients. We have to ignore missing clients because there can be the case that there are clients that
142
150
  * don't provide PreKeys (clients from the Pre-E2EE era).
143
151
  */
144
- if (reportMissing) {
152
+ if (options.reportMissing) {
145
153
  protoMessage.reportAll = {};
146
154
  }
147
155
  else {
148
156
  protoMessage.ignoreAll = {};
149
157
  }
150
158
  let sendingStatus;
159
+ let sendingFailed = false;
151
160
  try {
152
- sendingStatus = await this.apiClient.conversation.api.postOTRMessageV2(conversationId, conversationDomain, protoMessage);
161
+ sendingStatus = await this.apiClient.conversation.api.postOTRMessageV2(conversationId, domain, protoMessage);
153
162
  }
154
163
  catch (error) {
155
164
  if (!this.isClientMismatchError(error)) {
156
165
  throw error;
157
166
  }
158
167
  sendingStatus = error.response.data;
168
+ sendingFailed = true;
159
169
  }
160
170
  const mismatch = this.checkFederatedClientsMismatch(protoMessage, sendingStatus);
161
171
  if (mismatch) {
162
- const reEncryptedMessage = await this.encryptForMissingClients(protoMessage, mismatch, plainTextArray);
163
- await this.apiClient.conversation.api.postOTRMessageV2(conversationId, conversationDomain, reEncryptedMessage);
172
+ const shouldStopSending = options.onClientMismatch && !(await options.onClientMismatch(mismatch));
173
+ if (shouldStopSending || !sendingFailed) {
174
+ return sendingStatus;
175
+ }
176
+ const reEncryptedMessage = await this.onFederatedMismatch(protoMessage, mismatch, plainTextArray);
177
+ await this.apiClient.conversation.api.postOTRMessageV2(conversationId, domain, reEncryptedMessage);
164
178
  }
165
179
  return sendingStatus;
166
180
  }
@@ -203,168 +217,170 @@ class MessageService {
203
217
  return await this.apiClient.conversation.api.postOTRProtobufMessage(sendingClientId, conversationId, protoMessage, ignoreMissing);
204
218
  }
205
219
  catch (error) {
206
- const reEncryptedMessage = await this.onClientProtobufMismatch(error, protoMessage, plainTextArray);
220
+ if (!this.isClientMismatchError(error)) {
221
+ throw error;
222
+ }
223
+ const mismatch = error.response.data;
224
+ const reEncryptedMessage = await this.onClientProtobufMismatch(mismatch, protoMessage, plainTextArray);
207
225
  if (conversationId === null) {
208
226
  return await this.apiClient.broadcast.api.postBroadcastProtobufMessage(sendingClientId, reEncryptedMessage);
209
227
  }
210
228
  return await this.apiClient.conversation.api.postOTRProtobufMessage(sendingClientId, conversationId, reEncryptedMessage, ignoreMissing);
211
229
  }
212
230
  }
213
- async onClientMismatch(error, message, plainTextArray) {
214
- var _a, _b;
215
- if (((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === http_status_codes_1.StatusCodes.PRECONDITION_FAILED) {
216
- const { missing, deleted } = (_b = error.response) === null || _b === void 0 ? void 0 : _b.data;
217
- const deletedUserIds = Object.keys(deleted);
218
- const missingUserIds = Object.keys(missing);
219
- if (deletedUserIds.length) {
220
- for (const deletedUserId of deletedUserIds) {
221
- for (const deletedClientId of deleted[deletedUserId]) {
222
- const deletedUser = message.recipients[deletedUserId];
223
- if (deletedUser) {
224
- delete deletedUser[deletedClientId];
225
- }
231
+ async onClientMismatch(clientMismatch, message, plainTextArray) {
232
+ const { missing, deleted } = clientMismatch;
233
+ const deletedUserIds = Object.keys(deleted);
234
+ const missingUserIds = Object.keys(missing);
235
+ if (deletedUserIds.length) {
236
+ for (const deletedUserId of deletedUserIds) {
237
+ for (const deletedClientId of deleted[deletedUserId]) {
238
+ const deletedUser = message.recipients[deletedUserId];
239
+ if (deletedUser) {
240
+ delete deletedUser[deletedClientId];
226
241
  }
227
242
  }
228
243
  }
229
- if (missingUserIds.length) {
230
- const missingPreKeyBundles = await this.apiClient.user.api.postMultiPreKeyBundles(missing);
231
- const reEncryptedPayloads = await this.cryptographyService.encrypt(plainTextArray, missingPreKeyBundles);
232
- for (const missingUserId of missingUserIds) {
233
- for (const missingClientId in reEncryptedPayloads[missingUserId]) {
234
- const missingUser = message.recipients[missingUserId];
235
- if (!missingUser) {
236
- message.recipients[missingUserId] = {};
237
- }
238
- message.recipients[missingUserId][missingClientId] = reEncryptedPayloads[missingUserId][missingClientId];
244
+ }
245
+ if (missingUserIds.length) {
246
+ const missingPreKeyBundles = await this.apiClient.user.api.postMultiPreKeyBundles(missing);
247
+ const reEncryptedPayloads = await this.cryptographyService.encrypt(plainTextArray, missingPreKeyBundles);
248
+ for (const missingUserId of missingUserIds) {
249
+ for (const missingClientId in reEncryptedPayloads[missingUserId]) {
250
+ const missingUser = message.recipients[missingUserId];
251
+ if (!missingUser) {
252
+ message.recipients[missingUserId] = {};
239
253
  }
254
+ message.recipients[missingUserId][missingClientId] = reEncryptedPayloads[missingUserId][missingClientId];
240
255
  }
241
256
  }
242
- return message;
243
257
  }
244
- throw error;
258
+ return message;
245
259
  }
246
- async onClientProtobufMismatch(error, message, plainTextArray) {
247
- var _a, _b, _c, _d;
248
- if (((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === http_status_codes_1.StatusCodes.PRECONDITION_FAILED) {
249
- const { missing, deleted } = (_b = error.response) === null || _b === void 0 ? void 0 : _b.data;
250
- const deletedUserIds = Object.keys(deleted);
251
- const missingUserIds = Object.keys(missing);
252
- if (deletedUserIds.length) {
253
- for (const deletedUserId of deletedUserIds) {
254
- for (const deletedClientId of deleted[deletedUserId]) {
255
- const deletedUserIndex = message.recipients.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === deletedUserId);
256
- if (deletedUserIndex > -1) {
257
- const deletedClientIndex = (_c = message.recipients[deletedUserIndex].clients) === null || _c === void 0 ? void 0 : _c.findIndex(({ client }) => {
258
- return client.client.toString(16) === deletedClientId;
259
- });
260
- if (typeof deletedClientIndex !== 'undefined' && deletedClientIndex > -1) {
261
- (_d = message.recipients[deletedUserIndex].clients) === null || _d === void 0 ? true : delete _d[deletedClientIndex];
262
- }
260
+ async onClientProtobufMismatch(clientMismatch, message, plainTextArray) {
261
+ var _a, _b;
262
+ const { missing, deleted } = clientMismatch;
263
+ const deletedUserIds = Object.keys(deleted);
264
+ const missingUserIds = Object.keys(missing);
265
+ if (deletedUserIds.length) {
266
+ for (const deletedUserId of deletedUserIds) {
267
+ for (const deletedClientId of deleted[deletedUserId]) {
268
+ const deletedUserIndex = message.recipients.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === deletedUserId);
269
+ if (deletedUserIndex > -1) {
270
+ const deletedClientIndex = (_a = message.recipients[deletedUserIndex].clients) === null || _a === void 0 ? void 0 : _a.findIndex(({ client }) => {
271
+ return client.client.toString(16) === deletedClientId;
272
+ });
273
+ if (typeof deletedClientIndex !== 'undefined' && deletedClientIndex > -1) {
274
+ (_b = message.recipients[deletedUserIndex].clients) === null || _b === void 0 ? true : delete _b[deletedClientIndex];
263
275
  }
264
276
  }
265
277
  }
266
278
  }
267
- if (missingUserIds.length) {
268
- const missingPreKeyBundles = await this.apiClient.user.api.postMultiPreKeyBundles(missing);
269
- const reEncryptedPayloads = await this.cryptographyService.encrypt(plainTextArray, missingPreKeyBundles);
270
- for (const missingUserId of missingUserIds) {
271
- for (const missingClientId in reEncryptedPayloads[missingUserId]) {
272
- const missingUserIndex = message.recipients.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === missingUserId);
273
- if (missingUserIndex === -1) {
274
- message.recipients.push({
275
- clients: [
276
- {
277
- client: {
278
- client: long_1.default.fromString(missingClientId, 16),
279
- },
280
- text: reEncryptedPayloads[missingUserId][missingClientId],
279
+ }
280
+ if (missingUserIds.length) {
281
+ const missingPreKeyBundles = await this.apiClient.user.api.postMultiPreKeyBundles(missing);
282
+ const reEncryptedPayloads = await this.cryptographyService.encrypt(plainTextArray, missingPreKeyBundles);
283
+ for (const missingUserId of missingUserIds) {
284
+ for (const missingClientId in reEncryptedPayloads[missingUserId]) {
285
+ const missingUserIndex = message.recipients.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === missingUserId);
286
+ if (missingUserIndex === -1) {
287
+ message.recipients.push({
288
+ clients: [
289
+ {
290
+ client: {
291
+ client: long_1.default.fromString(missingClientId, 16),
281
292
  },
282
- ],
283
- user: {
284
- uuid: (0, StringUtil_1.uuidToBytes)(missingUserId),
293
+ text: reEncryptedPayloads[missingUserId][missingClientId],
285
294
  },
286
- });
287
- }
295
+ ],
296
+ user: {
297
+ uuid: (0, StringUtil_1.uuidToBytes)(missingUserId),
298
+ },
299
+ });
288
300
  }
289
301
  }
290
302
  }
291
- return message;
292
303
  }
293
- throw error;
304
+ return message;
294
305
  }
295
- /**
296
- * Will re-encrypt a message when there were some missing clients in the initial send (typically when the server replies with a client mismatch error)
297
- *
298
- * @param {ProtobufOTR.QualifiedNewOtrMessage} messageData The initial message that was sent
299
- * @param {MessageSendingStatus} messageSendingStatus Info about the missing/deleted clients
300
- * @param {Uint8Array} plainTextArray The text that should be encrypted for the missing clients
301
- * @return resolves with a new message payload that can be sent
302
- */
303
- async encryptForMissingClients(messageData, messageSendingStatus, plainTextArray) {
304
- var _a, _b, _c;
305
- var _d;
306
+ deleteExtraQualifiedClients(message, deletedClients) {
307
+ var _a;
306
308
  // walk through deleted domain/user map
307
- for (const [deletedUserDomain, deletedUserIdClients] of Object.entries(messageSendingStatus.deleted)) {
308
- if (!messageData.recipients.find(recipient => recipient.domain === deletedUserDomain)) {
309
+ for (const [deletedUserDomain, deletedUserIdClients] of Object.entries(deletedClients)) {
310
+ if (!message.recipients.find(recipient => recipient.domain === deletedUserDomain)) {
309
311
  // no user from this domain was deleted
310
312
  continue;
311
313
  }
312
314
  // walk through deleted user ids
313
315
  for (const [deletedUserId] of Object.entries(deletedUserIdClients)) {
314
316
  // walk through message recipients
315
- for (const recipientIndex in messageData.recipients) {
317
+ for (const recipients of message.recipients) {
316
318
  // check if message recipients' domain is the same as the deleted user's domain
317
- if (messageData.recipients[recipientIndex].domain === deletedUserDomain) {
319
+ if (recipients.domain === deletedUserDomain) {
318
320
  // check if message recipients' id is the same as the deleted user's id
319
- for (const entriesIndex in messageData.recipients[recipientIndex].entries || []) {
320
- const uuid = (_a = messageData.recipients[recipientIndex].entries[entriesIndex].user) === null || _a === void 0 ? void 0 : _a.uuid;
321
+ for (const recipientEntry of recipients.entries || []) {
322
+ const uuid = (_a = recipientEntry.user) === null || _a === void 0 ? void 0 : _a.uuid;
321
323
  if (!!uuid && (0, StringUtil_1.bytesToUUID)(uuid) === deletedUserId) {
322
324
  // delete this user from the message recipients
323
- delete messageData.recipients[recipientIndex].entries[entriesIndex];
325
+ const deleteIndex = recipients.entries.indexOf(recipientEntry);
326
+ recipients.entries.splice(deleteIndex);
324
327
  }
325
328
  }
326
329
  }
327
330
  }
328
331
  }
329
332
  }
330
- const missingUserIds = Object.entries(messageSendingStatus.missing);
331
- if (missingUserIds.length) {
332
- const missingPreKeyBundles = await this.apiClient.user.api.postQualifiedMultiPreKeyBundles(messageSendingStatus.missing);
333
- const reEncryptedPayloads = await this.cryptographyService.encryptQualified(plainTextArray, missingPreKeyBundles);
334
- // walk through missing domain/user map
335
- for (const [missingUserDomain, missingUserIdClients] of missingUserIds) {
336
- if (!messageData.recipients.find(recipient => recipient.domain === missingUserDomain)) {
337
- // no user from this domain is missing
338
- continue;
339
- }
340
- // walk through missing user ids
341
- for (const [missingUserId, missingClientIds] of Object.entries(missingUserIdClients)) {
342
- // walk through message recipients
343
- for (const domain of messageData.recipients) {
344
- // check if message recipients' domain is the same as the missing user's domain
345
- if (domain.domain === missingUserDomain) {
346
- // check if there is a recipient with same user id as the missing user's id
347
- let userIndex = (_b = domain.entries) === null || _b === void 0 ? void 0 : _b.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === missingUserId);
348
- if (userIndex === -1) {
349
- // no recipient found, let's create it
350
- userIndex =
351
- domain.entries.push({
352
- user: {
353
- uuid: (0, StringUtil_1.uuidToBytes)(missingUserId),
354
- },
355
- }) - 1;
356
- }
357
- const missingUserUUID = domain.entries[userIndex].user.uuid;
358
- if ((0, StringUtil_1.bytesToUUID)(missingUserUUID) === missingUserId) {
359
- for (const missingClientId of missingClientIds) {
360
- (_d = domain.entries[userIndex]).clients || (_d.clients = []);
361
- (_c = domain.entries[userIndex].clients) === null || _c === void 0 ? void 0 : _c.push({
362
- client: {
363
- client: long_1.default.fromString(missingClientId, 16),
364
- },
365
- text: reEncryptedPayloads[missingUserDomain][missingUserId][missingClientId],
366
- });
367
- }
333
+ return message;
334
+ }
335
+ /**
336
+ * Will re-encrypt a message when there were some missing clients in the initial send (typically when the server replies with a client mismatch error)
337
+ *
338
+ * @param {ProtobufOTR.QualifiedNewOtrMessage} messageData The initial message that was sent
339
+ * @param {MessageSendingStatus} messageSendingStatus Info about the missing/deleted clients
340
+ * @param {Uint8Array} plainText The text that should be encrypted for the missing clients
341
+ * @return resolves with a new message payload that can be sent
342
+ */
343
+ async onFederatedMismatch(message, { deleted, missing }, plainText) {
344
+ message = this.deleteExtraQualifiedClients(message, deleted);
345
+ if (Object.keys(missing).length) {
346
+ const missingPreKeyBundles = await this.apiClient.user.api.postQualifiedMultiPreKeyBundles(missing);
347
+ const reEncryptedPayloads = await this.cryptographyService.encryptQualified(plainText, missingPreKeyBundles);
348
+ message = this.addMissingQualifiedClients(message, reEncryptedPayloads);
349
+ }
350
+ return message;
351
+ }
352
+ addMissingQualifiedClients(messageData, reEncryptedPayloads) {
353
+ var _a, _b;
354
+ var _c;
355
+ // walk through missing domain/user map
356
+ for (const [missingDomain, userClients] of Object.entries(reEncryptedPayloads)) {
357
+ // walk through missing user ids
358
+ for (const [missingUserId, missingClientIds] of Object.entries(userClients)) {
359
+ // walk through message recipients
360
+ for (const domain of messageData.recipients) {
361
+ // check if message recipients' domain is the same as the missing user's domain
362
+ if (domain.domain === missingDomain) {
363
+ // check if there is a recipient with same user id as the missing user's id
364
+ let userIndex = (_a = domain.entries) === null || _a === void 0 ? void 0 : _a.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === missingUserId);
365
+ if (userIndex === -1) {
366
+ // no recipient found, let's create it
367
+ userIndex =
368
+ domain.entries.push({
369
+ user: {
370
+ uuid: (0, StringUtil_1.uuidToBytes)(missingUserId),
371
+ },
372
+ }) - 1;
373
+ }
374
+ const missingUserUUID = domain.entries[userIndex].user.uuid;
375
+ if ((0, StringUtil_1.bytesToUUID)(missingUserUUID) === missingUserId) {
376
+ for (const [missingClientId, missingClientPayload] of Object.entries(missingClientIds)) {
377
+ (_c = domain.entries[userIndex]).clients || (_c.clients = []);
378
+ (_b = domain.entries[userIndex].clients) === null || _b === void 0 ? void 0 : _b.push({
379
+ client: {
380
+ client: long_1.default.fromString(missingClientId, 16),
381
+ },
382
+ text: missingClientPayload,
383
+ });
368
384
  }
369
385
  }
370
386
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MessageService.js","sourceRoot":"","sources":["MessageService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageService.js","sourceRoot":"","sources":["MessageService.ts"],"names":[],"mappings":"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"}
@@ -35,45 +35,101 @@ const baseMessageSendingStatus = {
35
35
  };
36
36
  const user1 = { id: uuidjs_1.default.genV4().toString(), domain: '1.wire.test', clients: ['client1.1', 'client1.2'] };
37
37
  const user2 = { id: uuidjs_1.default.genV4().toString(), domain: '2.wire.test', clients: ['client2.1', 'client2.2'] };
38
- function generatePayload(users) {
38
+ function generateQualifiedRecipients(users) {
39
39
  const payload = {};
40
40
  users.forEach(({ id, domain, clients }) => {
41
41
  payload[domain] || (payload[domain] = {});
42
- payload[domain][id] = {};
43
- clients.forEach(client => (payload[domain][id][client] = new Uint8Array()));
42
+ payload[domain][id] = clients;
44
43
  });
45
44
  return payload;
46
45
  }
46
+ function fakeEncrypt(_, recipients) {
47
+ const encryptedPayload = Object.entries(recipients).reduce((acc, [domain, users]) => {
48
+ acc[domain] = Object.entries(users).reduce((userClients, [userId, clients]) => {
49
+ userClients[userId] = clients.reduce((payloads, client) => {
50
+ payloads[client] = new Uint8Array();
51
+ return payloads;
52
+ }, {});
53
+ return userClients;
54
+ }, {});
55
+ return acc;
56
+ }, {});
57
+ return Promise.resolve(encryptedPayload);
58
+ }
47
59
  describe('MessageService', () => {
48
60
  const apiClient = new api_client_1.APIClient();
49
61
  const cryptographyService = new cryptography_1.CryptographyService(apiClient, {});
50
62
  const messageService = new MessageService_1.MessageService(apiClient, cryptographyService);
63
+ beforeEach(() => {
64
+ spyOn(cryptographyService, 'encryptQualified').and.callFake(fakeEncrypt);
65
+ });
51
66
  describe('sendFederatedMessage', () => {
52
67
  it('sends a message', async () => {
53
68
  spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.returnValue(Promise.resolve(baseMessageSendingStatus));
54
- const recipients = generatePayload([user1, user2]);
55
- await messageService.sendFederatedOTRMessage('senderclientid', 'convid', '', recipients, new Uint8Array());
69
+ const recipients = generateQualifiedRecipients([user1, user2]);
70
+ await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array());
56
71
  expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalled();
57
72
  });
58
- it('handles mismatch errors internally if reportMissing is true', async () => {
59
- let spyCounter = 0;
60
- spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.callFake(() => {
61
- spyCounter++;
62
- if (spyCounter === 1) {
73
+ describe('client mismatch', () => {
74
+ it('handles client mismatch internally if no onClientMismatch is given', async () => {
75
+ let spyCounter = 0;
76
+ const clientMismatch = Object.assign(Object.assign({}, baseMessageSendingStatus), { deleted: { [user1.domain]: { [user1.id]: [user1.clients[0]] } }, missing: { '2.wire.test': { [user2.id]: ['client22'] } } });
77
+ spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.callFake(() => {
78
+ spyCounter++;
79
+ if (spyCounter === 1) {
80
+ const error = new Error();
81
+ error.response = {
82
+ status: http_status_codes_1.StatusCodes.PRECONDITION_FAILED,
83
+ data: clientMismatch,
84
+ };
85
+ return Promise.reject(error);
86
+ }
87
+ return Promise.resolve(baseMessageSendingStatus);
88
+ });
89
+ spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
90
+ const recipients = generateQualifiedRecipients([user1, user2]);
91
+ await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array(), { reportMissing: true });
92
+ expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(2);
93
+ });
94
+ it('continues message sending if onClientMismatch returns true', async () => {
95
+ const onClientMismatch = jasmine.createSpy().and.returnValue(Promise.resolve(true));
96
+ const clientMismatch = Object.assign(Object.assign({}, baseMessageSendingStatus), { missing: { '2.wire.test': { [user2.id]: ['client22'] } } });
97
+ let spyCounter = 0;
98
+ spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.callFake(() => {
99
+ spyCounter++;
100
+ if (spyCounter === 1) {
101
+ const error = new Error();
102
+ error.response = {
103
+ status: http_status_codes_1.StatusCodes.PRECONDITION_FAILED,
104
+ data: clientMismatch,
105
+ };
106
+ return Promise.reject(error);
107
+ }
108
+ return Promise.resolve(baseMessageSendingStatus);
109
+ });
110
+ spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
111
+ const recipients = generateQualifiedRecipients([user1, user2]);
112
+ await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array(), { reportMissing: true, onClientMismatch });
113
+ expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(2);
114
+ expect(onClientMismatch).toHaveBeenCalledWith(clientMismatch);
115
+ });
116
+ it('stops message sending if onClientMismatch returns false', async () => {
117
+ const onClientMismatch = jasmine.createSpy().and.returnValue(Promise.resolve(false));
118
+ const clientMismatch = Object.assign(Object.assign({}, baseMessageSendingStatus), { missing: { '2.wire.test': { [user2.id]: ['client22'] } } });
119
+ spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.callFake(() => {
63
120
  const error = new Error();
64
121
  error.response = {
65
122
  status: http_status_codes_1.StatusCodes.PRECONDITION_FAILED,
66
- data: Object.assign(Object.assign({}, baseMessageSendingStatus), { missing: { '2.wire.test': { [user2.id]: ['client22'] } } }),
123
+ data: clientMismatch,
67
124
  };
68
125
  return Promise.reject(error);
69
- }
70
- return Promise.resolve(baseMessageSendingStatus);
126
+ });
127
+ spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
128
+ const recipients = generateQualifiedRecipients([user1, user2]);
129
+ await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array(), { reportMissing: true, onClientMismatch });
130
+ expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(1);
131
+ expect(onClientMismatch).toHaveBeenCalledWith(clientMismatch);
71
132
  });
72
- spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
73
- spyOn(cryptographyService, 'encryptQualified').and.returnValue(Promise.resolve({ '2.wire.test': { [user2.id]: { client22: new Uint8Array() } } }));
74
- const recipients = generatePayload([user1, user2]);
75
- await messageService.sendFederatedOTRMessage('senderclientid', 'convid', '', recipients, new Uint8Array(), undefined, true);
76
- expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(2);
77
133
  });
78
134
  });
79
135
  });
@@ -1 +1 @@
1
- {"version":3,"file":"MessageService.test.node.js","sourceRoot":"","sources":["MessageService.test.node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageService.test.node.js","sourceRoot":"","sources":["MessageService.test.node.ts"],"names":[],"mappings":"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"}