@wireapp/core 42.3.3 → 42.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/Account.js +1 -1
- package/lib/conversation/ConversationService/ConversationService.js +1 -1
- package/lib/messagingProtocols/mls/MLSService/MLSService.d.ts +11 -4
- package/lib/messagingProtocols/mls/MLSService/MLSService.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/MLSService/MLSService.js +36 -18
- package/lib/messagingProtocols/mls/MLSService/MLSService.test.js +77 -0
- package/package.json +6 -6
package/lib/Account.js
CHANGED
|
@@ -209,7 +209,7 @@ class Account extends TypedEventEmitter_1.TypedEventEmitter {
|
|
|
209
209
|
// initialize schedulers for pending mls proposals once client is initialized
|
|
210
210
|
await this.service.mls.checkExistingPendingProposals();
|
|
211
211
|
// initialize scheduler for syncing key packages with backend
|
|
212
|
-
this.service.mls.
|
|
212
|
+
this.service.mls.schedulePeriodicKeyPackagesBackendSync(validClient.id);
|
|
213
213
|
// leave stale conference subconversations (e.g after a crash)
|
|
214
214
|
await this.service.mls.leaveStaleConferenceSubconversations();
|
|
215
215
|
}
|
|
@@ -407,7 +407,7 @@ class ConversationService extends TypedEventEmitter_1.TypedEventEmitter {
|
|
|
407
407
|
}
|
|
408
408
|
}
|
|
409
409
|
async handleMLSWelcomeMessageEvent(event) {
|
|
410
|
-
return this.mlsService.handleMLSWelcomeMessageEvent(event);
|
|
410
|
+
return this.mlsService.handleMLSWelcomeMessageEvent(event, this.apiClient.validatedClientId);
|
|
411
411
|
}
|
|
412
412
|
async handleOtrMessageAddEvent(event) {
|
|
413
413
|
return this.proteusService.handleOtrMessageAddEvent(event);
|
|
@@ -154,11 +154,18 @@ export declare class MLSService extends TypedEventEmitter<Events> {
|
|
|
154
154
|
*/
|
|
155
155
|
schedulePeriodicKeyMaterialRenewals(groupIds: string[]): void;
|
|
156
156
|
/**
|
|
157
|
-
*
|
|
157
|
+
* Schedules a task to periodically (every 24h) check if new key packages should be generated and uploaded to backend.
|
|
158
158
|
* Function must only be called once, after application start
|
|
159
|
+
* @param clientId id of the client
|
|
159
160
|
*/
|
|
160
|
-
|
|
161
|
-
|
|
161
|
+
schedulePeriodicKeyPackagesBackendSync(clientId: string): void;
|
|
162
|
+
/**
|
|
163
|
+
* Checks if there are enough key packages locally and if not,
|
|
164
|
+
* checks the number of keys available on backend and (if needed) generates new keys and uploads them.
|
|
165
|
+
* @param clientId id of the client
|
|
166
|
+
*/
|
|
167
|
+
private verifyLocalMLSKeyPackagesAmount;
|
|
168
|
+
private verifyRemoteMLSKeyPackagesAmount;
|
|
162
169
|
private getRemoteMLSKeyPackageCount;
|
|
163
170
|
/**
|
|
164
171
|
* Will update the given client on backend with its public key.
|
|
@@ -209,7 +216,7 @@ export declare class MLSService extends TypedEventEmitter<Events> {
|
|
|
209
216
|
domain: string;
|
|
210
217
|
}[]>;
|
|
211
218
|
handleMLSMessageAddEvent(event: ConversationMLSMessageAddEvent): Promise<import("../../../notification").HandledEventPayload | undefined>;
|
|
212
|
-
handleMLSWelcomeMessageEvent(event: ConversationMLSWelcomeEvent): Promise<import("../../../notification").HandledEventPayload>;
|
|
219
|
+
handleMLSWelcomeMessageEvent(event: ConversationMLSWelcomeEvent, clientId: string): Promise<import("../../../notification").HandledEventPayload>;
|
|
213
220
|
}
|
|
214
221
|
export {};
|
|
215
222
|
//# sourceMappingURL=MLSService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MLSService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/mls/MLSService/MLSService.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAqB,gBAAgB,EAAC,MAAM,gCAAgC,CAAC;AACzF,OAAO,EAAC,sBAAsB,EAAE,kBAAkB,EAAC,MAAM,sCAAsC,CAAC;AAChG,OAAO,EAAC,eAAe,EAAC,MAAM,sDAAsD,CAAC;AACrF,OAAO,EAAC,8BAA8B,EAAE,2BAA2B,EAAC,MAAM,+BAA+B,CAAC;AAE1G,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AAGzD,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EACL,eAAe,EAIf,cAAc,EACd,UAAU,EAEV,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,kBAAkB,EACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAC,gBAAgB,EAAsB,MAAM,oBAAoB,CAAC;AAIzE,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAM1D,OAAO,EAAC,iBAAiB,EAAC,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAC,4BAA4B,EAAE,4BAA4B,EAAE,YAAY,EAAC,MAAM,UAAU,CAAC;AAIlG,eAAO,MAAM,oBAAoB,UAAW,UAAU,GAAG,EAAE,KAAG,UAE7D,CAAC;AAEF,UAAU,qBAAsB,SAAQ,gBAAgB;IACtD;;OAEG;IACH,uCAAuC,EAAE,MAAM,CAAC;CACjD;AASD,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,KAAK,MAAM,GAAG;IACZ,QAAQ,EAAE;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,CAAC;CAC5C,CAAC;AACF,qBAAa,UAAW,SAAQ,iBAAiB,CAAC,MAAM,CAAC;IAQrD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IARnC,MAAM,iBAAuC;IAC7C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,yBAAyB,CAAC,EAAE,YAAY,CAAC,2BAA2B,CAAC,CAAC;IACtE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;gBAG9B,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,UAAU,EAC7C,EACE,6BAA2E,EAC3E,aAA2C,EAC3C,kBAAqD,EACrD,qBAA2D,GAC5D,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAYjB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB;YASvD,kBAAkB;IAuChC;;;;;;OAMG;IACI,8BAA8B,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;IAWlE,qBAAqB,CAAC,EAAC,yBAAyB,EAAE,GAAG,mBAAmB,EAAC,EAAE,YAAY,GAAG,IAAI;IAWxF,qBAAqB,CAAC,cAAc,EAAE,mBAAmB,EAAE;;;;IA8CjE,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IAK/B,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,GAAG,eAAe,GAAG,kBAAkB;IAIjG,oBAAoB,CAAC,YAAY,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC;IAwB5D,4BAA4B,CAAC,cAAc,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC;YAIlF,+BAA+B;IAO7C;;;;OAIG;IACU,8BAA8B,CAAC,cAAc,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B1E,oCAAoC,IAAI,OAAO,CAAC,IAAI,CAAC;IAUlE;;;;;OAKG;IACU,6BAA6B,CAAC,cAAc,EAAE,WAAW,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,CAAC;IAkCrG,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMpE,mBAAmB,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,IAAI,EAAE,uBAAuB;IAI7F,qBAAqB,CAAC,cAAc,EAAE,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC;IAI1E,cAAc,CAAC,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI9F,cAAc,CAAC,cAAc,EAAE,cAAc,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAIrG;;;;;;;;;OASG;YACW,mBAAmB;IAQjC,OAAO,CAAC,oBAAoB;IAK5B;;;OAGG;IACU,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAatE;;;;;OAKG;IACU,oBAAoB,CAC/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,CAAC,EAAE;QAAC,IAAI,EAAE,WAAW,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC,GAC7C,OAAO,CAAC,sBAAsB,CAAC;IAiClC;;;;OAIG;IACI,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;YAW3D,eAAe;IAK7B;;;OAGG;IACU,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlE;;;;OAIG;IACU,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK5D,2BAA2B,IAAI,OAAO,CAAC,MAAM,CAAC;IAO9C,iBAAiB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAQ9E;;;;OAIG;IACU,gBAAgB,CAAC,OAAO,EAAE,MAAM;IAc7C,OAAO,CAAC,sCAAsC;IAI9C;;;OAGG;IACI,uBAAuB,CAAC,OAAO,EAAE,MAAM;IAK9C;;;OAGG;IACI,wBAAwB,CAAC,OAAO,EAAE,MAAM;IAI/C;;;OAGG;IACI,0BAA0B,CAAC,OAAO,EAAE,MAAM;IAUjD;;;OAGG;IACI,mCAAmC,CAAC,QAAQ,EAAE,MAAM,EAAE;IAQ7D
|
|
1
|
+
{"version":3,"file":"MLSService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/mls/MLSService/MLSService.ts"],"names":[],"mappings":"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"}
|
|
@@ -82,7 +82,7 @@ class MLSService extends TypedEventEmitter_1.TypedEventEmitter {
|
|
|
82
82
|
await this.coreCryptoClient.mlsInit(this.textEncoder.encode(qualifiedClientId), [this.config.defaultCiphersuite]);
|
|
83
83
|
// We need to make sure keypackages and public key are uploaded to the backend
|
|
84
84
|
await this.uploadMLSPublicKeys(client);
|
|
85
|
-
await this.
|
|
85
|
+
await this.verifyRemoteMLSKeyPackagesAmount(client.id);
|
|
86
86
|
}
|
|
87
87
|
async uploadCommitBundle(groupId, commitBundle, { regenerateCommitBundle, isExternalCommit } = {}) {
|
|
88
88
|
const { commit, groupInfo, welcome } = commitBundle;
|
|
@@ -451,23 +451,37 @@ class MLSService extends TypedEventEmitter_1.TypedEventEmitter {
|
|
|
451
451
|
}
|
|
452
452
|
}
|
|
453
453
|
/**
|
|
454
|
-
*
|
|
454
|
+
* Schedules a task to periodically (every 24h) check if new key packages should be generated and uploaded to backend.
|
|
455
455
|
* Function must only be called once, after application start
|
|
456
|
+
* @param clientId id of the client
|
|
456
457
|
*/
|
|
457
|
-
|
|
458
|
+
schedulePeriodicKeyPackagesBackendSync(clientId) {
|
|
458
459
|
(0, RecurringTaskScheduler_1.registerRecurringTask)({
|
|
459
460
|
every: commons_1.TimeUtil.TimeInMillis.DAY,
|
|
460
461
|
key: 'try-key-packages-backend-sync',
|
|
461
|
-
task: () => this.
|
|
462
|
+
task: () => this.verifyRemoteMLSKeyPackagesAmount(clientId),
|
|
462
463
|
});
|
|
463
464
|
}
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
465
|
+
/**
|
|
466
|
+
* Checks if there are enough key packages locally and if not,
|
|
467
|
+
* checks the number of keys available on backend and (if needed) generates new keys and uploads them.
|
|
468
|
+
* @param clientId id of the client
|
|
469
|
+
*/
|
|
470
|
+
async verifyLocalMLSKeyPackagesAmount(clientId) {
|
|
471
|
+
const keyPackagesCount = await this.clientValidKeypackagesCount();
|
|
472
|
+
if (keyPackagesCount <= this.config.minRequiredNumberOfAvailableKeyPackages) {
|
|
473
|
+
return this.verifyRemoteMLSKeyPackagesAmount(clientId);
|
|
469
474
|
}
|
|
470
475
|
}
|
|
476
|
+
async verifyRemoteMLSKeyPackagesAmount(clientId) {
|
|
477
|
+
const backendKeyPackagesCount = await this.getRemoteMLSKeyPackageCount(clientId);
|
|
478
|
+
// If we have enough keys uploaded on backend, there's no need to upload more.
|
|
479
|
+
if (backendKeyPackagesCount > this.config.minRequiredNumberOfAvailableKeyPackages) {
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
const keyPackages = await this.clientKeypackages(this.config.nbKeyPackages);
|
|
483
|
+
return this.uploadMLSKeyPackages(clientId, keyPackages);
|
|
484
|
+
}
|
|
471
485
|
async getRemoteMLSKeyPackageCount(clientId) {
|
|
472
486
|
return this.apiClient.api.client.getMLSKeyPackageCount(clientId, (0, numberToHex_1.numberToHex)(this.config.defaultCiphersuite));
|
|
473
487
|
}
|
|
@@ -488,14 +502,8 @@ class MLSService extends TypedEventEmitter_1.TypedEventEmitter {
|
|
|
488
502
|
mls_public_keys: { ed25519: btoa(bazinga64_1.Converter.arrayBufferViewToBaselineString(publicKey)) },
|
|
489
503
|
});
|
|
490
504
|
}
|
|
491
|
-
async uploadMLSKeyPackages(clientId) {
|
|
492
|
-
|
|
493
|
-
// If we have enough keys uploaded on backend, there's no need to upload more.
|
|
494
|
-
if (backendKeyPackagesCount > this.config.minRequiredNumberOfAvailableKeyPackages) {
|
|
495
|
-
return;
|
|
496
|
-
}
|
|
497
|
-
const keyPackages = await this.clientKeypackages(this.config.nbKeyPackages);
|
|
498
|
-
return this.apiClient.api.client.uploadMLSKeyPackages(clientId, keyPackages.map(keypackage => btoa(bazinga64_1.Converter.arrayBufferViewToBaselineString(keypackage))));
|
|
505
|
+
async uploadMLSKeyPackages(clientId, keyPackages) {
|
|
506
|
+
return this.apiClient.api.client.uploadMLSKeyPackages(clientId, keyPackages.map(keyPackage => btoa(bazinga64_1.Converter.arrayBufferViewToBaselineString(keyPackage))));
|
|
499
507
|
}
|
|
500
508
|
async wipeConversation(groupId) {
|
|
501
509
|
const doesConversationExist = await this.conversationExists(groupId);
|
|
@@ -601,7 +609,17 @@ class MLSService extends TypedEventEmitter_1.TypedEventEmitter {
|
|
|
601
609
|
async handleMLSMessageAddEvent(event) {
|
|
602
610
|
return (0, events_1.handleMLSMessageAdd)({ event, mlsService: this });
|
|
603
611
|
}
|
|
604
|
-
async handleMLSWelcomeMessageEvent(event) {
|
|
612
|
+
async handleMLSWelcomeMessageEvent(event, clientId) {
|
|
613
|
+
// Every time we've received a welcome message, it means that our key package was consumed,
|
|
614
|
+
// we need to verify if we need to upload new ones.
|
|
615
|
+
// Note that this has to be done before we even process the welcome message (even if it fails),
|
|
616
|
+
// receiving a welcome message means that one of our key packages on backend was claimed.
|
|
617
|
+
try {
|
|
618
|
+
await this.verifyLocalMLSKeyPackagesAmount(clientId);
|
|
619
|
+
}
|
|
620
|
+
catch (_a) {
|
|
621
|
+
this.logger.error('Failed to verify the amount of MLS key packages');
|
|
622
|
+
}
|
|
605
623
|
return (0, events_1.handleMLSWelcomeMessage)({ event, mlsService: this });
|
|
606
624
|
}
|
|
607
625
|
}
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
21
|
const client_1 = require("@wireapp/api-client/lib/client");
|
|
22
|
+
const event_1 = require("@wireapp/api-client/lib/event");
|
|
22
23
|
const crypto_1 = require("crypto");
|
|
23
24
|
const api_client_1 = require("@wireapp/api-client");
|
|
24
25
|
const MLSService_1 = require("./MLSService");
|
|
@@ -36,6 +37,7 @@ describe('MLSService', () => {
|
|
|
36
37
|
clientKeypackages: jest.fn(),
|
|
37
38
|
mlsInit: jest.fn(),
|
|
38
39
|
clientPublicKey: jest.fn(),
|
|
40
|
+
processWelcomeMessage: jest.fn(),
|
|
39
41
|
};
|
|
40
42
|
describe('registerConversation', () => {
|
|
41
43
|
let mlsService;
|
|
@@ -146,4 +148,79 @@ describe('MLSService', () => {
|
|
|
146
148
|
expect(apiClient.api.client.putClient).not.toHaveBeenCalled();
|
|
147
149
|
});
|
|
148
150
|
});
|
|
151
|
+
describe('handleMLSWelcomeMessageEvent', () => {
|
|
152
|
+
it("before processing welcome it verifies that there's enough key packages locally", async () => {
|
|
153
|
+
const mlsService = new MLSService_1.MLSService(apiClient, mockCoreCrypto, {});
|
|
154
|
+
const mockClientId = 'client-1';
|
|
155
|
+
const mockClient = { mls_public_keys: { ed25519: 'key' }, id: mockClientId };
|
|
156
|
+
apiClient.context = { clientType: client_1.ClientType.PERMANENT, clientId: mockClientId, userId: '' };
|
|
157
|
+
const mockedClientKeyPackages = [new Uint8Array()];
|
|
158
|
+
jest.spyOn(mockCoreCrypto, 'clientKeypackages').mockResolvedValueOnce(mockedClientKeyPackages);
|
|
159
|
+
const numberOfKeysBelowThreshold = mlsService.config.minRequiredNumberOfAvailableKeyPackages - 1;
|
|
160
|
+
jest.spyOn(apiClient.api.client, 'getMLSKeyPackageCount').mockResolvedValueOnce(numberOfKeysBelowThreshold);
|
|
161
|
+
jest.spyOn(mockCoreCrypto, 'clientValidKeypackagesCount').mockResolvedValueOnce(numberOfKeysBelowThreshold);
|
|
162
|
+
jest.spyOn(apiClient.api.client, 'uploadMLSKeyPackages').mockResolvedValueOnce(undefined);
|
|
163
|
+
jest.spyOn(mockCoreCrypto, 'processWelcomeMessage').mockResolvedValueOnce(new Uint8Array());
|
|
164
|
+
jest.spyOn(mlsService, 'scheduleKeyMaterialRenewal').mockImplementation(jest.fn());
|
|
165
|
+
const mockedMLSWelcomeEvent = {
|
|
166
|
+
type: event_1.CONVERSATION_EVENT.MLS_WELCOME_MESSAGE,
|
|
167
|
+
conversation: '',
|
|
168
|
+
data: '',
|
|
169
|
+
from: '',
|
|
170
|
+
time: '',
|
|
171
|
+
};
|
|
172
|
+
await mlsService.handleMLSWelcomeMessageEvent(mockedMLSWelcomeEvent, mockClient.id);
|
|
173
|
+
expect(mockCoreCrypto.processWelcomeMessage).toHaveBeenCalled();
|
|
174
|
+
expect(apiClient.api.client.uploadMLSKeyPackages).toHaveBeenCalledWith(mockClientId, expect.anything());
|
|
175
|
+
});
|
|
176
|
+
it('before processing welcome it does not generate new keys if there is enough key packages locally', async () => {
|
|
177
|
+
const mlsService = new MLSService_1.MLSService(apiClient, mockCoreCrypto, {});
|
|
178
|
+
const mockClientId = 'client-1';
|
|
179
|
+
const mockClient = { mls_public_keys: { ed25519: 'key' }, id: mockClientId };
|
|
180
|
+
apiClient.context = { clientType: client_1.ClientType.PERMANENT, clientId: mockClientId, userId: '' };
|
|
181
|
+
const mockedClientKeyPackages = [new Uint8Array()];
|
|
182
|
+
jest.spyOn(mockCoreCrypto, 'clientKeypackages').mockResolvedValueOnce(mockedClientKeyPackages);
|
|
183
|
+
const numberOfKeysAboveThreshold = mlsService.config.minRequiredNumberOfAvailableKeyPackages + 1;
|
|
184
|
+
jest.spyOn(mockCoreCrypto, 'clientValidKeypackagesCount').mockResolvedValueOnce(numberOfKeysAboveThreshold);
|
|
185
|
+
jest.spyOn(apiClient.api.client, 'getMLSKeyPackageCount').mockResolvedValueOnce(numberOfKeysAboveThreshold);
|
|
186
|
+
jest.spyOn(apiClient.api.client, 'uploadMLSKeyPackages').mockResolvedValueOnce(undefined);
|
|
187
|
+
jest.spyOn(mockCoreCrypto, 'processWelcomeMessage').mockResolvedValueOnce(new Uint8Array());
|
|
188
|
+
jest.spyOn(mlsService, 'scheduleKeyMaterialRenewal').mockImplementation(jest.fn());
|
|
189
|
+
const mockedMLSWelcomeEvent = {
|
|
190
|
+
type: event_1.CONVERSATION_EVENT.MLS_WELCOME_MESSAGE,
|
|
191
|
+
conversation: '',
|
|
192
|
+
data: '',
|
|
193
|
+
from: '',
|
|
194
|
+
time: '',
|
|
195
|
+
};
|
|
196
|
+
await mlsService.handleMLSWelcomeMessageEvent(mockedMLSWelcomeEvent, mockClient.id);
|
|
197
|
+
expect(mockCoreCrypto.processWelcomeMessage).toHaveBeenCalled();
|
|
198
|
+
expect(apiClient.api.client.uploadMLSKeyPackages).not.toHaveBeenCalled();
|
|
199
|
+
});
|
|
200
|
+
it('before processing welcome it does not generate new keys if there is enough key packages uploaded to backend', async () => {
|
|
201
|
+
const mlsService = new MLSService_1.MLSService(apiClient, mockCoreCrypto, {});
|
|
202
|
+
const mockClientId = 'client-1';
|
|
203
|
+
const mockClient = { mls_public_keys: { ed25519: 'key' }, id: mockClientId };
|
|
204
|
+
apiClient.context = { clientType: client_1.ClientType.PERMANENT, clientId: mockClientId, userId: '' };
|
|
205
|
+
const mockedClientKeyPackages = [new Uint8Array()];
|
|
206
|
+
jest.spyOn(mockCoreCrypto, 'clientKeypackages').mockResolvedValueOnce(mockedClientKeyPackages);
|
|
207
|
+
const numberOfKeysBelowThreshold = mlsService.config.minRequiredNumberOfAvailableKeyPackages - 1;
|
|
208
|
+
const numberOfKeysAboveThreshold = mlsService.config.minRequiredNumberOfAvailableKeyPackages + 1;
|
|
209
|
+
jest.spyOn(mockCoreCrypto, 'clientValidKeypackagesCount').mockResolvedValueOnce(numberOfKeysBelowThreshold);
|
|
210
|
+
jest.spyOn(apiClient.api.client, 'getMLSKeyPackageCount').mockResolvedValueOnce(numberOfKeysAboveThreshold);
|
|
211
|
+
jest.spyOn(apiClient.api.client, 'uploadMLSKeyPackages').mockResolvedValueOnce(undefined);
|
|
212
|
+
jest.spyOn(mockCoreCrypto, 'processWelcomeMessage').mockResolvedValueOnce(new Uint8Array());
|
|
213
|
+
jest.spyOn(mlsService, 'scheduleKeyMaterialRenewal').mockImplementation(jest.fn());
|
|
214
|
+
const mockedMLSWelcomeEvent = {
|
|
215
|
+
type: event_1.CONVERSATION_EVENT.MLS_WELCOME_MESSAGE,
|
|
216
|
+
conversation: '',
|
|
217
|
+
data: '',
|
|
218
|
+
from: '',
|
|
219
|
+
time: '',
|
|
220
|
+
};
|
|
221
|
+
await mlsService.handleMLSWelcomeMessageEvent(mockedMLSWelcomeEvent, mockClient.id);
|
|
222
|
+
expect(mockCoreCrypto.processWelcomeMessage).toHaveBeenCalled();
|
|
223
|
+
expect(apiClient.api.client.uploadMLSKeyPackages).not.toHaveBeenCalled();
|
|
224
|
+
});
|
|
225
|
+
});
|
|
149
226
|
});
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"./lib/cryptography/AssetCryptography/crypto.node": "./lib/cryptography/AssetCryptography/crypto.browser.js"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@wireapp/api-client": "^26.1.
|
|
14
|
+
"@wireapp/api-client": "^26.1.1",
|
|
15
15
|
"@wireapp/commons": "^5.1.3",
|
|
16
16
|
"@wireapp/core-crypto": "1.0.0-rc.12",
|
|
17
17
|
"@wireapp/cryptobox": "12.8.0",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"@wireapp/store-engine": "5.1.4",
|
|
21
21
|
"@wireapp/store-engine-dexie": "^2.1.6",
|
|
22
22
|
"axios": "1.5.0",
|
|
23
|
-
"bazinga64": "^6.3.
|
|
23
|
+
"bazinga64": "^6.3.1",
|
|
24
24
|
"deepmerge-ts": "5.1.0",
|
|
25
25
|
"hash.js": "1.1.7",
|
|
26
26
|
"http-status-codes": "2.2.0",
|
|
@@ -36,13 +36,13 @@
|
|
|
36
36
|
"@types/jest": "^29.2.0",
|
|
37
37
|
"@types/long": "^5.0.0",
|
|
38
38
|
"@types/rimraf": "^3.0.2",
|
|
39
|
-
"@types/tough-cookie": "4.0.
|
|
39
|
+
"@types/tough-cookie": "4.0.3",
|
|
40
40
|
"commander": "11.0.0",
|
|
41
41
|
"cross-env": "7.0.3",
|
|
42
42
|
"dotenv-defaults": "5.0.2",
|
|
43
43
|
"fake-indexeddb": "^4.0.0",
|
|
44
44
|
"jest": "^29.2.1",
|
|
45
|
-
"jest-websocket-mock": "2.
|
|
45
|
+
"jest-websocket-mock": "2.5.0",
|
|
46
46
|
"nock": "13.3.3",
|
|
47
47
|
"rimraf": "^3.0.2",
|
|
48
48
|
"typescript": "^5.0.4"
|
|
@@ -60,6 +60,6 @@
|
|
|
60
60
|
"test:coverage": "jest --coverage",
|
|
61
61
|
"watch": "tsc --watch"
|
|
62
62
|
},
|
|
63
|
-
"version": "42.
|
|
64
|
-
"gitHead": "
|
|
63
|
+
"version": "42.4.0",
|
|
64
|
+
"gitHead": "f5b86dd2964932c725c061089c8546b7d796ebb2"
|
|
65
65
|
}
|