diff --git a/native/account/restore.js b/native/account/restore.js --- a/native/account/restore.js +++ b/native/account/restore.js @@ -2,7 +2,6 @@ import invariant from 'invariant'; import * as React from 'react'; -import { Platform } from 'react-native'; import { setClientDBStoreActionType } from 'lib/actions/client-db-store-actions.js'; import { @@ -19,7 +18,6 @@ import { type IdentityAuthResult, type SignedDeviceList, - platformToIdentityDeviceType, } from 'lib/types/identity-service-types.js'; import type { SignedMessage } from 'lib/types/siwe-types.js'; import { getConfig } from 'lib/utils/config.js'; @@ -32,8 +30,8 @@ import { setNativeCredentials } from './native-credentials.js'; import { useClientBackup } from '../backup/use-client-backup.js'; +import { rawGetDeviceListsForUsers } from '../identity-service/identity-service-context-provider.react.js'; import { commCoreModule } from '../native-modules.js'; -import { codeVersion, persistConfig } from '../redux/persist.js'; function useRestoreProtocol(): ( // username or wallet address @@ -125,20 +123,24 @@ ); } - //7. Return the result - const platformDetails = { - deviceType: platformToIdentityDeviceType[Platform.OS], - codeVersion, - stateVersion: persistConfig.version, + //7. Get up-to-date platform details from Identity + const authMetadata = { + userID, + deviceID: primaryDeviceID, + accessToken: result.accessToken, }; + const { usersDevicesPlatformDetails } = await rawGetDeviceListsForUsers( + authMetadata, + [userID], + ); + + //8. Return the result return { ...result, preRequestUserState, deviceLists: { [userID]: initialDeviceList }, usersPlatformDetails: { - [userID]: { - [primaryDeviceID]: platformDetails, - }, + [userID]: usersDevicesPlatformDetails[userID], }, }; }, diff --git a/native/identity-service/identity-service-context-provider.react.js b/native/identity-service/identity-service-context-provider.react.js --- a/native/identity-service/identity-service-context-provider.react.js +++ b/native/identity-service/identity-service-context-provider.react.js @@ -6,6 +6,7 @@ import { getOneTimeKeyValues } from 'lib/shared/crypto-utils.js'; import { createAndSignSingletonDeviceList } from 'lib/shared/device-list-utils.js'; import { IdentityClientContext } from 'lib/shared/identity-client-context.js'; +import type { AuthMetadata } from 'lib/shared/identity-client-context.js'; import { type IdentityKeysBlob, identityKeysBlobValidator, @@ -31,6 +32,7 @@ userIdentitiesResponseValidator, type UsersDevicesPlatformDetails, peersDeviceListsValidator, + type PeersDeviceLists, } from 'lib/types/identity-service-types.js'; import type { SignedMessage } from 'lib/types/siwe-types.js'; import { getConfig } from 'lib/utils/config.js'; @@ -660,39 +662,10 @@ ); }, getDeviceListsForUsers: async (userIDs: $ReadOnlyArray) => { - const { - deviceID: authDeviceID, - userID: authUserID, - accessToken: token, - } = await getAuthMetadata(); - const result = await authVerifiedEndpoint( - commRustModule.getDeviceListsForUsers( - authUserID, - authDeviceID, - token, - userIDs, - ), + const authMetadata = await getAuthMetadata(); + return await authVerifiedEndpoint( + rawGetDeviceListsForUsers(authMetadata, userIDs), ); - - const rawPayloads: { - +usersDeviceLists: { +[userID: string]: string }, - +usersDevicesPlatformDetails: UsersDevicesPlatformDetails, - } = JSON.parse(result); - - let usersDeviceLists: UsersSignedDeviceLists = {}; - for (const userID in rawPayloads.usersDeviceLists) { - usersDeviceLists = { - ...usersDeviceLists, - [userID]: JSON.parse(rawPayloads.usersDeviceLists[userID]), - }; - } - - const peersDeviceLists = { - usersSignedDeviceLists: usersDeviceLists, - usersDevicesPlatformDetails: rawPayloads.usersDevicesPlatformDetails, - }; - - return assertWithValidator(peersDeviceLists, peersDeviceListsValidator); }, updateDeviceList: async (newDeviceList: SignedDeviceList) => { const { @@ -807,4 +780,49 @@ ); } +// Unfortunately, Required +// doesn't work for `prop: ?string` +type RequiredAuthMetadata = $ObjMap< + AuthMetadata, + (prop: T) => $NonMaybeType, +>; +async function rawGetDeviceListsForUsers( + authMetadata: RequiredAuthMetadata, + userIDs: $ReadOnlyArray, +): Promise { + const { + deviceID: authDeviceID, + userID: authUserID, + accessToken: token, + } = authMetadata; + const result = await commRustModule.getDeviceListsForUsers( + authUserID, + authDeviceID, + token, + userIDs, + ); + + const rawPayloads: { + +usersDeviceLists: { +[userID: string]: string }, + +usersDevicesPlatformDetails: UsersDevicesPlatformDetails, + } = JSON.parse(result); + + let usersDeviceLists: UsersSignedDeviceLists = {}; + for (const userID in rawPayloads.usersDeviceLists) { + usersDeviceLists = { + ...usersDeviceLists, + [userID]: JSON.parse(rawPayloads.usersDeviceLists[userID]), + }; + } + + const peersDeviceLists = { + usersSignedDeviceLists: usersDeviceLists, + usersDevicesPlatformDetails: rawPayloads.usersDevicesPlatformDetails, + }; + + return assertWithValidator(peersDeviceLists, peersDeviceListsValidator); +} + +export { rawGetDeviceListsForUsers }; + export default IdentityServiceContextProvider;