Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F3150909
D12452.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
12 KB
Referenced Files
None
Subscribers
None
D12452.diff
View Options
diff --git a/native/qr-code/qr-code-screen.react.js b/native/qr-code/qr-code-screen.react.js
--- a/native/qr-code/qr-code-screen.react.js
+++ b/native/qr-code/qr-code-screen.react.js
@@ -4,23 +4,12 @@
import { View, Text } from 'react-native';
import QRCode from 'react-native-qrcode-svg';
+import { useQRAuthContext } from 'lib/components/qr-auth-provider.react.js';
import { qrCodeLinkURL } from 'lib/facts/links.js';
-import { useSecondaryDeviceLogIn } from 'lib/hooks/login-hooks.js';
-import { useQRAuth } from 'lib/hooks/qr-auth.js';
-import { uintArrayToHexString } from 'lib/media/data-utils.js';
-import { useTunnelbroker } from 'lib/tunnelbroker/tunnelbroker-context.js';
-import { getContentSigningKey } from 'lib/utils/crypto-utils.js';
import type { QRCodeSignInNavigationProp } from './qr-code-sign-in-navigator.react.js';
-import {
- composeTunnelbrokerQRAuthMessage,
- handleSecondaryDeviceRegistrationError,
- parseTunnelbrokerQRAuthMessage,
- performBackupRestore,
-} from './qr-code-utils.js';
import type { NavigationRoute } from '../navigation/route-names.js';
import { useStyles } from '../themes/colors.js';
-import * as AES from '../utils/aes-crypto-module.js';
type QRCodeScreenProps = {
+navigation: QRCodeSignInNavigationProp<'QRCodeScreen'>,
@@ -29,37 +18,7 @@
// eslint-disable-next-line no-unused-vars
function QRCodeScreen(props: QRCodeScreenProps): React.Node {
- const [qrData, setQRData] =
- React.useState<?{ +deviceID: string, +aesKey: string }>();
-
- const { setUnauthorizedDeviceID } = useTunnelbroker();
- const generateQRCode = React.useCallback(async () => {
- try {
- const [ed25519, rawAESKey] = await Promise.all([
- getContentSigningKey(),
- AES.generateKey(),
- ]);
- const aesKeyAsHexString: string = uintArrayToHexString(rawAESKey);
-
- setUnauthorizedDeviceID(ed25519);
- setQRData({ deviceID: ed25519, aesKey: aesKeyAsHexString });
- } catch (err) {
- console.error('Failed to generate QR Code:', err);
- }
- }, [setUnauthorizedDeviceID]);
-
- const logInSecondaryDevice = useSecondaryDeviceLogIn();
- const performRegistration = React.useCallback(
- async (userID: string) => {
- try {
- await logInSecondaryDevice(userID);
- } catch (err) {
- handleSecondaryDeviceRegistrationError(err);
- void generateQRCode();
- }
- },
- [logInSecondaryDevice, generateQRCode],
- );
+ const { qrData, generateQRCode } = useQRAuthContext();
React.useEffect(() => {
void generateQRCode();
@@ -70,19 +29,6 @@
[qrData],
);
- const qrAuthInput = React.useMemo(
- () => ({
- secondaryDeviceID: qrData?.deviceID,
- aesKey: qrData?.aesKey,
- performSecondaryDeviceRegistration: performRegistration,
- composeMessage: composeTunnelbrokerQRAuthMessage,
- processMessage: parseTunnelbrokerQRAuthMessage,
- performBackupRestore,
- }),
- [qrData, performRegistration],
- );
- useQRAuth(qrAuthInput);
-
const styles = useStyles(unboundStyles);
return (
<View style={styles.container}>
diff --git a/native/qr-code/qr-code-utils.js b/native/qr-code/qr-code-utils.js
--- a/native/qr-code/qr-code-utils.js
+++ b/native/qr-code/qr-code-utils.js
@@ -89,9 +89,14 @@
);
}
+function generateQRAuthKey(): Promise<Uint8Array> {
+ return Promise.resolve(AES.generateKey());
+}
+
export {
composeTunnelbrokerQRAuthMessage,
parseTunnelbrokerQRAuthMessage,
handleSecondaryDeviceRegistrationError,
performBackupRestore,
+ generateQRAuthKey,
};
diff --git a/native/root.react.js b/native/root.react.js
--- a/native/root.react.js
+++ b/native/root.react.js
@@ -32,6 +32,7 @@
import { NeynarClientProvider } from 'lib/components/neynar-client-provider.react.js';
import PlatformDetailsSynchronizer from 'lib/components/platform-details-synchronizer.react.js';
import PrekeysHandler from 'lib/components/prekeys-handler.react.js';
+import { QRAuthProvider } from 'lib/components/qr-auth-provider.react.js';
import { StaffContextProvider } from 'lib/components/staff-provider.react.js';
import { DBOpsHandler } from 'lib/handlers/db-ops-handler.react.js';
import { UserInfosHandler } from 'lib/handlers/user-infos-handler.react.js';
@@ -76,6 +77,13 @@
import OrientationHandler from './navigation/orientation-handler.react.js';
import { navStateAsyncStorageKey } from './navigation/persistance.js';
import RootNavigator from './navigation/root-navigator.react.js';
+import {
+ composeTunnelbrokerQRAuthMessage,
+ handleSecondaryDeviceRegistrationError,
+ parseTunnelbrokerQRAuthMessage,
+ performBackupRestore,
+ generateQRAuthKey,
+} from './qr-code/qr-code-utils.js';
import ConnectivityUpdater from './redux/connectivity-updater.react.js';
import { DimensionsUpdater } from './redux/dimensions-updater.react.js';
import { getPersistor } from './redux/persist.js';
@@ -309,63 +317,73 @@
<IdentityServiceContextProvider>
<TunnelbrokerProvider>
<IdentitySearchProvider>
- <FeatureFlagsProvider>
- <NavContext.Provider value={navContext}>
- <RootContext.Provider value={rootContext}>
- <InputStateContainer>
- <MessageEditingContextProvider>
- <SafeAreaProvider initialMetrics={initialWindowMetrics}>
- <ActionSheetProvider>
- <ENSCacheProvider provider={provider}>
- <NeynarClientProvider apiKey={neynarKey}>
- <MediaCacheProvider
- persistence={filesystemMediaCache}
- >
- <EditUserAvatarProvider>
- <NativeEditThreadAvatarProvider>
- <MarkdownContextProvider>
- <MessageSearchProvider>
- <BottomSheetProvider>
- <RegistrationContextProvider>
- <SQLiteDataHandler />
- <ConnectedStatusBar />
- <ReduxPersistGate
- persistor={getPersistor()}
- >
- {gated}
- </ReduxPersistGate>
- <PersistedStateGate>
- <KeyserverConnectionsHandler
- socketComponent={Socket}
- detectUnsupervisedBackgroundRef={
- detectUnsupervisedBackgroundRef
- }
- />
- <VersionSupportedChecker />
- <PlatformDetailsSynchronizer />
- <BackgroundIdentityLoginHandler />
- <PrekeysHandler />
- <ReportHandler />
- <FarcasterDataHandler />
- <AutoJoinCommunityHandler />
- </PersistedStateGate>
- {navigation}
- </RegistrationContextProvider>
- </BottomSheetProvider>
- </MessageSearchProvider>
- </MarkdownContextProvider>
- </NativeEditThreadAvatarProvider>
- </EditUserAvatarProvider>
- </MediaCacheProvider>
- </NeynarClientProvider>
- </ENSCacheProvider>
- </ActionSheetProvider>
- </SafeAreaProvider>
- </MessageEditingContextProvider>
- </InputStateContainer>
- </RootContext.Provider>
- </NavContext.Provider>
- </FeatureFlagsProvider>
+ <QRAuthProvider
+ processTunnelbrokerMessage={parseTunnelbrokerQRAuthMessage}
+ composeTunnelbrokerMessage={composeTunnelbrokerQRAuthMessage}
+ generateAESKey={generateQRAuthKey}
+ performBackupRestore={performBackupRestore}
+ onLoginError={handleSecondaryDeviceRegistrationError}
+ >
+ <FeatureFlagsProvider>
+ <NavContext.Provider value={navContext}>
+ <RootContext.Provider value={rootContext}>
+ <InputStateContainer>
+ <MessageEditingContextProvider>
+ <SafeAreaProvider
+ initialMetrics={initialWindowMetrics}
+ >
+ <ActionSheetProvider>
+ <ENSCacheProvider provider={provider}>
+ <NeynarClientProvider apiKey={neynarKey}>
+ <MediaCacheProvider
+ persistence={filesystemMediaCache}
+ >
+ <EditUserAvatarProvider>
+ <NativeEditThreadAvatarProvider>
+ <MarkdownContextProvider>
+ <MessageSearchProvider>
+ <BottomSheetProvider>
+ <RegistrationContextProvider>
+ <SQLiteDataHandler />
+ <ConnectedStatusBar />
+ <ReduxPersistGate
+ persistor={getPersistor()}
+ >
+ {gated}
+ </ReduxPersistGate>
+ <PersistedStateGate>
+ <KeyserverConnectionsHandler
+ socketComponent={Socket}
+ detectUnsupervisedBackgroundRef={
+ detectUnsupervisedBackgroundRef
+ }
+ />
+ <VersionSupportedChecker />
+ <PlatformDetailsSynchronizer />
+ <BackgroundIdentityLoginHandler />
+ <PrekeysHandler />
+ <ReportHandler />
+ <FarcasterDataHandler />
+ <AutoJoinCommunityHandler />
+ </PersistedStateGate>
+ {navigation}
+ </RegistrationContextProvider>
+ </BottomSheetProvider>
+ </MessageSearchProvider>
+ </MarkdownContextProvider>
+ </NativeEditThreadAvatarProvider>
+ </EditUserAvatarProvider>
+ </MediaCacheProvider>
+ </NeynarClientProvider>
+ </ENSCacheProvider>
+ </ActionSheetProvider>
+ </SafeAreaProvider>
+ </MessageEditingContextProvider>
+ </InputStateContainer>
+ </RootContext.Provider>
+ </NavContext.Provider>
+ </FeatureFlagsProvider>
+ </QRAuthProvider>
</IdentitySearchProvider>
</TunnelbrokerProvider>
</IdentityServiceContextProvider>
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Nov 6, 1:25 AM (21 h, 51 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2427136
Default Alt Text
D12452.diff (12 KB)
Attached To
Mode
D12452: [native] update QR login flow to use `QRAuthContext`
Attached
Detach File
Event Timeline
Log In to Comment