From 9b5c88e99062cc05c8ca5232b0408b1ab1716d5d Mon Sep 17 00:00:00 2001 From: aj-rosado <109146700+aj-rosado@users.noreply.github.com> Date: Mon, 14 Oct 2024 17:31:20 +0200 Subject: [PATCH] [PM-11982] On Passwordless flow switch activeAccount to match PasswordlessRequest userId (#4066) --- .../java/com/x8bit/bitwarden/MainViewModel.kt | 5 ++- .../com/x8bit/bitwarden/MainViewModelTest.kt | 36 +++++++++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/MainViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/MainViewModel.kt index cc462a0d2..fef7cba73 100644 --- a/app/src/main/java/com/x8bit/bitwarden/MainViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/MainViewModel.kt @@ -224,7 +224,7 @@ class MainViewModel @Inject constructor( ) } - @Suppress("LongMethod") + @Suppress("LongMethod", "CyclomaticComplexMethod") private fun handleIntent( intent: Intent, isFirstIntent: Boolean, @@ -242,6 +242,9 @@ class MainViewModel @Inject constructor( val fido2GetCredentialsRequest = intent.getFido2GetCredentialsRequestOrNull() when { passwordlessRequestData != null -> { + if (authRepository.activeUserId != passwordlessRequestData.userId) { + authRepository.switchAccount(passwordlessRequestData.userId) + } specialCircumstanceManager.specialCircumstance = SpecialCircumstance.PasswordlessRequest( passwordlessRequestData = passwordlessRequestData, diff --git a/app/src/test/java/com/x8bit/bitwarden/MainViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/MainViewModelTest.kt index f4463619b..e23f5008a 100644 --- a/app/src/test/java/com/x8bit/bitwarden/MainViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/MainViewModelTest.kt @@ -608,7 +608,7 @@ class MainViewModelTest : BaseViewModelTest() { fun `on ReceiveFirstIntent with a passwordless request data should set the special circumstance to PasswordlessRequest`() { val viewModel = createViewModel() val mockIntent = mockk() - val passwordlessRequestData = mockk() + val passwordlessRequestData = DEFAULT_PASSWORDLESS_REQUEST_DATA every { mockIntent.getPasswordlessRequestDataIntentOrNull() } returns passwordlessRequestData @@ -917,7 +917,7 @@ class MainViewModelTest : BaseViewModelTest() { fun `on ReceiveNewIntent with a passwordless auth request data should set the special circumstance to PasswordlessRequest`() { val viewModel = createViewModel() val mockIntent = mockk() - val passwordlessRequestData = mockk() + val passwordlessRequestData = DEFAULT_PASSWORDLESS_REQUEST_DATA every { mockIntent.getPasswordlessRequestDataIntentOrNull() } returns passwordlessRequestData @@ -1054,6 +1054,33 @@ class MainViewModelTest : BaseViewModelTest() { } } + @Suppress("MaxLineLength") + @Test + fun `on ReceiveNewIntent with a passwordless auth request data userId that doesn't match activeUserId should switchAccount`() { + val viewModel = createViewModel() + val mockIntent = mockk() + val passwordlessRequestData = mockk() + every { + mockIntent.getPasswordlessRequestDataIntentOrNull() + } returns passwordlessRequestData + every { mockIntent.getTotpDataOrNull() } returns null + every { mockIntent.getAutofillSaveItemOrNull() } returns null + every { mockIntent.getAutofillSelectionDataOrNull() } returns null + every { mockIntent.getCompleteRegistrationDataIntentOrNull() } returns null + every { intentManager.getShareDataFromIntent(mockIntent) } returns null + every { mockIntent.isMyVaultShortcut } returns false + every { mockIntent.isPasswordGeneratorShortcut } returns false + every { passwordlessRequestData.userId } returns "userId" + + viewModel.trySendAction( + MainAction.ReceiveNewIntent( + intent = mockIntent, + ), + ) + + verify { authRepository.switchAccount("userId") } + } + private fun createViewModel( initialSpecialCircumstance: SpecialCircumstance? = null, ) = MainViewModel( @@ -1109,6 +1136,11 @@ private val DEFAULT_USER_STATE = UserState( accounts = listOf(DEFAULT_ACCOUNT), ) +private val DEFAULT_PASSWORDLESS_REQUEST_DATA = PasswordlessRequestData( + userId = "activeUserId", + loginRequestId = "", +) + private fun createMockFido2RegistrationIntent( fido2CredentialRequest: Fido2CredentialRequest = createMockFido2CredentialRequest(number = 1), ): Intent = mockk {