Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F32558231
D13371.1767263592.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
D13371.1767263592.diff
View Options
diff --git a/lib/components/peer-olm-session-creator-provider.react.js b/lib/components/peer-olm-session-creator-provider.react.js
--- a/lib/components/peer-olm-session-creator-provider.react.js
+++ b/lib/components/peer-olm-session-creator-provider.react.js
@@ -6,7 +6,7 @@
import { IdentityClientContext } from '../shared/identity-client-context.js';
import { useTunnelbroker } from '../tunnelbroker/tunnelbroker-context.js';
import {
- createOlmSessionWithPeer,
+ createOlmSessionsWithUser,
type SessionCreationOptions,
} from '../utils/crypto-utils.js';
@@ -50,13 +50,12 @@
const promise = (async () => {
const authMetadata = await getAuthMetadata();
- await createOlmSessionWithPeer(
+ await createOlmSessionsWithUser(
authMetadata,
identityClient,
sendMessageToDevice,
userID,
- deviceID,
- sessionCreationOptions,
+ [{ deviceID, sessionCreationOptions }],
);
runningPromises.current[userID][deviceID] = null;
diff --git a/lib/utils/crypto-utils.js b/lib/utils/crypto-utils.js
--- a/lib/utils/crypto-utils.js
+++ b/lib/utils/crypto-utils.js
@@ -4,6 +4,7 @@
import { type TInterface } from 'tcomb';
import { getConfig } from './config.js';
+import { getMessageForException } from './errors.js';
import { primaryIdentityPublicKeyRegex } from './siwe-utils.js';
import { tRegex, tShape } from './validation-utils.js';
import type { AuthMetadata } from '../shared/identity-client-context.js';
@@ -111,34 +112,19 @@
+overwriteNotifSession?: boolean,
+overwriteContentSession?: boolean,
};
-async function createOlmSessionWithPeer(
+export type DeviceSessionCreationRequest = {
+ +deviceID: string,
+ +sessionCreationOptions?: SessionCreationOptions,
+};
+async function createOlmSessionsWithUser(
authMetadata: AuthMetadata,
identityClient: IdentityServiceClient,
sendMessage: (message: TunnelbrokerClientMessageToDevice) => Promise<void>,
userID: string,
- deviceID: string,
- options?: SessionCreationOptions,
+ devices: $ReadOnlyArray<DeviceSessionCreationRequest>,
): Promise<void> {
const { olmAPI } = getConfig();
await olmAPI.initializeCryptoAccount();
- const [hasContentSession, hasNotifsSession] = await Promise.all([
- (async () => {
- if (options?.overwriteContentSession) {
- return false;
- }
- return await olmAPI.isContentSessionInitialized(deviceID);
- })(),
- (async () => {
- if (options?.overwriteNotifSession) {
- return false;
- }
- return await olmAPI.isDeviceNotificationsSessionInitialized(deviceID);
- })(),
- ]);
-
- if (hasContentSession && hasNotifsSession) {
- return;
- }
const {
userID: authUserID,
@@ -149,67 +135,123 @@
throw new Error('CommServicesAuthMetadata is missing');
}
- const keysResponse = await identityClient.getOutboundKeysForUser(userID);
- const deviceKeysResponse = keysResponse.find(
- keys => keys.deviceID === deviceID,
+ const filteredDevices: $ReadOnlyArray<{
+ +deviceID: string,
+ +hasContentSession: boolean,
+ +hasNotifsSession: boolean,
+ }> = await Promise.all(
+ devices.map(request =>
+ (async () => {
+ const [hasContentSession, hasNotifsSession] = await Promise.all([
+ (async () => {
+ if (request.sessionCreationOptions?.overwriteContentSession) {
+ return false;
+ }
+ return await olmAPI.isContentSessionInitialized(request.deviceID);
+ })(),
+ (async () => {
+ if (request.sessionCreationOptions?.overwriteNotifSession) {
+ return false;
+ }
+ return await olmAPI.isDeviceNotificationsSessionInitialized(
+ request.deviceID,
+ );
+ })(),
+ ]);
+ return {
+ deviceID: request.deviceID,
+ hasContentSession,
+ hasNotifsSession,
+ };
+ })(),
+ ),
);
- if (!deviceKeysResponse || !deviceKeysResponse.keys) {
- throw new Error(`Keys missing for device ${deviceID}`);
- }
- const { keys } = deviceKeysResponse;
-
- const { primaryIdentityPublicKeys, notificationIdentityPublicKeys } =
- keys.identityKeysBlob;
- const recipientDeviceID = primaryIdentityPublicKeys.ed25519;
-
- if (hasContentSession) {
- await olmAPI.notificationsOutboundSessionCreator(
- recipientDeviceID,
- notificationIdentityPublicKeys,
- keys.notifInitializationInfo,
- );
+
+ const sessionCreationNeeded = filteredDevices.some(
+ device => !device.hasContentSession || !device.hasNotifsSession,
+ );
+ if (!sessionCreationNeeded) {
return;
}
- let outboundSessionCreationResult: OutboundSessionCreationResult;
- if (hasNotifsSession) {
- outboundSessionCreationResult = await olmAPI.contentOutboundSessionCreator(
- primaryIdentityPublicKeys,
- keys.contentInitializationInfo,
- );
- } else {
- [outboundSessionCreationResult] = await Promise.all([
- await olmAPI.contentOutboundSessionCreator(
- primaryIdentityPublicKeys,
- keys.contentInitializationInfo,
- ),
- olmAPI.notificationsOutboundSessionCreator(
- recipientDeviceID,
- notificationIdentityPublicKeys,
- keys.notifInitializationInfo,
- ),
- ]);
- }
+ const keysResponse = await identityClient.getOutboundKeysForUser(userID);
+
+ const devicePromises = filteredDevices.map(async sessionRequest => {
+ try {
+ const { deviceID, hasContentSession, hasNotifsSession } = sessionRequest;
+ const deviceKeysResponse = keysResponse.find(
+ keys => keys.deviceID === deviceID,
+ );
+
+ if (!deviceKeysResponse || !deviceKeysResponse.keys) {
+ console.log(`Keys missing for device ${deviceID}`);
+ return;
+ }
+ const { keys } = deviceKeysResponse;
- const { sessionVersion, encryptedData } = outboundSessionCreationResult;
-
- const sessionCreationMessage: OutboundSessionCreation = {
- type: peerToPeerMessageTypes.OUTBOUND_SESSION_CREATION,
- senderInfo: {
- userID: authUserID,
- deviceID: authDeviceID,
- },
- encryptedData,
- sessionVersion,
- };
-
- await sendMessage({
- deviceID: recipientDeviceID,
- payload: JSON.stringify(sessionCreationMessage),
+ const { primaryIdentityPublicKeys, notificationIdentityPublicKeys } =
+ keys.identityKeysBlob;
+ const recipientDeviceID = primaryIdentityPublicKeys.ed25519;
+
+ if (hasContentSession) {
+ await olmAPI.notificationsOutboundSessionCreator(
+ recipientDeviceID,
+ notificationIdentityPublicKeys,
+ keys.notifInitializationInfo,
+ );
+ return;
+ }
+
+ let outboundSessionCreationResult: OutboundSessionCreationResult;
+ if (hasNotifsSession) {
+ outboundSessionCreationResult =
+ await olmAPI.contentOutboundSessionCreator(
+ primaryIdentityPublicKeys,
+ keys.contentInitializationInfo,
+ );
+ } else {
+ [outboundSessionCreationResult] = await Promise.all([
+ await olmAPI.contentOutboundSessionCreator(
+ primaryIdentityPublicKeys,
+ keys.contentInitializationInfo,
+ ),
+ olmAPI.notificationsOutboundSessionCreator(
+ recipientDeviceID,
+ notificationIdentityPublicKeys,
+ keys.notifInitializationInfo,
+ ),
+ ]);
+ }
+
+ const { sessionVersion, encryptedData } = outboundSessionCreationResult;
+
+ const sessionCreationMessage: OutboundSessionCreation = {
+ type: peerToPeerMessageTypes.OUTBOUND_SESSION_CREATION,
+ senderInfo: {
+ userID: authUserID,
+ deviceID: authDeviceID,
+ },
+ encryptedData,
+ sessionVersion,
+ };
+
+ await sendMessage({
+ deviceID: recipientDeviceID,
+ payload: JSON.stringify(sessionCreationMessage),
+ });
+ console.log(
+ `Request to create a session with device ${recipientDeviceID} sent.`,
+ );
+ } catch (e) {
+ console.error(
+ `Error creating session with ${sessionRequest.deviceID}: ${
+ getMessageForException(e) ?? 'unknown error'
+ }`,
+ e,
+ );
+ }
});
- console.log(
- `Request to create a session with device ${recipientDeviceID} sent.`,
- );
+ await Promise.all(devicePromises);
}
export {
@@ -217,5 +259,5 @@
identityKeysBlobValidator,
getContentSigningKey,
createOlmSessionsWithOwnDevices,
- createOlmSessionWithPeer,
+ createOlmSessionsWithUser,
};
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Jan 1, 10:33 AM (10 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5875805
Default Alt Text
D13371.1767263592.diff (8 KB)
Attached To
Mode
D13371: [lib] refactor `createOlmSessionWithPeer` -> `createOlmSessionsWithUser`
Attached
Detach File
Event Timeline
Log In to Comment