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 @@ -28,13 +28,10 @@ import { usingRestoreFlow } from 'lib/utils/services-utils.js'; import { useClientBackup } from './use-client-backup.js'; -import { useGetBackupSecretForLoggedInUser } from './use-get-backup-secret.js'; import { commCoreModule } from '../native-modules.js'; import { useSelector } from '../redux/redux-utils.js'; import { useStaffCanSee } from '../utils/staff-utils.js'; -const millisecondsPerDay = 24 * 60 * 60 * 1000; - async function reorderAndSignDeviceList( thisDeviceID: string, currentDeviceList: RawDeviceList, @@ -73,9 +70,7 @@ ); const userIdentifier = useSelector(state => state.currentUserInfo?.username); const dispatchActionPromise = useDispatchActionPromise(); - const { createUserKeysBackup, retrieveLatestBackupInfo, getBackupUserKeys } = - useClientBackup(); - const getBackupSecret = useGetBackupSecretForLoggedInUser(); + const { createUserKeysBackup, retrieveLatestBackupInfo } = useClientBackup(); const backupUploadInProgress = React.useRef(false); const startingBackupHandlerInProgress = React.useRef(false); const [handlerStarted, setHandlerStarted] = React.useState(false); @@ -133,62 +128,6 @@ staffCanSee, ]); - const testUserKeysRestore = React.useCallback(async () => { - if (!latestBackupInfo?.backupID) { - return; - } - if (!userIdentifier) { - throw new Error('Missing userIdentifier'); - } - - const retrievedBackupInfo = await retrieveLatestBackupInfo(userIdentifier); - if (!retrievedBackupInfo) { - throw new Error('latestBackupInfo not retrieved'); - } - const { backupID } = retrievedBackupInfo; - - const backupSecret = await getBackupSecret(); - const [ - { - backupDataKey: backupDataKeyFromBackup, - backupLogDataKey: backupLogDataKeyFromBackup, - }, - { - backupID: localBackupID, - backupDataKey: localBackupDataKey, - backupLogDataKey: localBackupLogDataKey, - }, - ] = await Promise.all([ - getBackupUserKeys(userIdentifier, backupSecret, backupID), - commCoreModule.getQRAuthBackupData(), - ]); - - const backupIDCheck = - latestBackupInfo.backupID === backupID && backupID === localBackupID; - const keysCheck = - backupDataKeyFromBackup === localBackupDataKey && - backupLogDataKeyFromBackup === localBackupLogDataKey; - - if (!backupIDCheck || !keysCheck) { - throw new Error( - '\n' + - `backupID: ${backupID}\n` + - `latestBackupInfo.backupID: ${latestBackupInfo.backupID}\n` + - `localBackupID: ${localBackupID}\n` + - `backupDataKeyFromBackup: ${backupDataKeyFromBackup}\n` + - `backupLogDataKeyFromBackup: ${backupLogDataKeyFromBackup}\n` + - `localBackupDataKey: ${localBackupDataKey}\n` + - `localBackupLogDataKey: ${localBackupLogDataKey}\n`, - ); - } - }, [ - getBackupSecret, - getBackupUserKeys, - latestBackupInfo?.backupID, - retrieveLatestBackupInfo, - userIdentifier, - ]); - React.useEffect(() => { if ( !staffCanSee || @@ -233,22 +172,6 @@ return; } - if (isPrimaryDevice && latestBackupInfo) { - const timestamp = latestBackupInfo.timestamp; - if (timestamp >= Date.now() - millisecondsPerDay) { - backupUploadInProgress.current = false; - return; - } - - try { - await testUserKeysRestore(); - } catch (err) { - const message = getMessageForException(err) ?? 'unknown error'; - showAlertToStaff('Error restoring User Keys backup', message); - console.log('Error restoring User Keys backup:', message); - } - } - const shouldDoMigration = usingRestoreFlow && (!latestBackupInfo || !deviceListIsSigned); if (!shouldDoMigration && !isPrimaryDevice) { @@ -352,7 +275,6 @@ retrieveLatestBackupInfo, showAlertToStaff, staffCanSee, - testUserKeysRestore, userIdentifier, ]); 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 @@ -37,6 +37,9 @@ const isBackupEnabled = useSelector( state => state.localSettings.isBackupEnabled, ); + const latestBackupInfo = useSelector( + state => state.backupStore.latestBackupInfo, + ); const identityContext = React.useContext(IdentityClientContext); invariant(identityContext, 'Identity context should be set'); @@ -196,6 +199,68 @@ getBackupUserKeys, ]); + const testUserKeysRestore = React.useCallback(async () => { + let message; + try { + const retrievedBackupInfo = + await retrieveLatestBackupInfo(userIdentifier); + if (!retrievedBackupInfo) { + throw new Error('latestBackupInfo not retrieved'); + } + const { backupID } = retrievedBackupInfo; + + const backupSecret = await getBackupSecret(); + const [ + { + backupDataKey: backupDataKeyFromBackup, + backupLogDataKey: backupLogDataKeyFromBackup, + }, + { + backupID: localBackupID, + backupDataKey: localBackupDataKey, + backupLogDataKey: localBackupLogDataKey, + }, + ] = await Promise.all([ + getBackupUserKeys(userIdentifier, backupSecret, backupID), + commCoreModule.getQRAuthBackupData(), + ]); + + const backupIDCheck = + latestBackupInfo?.backupID === backupID && backupID === localBackupID; + const keysCheck = + backupDataKeyFromBackup === localBackupDataKey && + backupLogDataKeyFromBackup === localBackupLogDataKey; + + if (!backupIDCheck || !keysCheck) { + throw new Error( + '\n' + + `backupID: ${backupID}\n` + + `latestBackupInfo.backupID: ${ + latestBackupInfo?.backupID ?? 'undefined' + }\n` + + `localBackupID: ${localBackupID}\n` + + `backupDataKeyFromBackup: ${backupDataKeyFromBackup}\n` + + `backupLogDataKeyFromBackup: ${backupLogDataKeyFromBackup}\n` + + `localBackupDataKey: ${localBackupDataKey}\n` + + `localBackupLogDataKey: ${localBackupLogDataKey}\n`, + ); + } + message = 'Success!'; + } catch (e) { + message = `Error restoring User Keys backup: ${String( + getMessageForException(e), + )}`; + console.error(message); + } + Alert.alert('Restoring User Keys result', message); + }, [ + getBackupSecret, + getBackupUserKeys, + latestBackupInfo?.backupID, + retrieveLatestBackupInfo, + userIdentifier, + ]); + const onBackupToggled = React.useCallback( (value: boolean) => { dispatch({ @@ -268,6 +333,17 @@ + + + ); }