Page MenuHomePhabricator

D11326.id38333.diff
No OneTemporary

D11326.id38333.diff

diff --git a/web/shared-worker/types/sqlite-query-executor.js b/web/shared-worker/types/sqlite-query-executor.js
--- a/web/shared-worker/types/sqlite-query-executor.js
+++ b/web/shared-worker/types/sqlite-query-executor.js
@@ -33,7 +33,7 @@
+extras: string,
};
-type OlmPersistSession = {
+export type OlmPersistSession = {
+targetUserID: string,
+sessionData: string,
};
diff --git a/web/shared-worker/worker/worker-crypto.js b/web/shared-worker/worker/worker-crypto.js
--- a/web/shared-worker/worker/worker-crypto.js
+++ b/web/shared-worker/worker/worker-crypto.js
@@ -13,6 +13,7 @@
IdentityNewDeviceKeyUpload,
IdentityExistingDeviceKeyUpload,
} from 'lib/types/identity-service-types.js';
+import { entries } from 'lib/utils/objects.js';
import {
retrieveIdentityKeysAndPrekeys,
retrieveAccountKeysSet,
@@ -25,10 +26,12 @@
type WorkerResponseMessage,
workerRequestMessageTypes,
} from '../../types/worker-types.js';
+import type { OlmPersistSession } from '../types/sqlite-query-executor.js';
type WorkerCryptoStore = {
+contentAccountPickleKey: string,
+contentAccount: olm.Account,
+ +contentSessions: { [deviceID: string]: olm.Session },
+notificationAccountPickleKey: string,
+notificationAccount: olm.Account,
};
@@ -54,6 +57,7 @@
const {
contentAccountPickleKey,
contentAccount,
+ contentSessions,
notificationAccountPickleKey,
notificationAccount,
} = cryptoStore;
@@ -63,6 +67,13 @@
pickledAccount: contentAccount.pickle(contentAccountPickleKey),
};
+ const pickledContentSessions: OlmPersistSession[] = entries(
+ contentSessions,
+ ).map(([deviceID, session]) => ({
+ targetUserID: deviceID,
+ sessionData: session.pickle(contentAccountPickleKey),
+ }));
+
const pickledNotificationAccount: PickledOLMAccount = {
picklingKey: notificationAccountPickleKey,
pickledAccount: notificationAccount.pickle(notificationAccountPickleKey),
@@ -73,6 +84,9 @@
sqliteQueryExecutor.getContentAccountID(),
JSON.stringify(pickledContentAccount),
);
+ for (const pickledSession of pickledContentSessions) {
+ sqliteQueryExecutor.storeOlmPersistSession(pickledSession);
+ }
sqliteQueryExecutor.storeOlmPersistAccount(
sqliteQueryExecutor.getNotifsAccountID(),
JSON.stringify(pickledNotificationAccount),
@@ -115,6 +129,34 @@
return { picklingKey, account };
}
+function getOlmSessions(picklingKey: string): {
+ [deviceID: string]: olm.Session,
+} {
+ const sqliteQueryExecutor = getSQLiteQueryExecutor();
+ const dbModule = getDBModule();
+ if (!sqliteQueryExecutor || !dbModule) {
+ throw new Error(
+ "Couldn't get olm sessions because database is not initialized",
+ );
+ }
+
+ let sessionsData;
+ try {
+ sessionsData = sqliteQueryExecutor.getOlmPersistSessionsData();
+ } catch (err) {
+ throw new Error(getProcessingStoreOpsExceptionMessage(err, dbModule));
+ }
+
+ const sessions: { [deviceID: string]: olm.Session } = {};
+ for (const sessionData of sessionsData) {
+ const session = new olm.Session();
+ session.unpickle(picklingKey, sessionData.sessionData);
+ sessions[sessionData.targetUserID] = session;
+ }
+
+ return sessions;
+}
+
function unpickleInitialCryptoStoreAccount(
account: PickledOLMAccount,
): olm.Account {
@@ -141,6 +183,7 @@
contentAccount: unpickleInitialCryptoStoreAccount(
initialCryptoStore.primaryAccount,
),
+ contentSessions: {},
notificationAccountPickleKey:
initialCryptoStore.notificationAccount.picklingKey,
notificationAccount: unpickleInitialCryptoStoreAccount(
@@ -154,6 +197,7 @@
const contentAccountResult = getOrCreateOlmAccount(
sqliteQueryExecutor.getContentAccountID(),
);
+ const contentSessions = getOlmSessions(contentAccountResult.picklingKey);
const notificationAccountResult = getOrCreateOlmAccount(
sqliteQueryExecutor.getNotifsAccountID(),
);
@@ -161,6 +205,7 @@
cryptoStore = {
contentAccountPickleKey: contentAccountResult.picklingKey,
contentAccount: contentAccountResult.account,
+ contentSessions,
notificationAccountPickleKey: notificationAccountResult.picklingKey,
notificationAccount: notificationAccountResult.account,
};

File Metadata

Mime Type
text/plain
Expires
Tue, Nov 26, 3:23 AM (21 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2581943
Default Alt Text
D11326.id38333.diff (4 KB)

Event Timeline