From 397c78b4afbb0cf612c8daffff21e9e3294ca2a4 Mon Sep 17 00:00:00 2001 From: David Perez Date: Mon, 19 Aug 2024 15:13:31 -0500 Subject: [PATCH] PM-11140: Update hasMasterPassword logic for key connectors (#3775) --- .../data/auth/repository/model/UserState.kt | 8 ++------ .../util/UserStateJsonExtensions.kt | 2 +- .../trusteddevice/TrustedDeviceViewModel.kt | 4 ++-- .../vaultunlock/VaultUnlockViewModel.kt | 8 ++++---- .../AccountSecurityViewModel.kt | 1 - .../deleteaccount/DeleteAccountViewModel.kt | 3 +-- .../exportvault/ExportVaultViewModel.kt | 1 - .../addedit/util/CipherViewExtensions.kt | 3 +-- .../com/x8bit/bitwarden/MainViewModelTest.kt | 1 + .../util/UserStateJsonExtensionsTest.kt | 4 +++- .../processor/Fido2ProviderProcessorTest.kt | 1 + .../accountsetup/SetupUnlockViewModelTest.kt | 1 + .../feature/landing/LandingViewModelTest.kt | 6 ++++++ .../auth/feature/login/LoginViewModelTest.kt | 1 + .../TrustedDeviceViewModelTest.kt | 2 +- .../vaultunlock/VaultUnlockViewModelTest.kt | 10 +++++++--- .../feature/rootnav/RootNavViewModelTest.kt | 20 ++++++++++++++++--- .../feature/search/SearchViewModelTest.kt | 1 + .../AccountSecurityViewModelTest.kt | 1 + .../DeleteAccountViewModelTest.kt | 8 ++------ .../LoginApprovalViewModelTest.kt | 1 + .../exportvault/ExportVaultViewModelTest.kt | 1 + .../generator/GeneratorViewModelTest.kt | 1 + .../send/addsend/AddSendViewModelTest.kt | 1 + .../addedit/VaultAddEditViewModelTest.kt | 4 ++-- .../addedit/util/CipherViewExtensionsTest.kt | 1 + .../attachments/AttachmentsViewModelTest.kt | 1 + .../feature/item/VaultItemViewModelTest.kt | 1 + .../VaultItemListingViewModelTest.kt | 6 +++--- .../VaultMoveToOrganizationViewModelTest.kt | 1 + .../VaultMoveToOrganizationExtensionsTest.kt | 1 + .../vault/feature/vault/VaultViewModelTest.kt | 4 ++++ .../vault/util/UserStateExtensionsTest.kt | 10 ++++++++++ 33 files changed, 81 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/model/UserState.kt b/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/model/UserState.kt index 2275c291eb..801848099e 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/model/UserState.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/model/UserState.kt @@ -45,6 +45,7 @@ data class UserState( * they logged in using SSO and don't yet have one). NOTE: This should **not** be used to * determine whether a user has a master password. There are cases in which a user can both * not have a password but still not need one, such as TDE. + * @property hasMasterPassword Indicates that the user does or does not have a master password. * @property organizations List of [Organization]s the user is associated with, if any. * @property isBiometricsEnabled Indicates that the biometrics mechanism for unlocking the * user's vault is enabled. @@ -61,16 +62,12 @@ data class UserState( val isVaultUnlocked: Boolean, val needsPasswordReset: Boolean, val needsMasterPassword: Boolean, + val hasMasterPassword: Boolean, val trustedDevice: TrustedDevice?, val organizations: List, val isBiometricsEnabled: Boolean, val vaultUnlockType: VaultUnlockType = VaultUnlockType.MASTER_PASSWORD, ) { - /** - * Indicates that the user does or does not have a master password. - */ - val hasMasterPassword: Boolean get() = trustedDevice?.hasMasterPassword != false - /** * Indicates that the user does or does not have a means to manually unlock the vault. */ @@ -86,7 +83,6 @@ data class UserState( */ data class TrustedDevice( val isDeviceTrusted: Boolean, - val hasMasterPassword: Boolean, val hasAdminApproval: Boolean, val hasLoginApprovingDevice: Boolean, val hasResetPasswordPermission: Boolean, diff --git a/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensions.kt index 93b9683df4..a0634b76de 100644 --- a/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensions.kt @@ -103,7 +103,6 @@ fun UserStateJson.toUserState( val trustedDevice = trustedDeviceOptions?.let { UserState.TrustedDevice( isDeviceTrusted = isDeviceTrustedProvider(userId), - hasMasterPassword = decryptionOptions.hasMasterPassword, hasAdminApproval = it.hasAdminApproval, hasLoginApprovingDevice = it.hasLoginApprovingDevice, hasResetPasswordPermission = it.hasManageResetPasswordPermission, @@ -132,6 +131,7 @@ fun UserStateJson.toUserState( isBiometricsEnabled = isBiometricsEnabledProvider(userId), vaultUnlockType = vaultUnlockTypeProvider(userId), needsMasterPassword = needsMasterPassword, + hasMasterPassword = decryptionOptions?.hasMasterPassword != false, trustedDevice = trustedDevice, ) }, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt index a05b850fdd..966def37e8 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModel.kt @@ -41,11 +41,11 @@ class TrustedDeviceViewModel @Inject constructor( environmentLabel = environmentRepository.environment.label, isRemembered = true, showContinueButton = trustedDevice - ?.let { !it.hasAdminApproval && !it.hasMasterPassword } + ?.let { !it.hasAdminApproval && !account.hasMasterPassword } ?: false, showOtherDeviceButton = trustedDevice?.hasLoginApprovingDevice ?: false, showRequestAdminButton = trustedDevice?.hasAdminApproval ?: false, - showMasterPasswordButton = trustedDevice?.hasMasterPassword ?: false, + showMasterPasswordButton = account?.hasMasterPassword ?: false, ) }, ) { diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt index e43c0bb449..bb8a84999c 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModel.kt @@ -52,17 +52,17 @@ class VaultUnlockViewModel @Inject constructor( // We load the state from the savedStateHandle for testing purposes. initialState = savedStateHandle[KEY_STATE] ?: run { val userState = requireNotNull(authRepository.userStateFlow.value) - val trustedDevice = userState.activeAccount.trustedDevice + val activeAccount = userState.activeAccount val accountSummaries = userState.toAccountSummaries() val activeAccountSummary = userState.toActiveAccountSummary() val isBiometricsValid = biometricsEncryptionManager.isBiometricIntegrityValid( userId = userState.activeUserId, cipher = biometricsEncryptionManager.getOrCreateCipher(userState.activeUserId), ) - val vaultUnlockType = userState.activeAccount.vaultUnlockType - val hasNoMasterPassword = trustedDevice?.hasMasterPassword == false + val vaultUnlockType = activeAccount.vaultUnlockType + val hasNoMasterPassword = !activeAccount.hasMasterPassword val hideInput = hasNoMasterPassword && vaultUnlockType == VaultUnlockType.MASTER_PASSWORD - val isBiometricsEnabled = userState.activeAccount.isBiometricsEnabled + val isBiometricsEnabled = activeAccount.isBiometricsEnabled if (hasNoMasterPassword && vaultUnlockType != VaultUnlockType.PIN && !isBiometricsEnabled) { // There is no valid way to unlock this app. authRepository.logout() diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt index e06dbf0d1a..814e2e3214 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModel.kt @@ -63,7 +63,6 @@ class AccountSecurityViewModel @Inject constructor( .userStateFlow .value ?.activeAccount - ?.trustedDevice ?.hasMasterPassword != false, isUnlockWithPinEnabled = settingsRepository.isUnlockWithPinEnabled, userId = userId, diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModel.kt index a734bc9c33..47ee16c11f 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModel.kt @@ -34,8 +34,7 @@ class DeleteAccountViewModel @Inject constructor( dialog = null, isUnlockWithPasswordEnabled = requireNotNull(authRepository.userStateFlow.value) .activeAccount - .trustedDevice - ?.hasMasterPassword != false, + .hasMasterPassword, ), ) { diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt index 595178cdb6..1018c04576 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModel.kt @@ -66,7 +66,6 @@ class ExportVaultViewModel @Inject constructor( .userStateFlow .value ?.activeAccount - ?.trustedDevice ?.hasMasterPassword == false, ), ) { diff --git a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt index 481ae9c8c2..da54b613c8 100644 --- a/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt +++ b/app/src/main/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensions.kt @@ -128,8 +128,7 @@ fun VaultAddEditState.ViewState.appendFolderAndOwnerData( cipherView = currentContentState.common.originalCipher, isIndividualVaultDisabled = isIndividualVaultDisabled, ), - isUnlockWithPasswordEnabled = - activeAccount.trustedDevice?.hasMasterPassword != false, + isUnlockWithPasswordEnabled = activeAccount.hasMasterPassword, ), ) } ?: this diff --git a/app/src/test/java/com/x8bit/bitwarden/MainViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/MainViewModelTest.kt index 58e037cd77..5d8672febf 100644 --- a/app/src/test/java/com/x8bit/bitwarden/MainViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/MainViewModelTest.kt @@ -777,6 +777,7 @@ private val DEFAULT_ACCOUNT = UserState.Account( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ) private val DEFAULT_USER_STATE = UserState( diff --git a/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensionsTest.kt index cb652d7423..55e5134769 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/auth/repository/util/UserStateJsonExtensionsTest.kt @@ -235,6 +235,7 @@ class UserStateJsonExtensionsTest { vaultUnlockType = VaultUnlockType.PIN, needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -325,6 +326,7 @@ class UserStateJsonExtensionsTest { vaultUnlockType = VaultUnlockType.MASTER_PASSWORD, needsMasterPassword = true, trustedDevice = null, + hasMasterPassword = false, ), ), hasPendingAccountAddition = true, @@ -413,11 +415,11 @@ class UserStateJsonExtensionsTest { needsMasterPassword = false, trustedDevice = UserState.TrustedDevice( isDeviceTrusted = true, - hasMasterPassword = false, hasAdminApproval = false, hasLoginApprovingDevice = true, hasResetPasswordPermission = false, ), + hasMasterPassword = false, ), ), hasPendingAccountAddition = true, diff --git a/app/src/test/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorTest.kt b/app/src/test/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorTest.kt index 10542b1576..c1b73518b8 100644 --- a/app/src/test/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/data/autofill/fido2/processor/Fido2ProviderProcessorTest.kt @@ -530,6 +530,7 @@ private fun createMockAccounts(number: Int): List { organizations = emptyList(), isBiometricsEnabled = false, vaultUnlockType = VaultUnlockType.MASTER_PASSWORD, + hasMasterPassword = true, ), ) } diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModelTest.kt index 0a0af2789d..281da3091a 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/accountsetup/SetupUnlockViewModelTest.kt @@ -300,6 +300,7 @@ private val DEFAULT_USER_STATE: UserState = UserState( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModelTest.kt index c416235919..b94812b797 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/landing/LandingViewModelTest.kt @@ -78,6 +78,7 @@ class LandingViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) @@ -212,6 +213,7 @@ class LandingViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ) val userState = UserState( activeUserId = "activeUserId", @@ -265,6 +267,7 @@ class LandingViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ) val userState = UserState( activeUserId = "activeUserId", @@ -322,6 +325,7 @@ class LandingViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ) val userState = UserState( activeUserId = "activeUserId", @@ -481,6 +485,7 @@ class LandingViewModelTest : BaseViewModelTest() { organizations = listOf(), isBiometricsEnabled = false, vaultUnlockType = VaultUnlockType.MASTER_PASSWORD, + hasMasterPassword = true, ) val userState = UserState( @@ -513,6 +518,7 @@ class LandingViewModelTest : BaseViewModelTest() { organizations = listOf(), isBiometricsEnabled = false, vaultUnlockType = VaultUnlockType.MASTER_PASSWORD, + hasMasterPassword = true, ) val userState = UserState( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt index 052722e94e..3e89ff96ee 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/login/LoginViewModelTest.kt @@ -127,6 +127,7 @@ class LoginViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt index daf2d198dc..344daf8505 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/trusteddevice/TrustedDeviceViewModelTest.kt @@ -253,7 +253,6 @@ private val DEFAULT_AUTH_STATE: AuthState = AuthState.Authenticated(accessToken private val TRUSTED_DEVICE = UserState.TrustedDevice( isDeviceTrusted = false, - hasMasterPassword = false, hasAdminApproval = true, hasLoginApprovingDevice = true, hasResetPasswordPermission = false, @@ -273,6 +272,7 @@ private val DEFAULT_ACCOUNT = UserState.Account( organizations = emptyList(), needsMasterPassword = false, trustedDevice = TRUSTED_DEVICE, + hasMasterPassword = false, ) private val DEFAULT_USER_STATE = UserState( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt index 7dfb31d532..2e2580748d 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/auth/feature/vaultunlock/VaultUnlockViewModelTest.kt @@ -109,7 +109,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { DEFAULT_ACCOUNT.copy( vaultUnlockType = VaultUnlockType.MASTER_PASSWORD, isBiometricsEnabled = false, - trustedDevice = TRUSTED_DEVICE, + hasMasterPassword = false, ), ), ) @@ -128,6 +128,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { vaultUnlockType = VaultUnlockType.MASTER_PASSWORD, isBiometricsEnabled = true, trustedDevice = TRUSTED_DEVICE, + hasMasterPassword = false, ), ), ) @@ -146,6 +147,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { vaultUnlockType = VaultUnlockType.PIN, isBiometricsEnabled = false, trustedDevice = TRUSTED_DEVICE, + hasMasterPassword = false, ), ), ) @@ -210,6 +212,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) @@ -246,6 +249,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) @@ -436,7 +440,7 @@ class VaultUnlockViewModelTest : BaseViewModelTest() { val account = DEFAULT_ACCOUNT.copy( isVaultUnlocked = false, isBiometricsEnabled = true, - ) + ) val initialState = DEFAULT_STATE.copy(isBiometricsValid = true) val viewModel = createViewModel(state = initialState) mutableUserStateFlow.update { @@ -984,7 +988,6 @@ private val DEFAULT_STATE: VaultUnlockState = VaultUnlockState( private val TRUSTED_DEVICE: UserState.TrustedDevice = UserState.TrustedDevice( isDeviceTrusted = false, - hasMasterPassword = false, hasAdminApproval = false, hasLoginApprovingDevice = false, hasResetPasswordPermission = false, @@ -1004,6 +1007,7 @@ private val DEFAULT_ACCOUNT = UserState.Account( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ) private val DEFAULT_USER_STATE = UserState( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt index a99a48f114..d8b4ed4f2f 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/rootnav/RootNavViewModelTest.kt @@ -73,6 +73,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -104,6 +105,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -132,6 +134,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = true, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -164,11 +167,11 @@ class RootNavViewModelTest : BaseViewModelTest() { needsMasterPassword = false, trustedDevice = UserState.TrustedDevice( isDeviceTrusted = false, - hasMasterPassword = false, hasAdminApproval = true, hasLoginApprovingDevice = true, hasResetPasswordPermission = false, ), + hasMasterPassword = false, ), ), ), @@ -199,11 +202,11 @@ class RootNavViewModelTest : BaseViewModelTest() { needsMasterPassword = false, trustedDevice = UserState.TrustedDevice( isDeviceTrusted = false, - hasMasterPassword = true, hasAdminApproval = true, hasLoginApprovingDevice = true, hasResetPasswordPermission = false, ), + hasMasterPassword = true, ), ), ), @@ -234,11 +237,11 @@ class RootNavViewModelTest : BaseViewModelTest() { needsMasterPassword = false, trustedDevice = UserState.TrustedDevice( isDeviceTrusted = false, - hasMasterPassword = false, hasAdminApproval = true, hasLoginApprovingDevice = true, hasResetPasswordPermission = false, ), + hasMasterPassword = false, ), ), ), @@ -271,6 +274,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), hasPendingAccountAddition = true, @@ -303,6 +307,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -340,6 +345,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -377,6 +383,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -420,6 +427,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -464,6 +472,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -503,6 +512,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -541,6 +551,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -614,6 +625,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -662,6 +674,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), @@ -698,6 +711,7 @@ class RootNavViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ), diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt index 52ab73938a..82830c3250 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/search/SearchViewModelTest.kt @@ -1416,6 +1416,7 @@ private val DEFAULT_USER_STATE = UserState( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt index 133cbb9e77..6151f52084 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/AccountSecurityViewModelTest.kt @@ -639,6 +639,7 @@ private val DEFAULT_USER_STATE = UserState( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModelTest.kt index e055b3701c..c4eee9bfa3 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/deleteaccount/DeleteAccountViewModelTest.kt @@ -34,11 +34,7 @@ class DeleteAccountViewModelTest : BaseViewModelTest() { mutableUserStateFlow.update { currentState -> currentState.copy( accounts = currentState.accounts.map { account -> - account.copy( - trustedDevice = account.trustedDevice?.copy( - hasMasterPassword = false, - ), - ) + account.copy(hasMasterPassword = false) }, ) } @@ -240,11 +236,11 @@ private val DEFAULT_USER_STATE: UserState = UserState( needsMasterPassword = false, trustedDevice = UserState.TrustedDevice( isDeviceTrusted = true, - hasMasterPassword = true, hasAdminApproval = true, hasLoginApprovingDevice = true, hasResetPasswordPermission = true, ), + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt index d2e4c8d188..eff843a77b 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/accountsecurity/loginapproval/LoginApprovalViewModelTest.kt @@ -368,6 +368,7 @@ private val DEFAULT_USER_STATE = UserState( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt index 983700729a..0ee8af27d9 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/platform/feature/settings/exportvault/ExportVaultViewModelTest.kt @@ -720,6 +720,7 @@ private val DEFAULT_USER_STATE = UserState( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModelTest.kt index 98aeb4f5dd..d0194e7711 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/generator/GeneratorViewModelTest.kt @@ -2404,6 +2404,7 @@ private val DEFAULT_USER_STATE = UserState( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModelTest.kt index 6ccb44dc98..9738606097 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/tools/feature/send/addsend/AddSendViewModelTest.kt @@ -1099,6 +1099,7 @@ class AddSendViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ) private val DEFAULT_USER_STATE = UserState( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt index a5fe5acb76..fe3c0db506 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModelTest.kt @@ -917,7 +917,6 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { @Test fun `in add mode during fido2, SaveClick should show fido2 error dialog when create options are null`() = runTest { - val mockUserId = "mockUserId" val fido2CredentialRequest = createMockFido2CredentialRequest(number = 1) specialCircumstanceManager.specialCircumstance = SpecialCircumstance.Fido2Save( @@ -3216,11 +3215,11 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { vaultUnlockType = VaultUnlockType.MASTER_PASSWORD, trustedDevice = UserState.TrustedDevice( isDeviceTrusted = true, - hasMasterPassword = false, hasAdminApproval = true, hasLoginApprovingDevice = true, hasResetPasswordPermission = true, ), + hasMasterPassword = false, ), ), ) @@ -3885,6 +3884,7 @@ class VaultAddEditViewModelTest : BaseViewModelTest() { vaultUnlockType = VaultUnlockType.MASTER_PASSWORD, needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), hasPendingAccountAddition = false, diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt index b03f7e0c9f..2b5461c9fb 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/addedit/util/CipherViewExtensionsTest.kt @@ -440,6 +440,7 @@ class CipherViewExtensionsTest { vaultUnlockType = VaultUnlockType.MASTER_PASSWORD, needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ) } diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModelTest.kt index 1b85d58482..263b491f93 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/attachments/AttachmentsViewModelTest.kt @@ -560,6 +560,7 @@ private val DEFAULT_USER_STATE = UserState( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt index 2cf35d3292..dbfcee9af1 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/item/VaultItemViewModelTest.kt @@ -2577,6 +2577,7 @@ class VaultItemViewModelTest : BaseViewModelTest() { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt index 9aca139a1f..ac020bb9f7 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt @@ -2762,14 +2762,13 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { accounts = listOf( DEFAULT_ACCOUNT.copy( vaultUnlockType = VaultUnlockType.MASTER_PASSWORD, - trustedDevice = UserState.TrustedDevice( isDeviceTrusted = true, - hasMasterPassword = false, hasAdminApproval = true, hasLoginApprovingDevice = true, hasResetPasswordPermission = true, ), + hasMasterPassword = false, ), ), ) @@ -3157,11 +3156,11 @@ class VaultItemListingViewModelTest : BaseViewModelTest() { vaultUnlockType = VaultUnlockType.MASTER_PASSWORD, trustedDevice = UserState.TrustedDevice( isDeviceTrusted = true, - hasMasterPassword = false, hasAdminApproval = true, hasLoginApprovingDevice = true, hasResetPasswordPermission = true, ), + hasMasterPassword = false, ), ), ) @@ -3784,6 +3783,7 @@ private val DEFAULT_ACCOUNT = UserState.Account( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ) private val DEFAULT_USER_STATE = UserState( diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt index d103e7cb5e..451c9ed8bd 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/VaultMoveToOrganizationViewModelTest.kt @@ -501,6 +501,7 @@ private val DEFAULT_USER_STATE = UserState( ), ), trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationExtensionsTest.kt index 7d09e9ff68..2aca7636ea 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/movetoorganization/util/VaultMoveToOrganizationExtensionsTest.kt @@ -116,6 +116,7 @@ private fun createMockUserState(hasOrganizations: Boolean = true): UserState = emptyList() }, trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt index c8610f4af3..036dd05b68 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/VaultViewModelTest.kt @@ -190,6 +190,7 @@ class VaultViewModelTest : BaseViewModelTest() { ), ), trustedDevice = null, + hasMasterPassword = true, ), ), ) @@ -269,6 +270,7 @@ class VaultViewModelTest : BaseViewModelTest() { ), ), trustedDevice = null, + hasMasterPassword = true, ), ), ) @@ -1515,6 +1517,7 @@ private val DEFAULT_USER_STATE = UserState( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), UserState.Account( userId = "lockedUserId", @@ -1530,6 +1533,7 @@ private val DEFAULT_USER_STATE = UserState( organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ), ), ) diff --git a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/UserStateExtensionsTest.kt b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/UserStateExtensionsTest.kt index e432e14893..b92b2eb1e0 100644 --- a/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/UserStateExtensionsTest.kt +++ b/app/src/test/java/com/x8bit/bitwarden/ui/vault/feature/vault/util/UserStateExtensionsTest.kt @@ -79,6 +79,7 @@ class UserStateExtensionsTest { ), ), trustedDevice = null, + hasMasterPassword = true, ), UserState.Account( userId = "lockedUserId", @@ -99,6 +100,7 @@ class UserStateExtensionsTest { ), ), trustedDevice = null, + hasMasterPassword = true, ), UserState.Account( userId = "unlockedUserId", @@ -123,6 +125,7 @@ class UserStateExtensionsTest { ), ), trustedDevice = null, + hasMasterPassword = true, ), UserState.Account( userId = "loggedOutUserId", @@ -147,6 +150,7 @@ class UserStateExtensionsTest { ), ), trustedDevice = null, + hasMasterPassword = true, ), ), ) @@ -186,6 +190,7 @@ class UserStateExtensionsTest { ), ), trustedDevice = null, + hasMasterPassword = true, ) .toAccountSummary(isActive = true), ) @@ -223,6 +228,7 @@ class UserStateExtensionsTest { ), ), trustedDevice = null, + hasMasterPassword = true, ) .toAccountSummary(isActive = false), ) @@ -264,6 +270,7 @@ class UserStateExtensionsTest { ), ), trustedDevice = null, + hasMasterPassword = true, ), ), ) @@ -288,6 +295,7 @@ class UserStateExtensionsTest { organizations = emptyList(), needsMasterPassword = false, trustedDevice = null, + hasMasterPassword = true, ) .toVaultFilterData(isIndividualVaultDisabled = false), ) @@ -335,6 +343,7 @@ class UserStateExtensionsTest { ), ), trustedDevice = null, + hasMasterPassword = true, ) .toVaultFilterData( isIndividualVaultDisabled = false, @@ -383,6 +392,7 @@ class UserStateExtensionsTest { ), ), trustedDevice = null, + hasMasterPassword = true, ) .toVaultFilterData( isIndividualVaultDisabled = true,