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 @@ -3,7 +3,6 @@ import * as React from 'react'; import { isLoggedIn } from 'lib/selectors/user-selectors.js'; -import { accountHasPassword } from 'lib/shared/account-utils.js'; import { commCoreModule } from '../native-modules.js'; import { useSelector } from '../redux/redux-utils.js'; @@ -15,15 +14,12 @@ ); const loggedIn = useSelector(isLoggedIn); const staffCanSee = useStaffCanSee(); - const isAccountWithPassword = useSelector(state => - accountHasPassword(state.currentUserInfo), - ); const isBackground = useSelector( state => state.lifecycleState === 'background', ); React.useEffect(() => { - if (!staffCanSee || !isAccountWithPassword) { + if (!staffCanSee) { return; } @@ -40,13 +36,7 @@ console.log('Error stopping backup handler:', err); } } - }, [ - isBackupEnabled, - staffCanSee, - loggedIn, - isAccountWithPassword, - isBackground, - ]); + }, [isBackupEnabled, staffCanSee, loggedIn, isBackground]); return null; } 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 @@ -3,6 +3,8 @@ import * as React from 'react'; import { isLoggedIn } from 'lib/selectors/user-selectors.js'; +import { accountHasPassword } from 'lib/shared/account-utils.js'; +import type { SIWEBackupSecrets } from 'lib/types/siwe-types.js'; import { getContentSigningKey } from 'lib/utils/crypto-utils.js'; import { fetchNativeKeychainCredentials } from '../account/native-credentials.js'; @@ -22,11 +24,20 @@ return nativeCredentials.password; } +async function getSIWEBackupSecrets(): Promise { + const siweBackupSecrets = await commCoreModule.getSIWEBackupSecrets(); + if (!siweBackupSecrets) { + throw new Error('SIWE backup message and its signature are missing'); + } + return siweBackupSecrets; +} + function useClientBackup(): ClientBackup { const accessToken = useSelector(state => state.commServicesAccessToken); const currentUserID = useSelector( state => state.currentUserInfo && state.currentUserInfo.id, ); + const currentUserInfo = useSelector(state => state.currentUserInfo); const loggedIn = useSelector(isLoggedIn); const setMockCommServicesAuthMetadata = React.useCallback(async () => { @@ -50,11 +61,22 @@ console.info('Start uploading backup...'); await setMockCommServicesAuthMetadata(); - const backupSecret = await getBackupSecret(); - await commCoreModule.createNewBackup(backupSecret); + + if (accountHasPassword(currentUserInfo)) { + const backupSecret = await getBackupSecret(); + await commCoreModule.createNewBackup(backupSecret); + } else { + const { message, signature } = await getSIWEBackupSecrets(); + await commCoreModule.createNewSIWEBackup(signature, message); + } console.info('Backup uploaded.'); - }, [currentUserID, loggedIn, setMockCommServicesAuthMetadata]); + }, [ + currentUserID, + loggedIn, + setMockCommServicesAuthMetadata, + currentUserInfo, + ]); const restoreBackupProtocol = React.useCallback(async () => { if (!loggedIn || !currentUserID) { diff --git a/native/profile/profile-screen.react.js b/native/profile/profile-screen.react.js --- a/native/profile/profile-screen.react.js +++ b/native/profile/profile-screen.react.js @@ -174,7 +174,7 @@ defaultNotifications, keyserverSelection, tunnelbrokerMenu; - const { staffCanSee, isAccountWithPassword } = this.props; + const { staffCanSee } = this.props; if (staffCanSee) { developerTools = ( @@ -203,7 +203,7 @@ } let backupMenu; - if (staffCanSee && isAccountWithPassword) { + if (staffCanSee) { backupMenu = ( );