From 98530ed33dedf2139d9e022a84beaaaa22e71e38 Mon Sep 17 00:00:00 2001 From: David Perez Date: Fri, 19 Sep 2025 15:09:54 -0500 Subject: [PATCH] PM-26027: Remove the UserManagedPrivilegedApps feature flag (#5914) --- .../di/CredentialProviderModule.kt | 3 -- .../credentials/manager/OriginManagerImpl.kt | 8 +--- .../components/FeatureFlagListItems.kt | 5 --- .../settings/autofill/AutoFillScreen.kt | 33 ++++++-------- .../settings/autofill/AutoFillViewModel.kt | 32 -------------- .../itemlisting/VaultItemListingViewModel.kt | 6 +-- .../credentials/manager/OriginManagerTest.kt | 35 +-------------- .../debugmenu/DebugMenuViewModelTest.kt | 2 - .../settings/autofill/AutoFillScreenTest.kt | 18 -------- .../autofill/AutoFillViewModelTest.kt | 14 ------ .../VaultItemListingViewModelTest.kt | 44 ++----------------- .../components/FeatureFlagListItems.kt | 5 --- .../core/data/manager/model/FlagKey.kt | 9 ---- .../core/data/manager/model/FlagKeyTest.kt | 5 --- .../main/res/values/strings_non_localized.xml | 1 - 15 files changed, 20 insertions(+), 200 deletions(-) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/di/CredentialProviderModule.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/di/CredentialProviderModule.kt index 38e1cbdd0a..b6c131d676 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/di/CredentialProviderModule.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/di/CredentialProviderModule.kt @@ -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 diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/manager/OriginManagerImpl.kt b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/manager/OriginManagerImpl.kt index b61cdfce66..7db20e9516 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/manager/OriginManagerImpl.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/data/credentials/manager/OriginManagerImpl.kt @@ -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( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt index 4918cb69f6..6a5c86eb74 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt @@ -29,7 +29,6 @@ fun FlagKey.ListItemContent( FlagKey.CredentialExchangeProtocolImport, FlagKey.CredentialExchangeProtocolExport, FlagKey.CipherKeyEncryption, - FlagKey.UserManagedPrivilegedApps, -> { @Suppress("UNCHECKED_CAST") BooleanFlagItem( @@ -74,10 +73,6 @@ private fun FlagKey.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) } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreen.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreen.kt index 5ae2c51ed5..10bdc9a586 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreen.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreen.kt @@ -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( diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModel.kt index d696d7b0df..53733cb2c7 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModel.kt @@ -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( 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, - 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() } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt index cc7a1bd1c8..e806b10a85 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModel.kt @@ -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, diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/manager/OriginManagerTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/manager/OriginManagerTest.kt index 64e267c716..9cbe70d40d 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/manager/OriginManagerTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/data/credentials/manager/OriginManagerTest.kt @@ -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() - private val mockFeatureFlagManager = mockk { - every { getFeatureFlag(FlagKey.UserManagedPrivilegedApps) } returns true - } private val mockMessageDigest = mockk { 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, -) + ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt index 3ffd56336a..32aa056127 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/debugmenu/DebugMenuViewModelTest.kt @@ -146,13 +146,11 @@ class DebugMenuViewModelTest : BaseViewModelTest() { private val DEFAULT_MAP_VALUE: ImmutableMap, Any> = persistentMapOf( FlagKey.CredentialExchangeProtocolImport to true, FlagKey.CredentialExchangeProtocolExport to true, - FlagKey.UserManagedPrivilegedApps to true, ) private val UPDATED_MAP_VALUE: ImmutableMap, Any> = persistentMapOf( FlagKey.CredentialExchangeProtocolImport to false, FlagKey.CredentialExchangeProtocolExport to false, - FlagKey.UserManagedPrivilegedApps to false, ) private val DEFAULT_STATE = DebugMenuState( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreenTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreenTest.kt index 246b6b7575..cc903c62b0 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreenTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillScreenTest.kt @@ -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, ) diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModelTest.kt index 46fec390d7..68224e7c91 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/platform/feature/settings/autofill/AutoFillViewModelTest.kt @@ -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 { - 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( diff --git a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt index b3470d8f4d..f58fc6c379 100644 --- a/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt +++ b/app/src/test/kotlin/com/x8bit/bitwarden/ui/vault/feature/itemlisting/VaultItemListingViewModelTest.kt @@ -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, diff --git a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt index 823b900d6f..296f5cfbef 100644 --- a/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt +++ b/authenticator/src/main/kotlin/com/bitwarden/authenticator/ui/platform/feature/debugmenu/components/FeatureFlagListItems.kt @@ -26,7 +26,6 @@ fun FlagKey.ListItemContent( FlagKey.CipherKeyEncryption, FlagKey.CredentialExchangeProtocolExport, FlagKey.CredentialExchangeProtocolImport, - FlagKey.UserManagedPrivilegedApps, -> BooleanFlagItem( label = flagKey.getDisplayLabel(), key = flagKey as FlagKey, @@ -67,10 +66,6 @@ private fun FlagKey.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) } diff --git a/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt b/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt index 43075961a3..e3a814195a 100644 --- a/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt +++ b/core/src/main/kotlin/com/bitwarden/core/data/manager/model/FlagKey.kt @@ -32,7 +32,6 @@ sealed class FlagKey { listOf( CredentialExchangeProtocolImport, CredentialExchangeProtocolExport, - UserManagedPrivilegedApps, ) } } @@ -63,14 +62,6 @@ sealed class FlagKey { override val defaultValue: Boolean = false } - /** - * Data object holding the feature flag key to enabled user-managed privileged apps. - */ - data object UserManagedPrivilegedApps : FlagKey() { - override val keyName: String = "pm-18970-user-managed-privileged-apps" - override val defaultValue: Boolean = false - } - /** * Indicates the state of Bitwarden authentication. */ diff --git a/core/src/test/kotlin/com/bitwarden/core/data/manager/model/FlagKeyTest.kt b/core/src/test/kotlin/com/bitwarden/core/data/manager/model/FlagKeyTest.kt index 22a1d17e73..21efb757d8 100644 --- a/core/src/test/kotlin/com/bitwarden/core/data/manager/model/FlagKeyTest.kt +++ b/core/src/test/kotlin/com/bitwarden/core/data/manager/model/FlagKeyTest.kt @@ -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 diff --git a/ui/src/main/res/values/strings_non_localized.xml b/ui/src/main/res/values/strings_non_localized.xml index 91c888b531..94e5c61ed7 100644 --- a/ui/src/main/res/values/strings_non_localized.xml +++ b/ui/src/main/res/values/strings_non_localized.xml @@ -31,7 +31,6 @@ Generate crash Generate error report Error reports - User-trusted privileged app management Bitwarden authentication enabled Bitwarden (.json) 2FAS (no password)