diff --git a/native/account/restore.js b/native/account/restore.js --- a/native/account/restore.js +++ b/native/account/restore.js @@ -57,8 +57,12 @@ await olmAPI.initializeCryptoAccount(); //2. Retrieve User Keys Backup and `userID` - const { userID, backupID } = - await retrieveLatestBackupInfo(userIdentifier); + const latestBackupInfo = await retrieveLatestBackupInfo(userIdentifier); + if (!latestBackupInfo) { + throw new Error('Backup not found'); + } + const { userID, backupID } = latestBackupInfo; + const { pickledAccount, pickleKey } = await getBackupUserKeys( userIdentifier, secret, diff --git a/native/backup/backup-handler.js b/native/backup/backup-handler.js --- a/native/backup/backup-handler.js +++ b/native/backup/backup-handler.js @@ -140,7 +140,12 @@ if (!userIdentifier) { throw new Error('Missing userIdentifier'); } - const { backupID } = await retrieveLatestBackupInfo(userIdentifier); + + const retrievedBackupInfo = await retrieveLatestBackupInfo(userIdentifier); + if (!retrievedBackupInfo) { + throw new Error('latestBackupInfo not retrieved'); + } + const { backupID } = retrievedBackupInfo; const backupSecret = await getBackupSecret(); const [ @@ -296,7 +301,7 @@ let fetchedBackupInfo = await retrieveLatestBackupInfo(userIdentifier); - while (fetchedBackupInfo.backupID !== backupID) { + while (fetchedBackupInfo?.backupID !== backupID) { retryCount++; if (retryCount >= 3) { throw new Error(`Backup ID mismatched ${retryCount} times`); diff --git a/native/backup/use-client-backup.js b/native/backup/use-client-backup.js --- a/native/backup/use-client-backup.js +++ b/native/backup/use-client-backup.js @@ -22,7 +22,7 @@ +createUserKeysBackup: () => Promise<string>, +retrieveLatestBackupInfo: ( userIdentifier: string, - ) => Promise<LatestBackupInfo>, + ) => Promise<?LatestBackupInfo>, +getBackupUserKeys: ( userIdentifier: string, backupSecret: string, @@ -48,12 +48,17 @@ async function retrieveLatestBackupInfo( userIdentifier: string, -): Promise<LatestBackupInfo> { +): Promise<?LatestBackupInfo> { const response = await commCoreModule.retrieveLatestBackupInfo(userIdentifier); + const parsedResponse = JSON.parse(response); + if (!parsedResponse) { + return null; + } + return assertWithValidator<LatestBackupInfo>( - JSON.parse(response), + parsedResponse, latestBackupInfoResponseValidator, ); } diff --git a/native/profile/backup-menu.react.js b/native/profile/backup-menu.react.js --- a/native/profile/backup-menu.react.js +++ b/native/profile/backup-menu.react.js @@ -79,8 +79,11 @@ const testLatestBackupInfo = React.useCallback(async () => { let message; try { - const { backupID, userID } = - await retrieveLatestBackupInfo(userIdentifier); + const retrievedInfo = await retrieveLatestBackupInfo(userIdentifier); + if (!retrievedInfo) { + throw new Error('No backup found for user'); + } + const { backupID, userID } = retrievedInfo; message = `Success!\n` + `Backup ID: ${backupID},\n` + @@ -104,8 +107,11 @@ // 5. Perform this test let message; try { - const { userID, backupID } = - await retrieveLatestBackupInfo(userIdentifier); + const retrievedInfo = await retrieveLatestBackupInfo(userIdentifier); + if (!retrievedInfo) { + throw new Error('No backup found for user'); + } + const { userID, backupID } = retrievedInfo; if (currentUserInfo?.id !== userID) { throw new Error('Backup returned different userID');