Skip to content

Commit 7d39dfa

Browse files
committed
[PM-12391] Respect PIN unlock setting during FIDO user verification
Check the `isUnlockWithPinEnabled` setting instead of checking the `vaultUnlockType` of the active account to determine if a PIN prompt should be shown.
1 parent 3a41138 commit 7d39dfa

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import com.x8bit.bitwarden.data.auth.repository.model.BreachCountResult
1010
import com.x8bit.bitwarden.data.auth.repository.model.UserState
1111
import com.x8bit.bitwarden.data.auth.repository.model.ValidatePasswordResult
1212
import com.x8bit.bitwarden.data.auth.repository.model.ValidatePinResult
13-
import com.x8bit.bitwarden.data.auth.repository.model.VaultUnlockType
1413
import com.x8bit.bitwarden.data.autofill.fido2.manager.Fido2CredentialManager
1514
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2CreateCredentialRequest
1615
import com.x8bit.bitwarden.data.autofill.fido2.model.Fido2RegisterCredentialResult
@@ -662,7 +661,7 @@ class VaultAddEditViewModel @Inject constructor(
662661
return
663662
}
664663

665-
if (activeAccount.vaultUnlockType == VaultUnlockType.PIN) {
664+
if (settingsRepository.isUnlockWithPinEnabled) {
666665
mutableStateFlow.update {
667666
it.copy(dialog = VaultAddEditState.DialogState.Fido2PinPrompt)
668667
}

app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
105105
private val settingsRepository: SettingsRepository = mockk {
106106
every { initialAutofillDialogShown = any() } just runs
107107
every { initialAutofillDialogShown } returns true
108+
every { isUnlockWithPinEnabled } returns false
108109
}
109110
private val mutableUserStateFlow = MutableStateFlow<UserState?>(createUserState())
110111
private val authRepository: AuthRepository = mockk {
@@ -3684,8 +3685,9 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
36843685

36853686
@Suppress("MaxLineLength")
36863687
@Test
3687-
fun `UserVerificationNotSupported should display Fido2PinPrompt when user has pin`() {
3688+
fun `UserVerificationNotSupported should display Fido2PinPrompt when user has pin unlock enabled`() {
36883689
val userState = createUserState()
3690+
every { settingsRepository.isUnlockWithPinEnabled } returns true
36893691
mutableUserStateFlow.value = userState.copy(
36903692
accounts = listOf(
36913693
userState.accounts.first().copy(
@@ -3714,7 +3716,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
37143716

37153717
@Suppress("MaxLineLength")
37163718
@Test
3717-
fun `UserVerificationNotSupported should display Fido2PinSetUpPrompt when user has no password or pin`() {
3719+
fun `UserVerificationNotSupported should display Fido2PinSetUpPrompt when user has no password or pin and vaultUnlockType is MASTER_PASSWORD`() {
37183720
val userState = createUserState()
37193721
mutableUserStateFlow.value = userState.copy(
37203722
accounts = listOf(
@@ -3740,6 +3742,34 @@ class VaultAddEditViewModelTest : BaseViewModelTest() {
37403742
)
37413743
}
37423744

3745+
@Suppress("MaxLineLength")
3746+
@Test
3747+
fun `UserVerificationNotSupported should display Fido2PinSetUpPrompt when user has no password or pin and vaultUnlockType is PIN`() {
3748+
val userState = createUserState()
3749+
mutableUserStateFlow.value = userState.copy(
3750+
accounts = listOf(
3751+
userState.accounts.first().copy(
3752+
vaultUnlockType = VaultUnlockType.PIN,
3753+
trustedDevice = UserState.TrustedDevice(
3754+
isDeviceTrusted = true,
3755+
hasAdminApproval = true,
3756+
hasLoginApprovingDevice = true,
3757+
hasResetPasswordPermission = true,
3758+
),
3759+
hasMasterPassword = false,
3760+
),
3761+
),
3762+
)
3763+
3764+
viewModel.trySendAction(VaultAddEditAction.Common.UserVerificationNotSupported)
3765+
3766+
verify { fido2CredentialManager.isUserVerified = false }
3767+
assertEquals(
3768+
VaultAddEditState.DialogState.Fido2PinSetUpPrompt,
3769+
viewModel.stateFlow.value.dialog,
3770+
)
3771+
}
3772+
37433773
@Suppress("MaxLineLength")
37443774
@Test
37453775
fun `MasterPasswordFido2VerificationSubmit should display Fido2Error when password verification fails`() {

0 commit comments

Comments
 (0)