mirror of
https://github.com/bitwarden/android.git
synced 2026-08-24 14:28:58 -05:00
PM-26027: Remove the UserManagedPrivilegedApps feature flag (#5914)
This commit is contained in:
-3
@@ -24,7 +24,6 @@ import com.x8bit.bitwarden.data.credentials.repository.PrivilegedAppRepository
|
||||
import com.x8bit.bitwarden.data.credentials.repository.PrivilegedAppRepositoryImpl
|
||||
import com.x8bit.bitwarden.data.platform.manager.AssetManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.BiometricsEncryptionManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.ciphermatching.CipherMatchingManager
|
||||
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource
|
||||
import com.x8bit.bitwarden.data.vault.repository.VaultRepository
|
||||
@@ -93,13 +92,11 @@ object CredentialProviderModule {
|
||||
assetManager: AssetManager,
|
||||
digitalAssetLinkService: DigitalAssetLinkService,
|
||||
privilegedAppRepository: PrivilegedAppRepository,
|
||||
featureFlagManager: FeatureFlagManager,
|
||||
): OriginManager =
|
||||
OriginManagerImpl(
|
||||
assetManager = assetManager,
|
||||
digitalAssetLinkService = digitalAssetLinkService,
|
||||
privilegedAppRepository = privilegedAppRepository,
|
||||
featureFlagManager = featureFlagManager,
|
||||
)
|
||||
|
||||
@Provides
|
||||
|
||||
+1
-7
@@ -1,13 +1,11 @@
|
||||
package com.x8bit.bitwarden.data.credentials.manager
|
||||
|
||||
import androidx.credentials.provider.CallingAppInfo
|
||||
import com.bitwarden.core.data.manager.model.FlagKey
|
||||
import com.bitwarden.network.service.DigitalAssetLinkService
|
||||
import com.bitwarden.ui.platform.base.util.prefixHttpsIfNecessary
|
||||
import com.x8bit.bitwarden.data.credentials.model.ValidateOriginResult
|
||||
import com.x8bit.bitwarden.data.credentials.repository.PrivilegedAppRepository
|
||||
import com.x8bit.bitwarden.data.platform.manager.AssetManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager
|
||||
import com.x8bit.bitwarden.data.platform.util.getSignatureFingerprintAsHexString
|
||||
import com.x8bit.bitwarden.data.platform.util.validatePrivilegedApp
|
||||
import timber.log.Timber
|
||||
@@ -23,7 +21,6 @@ class OriginManagerImpl(
|
||||
private val assetManager: AssetManager,
|
||||
private val digitalAssetLinkService: DigitalAssetLinkService,
|
||||
private val privilegedAppRepository: PrivilegedAppRepository,
|
||||
private val featureFlagManager: FeatureFlagManager,
|
||||
) : OriginManager {
|
||||
|
||||
override suspend fun validateOrigin(
|
||||
@@ -70,10 +67,7 @@ class OriginManagerImpl(
|
||||
validatePrivilegedAppSignatureWithGoogleList(callingAppInfo)
|
||||
.takeUnless { it is ValidateOriginResult.Error.PrivilegedAppNotAllowed }
|
||||
?: validatePrivilegedAppSignatureWithCommunityList(callingAppInfo)
|
||||
.takeUnless {
|
||||
it is ValidateOriginResult.Error.PrivilegedAppNotAllowed &&
|
||||
featureFlagManager.getFeatureFlag(FlagKey.UserManagedPrivilegedApps)
|
||||
}
|
||||
.takeUnless { it is ValidateOriginResult.Error.PrivilegedAppNotAllowed }
|
||||
?: validatePrivilegedAppSignatureWithUserTrustList(callingAppInfo)
|
||||
|
||||
private suspend fun validatePrivilegedAppSignatureWithGoogleList(
|
||||
|
||||
-5
@@ -29,7 +29,6 @@ fun <T : Any> FlagKey<T>.ListItemContent(
|
||||
FlagKey.CredentialExchangeProtocolImport,
|
||||
FlagKey.CredentialExchangeProtocolExport,
|
||||
FlagKey.CipherKeyEncryption,
|
||||
FlagKey.UserManagedPrivilegedApps,
|
||||
-> {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
BooleanFlagItem(
|
||||
@@ -74,10 +73,6 @@ private fun <T : Any> FlagKey<T>.getDisplayLabel(): String = when (this) {
|
||||
FlagKey.CredentialExchangeProtocolImport -> stringResource(BitwardenString.cxp_import)
|
||||
FlagKey.CredentialExchangeProtocolExport -> stringResource(BitwardenString.cxp_export)
|
||||
FlagKey.CipherKeyEncryption -> stringResource(BitwardenString.cipher_key_encryption)
|
||||
FlagKey.UserManagedPrivilegedApps -> {
|
||||
stringResource(BitwardenString.user_trusted_privileged_app_management)
|
||||
}
|
||||
|
||||
FlagKey.BitwardenAuthenticationEnabled -> {
|
||||
stringResource(BitwardenString.bitwarden_authentication_enabled)
|
||||
}
|
||||
|
||||
+14
-19
@@ -245,30 +245,25 @@ private fun AutoFillScreenContent(
|
||||
id = BitwardenString.set_bitwarden_as_passkey_manager_description,
|
||||
),
|
||||
withDivider = false,
|
||||
cardStyle = if (state.isUserManagedPrivilegedAppsEnabled) {
|
||||
CardStyle.Top()
|
||||
} else {
|
||||
CardStyle.Full
|
||||
},
|
||||
cardStyle = CardStyle.Top(),
|
||||
modifier = Modifier
|
||||
.fillMaxWidth()
|
||||
.standardHorizontalMargin(),
|
||||
)
|
||||
if (state.isUserManagedPrivilegedAppsEnabled) {
|
||||
BitwardenTextRow(
|
||||
text = stringResource(BitwardenString.privileged_apps),
|
||||
onClick = autoFillHandlers.onPrivilegedAppsClick,
|
||||
tooltip = TooltipData(
|
||||
contentDescription =
|
||||
stringResource(BitwardenString.learn_more_about_privileged_apps),
|
||||
onClick = autoFillHandlers.onPrivilegedAppsHelpLinkClick,
|
||||
BitwardenTextRow(
|
||||
text = stringResource(BitwardenString.privileged_apps),
|
||||
onClick = autoFillHandlers.onPrivilegedAppsClick,
|
||||
tooltip = TooltipData(
|
||||
contentDescription = stringResource(
|
||||
id = BitwardenString.learn_more_about_privileged_apps,
|
||||
),
|
||||
cardStyle = CardStyle.Bottom,
|
||||
modifier = Modifier
|
||||
.standardHorizontalMargin()
|
||||
.fillMaxWidth(),
|
||||
)
|
||||
}
|
||||
onClick = autoFillHandlers.onPrivilegedAppsHelpLinkClick,
|
||||
),
|
||||
cardStyle = CardStyle.Bottom,
|
||||
modifier = Modifier
|
||||
.standardHorizontalMargin()
|
||||
.fillMaxWidth(),
|
||||
)
|
||||
Spacer(modifier = Modifier.height(height = 8.dp))
|
||||
}
|
||||
AccessibilityAutofillSwitch(
|
||||
|
||||
-32
@@ -4,7 +4,6 @@ import android.os.Build
|
||||
import android.os.Parcelable
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.bitwarden.core.data.manager.model.FlagKey
|
||||
import com.bitwarden.core.util.isBuildVersionAtLeast
|
||||
import com.bitwarden.core.util.persistentListOfNotNull
|
||||
import com.bitwarden.ui.platform.base.BaseViewModel
|
||||
@@ -15,7 +14,6 @@ import com.x8bit.bitwarden.data.auth.repository.AuthRepository
|
||||
import com.x8bit.bitwarden.data.autofill.manager.browser.BrowserThirdPartyAutofillEnabledManager
|
||||
import com.x8bit.bitwarden.data.autofill.model.browser.BrowserPackage
|
||||
import com.x8bit.bitwarden.data.autofill.model.browser.BrowserThirdPartyAutofillStatus
|
||||
import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager
|
||||
import com.x8bit.bitwarden.data.platform.repository.SettingsRepository
|
||||
import com.x8bit.bitwarden.data.platform.repository.model.UriMatchType
|
||||
@@ -42,7 +40,6 @@ class AutoFillViewModel @Inject constructor(
|
||||
private val savedStateHandle: SavedStateHandle,
|
||||
private val settingsRepository: SettingsRepository,
|
||||
private val firstTimeActionManager: FirstTimeActionManager,
|
||||
private val featureFlagManager: FeatureFlagManager,
|
||||
) : BaseViewModel<AutoFillState, AutoFillEvent, AutoFillAction>(
|
||||
initialState = savedStateHandle[KEY_STATE]
|
||||
?: run {
|
||||
@@ -69,8 +66,6 @@ class AutoFillViewModel @Inject constructor(
|
||||
browserAutofillSettingsOptions = browserThirdPartyAutofillEnabledManager
|
||||
.browserThirdPartyAutofillStatus
|
||||
.toBrowserAutoFillSettingsOptions(),
|
||||
isUserManagedPrivilegedAppsEnabled =
|
||||
featureFlagManager.getFeatureFlag(FlagKey.UserManagedPrivilegedApps),
|
||||
)
|
||||
},
|
||||
) {
|
||||
@@ -108,11 +103,6 @@ class AutoFillViewModel @Inject constructor(
|
||||
.map { AutoFillAction.Internal.BrowserAutofillStatusReceive(status = it) }
|
||||
.onEach(::sendAction)
|
||||
.launchIn(viewModelScope)
|
||||
|
||||
featureFlagManager.getFeatureFlagFlow(FlagKey.UserManagedPrivilegedApps)
|
||||
.map { AutoFillAction.Internal.UserManagedPrivilegedAppsEnableUpdateReceive(it) }
|
||||
.onEach(::sendAction)
|
||||
.launchIn(viewModelScope)
|
||||
}
|
||||
|
||||
override fun handleAction(action: AutoFillAction) = when (action) {
|
||||
@@ -159,10 +149,6 @@ class AutoFillViewModel @Inject constructor(
|
||||
is AutoFillAction.Internal.BrowserAutofillStatusReceive -> {
|
||||
handleBrowserAutofillStatusReceive(action)
|
||||
}
|
||||
|
||||
is AutoFillAction.Internal.UserManagedPrivilegedAppsEnableUpdateReceive -> {
|
||||
handleUserManagedPrivilegedAppsEnableUpdateReceive(action)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -170,16 +156,6 @@ class AutoFillViewModel @Inject constructor(
|
||||
sendEvent(AutoFillEvent.NavigateToAboutPrivilegedAppsScreen)
|
||||
}
|
||||
|
||||
private fun handleUserManagedPrivilegedAppsEnableUpdateReceive(
|
||||
action: AutoFillAction.Internal.UserManagedPrivilegedAppsEnableUpdateReceive,
|
||||
) {
|
||||
mutableStateFlow.update {
|
||||
it.copy(
|
||||
isUserManagedPrivilegedAppsEnabled = action.isUserManagedPrivilegedAppsEnabled,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleBrowserAutofillStatusReceive(
|
||||
action: AutoFillAction.Internal.BrowserAutofillStatusReceive,
|
||||
) {
|
||||
@@ -299,7 +275,6 @@ data class AutoFillState(
|
||||
val showAutofillActionCard: Boolean,
|
||||
val activeUserId: String,
|
||||
val browserAutofillSettingsOptions: ImmutableList<BrowserAutofillSettingsOption>,
|
||||
val isUserManagedPrivilegedAppsEnabled: Boolean,
|
||||
) : Parcelable {
|
||||
/**
|
||||
* Whether or not the dropdown controlling the [autofillStyle] value is displayed.
|
||||
@@ -520,12 +495,5 @@ sealed class AutoFillAction {
|
||||
data class BrowserAutofillStatusReceive(
|
||||
val status: BrowserThirdPartyAutofillStatus,
|
||||
) : Internal()
|
||||
|
||||
/**
|
||||
* The user managed privileged apps feature flag has been updated.
|
||||
*/
|
||||
data class UserManagedPrivilegedAppsEnableUpdateReceive(
|
||||
val isUserManagedPrivilegedAppsEnabled: Boolean,
|
||||
) : Internal()
|
||||
}
|
||||
}
|
||||
|
||||
+1
-5
@@ -9,7 +9,6 @@ import androidx.credentials.provider.ProviderCreateCredentialRequest
|
||||
import androidx.credentials.provider.ProviderGetCredentialRequest
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.bitwarden.core.data.manager.model.FlagKey
|
||||
import com.bitwarden.core.data.manager.toast.ToastManager
|
||||
import com.bitwarden.core.data.repository.model.DataState
|
||||
import com.bitwarden.core.data.repository.util.map
|
||||
@@ -53,7 +52,6 @@ import com.x8bit.bitwarden.data.credentials.model.ValidateOriginResult
|
||||
import com.x8bit.bitwarden.data.credentials.parser.RelyingPartyParser
|
||||
import com.x8bit.bitwarden.data.credentials.repository.PrivilegedAppRepository
|
||||
import com.x8bit.bitwarden.data.credentials.util.getCreatePasskeyCredentialRequestOrNull
|
||||
import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.PolicyManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.ciphermatching.CipherMatchingManager
|
||||
@@ -144,7 +142,6 @@ class VaultItemListingViewModel @Inject constructor(
|
||||
private val bitwardenCredentialManager: BitwardenCredentialManager,
|
||||
private val organizationEventManager: OrganizationEventManager,
|
||||
private val networkConnectionManager: NetworkConnectionManager,
|
||||
private val featureFlagManager: FeatureFlagManager,
|
||||
private val relyingPartyParser: RelyingPartyParser,
|
||||
private val toastManager: ToastManager,
|
||||
snackbarRelayManager: SnackbarRelayManager,
|
||||
@@ -2191,8 +2188,7 @@ class VaultItemListingViewModel @Inject constructor(
|
||||
}
|
||||
|
||||
private fun shouldShowTrustPrompt(error: ValidateOriginResult.Error): Boolean =
|
||||
error is ValidateOriginResult.Error.PrivilegedAppNotAllowed &&
|
||||
featureFlagManager.getFeatureFlag(FlagKey.UserManagedPrivilegedApps)
|
||||
error is ValidateOriginResult.Error.PrivilegedAppNotAllowed
|
||||
|
||||
private fun handleFido2AssertionDataReceive(
|
||||
action: VaultItemListingsAction.Internal.Fido2AssertionDataReceive,
|
||||
|
||||
+1
-34
@@ -10,8 +10,6 @@ import com.bitwarden.network.service.DigitalAssetLinkService
|
||||
import com.x8bit.bitwarden.data.credentials.model.ValidateOriginResult
|
||||
import com.x8bit.bitwarden.data.credentials.repository.PrivilegedAppRepository
|
||||
import com.x8bit.bitwarden.data.platform.manager.AssetManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager
|
||||
import com.bitwarden.core.data.manager.model.FlagKey
|
||||
import io.mockk.coEvery
|
||||
import io.mockk.coVerify
|
||||
import io.mockk.every
|
||||
@@ -44,9 +42,6 @@ class OriginManagerTest {
|
||||
}
|
||||
}
|
||||
private val mockPrivilegedAppRepository = mockk<PrivilegedAppRepository>()
|
||||
private val mockFeatureFlagManager = mockk<FeatureFlagManager> {
|
||||
every { getFeatureFlag(FlagKey.UserManagedPrivilegedApps) } returns true
|
||||
}
|
||||
private val mockMessageDigest = mockk<MessageDigest> {
|
||||
every { digest(any()) } returns DEFAULT_APP_SIGNATURE.toByteArray()
|
||||
}
|
||||
@@ -55,7 +50,6 @@ class OriginManagerTest {
|
||||
assetManager = mockAssetManager,
|
||||
digitalAssetLinkService = mockDigitalAssetLinkService,
|
||||
privilegedAppRepository = mockPrivilegedAppRepository,
|
||||
featureFlagManager = mockFeatureFlagManager,
|
||||
)
|
||||
|
||||
@BeforeEach
|
||||
@@ -248,33 +242,6 @@ class OriginManagerTest {
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `validateOrigin should ignore user trust list when feature flag is disabled`() = runTest {
|
||||
every {
|
||||
mockFeatureFlagManager.getFeatureFlag(FlagKey.UserManagedPrivilegedApps)
|
||||
} returns false
|
||||
coEvery {
|
||||
mockAssetManager.readAsset(GOOGLE_ALLOW_LIST_FILENAME)
|
||||
} returns FAIL_ALLOW_LIST.asSuccess()
|
||||
coEvery {
|
||||
mockAssetManager.readAsset(COMMUNITY_ALLOW_LIST_FILENAME)
|
||||
} returns FAIL_ALLOW_LIST.asSuccess()
|
||||
|
||||
val result = originManager.validateOrigin(
|
||||
relyingPartyId = DEFAULT_ORIGIN,
|
||||
callingAppInfo = mockPrivilegedAppInfo,
|
||||
)
|
||||
assertEquals(
|
||||
ValidateOriginResult.Error.PrivilegedAppNotAllowed,
|
||||
result,
|
||||
)
|
||||
coVerify(exactly = 1) {
|
||||
mockAssetManager.readAsset(GOOGLE_ALLOW_LIST_FILENAME)
|
||||
mockAssetManager.readAsset(COMMUNITY_ALLOW_LIST_FILENAME)
|
||||
}
|
||||
coVerify(exactly = 0) { mockPrivilegedAppRepository.getUserTrustedAllowListJson() }
|
||||
}
|
||||
}
|
||||
|
||||
private const val DEFAULT_PACKAGE_NAME = "com.x8bit.bitwarden"
|
||||
@@ -333,4 +300,4 @@ private val DEFAULT_ASSET_LINKS_CHECK_RESPONSE =
|
||||
linked = true,
|
||||
maxAge = "30s",
|
||||
debugString = null,
|
||||
)
|
||||
)
|
||||
|
||||
-2
@@ -146,13 +146,11 @@ class DebugMenuViewModelTest : BaseViewModelTest() {
|
||||
private val DEFAULT_MAP_VALUE: ImmutableMap<FlagKey<Any>, Any> = persistentMapOf(
|
||||
FlagKey.CredentialExchangeProtocolImport to true,
|
||||
FlagKey.CredentialExchangeProtocolExport to true,
|
||||
FlagKey.UserManagedPrivilegedApps to true,
|
||||
)
|
||||
|
||||
private val UPDATED_MAP_VALUE: ImmutableMap<FlagKey<Any>, Any> = persistentMapOf(
|
||||
FlagKey.CredentialExchangeProtocolImport to false,
|
||||
FlagKey.CredentialExchangeProtocolExport to false,
|
||||
FlagKey.UserManagedPrivilegedApps to false,
|
||||
)
|
||||
|
||||
private val DEFAULT_STATE = DebugMenuState(
|
||||
|
||||
-18
@@ -652,24 +652,8 @@ class AutoFillScreenTest : BitwardenComposeTest() {
|
||||
assertTrue(onNavigateToAboutPrivilegedAppsScreenCalled)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `PrivilegedAppsRow should display based on state`() {
|
||||
composeTestRule
|
||||
.onNodeWithText("Privileged apps")
|
||||
.assertDoesNotExist()
|
||||
|
||||
mutableStateFlow.update {
|
||||
it.copy(isUserManagedPrivilegedAppsEnabled = true)
|
||||
}
|
||||
composeTestRule
|
||||
.onNodeWithText("Privileged apps")
|
||||
.performScrollTo()
|
||||
.assertIsDisplayed()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `privileged app help link click should send AboutPrivilegedAppsClick`() {
|
||||
mutableStateFlow.update { it.copy(isUserManagedPrivilegedAppsEnabled = true) }
|
||||
composeTestRule
|
||||
.onNodeWithContentDescription("Learn more about privileged apps")
|
||||
.performScrollTo()
|
||||
@@ -689,7 +673,6 @@ class AutoFillScreenTest : BitwardenComposeTest() {
|
||||
|
||||
@Test
|
||||
fun `privileged apps row click should send PrivilegedAppsClick`() {
|
||||
mutableStateFlow.update { it.copy(isUserManagedPrivilegedAppsEnabled = true) }
|
||||
composeTestRule
|
||||
.onNodeWithText("Privileged apps")
|
||||
.performScrollTo()
|
||||
@@ -820,5 +803,4 @@ private val DEFAULT_STATE: AutoFillState = AutoFillState(
|
||||
showAutofillActionCard = false,
|
||||
activeUserId = "activeUserId",
|
||||
browserAutofillSettingsOptions = persistentListOf(),
|
||||
isUserManagedPrivilegedAppsEnabled = false,
|
||||
)
|
||||
|
||||
-14
@@ -3,7 +3,6 @@ package com.x8bit.bitwarden.ui.platform.feature.settings.autofill
|
||||
import android.os.Build
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
import app.cash.turbine.test
|
||||
import com.bitwarden.core.data.manager.model.FlagKey
|
||||
import com.bitwarden.core.util.isBuildVersionAtLeast
|
||||
import com.bitwarden.ui.platform.base.BaseViewModelTest
|
||||
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
|
||||
@@ -11,7 +10,6 @@ import com.x8bit.bitwarden.data.autofill.manager.browser.BrowserThirdPartyAutofi
|
||||
import com.x8bit.bitwarden.data.autofill.model.browser.BrowserPackage
|
||||
import com.x8bit.bitwarden.data.autofill.model.browser.BrowserThirdPartyAutoFillData
|
||||
import com.x8bit.bitwarden.data.autofill.model.browser.BrowserThirdPartyAutofillStatus
|
||||
import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.FirstTimeActionManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.model.FirstTimeState
|
||||
import com.x8bit.bitwarden.data.platform.repository.SettingsRepository
|
||||
@@ -69,16 +67,6 @@ class AutoFillViewModelTest : BaseViewModelTest() {
|
||||
every { disableAutofill() } just runs
|
||||
}
|
||||
|
||||
private val mutableUserManagedPrivilegedAppsEnabledFlow = MutableStateFlow(false)
|
||||
private val mockFeatureFlagManager = mockk<FeatureFlagManager> {
|
||||
every {
|
||||
getFeatureFlag(FlagKey.UserManagedPrivilegedApps)
|
||||
} returns mutableUserManagedPrivilegedAppsEnabledFlow.value
|
||||
every {
|
||||
getFeatureFlagFlow(FlagKey.UserManagedPrivilegedApps)
|
||||
} returns mutableUserManagedPrivilegedAppsEnabledFlow
|
||||
}
|
||||
|
||||
@BeforeEach
|
||||
fun setup() {
|
||||
mockkStatic(::isBuildVersionAtLeast)
|
||||
@@ -471,7 +459,6 @@ class AutoFillViewModelTest : BaseViewModelTest() {
|
||||
authRepository = authRepository,
|
||||
firstTimeActionManager = firstTimeActionManager,
|
||||
browserThirdPartyAutofillEnabledManager = browserThirdPartyAutofillEnabledManager,
|
||||
featureFlagManager = mockFeatureFlagManager,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -487,7 +474,6 @@ private val DEFAULT_STATE: AutoFillState = AutoFillState(
|
||||
showAutofillActionCard = false,
|
||||
activeUserId = "activeUserId",
|
||||
browserAutofillSettingsOptions = persistentListOf(),
|
||||
isUserManagedPrivilegedAppsEnabled = false,
|
||||
)
|
||||
|
||||
private val DEFAULT_BROWSER_AUTOFILL_DATA = BrowserThirdPartyAutoFillData(
|
||||
|
||||
+3
-41
@@ -15,7 +15,6 @@ import androidx.credentials.provider.ProviderGetCredentialRequest
|
||||
import androidx.credentials.provider.PublicKeyCredentialEntry
|
||||
import androidx.lifecycle.SavedStateHandle
|
||||
import app.cash.turbine.test
|
||||
import com.bitwarden.core.data.manager.model.FlagKey
|
||||
import com.bitwarden.core.data.manager.toast.ToastManager
|
||||
import com.bitwarden.core.data.repository.model.DataState
|
||||
import com.bitwarden.core.data.repository.util.bufferedMutableSharedFlow
|
||||
@@ -68,7 +67,6 @@ import com.x8bit.bitwarden.data.credentials.model.createMockGetCredentialsReques
|
||||
import com.x8bit.bitwarden.data.credentials.model.createMockProviderGetPasswordCredentialRequest
|
||||
import com.x8bit.bitwarden.data.credentials.parser.RelyingPartyParser
|
||||
import com.x8bit.bitwarden.data.credentials.repository.PrivilegedAppRepository
|
||||
import com.x8bit.bitwarden.data.platform.manager.FeatureFlagManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.PolicyManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManager
|
||||
import com.x8bit.bitwarden.data.platform.manager.SpecialCircumstanceManagerImpl
|
||||
@@ -109,7 +107,6 @@ import com.x8bit.bitwarden.ui.vault.components.model.CreateVaultItemType
|
||||
import com.x8bit.bitwarden.ui.vault.feature.addedit.util.createMockPasskeyAttestationOptions
|
||||
import com.x8bit.bitwarden.ui.vault.feature.itemlisting.model.ListingItemOverflowAction
|
||||
import com.x8bit.bitwarden.ui.vault.feature.itemlisting.util.createMockDisplayItemForCipher
|
||||
import com.x8bit.bitwarden.ui.vault.feature.vault.VaultAction
|
||||
import com.x8bit.bitwarden.ui.vault.feature.vault.model.VaultFilterType
|
||||
import com.x8bit.bitwarden.ui.vault.feature.vault.util.toAccountSummaries
|
||||
import com.x8bit.bitwarden.ui.vault.feature.vault.util.toActiveAccountSummary
|
||||
@@ -251,10 +248,6 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
|
||||
coEvery { addTrustedPrivilegedApp(any(), any()) } just runs
|
||||
}
|
||||
|
||||
private val featureFlagManager: FeatureFlagManager = mockk {
|
||||
every { getFeatureFlag(FlagKey.UserManagedPrivilegedApps) } returns true
|
||||
}
|
||||
|
||||
private val initialState = createVaultItemListingState()
|
||||
private val initialSavedStateHandle
|
||||
get() = createSavedStateHandleWithVaultItemListingType(
|
||||
@@ -3103,9 +3096,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
|
||||
)
|
||||
}
|
||||
|
||||
@Suppress("MaxLineLength")
|
||||
@Test
|
||||
fun `ValidateOriginResult should show TrustPrivilegedAddPrompt dialog when feature flag is on`() =
|
||||
fun `ValidateOriginResult should show TrustPrivilegedAddPrompt dialog`() =
|
||||
runTest {
|
||||
specialCircumstanceManager.specialCircumstance =
|
||||
SpecialCircumstance.ProviderCreateCredential(
|
||||
@@ -3122,7 +3114,8 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
|
||||
|
||||
assertEquals(
|
||||
VaultItemListingState.DialogState.TrustPrivilegedAddPrompt(
|
||||
message = BitwardenString.passkey_operation_failed_because_browser_x_is_not_trusted
|
||||
message = BitwardenString
|
||||
.passkey_operation_failed_because_browser_x_is_not_trusted
|
||||
.asText("mockPackageName"),
|
||||
selectedCipherId = null,
|
||||
),
|
||||
@@ -3130,36 +3123,6 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
|
||||
)
|
||||
}
|
||||
|
||||
@Suppress("MaxLineLength")
|
||||
@Test
|
||||
fun `ValidateOriginResult should show not show TrustPrivilegedAppPrompt dialog when feature flag is off`() =
|
||||
runTest {
|
||||
specialCircumstanceManager.specialCircumstance =
|
||||
SpecialCircumstance.ProviderCreateCredential(
|
||||
createCredentialRequest = createMockCreateCredentialRequest(number = 1),
|
||||
)
|
||||
coEvery {
|
||||
originManager.validateOrigin(
|
||||
relyingPartyId = DEFAULT_RELYING_PARTY_ID,
|
||||
callingAppInfo = mockCallingAppInfo,
|
||||
)
|
||||
} returns ValidateOriginResult.Error.PrivilegedAppNotAllowed
|
||||
every {
|
||||
featureFlagManager.getFeatureFlag(FlagKey.UserManagedPrivilegedApps)
|
||||
} returns false
|
||||
|
||||
val viewModel = createVaultItemListingViewModel()
|
||||
|
||||
assertEquals(
|
||||
VaultItemListingState.DialogState.CredentialManagerOperationFail(
|
||||
title = BitwardenString.an_error_has_occurred.asText(),
|
||||
message = BitwardenString.passkey_operation_failed_because_browser_is_not_privileged
|
||||
.asText(),
|
||||
),
|
||||
viewModel.stateFlow.value.dialogState,
|
||||
)
|
||||
}
|
||||
|
||||
@Suppress("MaxLineLength")
|
||||
@Test
|
||||
fun `ValidateOriginResult should update dialog state on PrivilegedAppSignatureNotFound error`() =
|
||||
@@ -5863,7 +5826,6 @@ class VaultItemListingViewModelTest : BaseViewModelTest() {
|
||||
originManager = originManager,
|
||||
networkConnectionManager = networkConnectionManager,
|
||||
privilegedAppRepository = privilegedAppRepository,
|
||||
featureFlagManager = featureFlagManager,
|
||||
snackbarRelayManager = snackbarRelayManager,
|
||||
toastManager = toastManager,
|
||||
relyingPartyParser = relyingPartyParser,
|
||||
|
||||
-5
@@ -26,7 +26,6 @@ fun <T : Any> FlagKey<T>.ListItemContent(
|
||||
FlagKey.CipherKeyEncryption,
|
||||
FlagKey.CredentialExchangeProtocolExport,
|
||||
FlagKey.CredentialExchangeProtocolImport,
|
||||
FlagKey.UserManagedPrivilegedApps,
|
||||
-> BooleanFlagItem(
|
||||
label = flagKey.getDisplayLabel(),
|
||||
key = flagKey as FlagKey<Boolean>,
|
||||
@@ -67,10 +66,6 @@ private fun <T : Any> FlagKey<T>.getDisplayLabel(): String = when (this) {
|
||||
FlagKey.CredentialExchangeProtocolImport -> stringResource(BitwardenString.cxp_import)
|
||||
FlagKey.CredentialExchangeProtocolExport -> stringResource(BitwardenString.cxp_export)
|
||||
FlagKey.CipherKeyEncryption -> stringResource(BitwardenString.cipher_key_encryption)
|
||||
FlagKey.UserManagedPrivilegedApps -> {
|
||||
stringResource(BitwardenString.user_trusted_privileged_app_management)
|
||||
}
|
||||
|
||||
FlagKey.BitwardenAuthenticationEnabled -> {
|
||||
stringResource(BitwardenString.bitwarden_authentication_enabled)
|
||||
}
|
||||
|
||||
@@ -32,7 +32,6 @@ sealed class FlagKey<out T : Any> {
|
||||
listOf(
|
||||
CredentialExchangeProtocolImport,
|
||||
CredentialExchangeProtocolExport,
|
||||
UserManagedPrivilegedApps,
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -63,14 +62,6 @@ sealed class FlagKey<out T : Any> {
|
||||
override val defaultValue: Boolean = false
|
||||
}
|
||||
|
||||
/**
|
||||
* Data object holding the feature flag key to enabled user-managed privileged apps.
|
||||
*/
|
||||
data object UserManagedPrivilegedApps : FlagKey<Boolean>() {
|
||||
override val keyName: String = "pm-18970-user-managed-privileged-apps"
|
||||
override val defaultValue: Boolean = false
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates the state of Bitwarden authentication.
|
||||
*/
|
||||
|
||||
@@ -20,10 +20,6 @@ class FlagKeyTest {
|
||||
FlagKey.CipherKeyEncryption.keyName,
|
||||
"cipher-key-encryption",
|
||||
)
|
||||
assertEquals(
|
||||
FlagKey.UserManagedPrivilegedApps.keyName,
|
||||
"pm-18970-user-managed-privileged-apps",
|
||||
)
|
||||
assertEquals(
|
||||
FlagKey.BitwardenAuthenticationEnabled.keyName,
|
||||
"bitwarden-authentication-enabled",
|
||||
@@ -37,7 +33,6 @@ class FlagKeyTest {
|
||||
FlagKey.CredentialExchangeProtocolImport,
|
||||
FlagKey.CredentialExchangeProtocolExport,
|
||||
FlagKey.CipherKeyEncryption,
|
||||
FlagKey.UserManagedPrivilegedApps,
|
||||
FlagKey.BitwardenAuthenticationEnabled,
|
||||
).all {
|
||||
!it.defaultValue
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
<string name="generate_crash">Generate crash</string>
|
||||
<string name="generate_error_report">Generate error report</string>
|
||||
<string name="error_reports">Error reports</string>
|
||||
<string name="user_trusted_privileged_app_management">User-trusted privileged app management</string>
|
||||
<string name="bitwarden_authentication_enabled">Bitwarden authentication enabled</string>
|
||||
<string name="import_format_label_bitwarden_json">Bitwarden (.json)</string>
|
||||
<string name="import_format_label_2fas_json">2FAS (no password)</string>
|
||||
|
||||
Reference in New Issue
Block a user