mirror of
https://github.com/bitwarden/browser
synced 2025-12-17 00:33:44 +00:00
add one time setup dialog for auto confirm
This commit is contained in:
@@ -8,10 +8,13 @@ import {
|
|||||||
TemplateRef,
|
TemplateRef,
|
||||||
viewChild,
|
viewChild,
|
||||||
} from "@angular/core";
|
} from "@angular/core";
|
||||||
|
import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
|
||||||
import { FormBuilder } from "@angular/forms";
|
import { FormBuilder } from "@angular/forms";
|
||||||
import { Router } from "@angular/router";
|
import { Router } from "@angular/router";
|
||||||
import {
|
import {
|
||||||
combineLatest,
|
combineLatest,
|
||||||
|
filter,
|
||||||
|
first,
|
||||||
firstValueFrom,
|
firstValueFrom,
|
||||||
map,
|
map,
|
||||||
Observable,
|
Observable,
|
||||||
@@ -20,8 +23,10 @@ import {
|
|||||||
startWith,
|
startWith,
|
||||||
switchMap,
|
switchMap,
|
||||||
tap,
|
tap,
|
||||||
|
zip,
|
||||||
} from "rxjs";
|
} from "rxjs";
|
||||||
|
|
||||||
|
import { AutomaticUserConfirmationService } from "@bitwarden/admin-console/common";
|
||||||
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
|
import { 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 { 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 { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
|
||||||
@@ -116,6 +121,7 @@ export class AutoConfirmPolicyDialogComponent
|
|||||||
private organizationService: OrganizationService,
|
private organizationService: OrganizationService,
|
||||||
private policyService: PolicyService,
|
private policyService: PolicyService,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
|
private autoConfirmService: AutomaticUserConfirmationService,
|
||||||
) {
|
) {
|
||||||
super(
|
super(
|
||||||
data,
|
data,
|
||||||
@@ -131,6 +137,18 @@ export class AutoConfirmPolicyDialogComponent
|
|||||||
);
|
);
|
||||||
|
|
||||||
this.firstTimeDialog.set(data.firstTimeDialog ?? false);
|
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,3 +2,5 @@ export { PoliciesComponent } from "./policies.component";
|
|||||||
export { ossPolicyEditRegister } from "./policy-edit-register";
|
export { ossPolicyEditRegister } from "./policy-edit-register";
|
||||||
export { BasePolicyEditDefinition, BasePolicyEditComponent } from "./base-policy-edit.component";
|
export { BasePolicyEditDefinition, BasePolicyEditComponent } from "./base-policy-edit.component";
|
||||||
export { POLICY_EDIT_REGISTER } from "./policy-register-token";
|
export { POLICY_EDIT_REGISTER } from "./policy-register-token";
|
||||||
|
export { AutoConfirmPolicyDialogComponent } from "./auto-confirm-edit-policy-dialog.component";
|
||||||
|
export { AutoConfirmPolicy } from "./policy-edit-definitions";
|
||||||
|
|||||||
@@ -9,6 +9,10 @@ import {
|
|||||||
DefaultCollectionAdminService,
|
DefaultCollectionAdminService,
|
||||||
OrganizationUserApiService,
|
OrganizationUserApiService,
|
||||||
CollectionService,
|
CollectionService,
|
||||||
|
AutomaticUserConfirmationService,
|
||||||
|
DefaultAutomaticUserConfirmationService,
|
||||||
|
OrganizationUserService,
|
||||||
|
DefaultOrganizationUserService,
|
||||||
} from "@bitwarden/admin-console/common";
|
} from "@bitwarden/admin-console/common";
|
||||||
import { DefaultDeviceManagementComponentService } from "@bitwarden/angular/auth/device-management/default-device-management-component.service";
|
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";
|
import { DeviceManagementComponentServiceAbstraction } from "@bitwarden/angular/auth/device-management/device-management-component.service.abstraction";
|
||||||
@@ -43,7 +47,10 @@ import {
|
|||||||
} from "@bitwarden/auth/common";
|
} from "@bitwarden/auth/common";
|
||||||
import { ApiService } from "@bitwarden/common/abstractions/api.service";
|
import { ApiService } from "@bitwarden/common/abstractions/api.service";
|
||||||
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
|
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 { PolicyApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/policy/policy-api.service.abstraction";
|
||||||
import {
|
import {
|
||||||
InternalPolicyService,
|
InternalPolicyService,
|
||||||
@@ -334,6 +341,29 @@ const safeProviders: SafeProvider[] = [
|
|||||||
OrganizationService,
|
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({
|
safeProvider({
|
||||||
provide: SdkLoadService,
|
provide: SdkLoadService,
|
||||||
useClass: flagEnabled("sdk") ? WebSdkLoadService : NoopSdkLoadService,
|
useClass: flagEnabled("sdk") ? WebSdkLoadService : NoopSdkLoadService,
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
lastValueFrom,
|
lastValueFrom,
|
||||||
Observable,
|
Observable,
|
||||||
Subject,
|
Subject,
|
||||||
|
zip,
|
||||||
} from "rxjs";
|
} from "rxjs";
|
||||||
import {
|
import {
|
||||||
concatMap,
|
concatMap,
|
||||||
@@ -25,6 +26,7 @@ import {
|
|||||||
} from "rxjs/operators";
|
} from "rxjs/operators";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
AutomaticUserConfirmationService,
|
||||||
CollectionData,
|
CollectionData,
|
||||||
CollectionDetailsResponse,
|
CollectionDetailsResponse,
|
||||||
CollectionService,
|
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 { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
|
||||||
import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction";
|
import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction";
|
||||||
import { EventType } from "@bitwarden/common/enums";
|
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 { 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 { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||||
import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service";
|
import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service";
|
||||||
@@ -102,6 +106,10 @@ import {
|
|||||||
getNestedCollectionTree,
|
getNestedCollectionTree,
|
||||||
getFlatCollectionTree,
|
getFlatCollectionTree,
|
||||||
} from "../../admin-console/organizations/collections";
|
} from "../../admin-console/organizations/collections";
|
||||||
|
import {
|
||||||
|
AutoConfirmPolicy,
|
||||||
|
AutoConfirmPolicyDialogComponent,
|
||||||
|
} from "../../admin-console/organizations/policies";
|
||||||
import {
|
import {
|
||||||
CollectionDialogAction,
|
CollectionDialogAction,
|
||||||
CollectionDialogTabType,
|
CollectionDialogTabType,
|
||||||
@@ -328,6 +336,8 @@ export class VaultComponent<C extends CipherViewLike> implements OnInit, OnDestr
|
|||||||
private policyService: PolicyService,
|
private policyService: PolicyService,
|
||||||
private unifiedUpgradePromptService: UnifiedUpgradePromptService,
|
private unifiedUpgradePromptService: UnifiedUpgradePromptService,
|
||||||
private premiumUpgradePromptService: PremiumUpgradePromptService,
|
private premiumUpgradePromptService: PremiumUpgradePromptService,
|
||||||
|
private autoConfirmService: AutomaticUserConfirmationService,
|
||||||
|
private configService: ConfigService,
|
||||||
) {}
|
) {}
|
||||||
|
|
||||||
async ngOnInit() {
|
async ngOnInit() {
|
||||||
@@ -629,6 +639,26 @@ export class VaultComponent<C extends CipherViewLike> implements OnInit, OnDestr
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
void this.unifiedUpgradePromptService.displayUpgradePromptConditionally();
|
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() {
|
ngOnDestroy() {
|
||||||
@@ -1547,6 +1577,16 @@ export class VaultComponent<C extends CipherViewLike> implements OnInit, OnDestr
|
|||||||
const cipherView = await this.cipherService.decrypt(_cipher, activeUserId);
|
const cipherView = await this.cipherService.decrypt(_cipher, activeUserId);
|
||||||
return cipherView.login?.password;
|
return cipherView.login?.password;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private openAutoConfirmFeatureDialog(organization: Organization) {
|
||||||
|
AutoConfirmPolicyDialogComponent.open(this.dialogService, {
|
||||||
|
data: {
|
||||||
|
policy: new AutoConfirmPolicy(),
|
||||||
|
organizationId: organization.id,
|
||||||
|
firstTimeDialog: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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.
|
// 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
|
// eslint-disable-next-line no-restricted-imports
|
||||||
import {
|
import {
|
||||||
|
AutomaticUserConfirmationService,
|
||||||
CollectionService,
|
CollectionService,
|
||||||
|
DefaultAutomaticUserConfirmationService,
|
||||||
DefaultCollectionService,
|
DefaultCollectionService,
|
||||||
DefaultOrganizationUserApiService,
|
DefaultOrganizationUserApiService,
|
||||||
DefaultOrganizationUserService,
|
DefaultOrganizationUserService,
|
||||||
@@ -1136,6 +1138,18 @@ const safeProviders: SafeProvider[] = [
|
|||||||
I18nServiceAbstraction,
|
I18nServiceAbstraction,
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
|
safeProvider({
|
||||||
|
provide: AutomaticUserConfirmationService,
|
||||||
|
useClass: DefaultAutomaticUserConfirmationService,
|
||||||
|
deps: [
|
||||||
|
ConfigService,
|
||||||
|
ApiService,
|
||||||
|
OrganizationUserService,
|
||||||
|
StateProvider,
|
||||||
|
InternalOrganizationServiceAbstraction,
|
||||||
|
OrganizationUserApiService,
|
||||||
|
],
|
||||||
|
}),
|
||||||
safeProvider({
|
safeProvider({
|
||||||
provide: OrganizationServiceAbstraction,
|
provide: OrganizationServiceAbstraction,
|
||||||
useExisting: InternalOrganizationServiceAbstraction,
|
useExisting: InternalOrganizationServiceAbstraction,
|
||||||
|
|||||||
Reference in New Issue
Block a user