Page MenuHomePhabricator

D13847.diff
No OneTemporary

D13847.diff

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
@@ -8,10 +8,9 @@
latestBackupInfoResponseValidator,
type LatestBackupInfo,
} from 'lib/types/backup-types.js';
-import type { SIWEBackupSecrets } from 'lib/types/siwe-types.js';
import { assertWithValidator } from 'lib/utils/validation-utils.js';
-import { fetchNativeKeychainCredentials } from '../account/native-credentials.js';
+import { useGetBackupSecretForLoggedInUser } from './use-get-backup-secret.js';
import { commCoreModule } from '../native-modules.js';
import { useSelector } from '../redux/redux-utils.js';
@@ -20,28 +19,13 @@
+retrieveLatestBackupInfo: () => Promise<LatestBackupInfo>,
};
-async function getBackupSecret(): Promise<string> {
- const nativeCredentials = await fetchNativeKeychainCredentials();
- if (!nativeCredentials) {
- throw new Error('Native credentials are missing');
- }
- return nativeCredentials.password;
-}
-
-async function getSIWEBackupSecrets(): Promise<SIWEBackupSecrets> {
- const siweBackupSecrets = await commCoreModule.getSIWEBackupSecrets();
- if (!siweBackupSecrets) {
- throw new Error('SIWE backup message and its signature are missing');
- }
- return siweBackupSecrets;
-}
-
function useClientBackup(): ClientBackup {
const currentUserID = useSelector(
state => state.currentUserInfo && state.currentUserInfo.id,
);
const currentUserInfo = useSelector(state => state.currentUserInfo);
const loggedIn = useSelector(isLoggedIn);
+ const getBackupSecret = useGetBackupSecretForLoggedInUser();
const uploadBackupProtocol = React.useCallback(async () => {
if (!loggedIn || !currentUserID) {
@@ -54,12 +38,18 @@
const backupSecret = await getBackupSecret();
await commCoreModule.createNewBackup(backupSecret);
} else {
- const { message, signature } = await getSIWEBackupSecrets();
- await commCoreModule.createNewSIWEBackup(signature, message);
+ const siweBackupSecrets = await commCoreModule.getSIWEBackupSecrets();
+ if (!siweBackupSecrets) {
+ throw new Error('SIWE backup message and its signature are missing');
+ }
+ await commCoreModule.createNewSIWEBackup(
+ siweBackupSecrets.signature,
+ siweBackupSecrets.message,
+ );
}
console.info('Backup uploaded.');
- }, [currentUserID, loggedIn, currentUserInfo]);
+ }, [loggedIn, currentUserID, currentUserInfo, getBackupSecret]);
const retrieveLatestBackupInfo = React.useCallback(async () => {
if (!loggedIn || !currentUserID || !currentUserInfo?.username) {
@@ -85,4 +75,4 @@
);
}
-export { getBackupSecret, useClientBackup };
+export { useClientBackup };
diff --git a/native/backup/use-get-backup-secret.js b/native/backup/use-get-backup-secret.js
new file mode 100644
--- /dev/null
+++ b/native/backup/use-get-backup-secret.js
@@ -0,0 +1,37 @@
+// @flow
+
+import * as React from 'react';
+
+import { isLoggedIn } from 'lib/selectors/user-selectors.js';
+import { accountHasPassword } from 'lib/shared/account-utils.js';
+
+import { fetchNativeKeychainCredentials } from '../account/native-credentials.js';
+import { commCoreModule } from '../native-modules.js';
+import { useSelector } from '../redux/redux-utils.js';
+
+function useGetBackupSecretForLoggedInUser(): () => Promise<string> {
+ const currentUserInfo = useSelector(state => state.currentUserInfo);
+ const loggedIn = useSelector(isLoggedIn);
+
+ return React.useCallback(async () => {
+ if (!loggedIn || !currentUserInfo) {
+ throw new Error('Attempt to get backup secret for not logged in user');
+ }
+
+ if (accountHasPassword(currentUserInfo)) {
+ const nativeCredentials = await fetchNativeKeychainCredentials();
+ if (!nativeCredentials) {
+ throw new Error('Native credentials are missing');
+ }
+ return nativeCredentials.password;
+ }
+
+ const siweBackupSecrets = await commCoreModule.getSIWEBackupSecrets();
+ if (!siweBackupSecrets) {
+ throw new Error('SIWE backup message and its signature are missing');
+ }
+ return siweBackupSecrets.signature;
+ }, [loggedIn, currentUserInfo]);
+}
+
+export { useGetBackupSecretForLoggedInUser };
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
@@ -10,10 +10,8 @@
import { useDispatch } from 'lib/utils/redux-utils.js';
import type { ProfileNavigationProp } from './profile.react.js';
-import {
- getBackupSecret,
- useClientBackup,
-} from '../backup/use-client-backup.js';
+import { useClientBackup } from '../backup/use-client-backup.js';
+import { useGetBackupSecretForLoggedInUser } from '../backup/use-get-backup-secret.js';
import Button from '../components/button.react.js';
import { commCoreModule } from '../native-modules.js';
import type { NavigationRoute } from '../navigation/route-names.js';
@@ -35,6 +33,7 @@
const colors = useColors();
const currentUserInfo = useSelector(state => state.currentUserInfo);
const navigation = useNavigation();
+ const getBackupSecret = useGetBackupSecretForLoggedInUser();
const isBackupEnabled = useSelector(
state => state.localSettings.isBackupEnabled,
@@ -71,7 +70,7 @@
console.error(message);
}
Alert.alert('Restore protocol result', message);
- }, [retrieveLatestBackupInfo]);
+ }, [getBackupSecret, retrieveLatestBackupInfo]);
const testLatestBackupInfo = React.useCallback(async () => {
let message;
diff --git a/native/profile/secondary-device-qr-code-scanner.react.js b/native/profile/secondary-device-qr-code-scanner.react.js
--- a/native/profile/secondary-device-qr-code-scanner.react.js
+++ b/native/profile/secondary-device-qr-code-scanner.react.js
@@ -44,7 +44,7 @@
import { assertWithValidator } from 'lib/utils/validation-utils.js';
import type { ProfileNavigationProp } from './profile.react.js';
-import { getBackupSecret } from '../backup/use-client-backup.js';
+import { useGetBackupSecretForLoggedInUser } from '../backup/use-get-backup-secret.js';
import TextInput from '../components/text-input.react.js';
import { commCoreModule } from '../native-modules.js';
import HeaderRightTextButton from '../navigation/header-right-text-button.react.js';
@@ -88,6 +88,7 @@
const foreignPeerDevices = useSelector(getForeignPeerDeviceIDs);
const ownPeerDevices = useSelector(getOwnPeerDevices);
const keyserverDeviceID = getKeyserverDeviceID(ownPeerDevices);
+ const getBackupSecret = useGetBackupSecretForLoggedInUser();
const { panelForegroundTertiaryLabel } = useColors();
@@ -187,6 +188,7 @@
broadcastDeviceListUpdates,
foreignPeerDevices,
getAndUpdateDeviceListsForUsers,
+ getBackupSecret,
tunnelbrokerContext,
goBack,
],

File Metadata

Mime Type
text/plain
Expires
Fri, Nov 1, 1:50 PM (17 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2398750
Default Alt Text
D13847.diff (6 KB)

Event Timeline