@wireapp/core 17.22.1 → 17.24.2
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/CHANGELOG.md +46 -0
- package/package.json +2 -2
- package/src/main/Account.d.ts +10 -1
- package/src/main/Account.js +8 -2
- package/src/main/Account.js.map +1 -1
- package/src/main/Account.ts +15 -2
- package/src/main/broadcast/BroadcastService.js +3 -4
- package/src/main/broadcast/BroadcastService.js.map +1 -1
- package/src/main/broadcast/BroadcastService.ts +3 -5
- package/src/main/conversation/ConversationService.d.ts +4 -6
- package/src/main/conversation/ConversationService.js +26 -59
- package/src/main/conversation/ConversationService.js.map +1 -1
- package/src/main/conversation/ConversationService.test.node.js +0 -38
- package/src/main/conversation/ConversationService.test.node.js.map +1 -1
- package/src/main/conversation/ConversationService.test.node.ts +1 -50
- package/src/main/conversation/ConversationService.ts +32 -116
- package/src/main/conversation/message/MessageService.d.ts +42 -12
- package/src/main/conversation/message/MessageService.js +147 -275
- package/src/main/conversation/message/MessageService.js.map +1 -1
- package/src/main/conversation/message/MessageService.test.node.js +117 -10
- package/src/main/conversation/message/MessageService.test.node.js.map +1 -1
- package/src/main/conversation/message/MessageService.test.node.ts +183 -40
- package/src/main/conversation/message/MessageService.ts +209 -354
- package/src/main/conversation/message/UserClientsUtil.d.ts +22 -0
- package/src/main/conversation/message/UserClientsUtil.js +38 -0
- package/src/main/conversation/message/UserClientsUtil.js.map +1 -0
- package/src/main/conversation/message/UserClientsUtil.ts +44 -0
- package/src/main/conversation/message/UserClientsUtils.test.node.d.ts +1 -0
- package/src/main/conversation/message/UserClientsUtils.test.node.js +42 -0
- package/src/main/conversation/message/UserClientsUtils.test.node.js.map +1 -0
- package/src/main/conversation/message/UserClientsUtils.test.node.ts +44 -0
- package/src/main/cryptography/CryptographyService.d.ts +6 -1
- package/src/main/cryptography/CryptographyService.js +14 -2
- package/src/main/cryptography/CryptographyService.js.map +1 -1
- package/src/main/cryptography/CryptographyService.test.node.js +2 -2
- package/src/main/cryptography/CryptographyService.test.node.js.map +1 -1
- package/src/main/cryptography/CryptographyService.test.node.ts +5 -4
- package/src/main/cryptography/CryptographyService.ts +22 -4
- package/src/main/util/TypePredicateUtil.js +3 -9
- package/src/main/util/TypePredicateUtil.js.map +1 -1
- package/src/main/util/TypePredicateUtil.ts +3 -9
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { QualifiedId } from '@wireapp/api-client/src/user';
|
|
2
|
+
declare type UserClientsContainer<T> = {
|
|
3
|
+
[userId: string]: T;
|
|
4
|
+
};
|
|
5
|
+
declare type QualifiedUserClientsContainer<T> = {
|
|
6
|
+
[domain: string]: UserClientsContainer<T>;
|
|
7
|
+
};
|
|
8
|
+
export declare function flattenUserClients<T>(userClients: UserClientsContainer<T>, domain?: string): {
|
|
9
|
+
data: T;
|
|
10
|
+
userId: QualifiedId;
|
|
11
|
+
}[];
|
|
12
|
+
/**
|
|
13
|
+
* Will flatten a container of users=>clients infos to an array
|
|
14
|
+
*
|
|
15
|
+
* @param userClients The UserClients (qualified or not) to flatten
|
|
16
|
+
* @return An array containing the qualified user Ids and the clients info
|
|
17
|
+
*/
|
|
18
|
+
export declare function flattenQualifiedUserClients<T = unknown>(userClients: QualifiedUserClientsContainer<T>): {
|
|
19
|
+
data: T;
|
|
20
|
+
userId: QualifiedId;
|
|
21
|
+
}[];
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.flattenQualifiedUserClients = exports.flattenUserClients = void 0;
|
|
22
|
+
function flattenUserClients(userClients, domain = '') {
|
|
23
|
+
return Object.entries(userClients).map(([id, data]) => ({ data, userId: { domain, id } }));
|
|
24
|
+
}
|
|
25
|
+
exports.flattenUserClients = flattenUserClients;
|
|
26
|
+
/**
|
|
27
|
+
* Will flatten a container of users=>clients infos to an array
|
|
28
|
+
*
|
|
29
|
+
* @param userClients The UserClients (qualified or not) to flatten
|
|
30
|
+
* @return An array containing the qualified user Ids and the clients info
|
|
31
|
+
*/
|
|
32
|
+
function flattenQualifiedUserClients(userClients) {
|
|
33
|
+
return Object.entries(userClients).reduce((ids, [domain, userClients]) => {
|
|
34
|
+
return [...ids, ...flattenUserClients(userClients, domain)];
|
|
35
|
+
}, []);
|
|
36
|
+
}
|
|
37
|
+
exports.flattenQualifiedUserClients = flattenQualifiedUserClients;
|
|
38
|
+
//# sourceMappingURL=UserClientsUtil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserClientsUtil.js","sourceRoot":"","sources":["UserClientsUtil.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAOH,SAAgB,kBAAkB,CAChC,WAAoC,EACpC,SAAiB,EAAE;IAEnB,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,IAAI,EAAE,MAAM,EAAE,EAAC,MAAM,EAAE,EAAE,EAAC,EAAC,CAAC,CAAC,CAAC;AACzF,CAAC;AALD,gDAKC;AAED;;;;;GAKG;AACH,SAAgB,2BAA2B,CACzC,WAA6C;IAE7C,OAAO,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,EAAE;QACvE,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,kBAAkB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC,EAAE,EAAsC,CAAC,CAAC;AAC7C,CAAC;AAND,kEAMC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Wire
|
|
3
|
+
* Copyright (C) 2021 Wire Swiss GmbH
|
|
4
|
+
*
|
|
5
|
+
* This program is free software: you can redistribute it and/or modify
|
|
6
|
+
* it under the terms of the GNU General Public License as published by
|
|
7
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
* (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* This program is distributed in the hope that it will be useful,
|
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
* GNU General Public License for more details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU General Public License
|
|
16
|
+
* along with this program. If not, see http://www.gnu.org/licenses/.
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import {QualifiedId} from '@wireapp/api-client/src/user';
|
|
21
|
+
|
|
22
|
+
type UserClientsContainer<T> = {[userId: string]: T};
|
|
23
|
+
type QualifiedUserClientsContainer<T> = {[domain: string]: UserClientsContainer<T>};
|
|
24
|
+
|
|
25
|
+
export function flattenUserClients<T>(
|
|
26
|
+
userClients: UserClientsContainer<T>,
|
|
27
|
+
domain: string = '',
|
|
28
|
+
): {data: T; userId: QualifiedId}[] {
|
|
29
|
+
return Object.entries(userClients).map(([id, data]) => ({data, userId: {domain, id}}));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Will flatten a container of users=>clients infos to an array
|
|
34
|
+
*
|
|
35
|
+
* @param userClients The UserClients (qualified or not) to flatten
|
|
36
|
+
* @return An array containing the qualified user Ids and the clients info
|
|
37
|
+
*/
|
|
38
|
+
export function flattenQualifiedUserClients<T = unknown>(
|
|
39
|
+
userClients: QualifiedUserClientsContainer<T>,
|
|
40
|
+
): {data: T; userId: QualifiedId}[] {
|
|
41
|
+
return Object.entries(userClients).reduce((ids, [domain, userClients]) => {
|
|
42
|
+
return [...ids, ...flattenUserClients(userClients, domain)];
|
|
43
|
+
}, [] as {data: T; userId: QualifiedId}[]);
|
|
44
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
const UserClientsUtil_1 = require("./UserClientsUtil");
|
|
22
|
+
describe('userClientsUtils', () => {
|
|
23
|
+
it('extracts user and data info from qualified payload', () => {
|
|
24
|
+
const payload = { domain1: { user1: ['client1'], user2: ['client11'] }, domain2: { user3: ['client1', 'client2'] } };
|
|
25
|
+
const expected = [
|
|
26
|
+
{ data: ['client1'], userId: { domain: 'domain1', id: 'user1' } },
|
|
27
|
+
{ data: ['client11'], userId: { domain: 'domain1', id: 'user2' } },
|
|
28
|
+
{ data: ['client1', 'client2'], userId: { domain: 'domain2', id: 'user3' } },
|
|
29
|
+
];
|
|
30
|
+
expect((0, UserClientsUtil_1.flattenQualifiedUserClients)(payload)).toEqual(expected);
|
|
31
|
+
});
|
|
32
|
+
it('extracts user and data info from non-qualified payload', () => {
|
|
33
|
+
const payload = { user1: ['client1'], user2: ['client11'], user3: ['client1', 'client2'] };
|
|
34
|
+
const expected = [
|
|
35
|
+
{ data: ['client1'], userId: { domain: '', id: 'user1' } },
|
|
36
|
+
{ data: ['client11'], userId: { domain: '', id: 'user2' } },
|
|
37
|
+
{ data: ['client1', 'client2'], userId: { domain: '', id: 'user3' } },
|
|
38
|
+
];
|
|
39
|
+
expect((0, UserClientsUtil_1.flattenUserClients)(payload)).toEqual(expected);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=UserClientsUtils.test.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserClientsUtils.test.node.js","sourceRoot":"","sources":["UserClientsUtils.test.node.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAEH,uDAAkF;AAElF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,OAAO,GAAG,EAAC,OAAO,EAAE,EAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,EAAC,EAAE,OAAO,EAAE,EAAC,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAC,EAAC,CAAC;QAC/G,MAAM,QAAQ,GAAG;YACf,EAAC,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAC,EAAC;YAC7D,EAAC,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,EAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAC,EAAC;YAC9D,EAAC,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,EAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAC,EAAC;SACzE,CAAC;QAEF,MAAM,CAAC,IAAA,6CAA2B,EAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,OAAO,GAAG,EAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAC,CAAC;QACzF,MAAM,QAAQ,GAAG;YACf,EAAC,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAC,EAAC;YACtD,EAAC,IAAI,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,EAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAC,EAAC;YACvD,EAAC,IAAI,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,EAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,EAAC,EAAC;SAClE,CAAC;QAEF,MAAM,CAAC,IAAA,oCAAkB,EAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Wire
|
|
3
|
+
* Copyright (C) 2021 Wire Swiss GmbH
|
|
4
|
+
*
|
|
5
|
+
* This program is free software: you can redistribute it and/or modify
|
|
6
|
+
* it under the terms of the GNU General Public License as published by
|
|
7
|
+
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
* (at your option) any later version.
|
|
9
|
+
*
|
|
10
|
+
* This program is distributed in the hope that it will be useful,
|
|
11
|
+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
* GNU General Public License for more details.
|
|
14
|
+
*
|
|
15
|
+
* You should have received a copy of the GNU General Public License
|
|
16
|
+
* along with this program. If not, see http://www.gnu.org/licenses/.
|
|
17
|
+
*
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import {flattenQualifiedUserClients, flattenUserClients} from './UserClientsUtil';
|
|
21
|
+
|
|
22
|
+
describe('userClientsUtils', () => {
|
|
23
|
+
it('extracts user and data info from qualified payload', () => {
|
|
24
|
+
const payload = {domain1: {user1: ['client1'], user2: ['client11']}, domain2: {user3: ['client1', 'client2']}};
|
|
25
|
+
const expected = [
|
|
26
|
+
{data: ['client1'], userId: {domain: 'domain1', id: 'user1'}},
|
|
27
|
+
{data: ['client11'], userId: {domain: 'domain1', id: 'user2'}},
|
|
28
|
+
{data: ['client1', 'client2'], userId: {domain: 'domain2', id: 'user3'}},
|
|
29
|
+
];
|
|
30
|
+
|
|
31
|
+
expect(flattenQualifiedUserClients(payload)).toEqual(expected);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it('extracts user and data info from non-qualified payload', () => {
|
|
35
|
+
const payload = {user1: ['client1'], user2: ['client11'], user3: ['client1', 'client2']};
|
|
36
|
+
const expected = [
|
|
37
|
+
{data: ['client1'], userId: {domain: '', id: 'user1'}},
|
|
38
|
+
{data: ['client11'], userId: {domain: '', id: 'user2'}},
|
|
39
|
+
{data: ['client1', 'client2'], userId: {domain: '', id: 'user3'}},
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
expect(flattenUserClients(payload)).toEqual(expected);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
@@ -13,13 +13,17 @@ export interface MetaClient extends RegisteredClient {
|
|
|
13
13
|
primary_key: string;
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
|
+
declare type CryptographyServiceOptions = {
|
|
17
|
+
federationDomain?: string;
|
|
18
|
+
};
|
|
16
19
|
export declare class CryptographyService {
|
|
17
20
|
readonly apiClient: APIClient;
|
|
18
21
|
private readonly storeEngine;
|
|
22
|
+
private readonly options?;
|
|
19
23
|
private readonly logger;
|
|
20
24
|
cryptobox: Cryptobox;
|
|
21
25
|
private readonly database;
|
|
22
|
-
constructor(apiClient: APIClient, storeEngine: CRUDEngine);
|
|
26
|
+
constructor(apiClient: APIClient, storeEngine: CRUDEngine, options?: CryptographyServiceOptions | undefined);
|
|
23
27
|
static constructSessionId(userId: string, clientId: string, domain: string | null): string;
|
|
24
28
|
static convertArrayRecipientsToBase64(recipients: OTRRecipients<Uint8Array>): OTRRecipients<string>;
|
|
25
29
|
static convertBase64RecipientsToArray(recipients: OTRRecipients<string>): OTRRecipients<Uint8Array>;
|
|
@@ -34,3 +38,4 @@ export declare class CryptographyService {
|
|
|
34
38
|
resetSession(sessionId: string): Promise<void>;
|
|
35
39
|
decodeGenericMessage(otrMessage: ConversationOtrMessageAddEvent, source: PayloadBundleSource): Promise<PayloadBundle>;
|
|
36
40
|
}
|
|
41
|
+
export {};
|
|
@@ -32,15 +32,17 @@ const util_1 = require("../util");
|
|
|
32
32
|
const CryptographyDatabaseRepository_1 = require("./CryptographyDatabaseRepository");
|
|
33
33
|
const GenericMessageMapper_1 = require("./GenericMessageMapper");
|
|
34
34
|
class CryptographyService {
|
|
35
|
-
constructor(apiClient, storeEngine) {
|
|
35
|
+
constructor(apiClient, storeEngine, options) {
|
|
36
36
|
this.apiClient = apiClient;
|
|
37
37
|
this.storeEngine = storeEngine;
|
|
38
|
+
this.options = options;
|
|
38
39
|
this.cryptobox = new cryptobox_1.Cryptobox(this.storeEngine);
|
|
39
40
|
this.database = new CryptographyDatabaseRepository_1.CryptographyDatabaseRepository(this.storeEngine);
|
|
40
41
|
this.logger = (0, logdown_1.default)('@wireapp/core/cryptography/CryptographyService', {
|
|
41
42
|
logger: console,
|
|
42
43
|
markdown: false,
|
|
43
44
|
});
|
|
45
|
+
this.options = options;
|
|
44
46
|
}
|
|
45
47
|
static constructSessionId(userId, clientId, domain) {
|
|
46
48
|
const baseId = `${userId}@${clientId}`;
|
|
@@ -105,6 +107,9 @@ class CryptographyService {
|
|
|
105
107
|
}
|
|
106
108
|
const payloads = await Promise.all(bundles);
|
|
107
109
|
return payloads.reduce((recipients, payload) => {
|
|
110
|
+
if (!payload) {
|
|
111
|
+
return recipients;
|
|
112
|
+
}
|
|
108
113
|
const { encryptedPayload, sessionId } = payload;
|
|
109
114
|
const { userId, clientId } = CryptographyService.dismantleSessionId(sessionId);
|
|
110
115
|
recipients[userId] || (recipients[userId] = {});
|
|
@@ -123,6 +128,11 @@ class CryptographyService {
|
|
|
123
128
|
encryptedPayload = new Uint8Array(payloadAsArrayBuffer);
|
|
124
129
|
}
|
|
125
130
|
catch (error) {
|
|
131
|
+
const notFoundErrorCode = 2;
|
|
132
|
+
if (error.code === notFoundErrorCode) {
|
|
133
|
+
// If the session is not in the database, we just return undefined. Later on there will be a mismatch and the session will be created
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
126
136
|
this.logger.error(`Could not encrypt payload: ${error.message}`);
|
|
127
137
|
encryptedPayload = new Uint8Array(Buffer.from('💣', 'utf-8'));
|
|
128
138
|
}
|
|
@@ -139,8 +149,10 @@ class CryptographyService {
|
|
|
139
149
|
this.logger.log(`Deleted session ID "${sessionId}".`);
|
|
140
150
|
}
|
|
141
151
|
async decodeGenericMessage(otrMessage, source) {
|
|
152
|
+
var _a;
|
|
142
153
|
const { from, qualified_from, data: { sender, text: cipherText }, } = otrMessage;
|
|
143
|
-
const
|
|
154
|
+
const domain = ((_a = this.options) === null || _a === void 0 ? void 0 : _a.federationDomain) ? (qualified_from === null || qualified_from === void 0 ? void 0 : qualified_from.domain) || this.options.federationDomain : null;
|
|
155
|
+
const sessionId = CryptographyService.constructSessionId(from, sender, domain);
|
|
144
156
|
const decryptedMessage = await this.decrypt(sessionId, cipherText);
|
|
145
157
|
const genericMessage = protocol_messaging_1.GenericMessage.decode(decryptedMessage);
|
|
146
158
|
if (genericMessage.content === conversation_1.GenericMessageType.EPHEMERAL) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CryptographyService.js","sourceRoot":"","sources":["CryptographyService.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;AAcH,kDAA6C;AAC7C,8CAAqD;AACrD,oEAA2D;AAE3D,yCAA2C;AAC3C,sDAA8B;AAE9B,kDAAuF;AAEvF,kCAAsC;AACtC,qFAAgF;AAChF,iEAA4D;
|
|
1
|
+
{"version":3,"file":"CryptographyService.js","sourceRoot":"","sources":["CryptographyService.ts"],"names":[],"mappings":"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"}
|
|
@@ -212,14 +212,14 @@ describe('CryptographyService', () => {
|
|
|
212
212
|
const sessionWithBobId = 'bob-user-id@bob-client-id';
|
|
213
213
|
const text = new Uint8Array([72, 101, 108, 108, 111, 32, 66, 111, 98, 33]); // "Hello Bob!"
|
|
214
214
|
const encodedPreKey = 'pQABAQACoQBYIHOFFWPnWlr4sulxUWYoP0A6rsJiBO/Ec3Y914t67CIAA6EAoQBYIPFH5CK/a0YwKEx4n/+U/IPRN+mJXVv++MCs5Z4dLmz4BPY=';
|
|
215
|
-
const { sessionId, encryptedPayload } = await cryptographyService['encryptPayloadForSession'](sessionWithBobId, text, encodedPreKey);
|
|
215
|
+
const { sessionId, encryptedPayload } = (await cryptographyService['encryptPayloadForSession'](sessionWithBobId, text, encodedPreKey));
|
|
216
216
|
expect(Buffer.from(encryptedPayload).toString('utf8')).not.toBe('💣');
|
|
217
217
|
expect(sessionId).toBe(sessionWithBobId);
|
|
218
218
|
});
|
|
219
219
|
it('encodes invalid text as Bomb Emoji.', async () => {
|
|
220
220
|
const sessionWithBobId = 'bob-user-id@bob-client-id';
|
|
221
221
|
const encodedPreKey = 'pQABAQACoQBYIHOFFWPnWlr4sulxUWYoP0A6rsJiBO/Ec3Y914t67CIAA6EAoQBYIPFH5CK/a0YwKEx4n/+U/IPRN+mJXVv++MCs5Z4dLmz4BPY=';
|
|
222
|
-
const { sessionId, encryptedPayload } = await cryptographyService['encryptPayloadForSession'](sessionWithBobId, undefined, encodedPreKey);
|
|
222
|
+
const { sessionId, encryptedPayload } = (await cryptographyService['encryptPayloadForSession'](sessionWithBobId, undefined, encodedPreKey));
|
|
223
223
|
expect(Buffer.from(encryptedPayload).toString()).toBe('💣');
|
|
224
224
|
expect(sessionId).toBe(sessionWithBobId);
|
|
225
225
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CryptographyService.test.node.js","sourceRoot":"","sources":["CryptographyService.test.node.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;;;;;;;;;;;;;;;;;AAEH,oDAA8C;AAC9C,kDAA6C;AAC7C,0DAA4C;AAC5C,wDAA+D;AAC/D,qDAAuC;AACvC,+CAAiC;AACjC,+BAA+B;
|
|
1
|
+
{"version":3,"file":"CryptographyService.test.node.js","sourceRoot":"","sources":["CryptographyService.test.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,7 @@ import {CRUDEngine, MemoryEngine} from '@wireapp/store-engine';
|
|
|
24
24
|
import * as bazinga64 from 'bazinga64';
|
|
25
25
|
import * as crypto from 'crypto';
|
|
26
26
|
import {promisify} from 'util';
|
|
27
|
+
import {SessionPayloadBundle} from '.';
|
|
27
28
|
|
|
28
29
|
import * as CryptographyHelper from '../test/CryptographyHelper';
|
|
29
30
|
import {decryptAsset, encryptAsset} from './AssetCryptography.node';
|
|
@@ -220,11 +221,11 @@ describe('CryptographyService', () => {
|
|
|
220
221
|
const text = new Uint8Array([72, 101, 108, 108, 111, 32, 66, 111, 98, 33]); // "Hello Bob!"
|
|
221
222
|
const encodedPreKey =
|
|
222
223
|
'pQABAQACoQBYIHOFFWPnWlr4sulxUWYoP0A6rsJiBO/Ec3Y914t67CIAA6EAoQBYIPFH5CK/a0YwKEx4n/+U/IPRN+mJXVv++MCs5Z4dLmz4BPY=';
|
|
223
|
-
const {sessionId, encryptedPayload} = await cryptographyService['encryptPayloadForSession'](
|
|
224
|
+
const {sessionId, encryptedPayload} = (await cryptographyService['encryptPayloadForSession'](
|
|
224
225
|
sessionWithBobId,
|
|
225
226
|
text,
|
|
226
227
|
encodedPreKey,
|
|
227
|
-
);
|
|
228
|
+
)) as SessionPayloadBundle;
|
|
228
229
|
expect(Buffer.from(encryptedPayload).toString('utf8')).not.toBe('💣');
|
|
229
230
|
expect(sessionId).toBe(sessionWithBobId);
|
|
230
231
|
});
|
|
@@ -233,11 +234,11 @@ describe('CryptographyService', () => {
|
|
|
233
234
|
const sessionWithBobId = 'bob-user-id@bob-client-id';
|
|
234
235
|
const encodedPreKey =
|
|
235
236
|
'pQABAQACoQBYIHOFFWPnWlr4sulxUWYoP0A6rsJiBO/Ec3Y914t67CIAA6EAoQBYIPFH5CK/a0YwKEx4n/+U/IPRN+mJXVv++MCs5Z4dLmz4BPY=';
|
|
236
|
-
const {sessionId, encryptedPayload} = await cryptographyService['encryptPayloadForSession'](
|
|
237
|
+
const {sessionId, encryptedPayload} = (await cryptographyService['encryptPayloadForSession'](
|
|
237
238
|
sessionWithBobId,
|
|
238
239
|
undefined as any,
|
|
239
240
|
encodedPreKey,
|
|
240
|
-
);
|
|
241
|
+
)) as SessionPayloadBundle;
|
|
241
242
|
expect(Buffer.from(encryptedPayload).toString()).toBe('💣');
|
|
242
243
|
expect(sessionId).toBe(sessionWithBobId);
|
|
243
244
|
});
|
|
@@ -49,19 +49,28 @@ export interface MetaClient extends RegisteredClient {
|
|
|
49
49
|
};
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
type CryptographyServiceOptions = {
|
|
53
|
+
federationDomain?: string;
|
|
54
|
+
};
|
|
55
|
+
|
|
52
56
|
export class CryptographyService {
|
|
53
57
|
private readonly logger: logdown.Logger;
|
|
54
58
|
|
|
55
59
|
public cryptobox: Cryptobox;
|
|
56
60
|
private readonly database: CryptographyDatabaseRepository;
|
|
57
61
|
|
|
58
|
-
constructor(
|
|
62
|
+
constructor(
|
|
63
|
+
readonly apiClient: APIClient,
|
|
64
|
+
private readonly storeEngine: CRUDEngine,
|
|
65
|
+
private readonly options?: CryptographyServiceOptions,
|
|
66
|
+
) {
|
|
59
67
|
this.cryptobox = new Cryptobox(this.storeEngine);
|
|
60
68
|
this.database = new CryptographyDatabaseRepository(this.storeEngine);
|
|
61
69
|
this.logger = logdown('@wireapp/core/cryptography/CryptographyService', {
|
|
62
70
|
logger: console,
|
|
63
71
|
markdown: false,
|
|
64
72
|
});
|
|
73
|
+
this.options = options;
|
|
65
74
|
}
|
|
66
75
|
|
|
67
76
|
public static constructSessionId(userId: string, clientId: string, domain: string | null): string {
|
|
@@ -141,7 +150,7 @@ export class CryptographyService {
|
|
|
141
150
|
users: UserPreKeyBundleMap | UserClients,
|
|
142
151
|
domain?: string,
|
|
143
152
|
): Promise<OTRRecipients<Uint8Array>> {
|
|
144
|
-
const bundles: Promise<SessionPayloadBundle>[] = [];
|
|
153
|
+
const bundles: Promise<SessionPayloadBundle | undefined>[] = [];
|
|
145
154
|
|
|
146
155
|
for (const userId in users) {
|
|
147
156
|
const clientIds = isUserClients(users) ? users[userId] : Object.keys(users[userId]);
|
|
@@ -155,6 +164,9 @@ export class CryptographyService {
|
|
|
155
164
|
const payloads = await Promise.all(bundles);
|
|
156
165
|
|
|
157
166
|
return payloads.reduce((recipients, payload) => {
|
|
167
|
+
if (!payload) {
|
|
168
|
+
return recipients;
|
|
169
|
+
}
|
|
158
170
|
const {encryptedPayload, sessionId} = payload;
|
|
159
171
|
const {userId, clientId} = CryptographyService.dismantleSessionId(sessionId);
|
|
160
172
|
recipients[userId] ||= {};
|
|
@@ -167,7 +179,7 @@ export class CryptographyService {
|
|
|
167
179
|
sessionId: string,
|
|
168
180
|
plainText: Uint8Array,
|
|
169
181
|
base64EncodedPreKey?: string,
|
|
170
|
-
): Promise<SessionPayloadBundle> {
|
|
182
|
+
): Promise<SessionPayloadBundle | undefined> {
|
|
171
183
|
this.logger.log(`Encrypting payload for session ID "${sessionId}"`);
|
|
172
184
|
|
|
173
185
|
let encryptedPayload: Uint8Array;
|
|
@@ -179,6 +191,11 @@ export class CryptographyService {
|
|
|
179
191
|
const payloadAsArrayBuffer = await this.cryptobox.encrypt(sessionId, plainText, decodedPreKeyBundle);
|
|
180
192
|
encryptedPayload = new Uint8Array(payloadAsArrayBuffer);
|
|
181
193
|
} catch (error) {
|
|
194
|
+
const notFoundErrorCode = 2;
|
|
195
|
+
if ((error as any).code === notFoundErrorCode) {
|
|
196
|
+
// If the session is not in the database, we just return undefined. Later on there will be a mismatch and the session will be created
|
|
197
|
+
return undefined;
|
|
198
|
+
}
|
|
182
199
|
this.logger.error(`Could not encrypt payload: ${(error as Error).message}`);
|
|
183
200
|
encryptedPayload = new Uint8Array(Buffer.from('💣', 'utf-8'));
|
|
184
201
|
}
|
|
@@ -209,7 +226,8 @@ export class CryptographyService {
|
|
|
209
226
|
data: {sender, text: cipherText},
|
|
210
227
|
} = otrMessage;
|
|
211
228
|
|
|
212
|
-
const
|
|
229
|
+
const domain = this.options?.federationDomain ? qualified_from?.domain || this.options.federationDomain : null;
|
|
230
|
+
const sessionId = CryptographyService.constructSessionId(from, sender, domain);
|
|
213
231
|
const decryptedMessage = await this.decrypt(sessionId, cipherText);
|
|
214
232
|
const genericMessage = GenericMessage.decode(decryptedMessage);
|
|
215
233
|
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
21
|
exports.isUserClients = exports.isQualifiedUserClients = exports.isQualifiedIdArray = exports.isQualifiedId = exports.isStringArray = void 0;
|
|
22
22
|
function isStringArray(obj) {
|
|
23
|
-
return Array.isArray(obj) && typeof obj[0] === 'string';
|
|
23
|
+
return Array.isArray(obj) && (obj.length === 0 || typeof obj[0] === 'string');
|
|
24
24
|
}
|
|
25
25
|
exports.isStringArray = isStringArray;
|
|
26
26
|
function isQualifiedId(obj) {
|
|
@@ -37,10 +37,7 @@ function isQualifiedUserClients(obj) {
|
|
|
37
37
|
const firstUserClientObject = (_a = Object.values(obj)) === null || _a === void 0 ? void 0 : _a[0];
|
|
38
38
|
if (typeof firstUserClientObject === 'object') {
|
|
39
39
|
const firstClientIdArray = Object.values(firstUserClientObject)[0];
|
|
40
|
-
|
|
41
|
-
const firstClientId = firstClientIdArray[0];
|
|
42
|
-
return typeof firstClientId === 'string' || typeof firstClientId === 'undefined';
|
|
43
|
-
}
|
|
40
|
+
return isStringArray(firstClientIdArray);
|
|
44
41
|
}
|
|
45
42
|
}
|
|
46
43
|
return false;
|
|
@@ -50,10 +47,7 @@ function isUserClients(obj) {
|
|
|
50
47
|
var _a;
|
|
51
48
|
if (typeof obj === 'object') {
|
|
52
49
|
const firstUserClientArray = (_a = Object.values(obj)) === null || _a === void 0 ? void 0 : _a[0];
|
|
53
|
-
|
|
54
|
-
const firstClientId = firstUserClientArray[0];
|
|
55
|
-
return typeof firstClientId === 'string';
|
|
56
|
-
}
|
|
50
|
+
return isStringArray(firstUserClientArray);
|
|
57
51
|
}
|
|
58
52
|
return false;
|
|
59
53
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TypePredicateUtil.js","sourceRoot":"","sources":["TypePredicateUtil.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAKH,SAAgB,aAAa,CAAC,GAAQ;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"TypePredicateUtil.js","sourceRoot":"","sources":["TypePredicateUtil.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;AAKH,SAAgB,aAAa,CAAC,GAAQ;IACpC,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;AAChF,CAAC;AAFD,sCAEC;AAED,SAAgB,aAAa,CAAC,GAAQ;IACpC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC;AACtE,CAAC;AAFD,sCAEC;AAED,SAAgB,kBAAkB,CAAC,GAAQ;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAFD,gDAEC;AAED,SAAgB,sBAAsB,CAAC,GAAQ;;IAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC3B,MAAM,qBAAqB,GAAG,MAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,0CAAG,CAAC,CAAC,CAAC;QACtD,IAAI,OAAO,qBAAqB,KAAK,QAAQ,EAAE;YAC7C,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,qBAA+B,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,OAAO,aAAa,CAAC,kBAAkB,CAAC,CAAC;SAC1C;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AATD,wDASC;AAED,SAAgB,aAAa,CAAC,GAAQ;;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAC3B,MAAM,oBAAoB,GAAG,MAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,0CAAG,CAAC,CAAC,CAAC;QACrD,OAAO,aAAa,CAAC,oBAAoB,CAAC,CAAC;KAC5C;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAND,sCAMC"}
|
|
@@ -21,7 +21,7 @@ import type {QualifiedUserClients, UserClients} from '@wireapp/api-client/src/co
|
|
|
21
21
|
import type {QualifiedId} from '@wireapp/api-client/src/user/';
|
|
22
22
|
|
|
23
23
|
export function isStringArray(obj: any): obj is string[] {
|
|
24
|
-
return Array.isArray(obj) && typeof obj[0] === 'string';
|
|
24
|
+
return Array.isArray(obj) && (obj.length === 0 || typeof obj[0] === 'string');
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
export function isQualifiedId(obj: any): obj is QualifiedId {
|
|
@@ -37,10 +37,7 @@ export function isQualifiedUserClients(obj: any): obj is QualifiedUserClients {
|
|
|
37
37
|
const firstUserClientObject = Object.values(obj)?.[0];
|
|
38
38
|
if (typeof firstUserClientObject === 'object') {
|
|
39
39
|
const firstClientIdArray = Object.values(firstUserClientObject as object)[0];
|
|
40
|
-
|
|
41
|
-
const firstClientId = firstClientIdArray[0];
|
|
42
|
-
return typeof firstClientId === 'string' || typeof firstClientId === 'undefined';
|
|
43
|
-
}
|
|
40
|
+
return isStringArray(firstClientIdArray);
|
|
44
41
|
}
|
|
45
42
|
}
|
|
46
43
|
return false;
|
|
@@ -49,10 +46,7 @@ export function isQualifiedUserClients(obj: any): obj is QualifiedUserClients {
|
|
|
49
46
|
export function isUserClients(obj: any): obj is UserClients {
|
|
50
47
|
if (typeof obj === 'object') {
|
|
51
48
|
const firstUserClientArray = Object.values(obj)?.[0];
|
|
52
|
-
|
|
53
|
-
const firstClientId = firstUserClientArray[0];
|
|
54
|
-
return typeof firstClientId === 'string';
|
|
55
|
-
}
|
|
49
|
+
return isStringArray(firstUserClientArray);
|
|
56
50
|
}
|
|
57
51
|
return false;
|
|
58
52
|
}
|