Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F3509606
D12884.id43277.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
5 KB
Referenced Files
None
Subscribers
None
D12884.id43277.diff
View Options
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
@@ -11,14 +11,25 @@
useBroadcastDeviceListUpdates,
useGetAndUpdateDeviceListsForUsers,
} from 'lib/hooks/peer-list-hooks.js';
-import { getForeignPeerDeviceIDs } from 'lib/selectors/user-selectors.js';
-import { addDeviceToDeviceList } from 'lib/shared/device-list-utils.js';
+import {
+ getForeignPeerDeviceIDs,
+ getOwnPeerDevices,
+ getKeyserverDeviceID,
+} from 'lib/selectors/user-selectors.js';
+import {
+ addDeviceToDeviceList,
+ replaceDeviceInDeviceList,
+} from 'lib/shared/device-list-utils.js';
import { IdentityClientContext } from 'lib/shared/identity-client-context.js';
import { useTunnelbroker } from 'lib/tunnelbroker/tunnelbroker-context.js';
import {
backupKeysValidator,
type BackupKeys,
} from 'lib/types/backup-types.js';
+import {
+ identityDeviceTypes,
+ type IdentityDeviceType,
+} from 'lib/types/identity-service-types.js';
import {
tunnelbrokerToDeviceMessageTypes,
type TunnelbrokerToDeviceMessage,
@@ -69,11 +80,14 @@
const aes256Key = React.useRef<?string>(null);
const secondaryDeviceID = React.useRef<?string>(null);
+ const secondaryDeviceType = React.useRef<?IdentityDeviceType>(null);
const broadcastDeviceListUpdates = useBroadcastDeviceListUpdates();
const getAndUpdateDeviceListsForUsers = useGetAndUpdateDeviceListsForUsers();
const foreignPeerDevices = useSelector(getForeignPeerDeviceIDs);
+ const ownPeerDevices = useSelector(getOwnPeerDevices);
+ const keyserverDeviceID = getKeyserverDeviceID(ownPeerDevices);
const { panelForegroundTertiaryLabel } = useColors();
@@ -215,20 +229,74 @@
if (!encryptionKey || !targetDeviceID) {
throw new Error('missing tunnelbroker message data');
}
- await addDeviceToDeviceList(
- identityContext.identityClient,
- userID,
- targetDeviceID,
+
+ const deviceType = secondaryDeviceType.current;
+
+ const sendDeviceListUpdateSuccessMessage = async () => {
+ const message = await composeTunnelbrokerQRAuthMessage(encryptionKey, {
+ type: qrCodeAuthMessageTypes.DEVICE_LIST_UPDATE_SUCCESS,
+ userID,
+ primaryDeviceID,
+ });
+ await tunnelbrokerContext.sendMessageToDevice({
+ deviceID: targetDeviceID,
+ payload: JSON.stringify(message),
+ });
+ };
+
+ const handleReplaceDevice = async () => {
+ try {
+ if (!keyserverDeviceID) {
+ throw new Error('missing ID for keyserver device to be replaced');
+ }
+ await replaceDeviceInDeviceList(
+ identityContext.identityClient,
+ userID,
+ keyserverDeviceID,
+ targetDeviceID,
+ );
+ await sendDeviceListUpdateSuccessMessage();
+ } catch (err) {
+ console.log('Device replacement or update error:', err);
+ Alert.alert(
+ 'Adding device failed',
+ 'Failed to update the device list',
+ [{ text: 'OK' }],
+ );
+ goBack();
+ }
+ };
+
+ if (
+ deviceType !== identityDeviceTypes.KEYSERVER ||
+ !keyserverDeviceID ||
+ keyserverDeviceID === targetDeviceID
+ ) {
+ await addDeviceToDeviceList(
+ identityContext.identityClient,
+ userID,
+ targetDeviceID,
+ );
+ await sendDeviceListUpdateSuccessMessage();
+ return;
+ }
+
+ Alert.alert(
+ 'Existing keyserver detected',
+ 'Do you want to replace your existing keyserver with this new one?',
+ [
+ {
+ text: 'Replace',
+ onPress: handleReplaceDevice,
+ style: 'destructive',
+ },
+ {
+ text: 'No',
+ onPress: goBack,
+ style: 'cancel',
+ },
+ ],
);
- const message = await composeTunnelbrokerQRAuthMessage(encryptionKey, {
- type: qrCodeAuthMessageTypes.DEVICE_LIST_UPDATE_SUCCESS,
- userID,
- primaryDeviceID,
- });
- await tunnelbrokerContext.sendMessageToDevice({
- deviceID: targetDeviceID,
- payload: JSON.stringify(message),
- });
} catch (err) {
console.log('Primary device error:', err);
Alert.alert('Adding device failed', 'Failed to update the device list', [
@@ -236,7 +304,7 @@
]);
goBack();
}
- }, [goBack, identityContext, tunnelbrokerContext]);
+ }, [goBack, identityContext, keyserverDeviceID, tunnelbrokerContext]);
const onPressSave = React.useCallback(async () => {
if (!urlInput) {
@@ -260,8 +328,10 @@
const { aes256, ed25519 } = keys;
aes256Key.current = aes256;
secondaryDeviceID.current = ed25519;
+ secondaryDeviceType.current = parsedData.data.deviceType;
} catch (err) {
console.log('Failed to decode URI component:', err);
+ return;
}
await processDeviceListUpdate();
}, [processDeviceListUpdate, urlInput]);
@@ -307,8 +377,10 @@
const { aes256, ed25519 } = keys;
aes256Key.current = aes256;
secondaryDeviceID.current = ed25519;
+ secondaryDeviceType.current = parsedData.data.deviceType;
} catch (err) {
console.log('Failed to decode URI component:', err);
+ return;
}
await processDeviceListUpdate();
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Dec 22, 6:40 AM (20 m, 30 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2690493
Default Alt Text
D12884.id43277.diff (5 KB)
Attached To
Mode
D12884: [native] replace keyserver using qr code auth
Attached
Detach File
Event Timeline
Log In to Comment