From a64f7d97e5a1b5d46422eda072c02a2307599bfa Mon Sep 17 00:00:00 2001 From: Leendert de Borst Date: Mon, 17 Nov 2025 23:59:08 +0100 Subject: [PATCH] Refactor browser extension MobileLoginUtility flow (#1347) --- .../popup/pages/auth/MobileLogin.tsx | 17 ++++---- .../popup/utils/MobileLoginUtility.ts | 19 +++++++-- .../types/messaging/MobileLoginResult.ts | 39 +++++++++++++++++++ 3 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 apps/browser-extension/src/utils/types/messaging/MobileLoginResult.ts diff --git a/apps/browser-extension/src/entrypoints/popup/pages/auth/MobileLogin.tsx b/apps/browser-extension/src/entrypoints/popup/pages/auth/MobileLogin.tsx index 618218eb7..dff77b46f 100644 --- a/apps/browser-extension/src/entrypoints/popup/pages/auth/MobileLogin.tsx +++ b/apps/browser-extension/src/entrypoints/popup/pages/auth/MobileLogin.tsx @@ -11,6 +11,7 @@ import { useWebApi } from '@/entrypoints/popup/context/WebApiContext'; import { MobileLoginUtility } from '@/entrypoints/popup/utils/MobileLoginUtility'; import type { VaultResponse } from '@/utils/dist/shared/models/webapi'; +import type { MobileLoginResult } from '@/utils/types/messaging/MobileLoginResult'; /** * Mobile login page - scan QR code with mobile device to login. @@ -81,19 +82,19 @@ const MobileLogin: React.FC = () => { // Start polling for response await mobileLoginRef.current.startPolling( - async (username, token, refreshToken, decryptionKey, salt, encryptionType, encryptionSettings) => { + async (result: MobileLoginResult) => { showLoading(); try { // Handle successful authentication await handleSuccessfulAuth( - username, - token, - refreshToken, - decryptionKey, + result.username, + result.token, + result.refreshToken, + result.decryptionKey, { - salt, - encryptionType, - encryptionSettings, + salt: result.salt, + encryptionType: result.encryptionType, + encryptionSettings: result.encryptionSettings, } ); } catch (err) { diff --git a/apps/browser-extension/src/entrypoints/popup/utils/MobileLoginUtility.ts b/apps/browser-extension/src/entrypoints/popup/utils/MobileLoginUtility.ts index f8007e3be..de701ffb3 100644 --- a/apps/browser-extension/src/entrypoints/popup/utils/MobileLoginUtility.ts +++ b/apps/browser-extension/src/entrypoints/popup/utils/MobileLoginUtility.ts @@ -2,6 +2,7 @@ import { Buffer } from 'buffer'; import type { LoginResponse, MobileLoginInitiateResponse, MobileLoginPollResponse } from '@/utils/dist/shared/models/webapi'; import EncryptionUtility from '@/utils/EncryptionUtility'; +import type { MobileLoginResult } from '@/utils/types/messaging/MobileLoginResult'; import type { WebApiService } from '@/utils/WebApiService'; /** @@ -58,7 +59,7 @@ export class MobileLoginUtility { * Starts polling the server for mobile login response */ public async startPolling( - onSuccess: (username: string, token: string, refreshToken: string, decryptionKey: string, salt: string, encryptionType: string, encryptionSettings: string) => void, + onSuccess: (result: MobileLoginResult) => void, onError: (error: string) => void ): Promise { if (!this.requestId || !this.privateKey) { @@ -134,8 +135,20 @@ export class MobileLoginUtility { const loginData = await loginResponse.json() as LoginResponse; - // Call success callback with all data - onSuccess(username, token, refreshToken, decryptionKey, loginData.salt, loginData.encryptionType, loginData.encryptionSettings); + // Create result object using the MobileLoginResult type + const result: MobileLoginResult = { + username: username, + token: token, + refreshToken: refreshToken, + decryptionKey: decryptionKey, + salt: loginData.salt, + encryptionType: loginData.encryptionType, + encryptionSettings: loginData.encryptionSettings, + }; + + // Call success callback with result object + onSuccess(result); + } } catch (error) { this.stopPolling(); diff --git a/apps/browser-extension/src/utils/types/messaging/MobileLoginResult.ts b/apps/browser-extension/src/utils/types/messaging/MobileLoginResult.ts new file mode 100644 index 000000000..906f1d713 --- /dev/null +++ b/apps/browser-extension/src/utils/types/messaging/MobileLoginResult.ts @@ -0,0 +1,39 @@ +/** + * Result of a successful mobile login containing decrypted authentication data. + */ +export type MobileLoginResult = { + /** + * The username. + */ + username: string; + + /** + * The JWT access token. + */ + token: string; + + /** + * The refresh token. + */ + refreshToken: string; + + /** + * The vault decryption key (base64 encoded). + */ + decryptionKey: string; + + /** + * The user's salt for key derivation. + */ + salt: string; + + /** + * The encryption type (e.g., "Argon2id"). + */ + encryptionType: string; + + /** + * The encryption settings JSON string. + */ + encryptionSettings: string; +}