PM-26027: Remove the UserManagedPrivilegedApps feature flag (#5914)

This commit is contained in:
David Perez
2025-09-19 20:09:54 +00:00
committed by GitHub
parent e57af949fc
commit 98530ed33d
15 changed files with 20 additions and 200 deletions
@@ -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,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(
@@ -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)
}
@@ -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(
@@ -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()
}
}
@@ -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,
@@ -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,
)
)
@@ -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(
@@ -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,
)
@@ -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(
@@ -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,
@@ -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>