@wireapp/core 17.20.2 → 17.22.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.
Files changed (26) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/package.json +3 -3
  3. package/src/main/conversation/ConversationService.d.ts +39 -5
  4. package/src/main/conversation/ConversationService.js +95 -38
  5. package/src/main/conversation/ConversationService.js.map +1 -1
  6. package/src/main/conversation/ConversationService.ts +110 -76
  7. package/src/main/conversation/message/MessageService.d.ts +19 -3
  8. package/src/main/conversation/message/MessageService.js +155 -119
  9. package/src/main/conversation/message/MessageService.js.map +1 -1
  10. package/src/main/conversation/message/MessageService.test.node.d.ts +1 -0
  11. package/src/main/conversation/message/MessageService.test.node.js +123 -0
  12. package/src/main/conversation/message/MessageService.test.node.js.map +1 -0
  13. package/src/main/conversation/message/MessageService.test.node.ts +163 -0
  14. package/src/main/conversation/message/MessageService.ts +176 -149
  15. package/src/main/cryptography/CryptographyService.d.ts +3 -3
  16. package/src/main/cryptography/CryptographyService.js +14 -11
  17. package/src/main/cryptography/CryptographyService.js.map +1 -1
  18. package/src/main/cryptography/CryptographyService.ts +23 -16
  19. package/src/main/util/TypePredicateUtil.d.ts +1 -0
  20. package/src/main/util/TypePredicateUtil.js +7 -3
  21. package/src/main/util/TypePredicateUtil.js.map +1 -1
  22. package/src/main/util/TypePredicateUtil.test.node.d.ts +1 -0
  23. package/src/main/util/TypePredicateUtil.test.node.js +42 -0
  24. package/src/main/util/TypePredicateUtil.test.node.js.map +1 -0
  25. package/src/main/util/TypePredicateUtil.test.node.ts +44 -0
  26. package/src/main/util/TypePredicateUtil.ts +6 -2
@@ -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),
@@ -60,6 +63,10 @@ class MessageService {
60
63
  });
61
64
  }
62
65
  }
66
+ isClientMismatchError(error) {
67
+ var _a;
68
+ return ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === http_status_codes_1.StatusCodes.PRECONDITION_FAILED;
69
+ }
63
70
  checkFederatedClientsMismatch(messageData, messageSendingStatus) {
64
71
  var _a, _b, _c, _d;
65
72
  const updatedMessageSendingStatus = Object.assign({}, messageSendingStatus);
@@ -103,8 +110,9 @@ class MessageService {
103
110
  }
104
111
  return updatedMessageSendingStatus;
105
112
  }
106
- async sendFederatedOTRMessage(sendingClientId, conversationId, conversationDomain, recipients, plainTextArray, assetData) {
107
- const qualifiedUserEntries = Object.entries(recipients).map(([domain, otrRecipients]) => {
113
+ async sendFederatedOTRMessage(sendingClientId, { id: conversationId, domain }, recipients, plainTextArray, options = {}) {
114
+ const otrRecipients = await this.cryptographyService.encryptQualified(plainTextArray, recipients);
115
+ const qualifiedUserEntries = Object.entries(otrRecipients).map(([domain, otrRecipients]) => {
108
116
  const userEntries = Object.entries(otrRecipients).map(([userId, otrClientMap]) => {
109
117
  const clientEntries = Object.entries(otrClientMap).map(([clientId, payload]) => {
110
118
  return {
@@ -129,22 +137,40 @@ class MessageService {
129
137
  client: long_1.default.fromString(sendingClientId, 16),
130
138
  },
131
139
  });
132
- if (assetData) {
133
- protoMessage.blob = assetData;
140
+ if (options.assetData) {
141
+ protoMessage.blob = options.assetData;
134
142
  }
135
143
  /*
136
144
  * When creating the PreKey bundles we already found out to which users we want to send a message, so we can ignore
137
145
  * missing clients. We have to ignore missing clients because there can be the case that there are clients that
138
146
  * don't provide PreKeys (clients from the Pre-E2EE era).
139
147
  */
140
- protoMessage.ignoreAll = {};
141
- const messageSendingStatus = await this.apiClient.conversation.api.postOTRMessageV2(conversationId, conversationDomain, protoMessage);
142
- const federatedClientsMismatch = this.checkFederatedClientsMismatch(protoMessage, messageSendingStatus);
143
- if (federatedClientsMismatch) {
144
- const reEncryptedMessage = await this.onFederatedClientMismatch(protoMessage, federatedClientsMismatch, plainTextArray);
145
- await this.apiClient.conversation.api.postOTRMessageV2(conversationId, conversationDomain, reEncryptedMessage);
148
+ if (options.reportMissing) {
149
+ protoMessage.reportAll = {};
150
+ }
151
+ else {
152
+ protoMessage.ignoreAll = {};
146
153
  }
147
- return messageSendingStatus;
154
+ let sendingStatus;
155
+ try {
156
+ sendingStatus = await this.apiClient.conversation.api.postOTRMessageV2(conversationId, domain, protoMessage);
157
+ }
158
+ catch (error) {
159
+ if (!this.isClientMismatchError(error)) {
160
+ throw error;
161
+ }
162
+ sendingStatus = error.response.data;
163
+ }
164
+ const mismatch = this.checkFederatedClientsMismatch(protoMessage, sendingStatus);
165
+ if (mismatch) {
166
+ const shouldStopSending = options.onClientMismatch && !(await options.onClientMismatch(mismatch));
167
+ if (shouldStopSending) {
168
+ return sendingStatus;
169
+ }
170
+ const reEncryptedMessage = await this.onFederatedMismatch(protoMessage, mismatch, plainTextArray);
171
+ await this.apiClient.conversation.api.postOTRMessageV2(conversationId, domain, reEncryptedMessage);
172
+ }
173
+ return sendingStatus;
148
174
  }
149
175
  async sendOTRProtobufMessage(sendingClientId, recipients, conversationId, plainTextArray, assetData) {
150
176
  const userEntries = Object.entries(recipients).map(([userId, otrClientMap]) => {
@@ -185,160 +211,170 @@ class MessageService {
185
211
  return await this.apiClient.conversation.api.postOTRProtobufMessage(sendingClientId, conversationId, protoMessage, ignoreMissing);
186
212
  }
187
213
  catch (error) {
188
- const reEncryptedMessage = await this.onClientProtobufMismatch(error, protoMessage, plainTextArray);
214
+ if (!this.isClientMismatchError(error)) {
215
+ throw error;
216
+ }
217
+ const mismatch = error.response.data;
218
+ const reEncryptedMessage = await this.onClientProtobufMismatch(mismatch, protoMessage, plainTextArray);
189
219
  if (conversationId === null) {
190
220
  return await this.apiClient.broadcast.api.postBroadcastProtobufMessage(sendingClientId, reEncryptedMessage);
191
221
  }
192
222
  return await this.apiClient.conversation.api.postOTRProtobufMessage(sendingClientId, conversationId, reEncryptedMessage, ignoreMissing);
193
223
  }
194
224
  }
195
- async onClientMismatch(error, message, plainTextArray) {
196
- var _a, _b;
197
- if (((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === http_status_codes_1.StatusCodes.PRECONDITION_FAILED) {
198
- const { missing, deleted } = (_b = error.response) === null || _b === void 0 ? void 0 : _b.data;
199
- const deletedUserIds = Object.keys(deleted);
200
- const missingUserIds = Object.keys(missing);
201
- if (deletedUserIds.length) {
202
- for (const deletedUserId of deletedUserIds) {
203
- for (const deletedClientId of deleted[deletedUserId]) {
204
- const deletedUser = message.recipients[deletedUserId];
205
- if (deletedUser) {
206
- delete deletedUser[deletedClientId];
207
- }
225
+ async onClientMismatch(clientMismatch, message, plainTextArray) {
226
+ const { missing, deleted } = clientMismatch;
227
+ const deletedUserIds = Object.keys(deleted);
228
+ const missingUserIds = Object.keys(missing);
229
+ if (deletedUserIds.length) {
230
+ for (const deletedUserId of deletedUserIds) {
231
+ for (const deletedClientId of deleted[deletedUserId]) {
232
+ const deletedUser = message.recipients[deletedUserId];
233
+ if (deletedUser) {
234
+ delete deletedUser[deletedClientId];
208
235
  }
209
236
  }
210
237
  }
211
- if (missingUserIds.length) {
212
- const missingPreKeyBundles = await this.apiClient.user.api.postMultiPreKeyBundles(missing);
213
- const reEncryptedPayloads = await this.cryptographyService.encrypt(plainTextArray, missingPreKeyBundles);
214
- for (const missingUserId of missingUserIds) {
215
- for (const missingClientId in reEncryptedPayloads[missingUserId]) {
216
- const missingUser = message.recipients[missingUserId];
217
- if (!missingUser) {
218
- message.recipients[missingUserId] = {};
219
- }
220
- message.recipients[missingUserId][missingClientId] = reEncryptedPayloads[missingUserId][missingClientId];
238
+ }
239
+ if (missingUserIds.length) {
240
+ const missingPreKeyBundles = await this.apiClient.user.api.postMultiPreKeyBundles(missing);
241
+ const reEncryptedPayloads = await this.cryptographyService.encrypt(plainTextArray, missingPreKeyBundles);
242
+ for (const missingUserId of missingUserIds) {
243
+ for (const missingClientId in reEncryptedPayloads[missingUserId]) {
244
+ const missingUser = message.recipients[missingUserId];
245
+ if (!missingUser) {
246
+ message.recipients[missingUserId] = {};
221
247
  }
248
+ message.recipients[missingUserId][missingClientId] = reEncryptedPayloads[missingUserId][missingClientId];
222
249
  }
223
250
  }
224
- return message;
225
251
  }
226
- throw error;
252
+ return message;
227
253
  }
228
- async onClientProtobufMismatch(error, message, plainTextArray) {
229
- var _a, _b, _c, _d;
230
- if (((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === http_status_codes_1.StatusCodes.PRECONDITION_FAILED) {
231
- const { missing, deleted } = (_b = error.response) === null || _b === void 0 ? void 0 : _b.data;
232
- const deletedUserIds = Object.keys(deleted);
233
- const missingUserIds = Object.keys(missing);
234
- if (deletedUserIds.length) {
235
- for (const deletedUserId of deletedUserIds) {
236
- for (const deletedClientId of deleted[deletedUserId]) {
237
- const deletedUserIndex = message.recipients.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === deletedUserId);
238
- if (deletedUserIndex > -1) {
239
- const deletedClientIndex = (_c = message.recipients[deletedUserIndex].clients) === null || _c === void 0 ? void 0 : _c.findIndex(({ client }) => {
240
- return client.client.toString(16) === deletedClientId;
241
- });
242
- if (typeof deletedClientIndex !== 'undefined' && deletedClientIndex > -1) {
243
- (_d = message.recipients[deletedUserIndex].clients) === null || _d === void 0 ? true : delete _d[deletedClientIndex];
244
- }
254
+ async onClientProtobufMismatch(clientMismatch, message, plainTextArray) {
255
+ var _a, _b;
256
+ const { missing, deleted } = clientMismatch;
257
+ const deletedUserIds = Object.keys(deleted);
258
+ const missingUserIds = Object.keys(missing);
259
+ if (deletedUserIds.length) {
260
+ for (const deletedUserId of deletedUserIds) {
261
+ for (const deletedClientId of deleted[deletedUserId]) {
262
+ const deletedUserIndex = message.recipients.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === deletedUserId);
263
+ if (deletedUserIndex > -1) {
264
+ const deletedClientIndex = (_a = message.recipients[deletedUserIndex].clients) === null || _a === void 0 ? void 0 : _a.findIndex(({ client }) => {
265
+ return client.client.toString(16) === deletedClientId;
266
+ });
267
+ if (typeof deletedClientIndex !== 'undefined' && deletedClientIndex > -1) {
268
+ (_b = message.recipients[deletedUserIndex].clients) === null || _b === void 0 ? true : delete _b[deletedClientIndex];
245
269
  }
246
270
  }
247
271
  }
248
272
  }
249
- if (missingUserIds.length) {
250
- const missingPreKeyBundles = await this.apiClient.user.api.postMultiPreKeyBundles(missing);
251
- const reEncryptedPayloads = await this.cryptographyService.encrypt(plainTextArray, missingPreKeyBundles);
252
- for (const missingUserId of missingUserIds) {
253
- for (const missingClientId in reEncryptedPayloads[missingUserId]) {
254
- const missingUserIndex = message.recipients.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === missingUserId);
255
- if (missingUserIndex === -1) {
256
- message.recipients.push({
257
- clients: [
258
- {
259
- client: {
260
- client: long_1.default.fromString(missingClientId, 16),
261
- },
262
- text: reEncryptedPayloads[missingUserId][missingClientId],
273
+ }
274
+ if (missingUserIds.length) {
275
+ const missingPreKeyBundles = await this.apiClient.user.api.postMultiPreKeyBundles(missing);
276
+ const reEncryptedPayloads = await this.cryptographyService.encrypt(plainTextArray, missingPreKeyBundles);
277
+ for (const missingUserId of missingUserIds) {
278
+ for (const missingClientId in reEncryptedPayloads[missingUserId]) {
279
+ const missingUserIndex = message.recipients.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === missingUserId);
280
+ if (missingUserIndex === -1) {
281
+ message.recipients.push({
282
+ clients: [
283
+ {
284
+ client: {
285
+ client: long_1.default.fromString(missingClientId, 16),
263
286
  },
264
- ],
265
- user: {
266
- uuid: (0, StringUtil_1.uuidToBytes)(missingUserId),
287
+ text: reEncryptedPayloads[missingUserId][missingClientId],
267
288
  },
268
- });
269
- }
289
+ ],
290
+ user: {
291
+ uuid: (0, StringUtil_1.uuidToBytes)(missingUserId),
292
+ },
293
+ });
270
294
  }
271
295
  }
272
296
  }
273
- return message;
274
297
  }
275
- throw error;
298
+ return message;
276
299
  }
277
- async onFederatedClientMismatch(messageData, messageSendingStatus, plainTextArray) {
278
- var _a, _b, _c;
279
- var _d;
300
+ deleteExtraQualifiedClients(message, deletedClients) {
301
+ var _a;
280
302
  // walk through deleted domain/user map
281
- for (const [deletedUserDomain, deletedUserIdClients] of Object.entries(messageSendingStatus.deleted)) {
282
- if (!messageData.recipients.find(recipient => recipient.domain === deletedUserDomain)) {
303
+ for (const [deletedUserDomain, deletedUserIdClients] of Object.entries(deletedClients)) {
304
+ if (!message.recipients.find(recipient => recipient.domain === deletedUserDomain)) {
283
305
  // no user from this domain was deleted
284
306
  continue;
285
307
  }
286
308
  // walk through deleted user ids
287
309
  for (const [deletedUserId] of Object.entries(deletedUserIdClients)) {
288
310
  // walk through message recipients
289
- for (const recipientIndex in messageData.recipients) {
311
+ for (const recipientIndex in message.recipients) {
290
312
  // check if message recipients' domain is the same as the deleted user's domain
291
- if (messageData.recipients[recipientIndex].domain === deletedUserDomain) {
313
+ if (message.recipients[recipientIndex].domain === deletedUserDomain) {
292
314
  // check if message recipients' id is the same as the deleted user's id
293
- for (const entriesIndex in messageData.recipients[recipientIndex].entries || []) {
294
- const uuid = (_a = messageData.recipients[recipientIndex].entries[entriesIndex].user) === null || _a === void 0 ? void 0 : _a.uuid;
315
+ for (const entriesIndex in message.recipients[recipientIndex].entries || []) {
316
+ const uuid = (_a = message.recipients[recipientIndex].entries[entriesIndex].user) === null || _a === void 0 ? void 0 : _a.uuid;
295
317
  if (!!uuid && (0, StringUtil_1.bytesToUUID)(uuid) === deletedUserId) {
296
318
  // delete this user from the message recipients
297
- delete messageData.recipients[recipientIndex].entries[entriesIndex];
319
+ delete message.recipients[recipientIndex].entries[entriesIndex];
298
320
  }
299
321
  }
300
322
  }
301
323
  }
302
324
  }
303
325
  }
304
- const missingUserIds = Object.entries(messageSendingStatus.missing);
305
- if (missingUserIds.length) {
306
- const missingPreKeyBundles = await this.apiClient.user.api.postQualifiedMultiPreKeyBundles(messageSendingStatus.missing);
307
- const reEncryptedPayloads = await this.cryptographyService.encryptQualified(plainTextArray, missingPreKeyBundles);
308
- // walk through missing domain/user map
309
- for (const [missingUserDomain, missingUserIdClients] of missingUserIds) {
310
- if (!messageData.recipients.find(recipient => recipient.domain === missingUserDomain)) {
311
- // no user from this domain is missing
312
- continue;
313
- }
314
- // walk through missing user ids
315
- for (const [missingUserId, missingClientIds] of Object.entries(missingUserIdClients)) {
316
- // walk through message recipients
317
- for (const recipientIndex in messageData.recipients) {
318
- // check if message recipients' domain is the same as the missing user's domain
319
- if (messageData.recipients[recipientIndex].domain === missingUserDomain) {
320
- // check if there is a recipient with same user id as the missing user's id
321
- let userIndex = (_b = messageData.recipients[recipientIndex].entries) === null || _b === void 0 ? void 0 : _b.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === missingUserId);
322
- if (userIndex === -1) {
323
- // no recipient found, let's create it
324
- userIndex = messageData.recipients[recipientIndex].entries.push({
326
+ return message;
327
+ }
328
+ /**
329
+ * 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)
330
+ *
331
+ * @param {ProtobufOTR.QualifiedNewOtrMessage} messageData The initial message that was sent
332
+ * @param {MessageSendingStatus} messageSendingStatus Info about the missing/deleted clients
333
+ * @param {Uint8Array} plainText The text that should be encrypted for the missing clients
334
+ * @return resolves with a new message payload that can be sent
335
+ */
336
+ async onFederatedMismatch(message, { deleted, missing }, plainText) {
337
+ message = this.deleteExtraQualifiedClients(message, deleted);
338
+ if (Object.keys(missing).length) {
339
+ const missingPreKeyBundles = await this.apiClient.user.api.postQualifiedMultiPreKeyBundles(missing);
340
+ const reEncryptedPayloads = await this.cryptographyService.encryptQualified(plainText, missingPreKeyBundles);
341
+ message = this.addMissingQualifiedClients(message, reEncryptedPayloads);
342
+ }
343
+ return message;
344
+ }
345
+ addMissingQualifiedClients(messageData, reEncryptedPayloads) {
346
+ var _a, _b;
347
+ var _c;
348
+ // walk through missing domain/user map
349
+ for (const [missingDomain, userClients] of Object.entries(reEncryptedPayloads)) {
350
+ // walk through missing user ids
351
+ for (const [missingUserId, missingClientIds] of Object.entries(userClients)) {
352
+ // walk through message recipients
353
+ for (const domain of messageData.recipients) {
354
+ // check if message recipients' domain is the same as the missing user's domain
355
+ if (domain.domain === missingDomain) {
356
+ // check if there is a recipient with same user id as the missing user's id
357
+ let userIndex = (_a = domain.entries) === null || _a === void 0 ? void 0 : _a.findIndex(({ user }) => (0, StringUtil_1.bytesToUUID)(user.uuid) === missingUserId);
358
+ if (userIndex === -1) {
359
+ // no recipient found, let's create it
360
+ userIndex =
361
+ domain.entries.push({
325
362
  user: {
326
363
  uuid: (0, StringUtil_1.uuidToBytes)(missingUserId),
327
364
  },
365
+ }) - 1;
366
+ }
367
+ const missingUserUUID = domain.entries[userIndex].user.uuid;
368
+ if ((0, StringUtil_1.bytesToUUID)(missingUserUUID) === missingUserId) {
369
+ for (const [missingClientId, missingClientPayload] of Object.entries(missingClientIds)) {
370
+ (_c = domain.entries[userIndex]).clients || (_c.clients = []);
371
+ (_b = domain.entries[userIndex].clients) === null || _b === void 0 ? void 0 : _b.push({
372
+ client: {
373
+ client: long_1.default.fromString(missingClientId, 16),
374
+ },
375
+ text: missingClientPayload,
328
376
  });
329
377
  }
330
- const missingUserUUID = messageData.recipients[recipientIndex].entries[userIndex].user.uuid;
331
- if ((0, StringUtil_1.bytesToUUID)(missingUserUUID) === missingUserId) {
332
- for (const missingClientId of missingClientIds) {
333
- (_d = messageData.recipients[recipientIndex].entries[userIndex]).clients || (_d.clients = []);
334
- (_c = messageData.recipients[recipientIndex].entries[userIndex].clients) === null || _c === void 0 ? void 0 : _c.push({
335
- client: {
336
- client: long_1.default.fromString(missingClientId, 16),
337
- },
338
- text: reEncryptedPayloads[missingUserDomain][missingUserId][missingClientId],
339
- });
340
- }
341
- }
342
378
  }
343
379
  }
344
380
  }
@@ -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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"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ /*
3
+ * Wire
4
+ * Copyright (C) 2021 Wire Swiss GmbH
5
+ *
6
+ * This program is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU General Public License as published by
8
+ * the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * This program is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ * GNU General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public License
17
+ * along with this program. If not, see http://www.gnu.org/licenses/.
18
+ *
19
+ */
20
+ var __importDefault = (this && this.__importDefault) || function (mod) {
21
+ return (mod && mod.__esModule) ? mod : { "default": mod };
22
+ };
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ const uuidjs_1 = __importDefault(require("uuidjs"));
25
+ const http_status_codes_1 = require("http-status-codes");
26
+ const api_client_1 = require("@wireapp/api-client");
27
+ const cryptography_1 = require("../../cryptography");
28
+ const MessageService_1 = require("./MessageService");
29
+ const baseMessageSendingStatus = {
30
+ deleted: {},
31
+ missing: {},
32
+ failed_to_send: {},
33
+ redundant: {},
34
+ time: new Date().toISOString(),
35
+ };
36
+ const user1 = { id: uuidjs_1.default.genV4().toString(), domain: '1.wire.test', clients: ['client1.1', 'client1.2'] };
37
+ const user2 = { id: uuidjs_1.default.genV4().toString(), domain: '2.wire.test', clients: ['client2.1', 'client2.2'] };
38
+ function generateQualifiedRecipients(users) {
39
+ const payload = {};
40
+ users.forEach(({ id, domain, clients }) => {
41
+ payload[domain] || (payload[domain] = {});
42
+ payload[domain][id] = clients;
43
+ });
44
+ return payload;
45
+ }
46
+ describe('MessageService', () => {
47
+ const apiClient = new api_client_1.APIClient();
48
+ const cryptographyService = new cryptography_1.CryptographyService(apiClient, {});
49
+ const messageService = new MessageService_1.MessageService(apiClient, cryptographyService);
50
+ describe('sendFederatedMessage', () => {
51
+ it('sends a message', async () => {
52
+ spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.returnValue(Promise.resolve(baseMessageSendingStatus));
53
+ const recipients = generateQualifiedRecipients([user1, user2]);
54
+ await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array());
55
+ expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalled();
56
+ });
57
+ describe('client mismatch', () => {
58
+ it('handles client mismatch internally if no onClientMismatch is given', async () => {
59
+ let spyCounter = 0;
60
+ const clientMismatch = Object.assign(Object.assign({}, baseMessageSendingStatus), { missing: { '2.wire.test': { [user2.id]: ['client22'] } } });
61
+ spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.callFake(() => {
62
+ spyCounter++;
63
+ if (spyCounter === 1) {
64
+ const error = new Error();
65
+ error.response = {
66
+ status: http_status_codes_1.StatusCodes.PRECONDITION_FAILED,
67
+ data: clientMismatch,
68
+ };
69
+ return Promise.reject(error);
70
+ }
71
+ return Promise.resolve(baseMessageSendingStatus);
72
+ });
73
+ spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
74
+ spyOn(cryptographyService, 'encryptQualified').and.returnValue(Promise.resolve({ '2.wire.test': { [user2.id]: { client22: new Uint8Array() } } }));
75
+ const recipients = generateQualifiedRecipients([user1, user2]);
76
+ await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array(), { reportMissing: true });
77
+ expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(2);
78
+ });
79
+ it('continues message sending if onClientMismatch returns true', async () => {
80
+ const onClientMismatch = jasmine.createSpy().and.returnValue(Promise.resolve(true));
81
+ const clientMismatch = Object.assign(Object.assign({}, baseMessageSendingStatus), { missing: { '2.wire.test': { [user2.id]: ['client22'] } } });
82
+ let spyCounter = 0;
83
+ spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.callFake(() => {
84
+ spyCounter++;
85
+ if (spyCounter === 1) {
86
+ const error = new Error();
87
+ error.response = {
88
+ status: http_status_codes_1.StatusCodes.PRECONDITION_FAILED,
89
+ data: clientMismatch,
90
+ };
91
+ return Promise.reject(error);
92
+ }
93
+ return Promise.resolve(baseMessageSendingStatus);
94
+ });
95
+ spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
96
+ spyOn(cryptographyService, 'encryptQualified').and.returnValue(Promise.resolve({ '2.wire.test': { [user2.id]: { client22: new Uint8Array() } } }));
97
+ const recipients = generateQualifiedRecipients([user1, user2]);
98
+ await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array(), { reportMissing: true, onClientMismatch });
99
+ expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(2);
100
+ expect(onClientMismatch).toHaveBeenCalledWith(clientMismatch);
101
+ });
102
+ it('stops message sending if onClientMismatch returns false', async () => {
103
+ const onClientMismatch = jasmine.createSpy().and.returnValue(Promise.resolve(false));
104
+ const clientMismatch = Object.assign(Object.assign({}, baseMessageSendingStatus), { missing: { '2.wire.test': { [user2.id]: ['client22'] } } });
105
+ spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.callFake(() => {
106
+ const error = new Error();
107
+ error.response = {
108
+ status: http_status_codes_1.StatusCodes.PRECONDITION_FAILED,
109
+ data: clientMismatch,
110
+ };
111
+ return Promise.reject(error);
112
+ });
113
+ spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
114
+ spyOn(cryptographyService, 'encryptQualified').and.returnValue(Promise.resolve({ '2.wire.test': { [user2.id]: { client22: new Uint8Array() } } }));
115
+ const recipients = generateQualifiedRecipients([user1, user2]);
116
+ await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array(), { reportMissing: true, onClientMismatch });
117
+ expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(1);
118
+ expect(onClientMismatch).toHaveBeenCalledWith(clientMismatch);
119
+ });
120
+ });
121
+ });
122
+ });
123
+ //# sourceMappingURL=MessageService.test.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageService.test.node.js","sourceRoot":"","sources":["MessageService.test.node.ts"],"names":[],"mappings":"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"}