diff --git a/keyserver/src/creators/account-creator.js b/keyserver/src/creators/account-creator.js --- a/keyserver/src/creators/account-creator.js +++ b/keyserver/src/creators/account-creator.js @@ -31,7 +31,7 @@ import createIDs from './id-creator.js'; import createMessages from './message-creator.js'; -import { createOlmSession } from './olm-session-creator.js'; +import { createAndStoreOlmSession } from './olm-session-creator.js'; import { createThread, createPrivateThread, @@ -125,7 +125,7 @@ const olmSessionPromise = (async () => { if (userViewerData.cookieID && initialNotificationsEncryptedMessage) { - await createOlmSession( + await createAndStoreOlmSession( initialNotificationsEncryptedMessage, 'notifications', userViewerData.cookieID, diff --git a/keyserver/src/creators/olm-session-creator.js b/keyserver/src/creators/olm-session-creator.js --- a/keyserver/src/creators/olm-session-creator.js +++ b/keyserver/src/creators/olm-session-creator.js @@ -11,27 +11,26 @@ async function createOlmSession( initialEncryptedMessage: string, olmSessionType: 'content' | 'notifications', - cookieID: string, -): Promise { + theirCurve25519Key?: string, +): Promise { const callback = (account: OlmAccount, picklingKey: string) => - createPickledOlmSession(account, picklingKey, initialEncryptedMessage); - - let pickledOlmSession; - try { - pickledOlmSession = await fetchCallUpdateOlmAccount( - olmSessionType, - callback, - ); - } catch (e) { - console.warn( - `failed to create olm session of type: ${olmSessionType} ` + - `for user with cookie id: ${cookieID}`, - e, + createPickledOlmSession( + account, + picklingKey, + initialEncryptedMessage, + theirCurve25519Key, ); - throw new ServerError('olm_session_creation_failure'); - } + return await fetchCallUpdateOlmAccount(olmSessionType, callback); +} + +async function storeOlmSession( + pickledOlmSession: string, + olmSessionType: 'content' | 'notifications', + cookieID: string, +): Promise { const isContent = olmSessionType === 'content'; + // We match the native client behavior here where olm session is overwritten // in case it is initialized twice for the same pair of identities await dbQuery( @@ -45,4 +44,29 @@ ); } -export { createOlmSession }; +async function createAndStoreOlmSession( + initialEncryptedMessage: string, + olmSessionType: 'content' | 'notifications', + cookieID: string, + theirCurve25519Key?: string, +): Promise { + let pickledOlmSession: string; + + try { + pickledOlmSession = await createOlmSession( + initialEncryptedMessage, + olmSessionType, + theirCurve25519Key, + ); + } catch (e) { + console.warn( + `Failed to create olm session of type: ${olmSessionType} for user with cookie id: ${cookieID}`, + e, + ); + throw new ServerError('olm_session_creation_failure'); + } + + await storeOlmSession(pickledOlmSession, olmSessionType, cookieID); +} + +export { createOlmSession, createAndStoreOlmSession, storeOlmSession }; diff --git a/keyserver/src/responders/user-responders.js b/keyserver/src/responders/user-responders.js --- a/keyserver/src/responders/user-responders.js +++ b/keyserver/src/responders/user-responders.js @@ -101,7 +101,7 @@ createAccount, processSIWEAccountCreation, } from '../creators/account-creator.js'; -import { createOlmSession } from '../creators/olm-session-creator.js'; +import { createAndStoreOlmSession } from '../creators/olm-session-creator.js'; import { dbQuery, SQL } from '../database/database.js'; import { deleteAccount } from '../deleters/account-deleters.js'; import { deleteCookie } from '../deleters/cookie-deleters.js'; @@ -363,7 +363,7 @@ initialNotificationsEncryptedMessage && signedIdentityKeysBlob ) { - await createOlmSession( + await createAndStoreOlmSession( initialNotificationsEncryptedMessage, 'notifications', userViewerData.cookieID, diff --git a/keyserver/src/socket/session-utils.js b/keyserver/src/socket/session-utils.js --- a/keyserver/src/socket/session-utils.js +++ b/keyserver/src/socket/session-utils.js @@ -34,7 +34,7 @@ tPlatformDetails, } from 'lib/utils/validation-utils.js'; -import { createOlmSession } from '../creators/olm-session-creator.js'; +import { createAndStoreOlmSession } from '../creators/olm-session-creator.js'; import { saveOneTimeKeys } from '../creators/one-time-keys-creator.js'; import createReport from '../creators/report-creator.js'; import { fetchEntriesForSession } from '../fetchers/entry-fetchers.js'; @@ -231,7 +231,7 @@ ); const { initialNotificationsEncryptedMessage } = clientResponse; try { - await createOlmSession( + await createAndStoreOlmSession( initialNotificationsEncryptedMessage, 'notifications', viewer.cookieID,