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 @@ -42,13 +42,13 @@ import { createNewUserCookie, setNewSession } from '../session/cookies.js'; import { createScriptViewer } from '../session/scripts.js'; import type { Viewer } from '../session/viewer.js'; -import { fetchOlmAccount } from '../updaters/olm-account-updater.js'; import { updateThread } from '../updaters/thread-updaters.js'; import { viewerAcknowledgmentUpdater } from '../updaters/viewer-acknowledgment-updater.js'; import { isAuthoritativeKeyserver, thisKeyserverAdmin, } from '../user/identity.js'; +import { signUsingOlmAccount } from '../utils/olm-utils.js'; const adminMessages = [ 'welcome to Comm!', @@ -224,11 +224,10 @@ }; const stringifiedMessage = JSON.stringify(reservedUsernameMessage); - const [rustAPI, accountInfo] = await Promise.all([ + const [rustAPI, signature] = await Promise.all([ getRustAPI(), - fetchOlmAccount('content'), + signUsingOlmAccount(stringifiedMessage), ]); - const signature = accountInfo.account.sign(stringifiedMessage); await rustAPI.addReservedUsernames(stringifiedMessage, signature); } diff --git a/keyserver/src/cron/update-identity-reserved-usernames.js b/keyserver/src/cron/update-identity-reserved-usernames.js --- a/keyserver/src/cron/update-identity-reserved-usernames.js +++ b/keyserver/src/cron/update-identity-reserved-usernames.js @@ -5,13 +5,12 @@ import type { ReservedUsernameMessage } from 'lib/types/crypto-types.js'; import { fetchAllUserDetails } from '../fetchers/user-fetchers.js'; -import { fetchOlmAccount } from '../updaters/olm-account-updater.js'; +import { signUsingOlmAccount } from '../utils/olm-utils.js'; async function updateIdentityReservedUsernames(): Promise { - const [userDetails, rustAPI, accountInfo] = await Promise.all([ + const [userDetails, rustAPI] = await Promise.all([ fetchAllUserDetails(), getRustAPI(), - fetchOlmAccount('content'), ]); const issuedAt = new Date().toISOString(); const reservedUsernameMessage: ReservedUsernameMessage = { @@ -20,7 +19,7 @@ issuedAt, }; const stringifiedMessage = JSON.stringify(reservedUsernameMessage); - const signature = accountInfo.account.sign(stringifiedMessage); + const signature = await signUsingOlmAccount(stringifiedMessage); await rustAPI.addReservedUsernames(stringifiedMessage, signature); } diff --git a/keyserver/src/deleters/account-deleters.js b/keyserver/src/deleters/account-deleters.js --- a/keyserver/src/deleters/account-deleters.js +++ b/keyserver/src/deleters/account-deleters.js @@ -20,8 +20,8 @@ import { removeBlobHolders } from '../services/blob.js'; import { createNewAnonymousCookie } from '../session/cookies.js'; import type { Viewer, AnonymousViewerData } from '../session/viewer.js'; -import { fetchOlmAccount } from '../updaters/olm-account-updater.js'; import { blobHoldersFromUploadRows } from '../uploads/media-utils.js'; +import { signUsingOlmAccount } from '../utils/olm-utils.js'; async function deleteUploadsForUser(deletedUserID: string): Promise { try { @@ -129,9 +129,10 @@ const message = JSON.stringify(reservedUsernameMessage); const removeReservedUsernamePromise = (async () => { - const rustAPI = await getRustAPI(); - const accountInfo = await fetchOlmAccount('content'); - const signature = accountInfo.account.sign(message); + const [rustAPI, signature] = await Promise.all([ + getRustAPI(), + signUsingOlmAccount(message), + ]); await rustAPI.removeReservedUsername(message, signature); })(); if (viewer.isScriptViewer) { 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 @@ -133,10 +133,10 @@ updateUserSettings, updateUserAvatar, } from '../updaters/account-updaters.js'; -import { fetchOlmAccount } from '../updaters/olm-account-updater.js'; import { userSubscriptionUpdater } from '../updaters/user-subscription-updaters.js'; import { viewerAcknowledgmentUpdater } from '../updaters/viewer-acknowledgment-updater.js'; import { getInboundKeysForUserDevice } from '../utils/identity-utils.js'; +import { signUsingOlmAccount } from '../utils/olm-utils.js'; export const subscriptionUpdateRequestInputValidator: TInterface = tShape({ @@ -962,10 +962,7 @@ FROM users WHERE LCASE(username) = LCASE(${request.username}) `; - const [[userResult], accountInfo] = await Promise.all([ - dbQuery(userQuery), - fetchOlmAccount('content'), - ]); + const [userResult] = await dbQuery(userQuery); if (userResult.length === 0) { throw new ServerError('invalid_credentials'); @@ -993,7 +990,7 @@ issuedAt, }; const message = JSON.stringify(reservedUsernameMessage); - const signature = accountInfo.account.sign(message); + const signature = await signUsingOlmAccount(message); return { message, signature }; } diff --git a/keyserver/src/socket/tunnelbroker.js b/keyserver/src/socket/tunnelbroker.js --- a/keyserver/src/socket/tunnelbroker.js +++ b/keyserver/src/socket/tunnelbroker.js @@ -46,7 +46,6 @@ import { getMessageForException } from 'lib/utils/errors.js'; import sleep from 'lib/utils/sleep.js'; -import { fetchOlmAccount } from '../updaters/olm-account-updater.js'; import { clearIdentityInfo, fetchIdentityInfo, @@ -60,6 +59,7 @@ uploadNewOneTimeKeys, getNewDeviceKeyUpload, markPrekeysAsPublished, + signUsingOlmAccount, } from '../utils/olm-utils.js'; type TBConnectionInfo = { @@ -297,10 +297,9 @@ const messageToKeyserver = JSON.parse(payload); if (qrCodeAuthMessageValidator.is(messageToKeyserver)) { const request: QRCodeAuthMessage = messageToKeyserver; - const [qrCodeAuthMessage, rustAPI, accountInfo] = await Promise.all([ + const [qrCodeAuthMessage, rustAPI] = await Promise.all([ this.parseQRCodeAuthMessage(request), getRustAPI(), - fetchOlmAccount('content'), ]); if ( !qrCodeAuthMessage || @@ -320,7 +319,7 @@ payload: deviceKeyUpload.keyPayload, signature: deviceKeyUpload.keyPayloadSignature, }; - const nonceSignature = accountInfo.account.sign(nonce); + const nonceSignature = await signUsingOlmAccount(nonce); const identityInfo = await rustAPI.uploadSecondaryDeviceKeysAndLogIn( userID, diff --git a/keyserver/src/utils/olm-utils.js b/keyserver/src/utils/olm-utils.js --- a/keyserver/src/utils/olm-utils.js +++ b/keyserver/src/utils/olm-utils.js @@ -241,6 +241,20 @@ return result; } +async function signUsingOlmAccount(message: string): Promise { + const pickledAccount = await fetchPickledOlmAccount('content'); + + const signUsingAccount: (account: OlmAccount) => string = ( + account: OlmAccount, + ) => account.sign(message); + + const { result } = await unpickleAccountAndUseCallback( + pickledAccount, + signUsingAccount, + ); + return result; +} + function validateAndUploadAccountPrekeys( contentAccount: OlmAccount, notifAccount: OlmAccount, @@ -300,4 +314,5 @@ publishPrekeysToIdentity, getNewDeviceKeyUpload, markPrekeysAsPublished, + signUsingOlmAccount, };