@wireapp/core 44.0.11 → 44.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/conversation/ConversationService/ConversationService.d.ts.map +1 -1
- package/lib/conversation/ConversationService/ConversationService.js +9 -14
- package/lib/conversation/ConversationService/ConversationService.test.js +39 -4
- package/lib/conversation/ConversationService/ConversationService.types.d.ts +15 -8
- package/lib/conversation/ConversationService/ConversationService.types.d.ts.map +1 -1
- package/lib/conversation/ConversationService/ConversationService.types.js +1 -0
- package/lib/messagingProtocols/mls/MLSService/MLSService.d.ts +9 -5
- package/lib/messagingProtocols/mls/MLSService/MLSService.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/MLSService/MLSService.js +55 -16
- package/lib/messagingProtocols/mls/MLSService/MLSService.test.js +74 -1
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.js +10 -8
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.test.js +23 -19
- package/package.json +2 -2
|
@@ -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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"}
|
|
@@ -30,7 +30,6 @@ const bazinga64_1 = require("bazinga64");
|
|
|
30
30
|
const logdown_1 = __importDefault(require("logdown"));
|
|
31
31
|
const commons_1 = require("@wireapp/commons");
|
|
32
32
|
const protocol_messaging_1 = require("@wireapp/protocol-messaging");
|
|
33
|
-
const ConversationService_types_1 = require("./ConversationService.types");
|
|
34
33
|
const conversation_2 = require("../../conversation/");
|
|
35
34
|
const AssetCryptography_1 = require("../../cryptography/AssetCryptography");
|
|
36
35
|
const conversationRejoinQueue_1 = require("../../messagingProtocols/mls/conversationRejoinQueue");
|
|
@@ -247,7 +246,7 @@ class ConversationService extends commons_1.TypedEventEmitter {
|
|
|
247
246
|
if (!groupId) {
|
|
248
247
|
throw new Error('No group_id found in response which is required for creating MLS conversations.');
|
|
249
248
|
}
|
|
250
|
-
const
|
|
249
|
+
const { events, failures } = await this.mlsService.registerConversation(groupId, qualifiedUsers.concat(selfUserId), {
|
|
251
250
|
creator: {
|
|
252
251
|
user: selfUserId,
|
|
253
252
|
client: selfClientId,
|
|
@@ -256,11 +255,9 @@ class ConversationService extends commons_1.TypedEventEmitter {
|
|
|
256
255
|
// We fetch the fresh version of the conversation created on backend with the newly added users
|
|
257
256
|
const conversation = await this.apiClient.api.conversation.getConversation(qualifiedId);
|
|
258
257
|
return {
|
|
259
|
-
events
|
|
258
|
+
events,
|
|
260
259
|
conversation,
|
|
261
|
-
failedToAdd:
|
|
262
|
-
? { users: response.failed, backends: [], reason: ConversationService_types_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS }
|
|
263
|
-
: undefined,
|
|
260
|
+
failedToAdd: failures,
|
|
264
261
|
};
|
|
265
262
|
}
|
|
266
263
|
async sendMLSMessage(params, shouldRetry = true) {
|
|
@@ -307,19 +304,17 @@ class ConversationService extends commons_1.TypedEventEmitter {
|
|
|
307
304
|
* @param conversationId Id of the conversation to which we want to add users
|
|
308
305
|
*/
|
|
309
306
|
async addUsersToMLSConversation({ qualifiedUsers, groupId, conversationId, }) {
|
|
310
|
-
const {
|
|
311
|
-
const
|
|
312
|
-
? await this.mlsService.addUsersToExistingConversation(groupId,
|
|
313
|
-
: { events: [] };
|
|
307
|
+
const { keyPackages, failures: keysClaimingFailures } = await this.mlsService.getKeyPackagesPayload(qualifiedUsers);
|
|
308
|
+
const { events, failures } = keyPackages.length > 0
|
|
309
|
+
? await this.mlsService.addUsersToExistingConversation(groupId, keyPackages)
|
|
310
|
+
: { events: [], failures: [] };
|
|
314
311
|
const conversation = await this.getConversation(conversationId);
|
|
315
312
|
//We store the info when user was added (and key material was created), so we will know when to renew it
|
|
316
313
|
await this.mlsService.resetKeyMaterialRenewal(groupId);
|
|
317
314
|
return {
|
|
318
|
-
events
|
|
315
|
+
events,
|
|
319
316
|
conversation,
|
|
320
|
-
failedToAdd:
|
|
321
|
-
? { users: failedToFetchKeyPackages, backends: [], reason: ConversationService_types_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS }
|
|
322
|
-
: undefined,
|
|
317
|
+
failedToAdd: [...keysClaimingFailures, ...failures],
|
|
323
318
|
};
|
|
324
319
|
}
|
|
325
320
|
async removeUsersFromMLSConversation({ groupId, conversationId, qualifiedUserIds, }) {
|
|
@@ -480,16 +480,14 @@ describe('ConversationService', () => {
|
|
|
480
480
|
.map(() => ({ id: PayloadHelper.getUUID(), domain: 'local.wire.com' }));
|
|
481
481
|
const selfUserToAdd = { id: 'self-user-id', domain: 'local.wire.com', skipOwnClientId: apiClient.clientId };
|
|
482
482
|
const qualifiedUsers = [...otherUsersToAdd, selfUserToAdd];
|
|
483
|
-
jest
|
|
484
|
-
.spyOn(mlsService, 'getKeyPackagesPayload')
|
|
485
|
-
.mockResolvedValueOnce({ coreCryptoKeyPackagesPayload: [], failedToFetchKeyPackages: [] });
|
|
483
|
+
jest.spyOn(mlsService, 'getKeyPackagesPayload').mockResolvedValueOnce({ keyPackages: [], failures: [] });
|
|
486
484
|
jest.spyOn(apiClient.api.conversation, 'getConversation').mockResolvedValueOnce({
|
|
487
485
|
qualified_id: mockConversationId,
|
|
488
486
|
protocol: conversation_1.ConversationProtocol.MLS,
|
|
489
487
|
epoch: 1,
|
|
490
488
|
group_id: mockGroupId,
|
|
491
489
|
});
|
|
492
|
-
const mlsMessage = { events: [], time: '' };
|
|
490
|
+
const mlsMessage = { events: [], time: '', failures: [] };
|
|
493
491
|
jest.spyOn(mlsService, 'addUsersToExistingConversation').mockResolvedValueOnce(mlsMessage);
|
|
494
492
|
await conversationService.addUsersToMLSConversation({
|
|
495
493
|
qualifiedUsers,
|
|
@@ -499,6 +497,43 @@ describe('ConversationService', () => {
|
|
|
499
497
|
expect(mlsService.getKeyPackagesPayload).toHaveBeenCalledWith(qualifiedUsers);
|
|
500
498
|
expect(mlsService.resetKeyMaterialRenewal).toHaveBeenCalledWith(mockGroupId);
|
|
501
499
|
});
|
|
500
|
+
it('should return failure reasons for users it was not possible to claim keys for', async () => {
|
|
501
|
+
const [conversationService, { apiClient, mlsService }] = await buildConversationService();
|
|
502
|
+
const mockGroupId = 'groupId';
|
|
503
|
+
const mockConversationId = { id: PayloadHelper.getUUID(), domain: 'local.wire.com' };
|
|
504
|
+
const otherUsersToAdd = Array(3)
|
|
505
|
+
.fill(0)
|
|
506
|
+
.map(() => ({ id: PayloadHelper.getUUID(), domain: 'local.wire.com' }));
|
|
507
|
+
const selfUserToAdd = { id: 'self-user-id', domain: 'local.wire.com', skipOwnClientId: apiClient.clientId };
|
|
508
|
+
const qualifiedUsers = [...otherUsersToAdd, selfUserToAdd];
|
|
509
|
+
const keysClaimingFailure = {
|
|
510
|
+
reason: __1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG,
|
|
511
|
+
users: [otherUsersToAdd[0]],
|
|
512
|
+
};
|
|
513
|
+
const addUsersFailure = {
|
|
514
|
+
reason: __1.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
|
|
515
|
+
users: [otherUsersToAdd[1]],
|
|
516
|
+
backends: [otherUsersToAdd[1].domain],
|
|
517
|
+
};
|
|
518
|
+
jest.spyOn(mlsService, 'getKeyPackagesPayload').mockResolvedValueOnce({
|
|
519
|
+
keyPackages: [new Uint8Array(0)],
|
|
520
|
+
failures: [keysClaimingFailure],
|
|
521
|
+
});
|
|
522
|
+
jest.spyOn(apiClient.api.conversation, 'getConversation').mockResolvedValueOnce({
|
|
523
|
+
qualified_id: mockConversationId,
|
|
524
|
+
protocol: conversation_1.ConversationProtocol.MLS,
|
|
525
|
+
epoch: 1,
|
|
526
|
+
group_id: mockGroupId,
|
|
527
|
+
});
|
|
528
|
+
const mlsMessage = { events: [], time: '', failures: [addUsersFailure] };
|
|
529
|
+
jest.spyOn(mlsService, 'addUsersToExistingConversation').mockResolvedValueOnce(mlsMessage);
|
|
530
|
+
const { failedToAdd } = await conversationService.addUsersToMLSConversation({
|
|
531
|
+
qualifiedUsers,
|
|
532
|
+
groupId: mockGroupId,
|
|
533
|
+
conversationId: mockConversationId,
|
|
534
|
+
});
|
|
535
|
+
expect(failedToAdd).toEqual([keysClaimingFailure, addUsersFailure]);
|
|
536
|
+
});
|
|
502
537
|
});
|
|
503
538
|
describe('tryEstablishingMLSGroup', () => {
|
|
504
539
|
it('should add all the users to a MLS group after group was established by the self client', async () => {
|
|
@@ -79,32 +79,39 @@ export type RemoveUsersParams = {
|
|
|
79
79
|
};
|
|
80
80
|
export declare enum AddUsersFailureReasons {
|
|
81
81
|
NON_FEDERATING_BACKENDS = "NON_FEDERATING_BACKENDS",
|
|
82
|
-
UNREACHABLE_BACKENDS = "UNREACHABLE_BACKENDS"
|
|
82
|
+
UNREACHABLE_BACKENDS = "UNREACHABLE_BACKENDS",
|
|
83
|
+
OFFLINE_FOR_TOO_LONG = "OFFLINE_FOR_TOO_LONG"
|
|
83
84
|
}
|
|
84
85
|
/**
|
|
85
86
|
* List of users that were originaly requested to be in the conversation
|
|
86
87
|
* but could not be added due to their backend not being available
|
|
87
88
|
* @note Added since version 4: https://staging-nginz-https.z
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
ra.io/v4/api/swagger-ui/#/default/post_conversations
|
|
90
|
+
* @note Federation only
|
|
91
|
+
*/
|
|
91
92
|
export type AddUsersFailure = {
|
|
93
|
+
reason: AddUsersFailureReasons.NON_FEDERATING_BACKENDS;
|
|
94
|
+
users: QualifiedId[];
|
|
95
|
+
backends: string[];
|
|
96
|
+
} | {
|
|
97
|
+
reason: AddUsersFailureReasons.UNREACHABLE_BACKENDS;
|
|
92
98
|
users: QualifiedId[];
|
|
93
|
-
reason: AddUsersFailureReasons;
|
|
94
|
-
/** the backends that caused the failure */
|
|
95
99
|
backends: string[];
|
|
100
|
+
} | {
|
|
101
|
+
reason: AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG;
|
|
102
|
+
users: QualifiedId[];
|
|
96
103
|
};
|
|
97
104
|
/**
|
|
98
105
|
* The backend response of any method that will create (or add users to) a conversation
|
|
99
106
|
*/
|
|
100
107
|
export interface BaseCreateConversationResponse {
|
|
101
108
|
conversation: Conversation;
|
|
102
|
-
failedToAdd?: AddUsersFailure;
|
|
109
|
+
failedToAdd?: AddUsersFailure[];
|
|
103
110
|
}
|
|
104
111
|
export type ProteusCreateConversationResponse = BaseCreateConversationResponse;
|
|
105
112
|
export type ProteusAddUsersResponse = {
|
|
106
113
|
event?: ConversationMemberJoinEvent;
|
|
107
|
-
failedToAdd?: AddUsersFailure;
|
|
114
|
+
failedToAdd?: AddUsersFailure[];
|
|
108
115
|
};
|
|
109
116
|
export interface MLSCreateConversationResponse extends BaseCreateConversationResponse {
|
|
110
117
|
events: ConversationEvent[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConversationService.types.d.ts","sourceRoot":"","sources":["../../../src/conversation/ConversationService/ConversationService.types.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,YAAY,EACb,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAC,iBAAiB,EAAE,2BAA2B,EAAC,MAAM,+BAA+B,CAAC;AAC7F,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAE3D,OAAO,EAAC,mBAAmB,EAAC,MAAM,IAAI,CAAC;AAEvC,oBAAY,iBAAiB;IAC3B,IAAI,IAAA;IACJ,KAAK,IAAA;IACL,aAAa,IAAA;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;OAKG;IACH,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,oBAAoB,CAAC;IAE/C,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,gBAAgB,CAAC,EAAE,uBAAuB,CAAC,kBAAkB,CAAC,CAAC;IAE/D;;;;;OAKG;IACH,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,MAAM,WAAW,uBAAuB;IACtC;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1G;AAED;;;;GAIG;AAEH;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG;IAC7C,OAAO,EAAE,cAAc,CAAC;IACxB,cAAc,EAAE,WAAW,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IACpD;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,oBAAoB,CAAC,GAAG,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,WAAW,GAAG;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAE3E,MAAM,MAAM,cAAc,GAAG;IAC3B,cAAc,EAAE,WAAW,CAAC;IAC5B,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,WAAW,CAAC;IAC5B,gBAAgB,EAAE,WAAW,EAAE,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,oBAAY,sBAAsB;IAChC,uBAAuB,4BAA4B;IACnD,oBAAoB,yBAAyB;CAC9C;AAED;;;;;;
|
|
1
|
+
{"version":3,"file":"ConversationService.types.d.ts","sourceRoot":"","sources":["../../../src/conversation/ConversationService/ConversationService.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,4 +29,5 @@ var AddUsersFailureReasons;
|
|
|
29
29
|
(function (AddUsersFailureReasons) {
|
|
30
30
|
AddUsersFailureReasons["NON_FEDERATING_BACKENDS"] = "NON_FEDERATING_BACKENDS";
|
|
31
31
|
AddUsersFailureReasons["UNREACHABLE_BACKENDS"] = "UNREACHABLE_BACKENDS";
|
|
32
|
+
AddUsersFailureReasons["OFFLINE_FOR_TOO_LONG"] = "OFFLINE_FOR_TOO_LONG";
|
|
32
33
|
})(AddUsersFailureReasons || (exports.AddUsersFailureReasons = AddUsersFailureReasons = {}));
|
|
@@ -7,7 +7,7 @@ import { APIClient } from '@wireapp/api-client';
|
|
|
7
7
|
import { TypedEventEmitter } from '@wireapp/commons';
|
|
8
8
|
import { AddProposalArgs, ConversationId, CoreCrypto, DecryptedMessage, ProposalArgs, ProposalType, RemoveProposalArgs } from '@wireapp/core-crypto';
|
|
9
9
|
import { MLSServiceConfig } from './MLSService.types';
|
|
10
|
-
import { KeyPackageClaimUser } from '../../../conversation';
|
|
10
|
+
import { AddUsersFailure, KeyPackageClaimUser } from '../../../conversation';
|
|
11
11
|
import { CoreDatabase } from '../../../storage/CoreDB';
|
|
12
12
|
import { RecurringTaskScheduler } from '../../../util/RecurringTaskScheduler';
|
|
13
13
|
import { AcmeChallenge, User } from '../E2EIdentityService';
|
|
@@ -61,10 +61,12 @@ export declare class MLSService extends TypedEventEmitter<Events> {
|
|
|
61
61
|
* @param groupId - the group id of the MLS group
|
|
62
62
|
* @param keyPackages - the list of keys of clients to add to the MLS group
|
|
63
63
|
*/
|
|
64
|
-
addUsersToExistingConversation(groupId: string, keyPackages: Uint8Array[]): Promise<PostMlsMessageResponse
|
|
64
|
+
addUsersToExistingConversation(groupId: string, keyPackages: Uint8Array[]): Promise<PostMlsMessageResponse & {
|
|
65
|
+
failures: AddUsersFailure[];
|
|
66
|
+
}>;
|
|
65
67
|
getKeyPackagesPayload(qualifiedUsers: KeyPackageClaimUser[]): Promise<{
|
|
66
|
-
|
|
67
|
-
|
|
68
|
+
keyPackages: Uint8Array[];
|
|
69
|
+
failures: AddUsersFailure[];
|
|
68
70
|
}>;
|
|
69
71
|
getEpoch(groupId: string | Uint8Array): Promise<number>;
|
|
70
72
|
newProposal(proposalType: ProposalType, args: ProposalArgs | AddProposalArgs | RemoveProposalArgs): Promise<import("@wireapp/core-crypto").ProposalBundle>;
|
|
@@ -105,7 +107,9 @@ export declare class MLSService extends TypedEventEmitter<Events> {
|
|
|
105
107
|
client?: string;
|
|
106
108
|
};
|
|
107
109
|
parentGroupId?: string;
|
|
108
|
-
}): Promise<PostMlsMessageResponse
|
|
110
|
+
}): Promise<PostMlsMessageResponse & {
|
|
111
|
+
failures: AddUsersFailure[];
|
|
112
|
+
}>;
|
|
109
113
|
/**
|
|
110
114
|
* Will try to register mls group and send an empty commit to establish it.
|
|
111
115
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MLSService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/mls/MLSService/MLSService.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAqB,gBAAgB,EAAC,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAC,sBAAsB,EAAE,kBAAkB,EAAC,MAAM,sCAAsC,CAAC;AAChG,OAAO,EAAC,8BAA8B,EAAE,2BAA2B,EAAC,MAAM,+BAA+B,CAAC;AAE1G,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AAIzD,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAW,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EACL,eAAe,EAIf,cAAc,EACd,UAAU,EAEV,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAC,gBAAgB,EAAuD,MAAM,oBAAoB,CAAC;AAE1G,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"MLSService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/mls/MLSService/MLSService.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,7 @@ const logdown_1 = __importDefault(require("logdown"));
|
|
|
41
41
|
const commons_1 = require("@wireapp/commons");
|
|
42
42
|
const core_crypto_1 = require("@wireapp/core-crypto");
|
|
43
43
|
const CoreCryptoMLSError_1 = require("./CoreCryptoMLSError");
|
|
44
|
+
const conversation_1 = require("../../../conversation");
|
|
44
45
|
const messageSender_1 = require("../../../conversation/message/messageSender");
|
|
45
46
|
const fullyQualifiedClientIdUtils_1 = require("../../../util/fullyQualifiedClientIdUtils");
|
|
46
47
|
const numberToHex_1 = require("../../../util/numberToHex");
|
|
@@ -199,16 +200,28 @@ class MLSService extends commons_1.TypedEventEmitter {
|
|
|
199
200
|
* @param groupId - the group id of the MLS group
|
|
200
201
|
* @param keyPackages - the list of keys of clients to add to the MLS group
|
|
201
202
|
*/
|
|
202
|
-
addUsersToExistingConversation(groupId, keyPackages) {
|
|
203
|
+
async addUsersToExistingConversation(groupId, keyPackages) {
|
|
203
204
|
const groupIdBytes = bazinga64_1.Decoder.fromBase64(groupId).asBytes;
|
|
204
205
|
if (keyPackages.length < 1) {
|
|
205
206
|
throw new Error('Empty list of keys provided to addUsersToExistingConversation');
|
|
206
207
|
}
|
|
207
|
-
|
|
208
|
+
//TODO: handle federation error when sending a commit bundle to backend like we do in ProteusService
|
|
209
|
+
const response = await this.processCommitAction(groupIdBytes, async () => {
|
|
208
210
|
const commitBundle = await this.coreCryptoClient.addClientsToConversation(groupIdBytes, keyPackages);
|
|
209
211
|
this.dispatchNewCrlDistributionPoints(commitBundle);
|
|
210
212
|
return commitBundle;
|
|
211
213
|
});
|
|
214
|
+
const failedUsers = response.failed;
|
|
215
|
+
const failures = failedUsers
|
|
216
|
+
? [
|
|
217
|
+
{
|
|
218
|
+
users: failedUsers,
|
|
219
|
+
backends: failedUsers.map(({ domain }) => domain),
|
|
220
|
+
reason: conversation_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
|
|
221
|
+
},
|
|
222
|
+
]
|
|
223
|
+
: [];
|
|
224
|
+
return Object.assign(Object.assign({}, response), { failures });
|
|
212
225
|
}
|
|
213
226
|
async getKeyPackagesPayload(qualifiedUsers) {
|
|
214
227
|
/**
|
|
@@ -217,13 +230,25 @@ class MLSService extends commons_1.TypedEventEmitter {
|
|
|
217
230
|
* includes self user too.
|
|
218
231
|
*/
|
|
219
232
|
const failedToFetchKeyPackages = [];
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
233
|
+
const emptyKeyPackagesUsers = [];
|
|
234
|
+
const keyPackagesSettledResult = await Promise.allSettled(qualifiedUsers.map(async ({ id, domain, skipOwnClientId }) => {
|
|
235
|
+
try {
|
|
236
|
+
const keys = await this.apiClient.api.client.claimMLSKeyPackages(id, domain, (0, numberToHex_1.numberToHex)(this.config.cipherSuite), skipOwnClientId);
|
|
237
|
+
const isSelfUser = this.apiClient.userId === id && this.apiClient.domain === domain;
|
|
238
|
+
// It's possible that user's backend is reachable but they have not uploaded their MLS key packages (or all of them have been claimed already)
|
|
239
|
+
// We don't care about the self user here.
|
|
240
|
+
if (!isSelfUser && keys.key_packages.length === 0) {
|
|
241
|
+
this.logger.warn(`User ${id} has no key packages uploaded`);
|
|
242
|
+
emptyKeyPackagesUsers.push({ id, domain });
|
|
243
|
+
}
|
|
244
|
+
return keys;
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
failedToFetchKeyPackages.push({ id, domain });
|
|
248
|
+
// Throw the error so we don't get {status: 'fulfilled', value: undefined}
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
}));
|
|
227
252
|
/**
|
|
228
253
|
* @note We are filtering failed requests for key packages
|
|
229
254
|
* this is required because on federation environments it is possible
|
|
@@ -243,7 +268,18 @@ class MLSService extends commons_1.TypedEventEmitter {
|
|
|
243
268
|
}
|
|
244
269
|
return previousValue;
|
|
245
270
|
}, []);
|
|
246
|
-
|
|
271
|
+
const failures = [];
|
|
272
|
+
if (emptyKeyPackagesUsers.length > 0) {
|
|
273
|
+
failures.push({ reason: conversation_1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG, users: emptyKeyPackagesUsers });
|
|
274
|
+
}
|
|
275
|
+
if (failedToFetchKeyPackages.length > 0) {
|
|
276
|
+
failures.push({
|
|
277
|
+
reason: conversation_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
|
|
278
|
+
users: failedToFetchKeyPackages,
|
|
279
|
+
backends: failedToFetchKeyPackages.map(({ domain }) => domain),
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
return { keyPackages: coreCryptoKeyPackagesPayload, failures };
|
|
247
283
|
}
|
|
248
284
|
getEpoch(groupId) {
|
|
249
285
|
const groupIdBytes = typeof groupId === 'string' ? bazinga64_1.Decoder.fromBase64(groupId).asBytes : groupId;
|
|
@@ -365,7 +401,7 @@ class MLSService extends commons_1.TypedEventEmitter {
|
|
|
365
401
|
async registerConversation(groupId, users, options) {
|
|
366
402
|
await this.registerEmptyConversation(groupId, options === null || options === void 0 ? void 0 : options.parentGroupId);
|
|
367
403
|
const creator = options === null || options === void 0 ? void 0 : options.creator;
|
|
368
|
-
const {
|
|
404
|
+
const { keyPackages, failures: keysClaimingFailures } = await this.getKeyPackagesPayload(users.map(user => {
|
|
369
405
|
if (user.id === (creator === null || creator === void 0 ? void 0 : creator.user.id)) {
|
|
370
406
|
/**
|
|
371
407
|
* we should skip fetching key packages for current self client,
|
|
@@ -375,17 +411,20 @@ class MLSService extends commons_1.TypedEventEmitter {
|
|
|
375
411
|
}
|
|
376
412
|
return user;
|
|
377
413
|
}));
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
414
|
+
if (keyPackages.length <= 0) {
|
|
415
|
+
// If there are no clients to add, just update the keying material
|
|
416
|
+
const response = await this.updateKeyingMaterial(groupId);
|
|
417
|
+
await this.scheduleKeyMaterialRenewal(groupId);
|
|
418
|
+
return Object.assign(Object.assign({}, response), { failures: keysClaimingFailures });
|
|
419
|
+
}
|
|
420
|
+
const response = await this.addUsersToExistingConversation(groupId, keyPackages);
|
|
382
421
|
// We schedule a periodic key material renewal
|
|
383
422
|
await this.scheduleKeyMaterialRenewal(groupId);
|
|
384
423
|
/**
|
|
385
424
|
* @note If we can't fetch a user's key packages then we can not add them to mls conversation
|
|
386
425
|
* so we're adding them to the list of failed users.
|
|
387
426
|
*/
|
|
388
|
-
response.
|
|
427
|
+
response.failures = [...keysClaimingFailures, ...response.failures];
|
|
389
428
|
return response;
|
|
390
429
|
}
|
|
391
430
|
/**
|
|
@@ -25,6 +25,7 @@ const crypto_1 = require("crypto");
|
|
|
25
25
|
const api_client_1 = require("@wireapp/api-client");
|
|
26
26
|
const CoreCryptoMLSError_1 = require("./CoreCryptoMLSError");
|
|
27
27
|
const MLSService_1 = require("./MLSService");
|
|
28
|
+
const conversation_1 = require("../../../conversation");
|
|
28
29
|
const CoreDB_1 = require("../../../storage/CoreDB");
|
|
29
30
|
const RecurringTaskScheduler_1 = require("../../../util/RecurringTaskScheduler");
|
|
30
31
|
const TaskScheduler_1 = require("../../../util/TaskScheduler");
|
|
@@ -99,6 +100,78 @@ describe('MLSService', () => {
|
|
|
99
100
|
await mlsService.registerConversation(groupId, [createUserId(), createUserId()]);
|
|
100
101
|
expect(mlsService.scheduleKeyMaterialRenewal).toHaveBeenCalledWith(groupId);
|
|
101
102
|
});
|
|
103
|
+
it('returns a list of failure reasons if it was not possible to claim keys for intended users', async () => {
|
|
104
|
+
const groupId = 'mXOagqRIX/RFd7QyXJA8/Ed8X+hvQgLXIiwYHm3OQFc=';
|
|
105
|
+
const selfUser = createUserId();
|
|
106
|
+
const creator = { user: selfUser, client: 'client-1' };
|
|
107
|
+
const users = [createUserId(), createUserId()];
|
|
108
|
+
const failure = { reason: conversation_1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG, users };
|
|
109
|
+
jest.spyOn(mlsService, 'getKeyPackagesPayload').mockResolvedValueOnce({
|
|
110
|
+
keyPackages: [],
|
|
111
|
+
failures: [failure],
|
|
112
|
+
});
|
|
113
|
+
const { failures } = await mlsService.registerConversation(groupId, [...users, selfUser], { creator });
|
|
114
|
+
expect(failures).toEqual([failure]);
|
|
115
|
+
expect(mlsService.scheduleKeyMaterialRenewal).toHaveBeenCalledWith(groupId);
|
|
116
|
+
});
|
|
117
|
+
it("returns a list of failure reasons if it was not possible to upload users' keys", async () => {
|
|
118
|
+
const groupId = 'mXOagqRIX/RFd7QyXJA8/Ed8X+hvQgLXIiwYHm3OQFc=';
|
|
119
|
+
const selfUser = createUserId();
|
|
120
|
+
const creator = { user: selfUser, client: 'client-1' };
|
|
121
|
+
const users = [createUserId(), createUserId()];
|
|
122
|
+
const failureKeysClaiming = {
|
|
123
|
+
reason: conversation_1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG,
|
|
124
|
+
users: [users[0]],
|
|
125
|
+
};
|
|
126
|
+
const failureKeysUpload = {
|
|
127
|
+
reason: conversation_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
|
|
128
|
+
users: [users[1]],
|
|
129
|
+
backends: [users[1].domain],
|
|
130
|
+
};
|
|
131
|
+
jest.spyOn(mlsService, 'getKeyPackagesPayload').mockResolvedValueOnce({
|
|
132
|
+
keyPackages: [new Uint8Array()],
|
|
133
|
+
failures: [failureKeysClaiming],
|
|
134
|
+
});
|
|
135
|
+
jest.spyOn(mlsService, 'addUsersToExistingConversation').mockResolvedValueOnce({
|
|
136
|
+
failures: [failureKeysUpload],
|
|
137
|
+
events: [],
|
|
138
|
+
time: '',
|
|
139
|
+
});
|
|
140
|
+
const { failures } = await mlsService.registerConversation(groupId, [...users, selfUser], { creator });
|
|
141
|
+
expect(failures).toEqual([failureKeysClaiming, failureKeysUpload]);
|
|
142
|
+
expect(mlsService.scheduleKeyMaterialRenewal).toHaveBeenCalledWith(groupId);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
describe('getKeyPackagesPayload', () => {
|
|
146
|
+
it('succesfully claims keys for all users', async () => {
|
|
147
|
+
const [mlsService, { apiClient }] = await createMLSService();
|
|
148
|
+
const users = [createUserId(), createUserId()];
|
|
149
|
+
jest.spyOn(apiClient.api.client, 'claimMLSKeyPackages').mockImplementation(async (userId) => ({
|
|
150
|
+
key_packages: [{ client: 'client-1', domain: 'domain-1', key_package: '', key_package_ref: '', user: userId }],
|
|
151
|
+
}));
|
|
152
|
+
const { failures, keyPackages } = await mlsService.getKeyPackagesPayload(users);
|
|
153
|
+
expect(failures).toEqual([]);
|
|
154
|
+
expect(keyPackages).toHaveLength(2);
|
|
155
|
+
});
|
|
156
|
+
it('returns failure reasons list if it was not possible to claim user keys', async () => {
|
|
157
|
+
const [mlsService, { apiClient }] = await createMLSService();
|
|
158
|
+
const users = [createUserId(), createUserId(), createUserId()];
|
|
159
|
+
jest.spyOn(apiClient.api.client, 'claimMLSKeyPackages').mockRejectedValueOnce(undefined);
|
|
160
|
+
jest.spyOn(apiClient.api.client, 'claimMLSKeyPackages').mockResolvedValueOnce({
|
|
161
|
+
key_packages: [],
|
|
162
|
+
});
|
|
163
|
+
jest.spyOn(apiClient.api.client, 'claimMLSKeyPackages').mockResolvedValueOnce({
|
|
164
|
+
key_packages: [
|
|
165
|
+
{ client: 'client-1', domain: 'domain-1', key_package: '', key_package_ref: '', user: users[2].id },
|
|
166
|
+
],
|
|
167
|
+
});
|
|
168
|
+
const { failures, keyPackages } = await mlsService.getKeyPackagesPayload(users);
|
|
169
|
+
expect(failures).toEqual([
|
|
170
|
+
{ reason: conversation_1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG, users: [users[1]] },
|
|
171
|
+
{ reason: conversation_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS, users: [users[0]], backends: [users[1].domain] },
|
|
172
|
+
]);
|
|
173
|
+
expect(keyPackages).toHaveLength(1);
|
|
174
|
+
});
|
|
102
175
|
});
|
|
103
176
|
describe('isConversationEstablished', () => {
|
|
104
177
|
it('returns false if conversation does not exist locally', async () => {
|
|
@@ -403,7 +476,7 @@ describe('MLSService', () => {
|
|
|
403
476
|
const [mlsService] = await createMLSService();
|
|
404
477
|
const mockGroupId = 'mock-group-id2';
|
|
405
478
|
jest.spyOn(mlsService, 'conversationExists').mockResolvedValueOnce(false);
|
|
406
|
-
jest.spyOn(mlsService, 'registerConversation').mockResolvedValueOnce({ events: [], time: '' });
|
|
479
|
+
jest.spyOn(mlsService, 'registerConversation').mockResolvedValueOnce({ events: [], time: '', failures: [] });
|
|
407
480
|
jest.spyOn(mlsService, 'wipeConversation').mockImplementation(jest.fn());
|
|
408
481
|
const wasConversationEstablished = await mlsService.tryEstablishingMLSGroup(mockGroupId);
|
|
409
482
|
expect(mlsService.registerConversation).toHaveBeenCalledWith(mockGroupId, []);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProteusService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/ProteusService.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,mCAAmC,CAAC;AACjE,OAAO,KAAK,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAGL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAC,8BAA8B,EAAC,MAAM,+BAA+B,CAAC;AAClF,OAAO,KAAK,EAAC,WAAW,EAAE,4BAA4B,EAAC,MAAM,8BAA8B,CAAC;AAG5F,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAI5C,OAAO,KAAK,EACV,mCAAmC,EACnC,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EAEL,iCAAiC,EAEjC,UAAU,EACV,uBAAuB,EACxB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAY1D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wEAAwE;IACxE,QAAQ,EAAE,sBAAsB,CAAC;IACjC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,sGAAsG;IACtG,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC;AAEF,qBAAa,cAAc;IAKvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;gBAG/C,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,oBAAoB;IAKlC,wBAAwB,CAAC,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAO7F,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;IA2B1D,YAAY,CAAC,OAAO,CAAC,EAAE,UAAU;IAIxC;;OAEG;IACI,mBAAmB;IAInB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIxE;;;;;;OAMG;IACU,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAQ3E,kBAAkB,CAAC,gBAAgB,EAAE,eAAe,GAAG,OAAO,CAAC,iCAAiC,CAAC;IAwC9G;;;OAGG;IACU,sBAAsB,CAAC,EAClC,cAAc,EACd,cAAc,GACf,EAAE,mCAAmC,GAAG,OAAO,CAAC,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"ProteusService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/ProteusService.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,mCAAmC,CAAC;AACjE,OAAO,KAAK,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAGL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAC,8BAA8B,EAAC,MAAM,+BAA+B,CAAC;AAClF,OAAO,KAAK,EAAC,WAAW,EAAE,4BAA4B,EAAC,MAAM,8BAA8B,CAAC;AAG5F,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAI5C,OAAO,KAAK,EACV,mCAAmC,EACnC,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EAEL,iCAAiC,EAEjC,UAAU,EACV,uBAAuB,EACxB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAY1D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wEAAwE;IACxE,QAAQ,EAAE,sBAAsB,CAAC;IACjC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,sGAAsG;IACtG,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC;AAEF,qBAAa,cAAc;IAKvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;gBAG/C,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,oBAAoB;IAKlC,wBAAwB,CAAC,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAO7F,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;IA2B1D,YAAY,CAAC,OAAO,CAAC,EAAE,UAAU;IAIxC;;OAEG;IACI,mBAAmB;IAInB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIxE;;;;;;OAMG;IACU,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAQ3E,kBAAkB,CAAC,gBAAgB,EAAE,eAAe,GAAG,OAAO,CAAC,iCAAiC,CAAC;IAwC9G;;;OAGG;IACU,sBAAsB,CAAC,EAClC,cAAc,EACd,cAAc,GACf,EAAE,mCAAmC,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAoD5D,WAAW,CAAC,EACvB,OAAO,EACP,cAAc,EACd,UAAU,EACV,UAAU,EACV,OAAO,EACP,gBAAgB,GACjB,EAAE,wBAAwB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6CpC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM;IAuB9E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM;IAQ7C,OAAO,CAClB,SAAS,EAAE,UAAU,EACrB,UAAU,EAAE,4BAA4B,GAAG,oBAAoB,GAC9D,OAAO,CAAC,gBAAgB,CAAC;IAiBtB,IAAI,CAAC,WAAW,CAAC,EAAE,UAAU;CAMpC"}
|
|
@@ -126,7 +126,7 @@ class ProteusService {
|
|
|
126
126
|
// on a succesfull conversation creation with the available users,
|
|
127
127
|
// we append the users from an unreachable backend to the response
|
|
128
128
|
unreachableUsers.length > 0
|
|
129
|
-
? { reason: conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS, backends, users: unreachableUsers }
|
|
129
|
+
? [{ reason: conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS, backends, users: unreachableUsers }]
|
|
130
130
|
: undefined,
|
|
131
131
|
};
|
|
132
132
|
}
|
|
@@ -155,7 +155,7 @@ class ProteusService {
|
|
|
155
155
|
const { backends } = error;
|
|
156
156
|
const { excludedUsers: unreachableUsers, includedUsers: availableUsers } = (0, userDomainFilters_1.filterUsersFromDomains)(qualifiedUsers, backends);
|
|
157
157
|
if (availableUsers.length === 0) {
|
|
158
|
-
return { failedToAdd: { reason: failureReasonsMap[error.label], backends, users: unreachableUsers } };
|
|
158
|
+
return { failedToAdd: [{ reason: failureReasonsMap[error.label], backends, users: unreachableUsers }] };
|
|
159
159
|
}
|
|
160
160
|
// In case the request to add users failed with a `UNREACHABLE_BACKENDS` or `NOT_CONNECTED_BACKENDS` errors, we try again with the users from available backends
|
|
161
161
|
try {
|
|
@@ -163,18 +163,20 @@ class ProteusService {
|
|
|
163
163
|
return {
|
|
164
164
|
event: response,
|
|
165
165
|
failedToAdd: unreachableUsers.length > 0
|
|
166
|
-
? { reason: failureReasonsMap[error.label], backends, users: unreachableUsers }
|
|
166
|
+
? [{ reason: failureReasonsMap[error.label], backends, users: unreachableUsers }]
|
|
167
167
|
: undefined,
|
|
168
168
|
};
|
|
169
169
|
}
|
|
170
170
|
catch (error) {
|
|
171
171
|
if ((0, conversation_1.isFederatedBackendsError)(error)) {
|
|
172
172
|
return {
|
|
173
|
-
failedToAdd:
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
173
|
+
failedToAdd: [
|
|
174
|
+
{
|
|
175
|
+
reason: failureReasonsMap[error.label],
|
|
176
|
+
backends: error.backends,
|
|
177
|
+
users: qualifiedUsers,
|
|
178
|
+
},
|
|
179
|
+
],
|
|
178
180
|
};
|
|
179
181
|
}
|
|
180
182
|
throw error;
|
|
@@ -502,7 +502,7 @@ describe('ProteusService', () => {
|
|
|
502
502
|
expect(event).toEqual(baseResponse);
|
|
503
503
|
});
|
|
504
504
|
it('partially add users if some backends are unreachable', async () => {
|
|
505
|
-
var _a, _b;
|
|
505
|
+
var _a, _b, _c, _d;
|
|
506
506
|
const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
|
|
507
507
|
const postMembersSpy = jest
|
|
508
508
|
.spyOn(apiClient.api.conversation, 'postMembers')
|
|
@@ -515,11 +515,11 @@ describe('ProteusService', () => {
|
|
|
515
515
|
expect(postMembersSpy).toHaveBeenCalledTimes(2);
|
|
516
516
|
expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining([...usersDomain1, ...usersDomain2]));
|
|
517
517
|
expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining(usersDomain2));
|
|
518
|
-
expect((_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a.reason).toBe(conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS);
|
|
519
|
-
expect((
|
|
518
|
+
expect((_b = (_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.reason).toBe(conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS);
|
|
519
|
+
expect((_d = (_c = result.failedToAdd) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.users).toEqual([...usersDomain1]);
|
|
520
520
|
});
|
|
521
521
|
it('completely fails to add users if some backends are unreachable', async () => {
|
|
522
|
-
var _a, _b;
|
|
522
|
+
var _a, _b, _c, _d;
|
|
523
523
|
const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
|
|
524
524
|
const allUsers = [...usersDomain1, ...usersDomain2];
|
|
525
525
|
const postMembersSpy = jest
|
|
@@ -532,11 +532,11 @@ describe('ProteusService', () => {
|
|
|
532
532
|
expect(postMembersSpy).toHaveBeenCalledTimes(2);
|
|
533
533
|
expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining(allUsers));
|
|
534
534
|
expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining(usersDomain2));
|
|
535
|
-
expect((_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a.reason).toBe(conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS);
|
|
536
|
-
expect((
|
|
535
|
+
expect((_b = (_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.reason).toBe(conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS);
|
|
536
|
+
expect((_d = (_c = result.failedToAdd) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.users).toEqual(allUsers);
|
|
537
537
|
});
|
|
538
538
|
it('partially add users if some users are part of not-connected backends', async () => {
|
|
539
|
-
var _a, _b;
|
|
539
|
+
var _a, _b, _c, _d;
|
|
540
540
|
const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
|
|
541
541
|
const postMembersSpy = jest
|
|
542
542
|
.spyOn(apiClient.api.conversation, 'postMembers')
|
|
@@ -549,8 +549,8 @@ describe('ProteusService', () => {
|
|
|
549
549
|
expect(postMembersSpy).toHaveBeenCalledTimes(2);
|
|
550
550
|
expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining([...usersDomain1, ...usersDomain2]));
|
|
551
551
|
expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining(usersDomain1));
|
|
552
|
-
expect((_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a.reason).toBe(conversation_2.AddUsersFailureReasons.NON_FEDERATING_BACKENDS);
|
|
553
|
-
expect((
|
|
552
|
+
expect((_b = (_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.reason).toBe(conversation_2.AddUsersFailureReasons.NON_FEDERATING_BACKENDS);
|
|
553
|
+
expect((_d = (_c = result.failedToAdd) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.users).toEqual([...usersDomain2, ...usersDomain3]);
|
|
554
554
|
});
|
|
555
555
|
});
|
|
556
556
|
describe('createConversation', () => {
|
|
@@ -600,11 +600,13 @@ describe('ProteusService', () => {
|
|
|
600
600
|
expect(postConversationSpy).toHaveBeenCalledTimes(2);
|
|
601
601
|
expect(postConversationSpy).toHaveBeenCalledWith(expect.objectContaining({ qualified_users: [...usersDomain1, ...usersDomain2] }));
|
|
602
602
|
expect(postConversationSpy).toHaveBeenCalledWith(expect.objectContaining({ qualified_users: usersDomain2 }));
|
|
603
|
-
expect(failedToAdd).toEqual(
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
603
|
+
expect(failedToAdd).toEqual([
|
|
604
|
+
{
|
|
605
|
+
reason: conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
|
|
606
|
+
backends: ['domain1'],
|
|
607
|
+
users: expect.arrayContaining([...usersDomain1, ...usersDomain1]),
|
|
608
|
+
},
|
|
609
|
+
]);
|
|
608
610
|
});
|
|
609
611
|
it('creates an empty conversation if no backend is reachable', async () => {
|
|
610
612
|
const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
|
|
@@ -619,11 +621,13 @@ describe('ProteusService', () => {
|
|
|
619
621
|
expect(postConversationSpy).toHaveBeenCalledTimes(2);
|
|
620
622
|
expect(postConversationSpy).toHaveBeenCalledWith(expect.objectContaining({ qualified_users: [...usersDomain1, ...usersDomain2] }));
|
|
621
623
|
expect(postConversationSpy).toHaveBeenCalledWith(expect.objectContaining({ qualified_users: [] }));
|
|
622
|
-
expect(failedToAdd).toEqual(
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
624
|
+
expect(failedToAdd).toEqual([
|
|
625
|
+
{
|
|
626
|
+
reason: conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
|
|
627
|
+
backends: [domain1, domain2],
|
|
628
|
+
users: expect.arrayContaining([...usersDomain1, ...usersDomain1]),
|
|
629
|
+
},
|
|
630
|
+
]);
|
|
627
631
|
});
|
|
628
632
|
it('fails to create a conversation if there are users from non-connected backends', async () => {
|
|
629
633
|
const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
|
package/package.json
CHANGED