+
-
+
{{ trashCleanupWarning }}
@@ -81,44 +83,6 @@
-
diff --git a/apps/web/src/app/vault/individual-vault/vault.component.ts b/apps/web/src/app/vault/individual-vault/vault.component.ts
index 474e9045d0..ca04b3aa51 100644
--- a/apps/web/src/app/vault/individual-vault/vault.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault.component.ts
@@ -35,9 +35,6 @@ import { EventCollectionService } from "@bitwarden/common/abstractions/event/eve
import { SearchService } from "@bitwarden/common/abstractions/search.service";
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
-import { KdfConfigService } from "@bitwarden/common/auth/abstractions/kdf-config.service";
-import { TokenService } from "@bitwarden/common/auth/abstractions/token.service";
-import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction";
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
import { EventType } from "@bitwarden/common/enums";
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
@@ -47,7 +44,6 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service";
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
-import { KdfType, PBKDF2_ITERATIONS } from "@bitwarden/common/platform/enums";
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
import { CollectionService } from "@bitwarden/common/vault/abstractions/collection.service";
@@ -122,10 +118,6 @@ export class VaultComponent implements OnInit, OnDestroy {
@ViewChild("collectionsModal", { read: ViewContainerRef, static: true })
collectionsModalRef: ViewContainerRef;
- showVerifyEmail = false;
- showBrowserOutdated = false;
- showPremiumCallout = false;
- showLowKdf = false;
trashCleanupWarning: string = null;
kdfIterations: number;
activeFilter: VaultFilter = new VaultFilter();
@@ -161,7 +153,6 @@ export class VaultComponent implements OnInit, OnDestroy {
private i18nService: I18nService,
private modalService: ModalService,
private dialogService: DialogService,
- private tokenService: TokenService,
private messagingService: MessagingService,
private platformUtilsService: PlatformUtilsService,
private broadcasterService: BroadcasterService,
@@ -180,14 +171,11 @@ export class VaultComponent implements OnInit, OnDestroy {
private searchPipe: SearchPipe,
private configService: ConfigService,
private apiService: ApiService,
- private userVerificationService: UserVerificationService,
private billingAccountProfileStateService: BillingAccountProfileStateService,
private toastService: ToastService,
- protected kdfConfigService: KdfConfigService,
) {}
async ngOnInit() {
- this.showBrowserOutdated = window.navigator.userAgent.indexOf("MSIE") !== -1;
this.trashCleanupWarning = this.i18nService.t(
this.platformUtilsService.isSelfHost()
? "trashCleanupWarningSelfHosted"
@@ -197,18 +185,8 @@ export class VaultComponent implements OnInit, OnDestroy {
const firstSetup$ = this.route.queryParams.pipe(
first(),
switchMap(async (params: Params) => {
- this.showVerifyEmail = !(await this.tokenService.getEmailVerified());
- this.showLowKdf = (await this.userVerificationService.hasMasterPassword())
- ? await this.isLowKdfIteration()
- : false;
await this.syncService.fullSync(false);
- const canAccessPremium = await firstValueFrom(
- this.billingAccountProfileStateService.hasPremiumFromAnySource$,
- );
- this.showPremiumCallout =
- !this.showVerifyEmail && !canAccessPremium && !this.platformUtilsService.isSelfHost();
-
const cipherId = getCipherIdFromParams(params);
if (!cipherId) {
return;
@@ -412,16 +390,6 @@ export class VaultComponent implements OnInit, OnDestroy {
);
}
- get isShowingCards() {
- return (
- this.showBrowserOutdated || this.showPremiumCallout || this.showVerifyEmail || this.showLowKdf
- );
- }
-
- emailVerified(verified: boolean) {
- this.showVerifyEmail = !verified;
- }
-
ngOnDestroy() {
this.broadcasterService.unsubscribe(BroadcasterSubscriptionId);
this.destroy$.next();
@@ -1005,14 +973,6 @@ export class VaultComponent implements OnInit, OnDestroy {
: this.cipherService.softDeleteWithServer(id);
}
- async isLowKdfIteration() {
- const kdfConfig = await this.kdfConfigService.getKdfConfig();
- return (
- kdfConfig.kdfType === KdfType.PBKDF2_SHA256 &&
- kdfConfig.iterations < PBKDF2_ITERATIONS.defaultValue
- );
- }
-
protected async repromptCipher(ciphers: CipherView[]) {
const notProtected = !ciphers.find((cipher) => cipher.reprompt !== CipherRepromptType.None);
diff --git a/apps/web/src/app/vault/individual-vault/vault.module.ts b/apps/web/src/app/vault/individual-vault/vault.module.ts
index 81fc38eda1..c79c64c1eb 100644
--- a/apps/web/src/app/vault/individual-vault/vault.module.ts
+++ b/apps/web/src/app/vault/individual-vault/vault.module.ts
@@ -1,7 +1,8 @@
import { NgModule } from "@angular/core";
-import { BreadcrumbsModule } from "@bitwarden/components";
+import { BannerModule, BreadcrumbsModule } from "@bitwarden/components";
+import { VerifyEmailComponent } from "../../auth/settings/verify-email.component";
import { LooseComponentsModule, SharedModule } from "../../shared";
import { CollectionDialogModule } from "../components/collection-dialog";
import { VaultItemsModule } from "../components/vault-items/vault-items.module";
@@ -11,6 +12,8 @@ import { GroupBadgeModule } from "../org-vault/group-badge/group-badge.module";
import { BulkDialogsModule } from "./bulk-action-dialogs/bulk-dialogs.module";
import { OrganizationBadgeModule } from "./organization-badge/organization-badge.module";
import { PipesModule } from "./pipes/pipes.module";
+import { VaultBannersService } from "./vault-banners/services/vault-banners.service";
+import { VaultBannersComponent } from "./vault-banners/vault-banners.component";
import { VaultFilterModule } from "./vault-filter/vault-filter.module";
import { VaultHeaderComponent } from "./vault-header/vault-header.component";
import { VaultOnboardingService as VaultOnboardingServiceAbstraction } from "./vault-onboarding/services/abstraction/vault-onboarding.service";
@@ -34,10 +37,13 @@ import { VaultComponent } from "./vault.component";
VaultItemsModule,
CollectionDialogModule,
VaultOnboardingComponent,
+ BannerModule,
+ VerifyEmailComponent,
],
- declarations: [VaultComponent, VaultHeaderComponent],
+ declarations: [VaultComponent, VaultHeaderComponent, VaultBannersComponent],
exports: [VaultComponent],
providers: [
+ VaultBannersService,
{
provide: VaultOnboardingServiceAbstraction,
useClass: VaultOnboardingService,
diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index 3f67df15be..e79497d25e 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -8223,6 +8223,12 @@
}
}
},
+ "lowKDFIterationsBanner": {
+ "message": "Low KDF iterations. Increase your iterations to improve the security of your account."
+ },
+ "changeKDFSettings": {
+ "message": "Change KDF settings"
+ },
"secureYourInfrastructure": {
"message": "Secure your infrastructure"
},
diff --git a/libs/common/src/platform/state/state-definitions.ts b/libs/common/src/platform/state/state-definitions.ts
index 6f225f6c2f..986c51f4b7 100644
--- a/libs/common/src/platform/state/state-definitions.ts
+++ b/libs/common/src/platform/state/state-definitions.ts
@@ -160,3 +160,7 @@ export const CIPHERS_DISK_LOCAL = new StateDefinition("ciphersLocal", "disk", {
export const CIPHERS_MEMORY = new StateDefinition("ciphersMemory", "memory", {
browser: "memory-large-object",
});
+export const PREMIUM_BANNER_DISK_LOCAL = new StateDefinition("premiumBannerReprompt", "disk", {
+ web: "disk-local",
+});
+export const BANNERS_DISMISSED_DISK = new StateDefinition("bannersDismissed", "disk");