1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-16 08:13:42 +00:00

add one time setup dialog for auto confirm

This commit is contained in:
Brandon
2025-10-29 10:34:32 -04:00
parent ff30df3dd6
commit 5326ecedca
5 changed files with 105 additions and 1 deletions

View File

@@ -8,10 +8,13 @@ import {
TemplateRef,
viewChild,
} from "@angular/core";
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
import { FormBuilder } from "@angular/forms";
import { Router } from "@angular/router";
import {
combineLatest,
filter,
first,
firstValueFrom,
map,
Observable,
@@ -20,8 +23,10 @@ import {
startWith,
switchMap,
tap,
zip,
} from "rxjs";
import { AutomaticUserConfirmationService } from "@bitwarden/admin-console/common";
import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PolicyType } from "@bitwarden/common/admin-console/enums";
@@ -107,6 +112,7 @@ export class AutoConfirmPolicyDialogComponent
keyService: KeyService,
private policyService: PolicyService,
private router: Router,
private autoConfirmService: AutomaticUserConfirmationService,
) {
super(
data,
@@ -122,6 +128,18 @@ export class AutoConfirmPolicyDialogComponent
);
this.firstTimeDialog.set(data.firstTimeDialog ?? false);
const userId$ = this.accountService.activeAccount$.pipe(getUserId);
zip([userId$.pipe(switchMap((userId) => autoConfirmService.configuration$(userId))), userId$])
.pipe(
first(),
filter(([state]) => state.showSetupDialog),
switchMap(([autoConfirmState, userId]) =>
this.autoConfirmService.upsert(userId, { ...autoConfirmState, showSetupDialog: false }),
),
takeUntilDestroyed(),
)
.subscribe();
}
/**

View File

@@ -2,3 +2,5 @@ export { PoliciesComponent } from "./policies.component";
export { ossPolicyEditRegister } from "./policy-edit-register";
export { BasePolicyEditDefinition, BasePolicyEditComponent } from "./base-policy-edit.component";
export { POLICY_EDIT_REGISTER } from "./policy-register-token";
export { AutoConfirmPolicyDialogComponent } from "./auto-confirm-edit-policy-dialog.component";
export { AutoConfirmPolicy } from "./policy-edit-definitions";

View File

@@ -9,6 +9,10 @@ import {
DefaultCollectionAdminService,
OrganizationUserApiService,
CollectionService,
AutomaticUserConfirmationService,
DefaultAutomaticUserConfirmationService,
OrganizationUserService,
DefaultOrganizationUserService,
} from "@bitwarden/admin-console/common";
import { DefaultDeviceManagementComponentService } from "@bitwarden/angular/auth/device-management/default-device-management-component.service";
import { DeviceManagementComponentServiceAbstraction } from "@bitwarden/angular/auth/device-management/device-management-component.service.abstraction";
@@ -43,7 +47,10 @@ import {
} from "@bitwarden/auth/common";
import { ApiService } from "@bitwarden/common/abstractions/api.service";
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import {
InternalOrganizationServiceAbstraction,
OrganizationService,
} from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction";
import {
InternalPolicyService,
@@ -332,6 +339,29 @@ const safeProviders: SafeProvider[] = [
OrganizationService,
],
}),
safeProvider({
provide: OrganizationUserService,
useClass: DefaultOrganizationUserService,
deps: [
KeyServiceAbstraction,
EncryptService,
OrganizationUserApiService,
AccountService,
I18nServiceAbstraction,
],
}),
safeProvider({
provide: AutomaticUserConfirmationService,
useClass: DefaultAutomaticUserConfirmationService,
deps: [
ConfigService,
ApiService,
OrganizationUserService,
StateProvider,
InternalOrganizationServiceAbstraction,
OrganizationUserApiService,
],
}),
safeProvider({
provide: SdkLoadService,
useClass: flagEnabled("sdk") ? WebSdkLoadService : NoopSdkLoadService,

View File

@@ -9,6 +9,7 @@ import {
lastValueFrom,
Observable,
Subject,
zip,
} from "rxjs";
import {
concatMap,
@@ -25,6 +26,7 @@ import {
} from "rxjs/operators";
import {
AutomaticUserConfirmationService,
CollectionData,
CollectionDetailsResponse,
CollectionService,
@@ -54,7 +56,9 @@ import { getUserId } from "@bitwarden/common/auth/services/account.service";
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction";
import { EventType } from "@bitwarden/common/enums";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service";
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service";
@@ -101,6 +105,10 @@ import {
getNestedCollectionTree,
getFlatCollectionTree,
} from "../../admin-console/organizations/collections";
import {
AutoConfirmPolicy,
AutoConfirmPolicyDialogComponent,
} from "../../admin-console/organizations/policies";
import {
CollectionDialogAction,
CollectionDialogTabType,
@@ -326,6 +334,8 @@ export class VaultComponent<C extends CipherViewLike> implements OnInit, OnDestr
private organizationWarningsService: OrganizationWarningsService,
private policyService: PolicyService,
private unifiedUpgradePromptService: UnifiedUpgradePromptService,
private autoConfirmService: AutomaticUserConfirmationService,
private configService: ConfigService,
) {}
async ngOnInit() {
@@ -627,6 +637,26 @@ export class VaultComponent<C extends CipherViewLike> implements OnInit, OnDestr
},
);
void this.unifiedUpgradePromptService.displayUpgradePromptConditionally();
zip([
this.configService.getFeatureFlag$(FeatureFlag.AutoConfirm),
this.userId$.pipe(switchMap((userId) => this.autoConfirmService.configuration$(userId))),
this.organizations$.pipe(map((organizations) => organizations[0])),
])
.pipe(
filter(
([enabled, autoConfirmState, organization]) =>
enabled &&
autoConfirmState.showSetupDialog &&
!!organization &&
organization.canManageUsers,
),
first(),
takeUntil(this.destroy$),
)
.subscribe(([enabled, autoConfirmState, organization]) =>
this.openAutoConfirmFeatureDialog(organization),
);
}
ngOnDestroy() {
@@ -1545,6 +1575,16 @@ export class VaultComponent<C extends CipherViewLike> implements OnInit, OnDestr
const cipherView = await this.cipherService.decrypt(_cipher, activeUserId);
return cipherView.login?.password;
}
private openAutoConfirmFeatureDialog(organization: Organization) {
AutoConfirmPolicyDialogComponent.open(this.dialogService, {
data: {
policy: new AutoConfirmPolicy(),
organizationId: organization.id,
firstTimeDialog: true,
},
});
}
}
/**

View File

@@ -6,7 +6,9 @@ import { Subject } from "rxjs";
// This import has been flagged as unallowed for this class. It may be involved in a circular dependency loop.
// eslint-disable-next-line no-restricted-imports
import {
AutomaticUserConfirmationService,
CollectionService,
DefaultAutomaticUserConfirmationService,
DefaultCollectionService,
DefaultOrganizationUserApiService,
DefaultOrganizationUserService,
@@ -1134,6 +1136,18 @@ const safeProviders: SafeProvider[] = [
I18nServiceAbstraction,
],
}),
safeProvider({
provide: AutomaticUserConfirmationService,
useClass: DefaultAutomaticUserConfirmationService,
deps: [
ConfigService,
ApiService,
OrganizationUserService,
StateProvider,
InternalOrganizationServiceAbstraction,
OrganizationUserApiService,
],
}),
safeProvider({
provide: OrganizationServiceAbstraction,
useExisting: InternalOrganizationServiceAbstraction,