From 3c6f7632338dc3aee265d3dfefae1b0d020faad4 Mon Sep 17 00:00:00 2001 From: SmithThe4th Date: Fri, 11 Jul 2025 12:50:31 -0400 Subject: [PATCH] [PM-23306] "Show cards in autofill" is defaulting to on when the setting is enabled (#15534) * disable card autofill * Fixed dependency issues --- .../browser/src/background/main.background.ts | 51 ++++++++++--------- .../src/popup/services/services.module.ts | 3 +- .../service-container/service-container.ts | 23 +++++---- .../src/services/jslib-services.module.ts | 4 +- .../services/autofill-settings.service.ts | 17 ++++++- .../vault-settings/vault-settings.service.ts | 20 ++++++-- 6 files changed, 75 insertions(+), 43 deletions(-) diff --git a/apps/browser/src/background/main.background.ts b/apps/browser/src/background/main.background.ts index 3f29151a1b..0d7fe74006 100644 --- a/apps/browser/src/background/main.background.ts +++ b/apps/browser/src/background/main.background.ts @@ -752,11 +752,6 @@ export default class MainBackground { this.stateProvider, ); - this.autofillSettingsService = new AutofillSettingsService( - this.stateProvider, - this.policyService, - this.accountService, - ); this.badgeSettingsService = new BadgeSettingsService(this.stateProvider); this.policyApiService = new PolicyApiService( this.policyService, @@ -844,16 +839,6 @@ export default class MainBackground { this.tokenService, ); - this.billingAccountProfileStateService = new DefaultBillingAccountProfileStateService( - this.stateProvider, - this.platformUtilsService, - this.apiService, - ); - - this.ssoLoginService = new SsoLoginService(this.stateProvider, this.logService); - - this.userVerificationApiService = new UserVerificationApiService(this.apiService); - this.configApiService = new ConfigApiService(this.apiService, this.tokenService); this.configService = new DefaultConfigService( @@ -864,6 +849,30 @@ export default class MainBackground { this.authService, ); + this.billingAccountProfileStateService = new DefaultBillingAccountProfileStateService( + this.stateProvider, + this.platformUtilsService, + this.apiService, + ); + + this.restrictedItemTypesService = new RestrictedItemTypesService( + this.configService, + this.accountService, + this.organizationService, + this.policyService, + ); + + this.autofillSettingsService = new AutofillSettingsService( + this.stateProvider, + this.policyService, + this.accountService, + this.restrictedItemTypesService, + ); + + this.ssoLoginService = new SsoLoginService(this.stateProvider, this.logService); + + this.userVerificationApiService = new UserVerificationApiService(this.apiService); + this.domainSettingsService = new DefaultDomainSettingsService( this.stateProvider, this.configService, @@ -928,7 +937,10 @@ export default class MainBackground { this.i18nService, ); - this.vaultSettingsService = new VaultSettingsService(this.stateProvider); + this.vaultSettingsService = new VaultSettingsService( + this.stateProvider, + this.restrictedItemTypesService, + ); this.vaultTimeoutService = new VaultTimeoutService( this.accountService, @@ -1315,13 +1327,6 @@ export default class MainBackground { this.stateProvider, ); - this.restrictedItemTypesService = new RestrictedItemTypesService( - this.configService, - this.accountService, - this.organizationService, - this.policyService, - ); - this.mainContextMenuHandler = new MainContextMenuHandler( this.stateService, this.autofillSettingsService, diff --git a/apps/browser/src/popup/services/services.module.ts b/apps/browser/src/popup/services/services.module.ts index ca8a76f7bc..54d09ab9d8 100644 --- a/apps/browser/src/popup/services/services.module.ts +++ b/apps/browser/src/popup/services/services.module.ts @@ -118,6 +118,7 @@ import { InternalFolderService, } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction"; import { TotpService as TotpServiceAbstraction } from "@bitwarden/common/vault/abstractions/totp.service"; +import { RestrictedItemTypesService } from "@bitwarden/common/vault/services/restricted-item-types.service"; import { TotpService } from "@bitwarden/common/vault/services/totp.service"; import { AnonLayoutWrapperDataService, @@ -486,7 +487,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: AutofillSettingsServiceAbstraction, useClass: AutofillSettingsService, - deps: [StateProvider, PolicyService, AccountService], + deps: [StateProvider, PolicyService, AccountService, RestrictedItemTypesService], }), safeProvider({ provide: UserNotificationSettingsServiceAbstraction, diff --git a/apps/cli/src/service-container/service-container.ts b/apps/cli/src/service-container/service-container.ts index 53950e5da1..aa507aec1d 100644 --- a/apps/cli/src/service-container/service-container.ts +++ b/apps/cli/src/service-container/service-container.ts @@ -685,11 +685,23 @@ export class ServiceContainer { this.configService, ); + this.restrictedItemTypesService = new RestrictedItemTypesService( + this.configService, + this.accountService, + this.organizationService, + this.policyService, + ); + + this.cliRestrictedItemTypesService = new CliRestrictedItemTypesService( + this.restrictedItemTypesService, + ); + // FIXME: CLI does not support autofill this.autofillSettingsService = new AutofillSettingsService( this.stateProvider, this.policyService, this.accountService, + this.restrictedItemTypesService, ); this.cipherEncryptionService = new DefaultCipherEncryptionService( @@ -796,17 +808,6 @@ export class ServiceContainer { this.totpService = new TotpService(this.sdkService); - this.restrictedItemTypesService = new RestrictedItemTypesService( - this.configService, - this.accountService, - this.organizationService, - this.policyService, - ); - - this.cliRestrictedItemTypesService = new CliRestrictedItemTypesService( - this.restrictedItemTypesService, - ); - this.importApiService = new ImportApiService(this.apiService); this.importService = new ImportService( diff --git a/libs/angular/src/services/jslib-services.module.ts b/libs/angular/src/services/jslib-services.module.ts index c3f33f2a79..3af6c5b1eb 100644 --- a/libs/angular/src/services/jslib-services.module.ts +++ b/libs/angular/src/services/jslib-services.module.ts @@ -1319,7 +1319,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: AutofillSettingsServiceAbstraction, useClass: AutofillSettingsService, - deps: [StateProvider, PolicyServiceAbstraction, AccountService], + deps: [StateProvider, PolicyServiceAbstraction, AccountService, RestrictedItemTypesService], }), safeProvider({ provide: BadgeSettingsServiceAbstraction, @@ -1334,7 +1334,7 @@ const safeProviders: SafeProvider[] = [ safeProvider({ provide: VaultSettingsServiceAbstraction, useClass: VaultSettingsService, - deps: [StateProvider], + deps: [StateProvider, RestrictedItemTypesService], }), safeProvider({ provide: MigrationRunner, diff --git a/libs/common/src/autofill/services/autofill-settings.service.ts b/libs/common/src/autofill/services/autofill-settings.service.ts index 3346ef99a5..c56f852d3d 100644 --- a/libs/common/src/autofill/services/autofill-settings.service.ts +++ b/libs/common/src/autofill/services/autofill-settings.service.ts @@ -1,6 +1,9 @@ // FIXME: Update this file to be type safe and remove this and next line // @ts-strict-ignore -import { map, Observable, switchMap } from "rxjs"; +import { combineLatest, map, Observable, startWith, switchMap } from "rxjs"; + +import { CipherType } from "@bitwarden/common/vault/enums"; +import { RestrictedItemTypesService } from "@bitwarden/common/vault/services/restricted-item-types.service"; import { PolicyService } from "../../admin-console/abstractions/policy/policy.service.abstraction"; import { PolicyType } from "../../admin-console/enums"; @@ -155,6 +158,7 @@ export class AutofillSettingsService implements AutofillSettingsServiceAbstracti private stateProvider: StateProvider, private policyService: PolicyService, private accountService: AccountService, + private restrictedItemTypesService: RestrictedItemTypesService, ) { this.autofillOnPageLoadState = this.stateProvider.getActive(AUTOFILL_ON_PAGE_LOAD); this.autofillOnPageLoad$ = this.autofillOnPageLoadState.state$.pipe(map((x) => x ?? false)); @@ -199,7 +203,16 @@ export class AutofillSettingsService implements AutofillSettingsServiceAbstracti ); this.showInlineMenuCardsState = this.stateProvider.getActive(SHOW_INLINE_MENU_CARDS); - this.showInlineMenuCards$ = this.showInlineMenuCardsState.state$.pipe(map((x) => x ?? true)); + this.showInlineMenuCards$ = combineLatest([ + this.showInlineMenuCardsState.state$.pipe(map((x) => x ?? true)), + this.restrictedItemTypesService.restricted$.pipe(startWith([])), + ]).pipe( + map( + ([enabled, restrictions]) => + // If enabled, show cards inline menu unless card type is restricted + enabled && !restrictions.some((r) => r.cipherType === CipherType.Card), + ), + ); this.enableContextMenuState = this.stateProvider.getGlobal(ENABLE_CONTEXT_MENU); this.enableContextMenu$ = this.enableContextMenuState.state$.pipe(map((x) => x ?? true)); diff --git a/libs/common/src/vault/services/vault-settings/vault-settings.service.ts b/libs/common/src/vault/services/vault-settings/vault-settings.service.ts index 423acba8ff..28671a94cc 100644 --- a/libs/common/src/vault/services/vault-settings/vault-settings.service.ts +++ b/libs/common/src/vault/services/vault-settings/vault-settings.service.ts @@ -1,13 +1,15 @@ -import { Observable, map, shareReplay } from "rxjs"; +import { Observable, combineLatest, map, shareReplay, startWith } from "rxjs"; import { ActiveUserState, GlobalState, StateProvider } from "../../../platform/state"; import { VaultSettingsService as VaultSettingsServiceAbstraction } from "../../abstractions/vault-settings/vault-settings.service"; +import { CipherType } from "../../enums"; import { SHOW_CARDS_CURRENT_TAB, SHOW_IDENTITIES_CURRENT_TAB, USER_ENABLE_PASSKEYS, CLICK_ITEMS_AUTOFILL_VAULT_VIEW, } from "../key-state/vault-settings.state"; +import { RestrictedItemTypesService } from "../restricted-item-types.service"; /** * {@link VaultSettingsServiceAbstraction} @@ -27,8 +29,15 @@ export class VaultSettingsService implements VaultSettingsServiceAbstraction { /** * {@link VaultSettingsServiceAbstraction.showCardsCurrentTab$} */ - readonly showCardsCurrentTab$: Observable = this.showCardsCurrentTabState.state$.pipe( - map((x) => x ?? true), + readonly showCardsCurrentTab$: Observable = combineLatest([ + this.showCardsCurrentTabState.state$.pipe(map((x) => x ?? true)), + this.restrictedItemTypesService.restricted$.pipe(startWith([])), + ]).pipe( + map( + ([enabled, restrictions]) => + // If enabled, show cards tab unless card type is restricted + enabled && !restrictions.some((r) => r.cipherType === CipherType.Card), + ), ); private showIdentitiesCurrentTabState: ActiveUserState = this.stateProvider.getActive( @@ -51,7 +60,10 @@ export class VaultSettingsService implements VaultSettingsServiceAbstraction { shareReplay({ bufferSize: 1, refCount: false }), ); - constructor(private stateProvider: StateProvider) {} + constructor( + private stateProvider: StateProvider, + private restrictedItemTypesService: RestrictedItemTypesService, + ) {} /** * {@link VaultSettingsServiceAbstraction.setShowCardsCurrentTab}