Repository: bitwarden/clients
Pull request #13852: [PM-19237] Add Archive Filter Type
Author: login: gbubemismith
Created: 2025-03-14T21:53:25Z | Merged: 2025-03-19T18:47:19Z

## 🎟️ Tracking
https://bitwarden.atlassian.net/browse/PM-19237
<!-- Paste the link to the Jira or GitHub issue or otherwise describe / point to where this change is coming from. -->

## 📔 Objective
Add `Archive` filter type to the end user vault view.
<!-- Describe what the purpose of this PR is, for example what bug you're fixing or new feature you're adding. -->

## 📸 Screenshots

https://github.com/user-attachments/assets/25d0b8e0-216b-4841-97a0-2550f7c1e197


<!-- Required for any UI changes; delete if not applicable. Use fixed width images for better display. -->

## ⏰ Reminders before review

- Contributor guidelines followed
- All formatters and local linters executed and passed
- Written new unit and / or integration tests where applicable
- Protected functional changes with optionality (feature flags)
- Used internationalization (i18n) for all UI strings
- CI builds passed
- Communicated to DevOps any deployment requirements
- Updated any necessary documentation (Confluence, contributing docs) or informed the documentation team

## 🦮 Reviewer guidelines

<!-- Suggested interactions but feel free to use (or not) as you desire! -->

- 👍 (`:+1:`) or similar for great changes
- 📝 (`:memo:`) or ℹ️ (`:information_source:`) for notes or general info
- ❓ (`:question:`) for questions
- 🤔 (`:thinking:`) or 💭 (`:thought_balloon:`) for more open inquiry that's not quite a confirmed issue and could potentially benefit from discussion
- 🎨 (`:art:`) for suggestions / improvements
- ❌ (`:x:`) or ⚠️ (`:warning:`) for more significant problems or concerns needing attention
- 🌱 (`:seedling:`) or ♻️ (`:recycle:`) for future improvements or indications of technical debt
- ⛏ (`:pick:`) for minor or nitpick changes



Diff:
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts
index 786c5de740ef..efc018717d42 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/components/vault-filter.component.ts
@@ -1,12 +1,12 @@
 // FIXME: Update this file to be type safe and remove this and next line
 // @ts-strict-ignore
 import { Component, EventEmitter, inject, Input, OnDestroy, OnInit, Output } from "@angular/core";
-import { Router } from "@angular/router";
 import { firstValueFrom, merge, Subject, switchMap, takeUntil } from "rxjs";
 
 import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
 import { PolicyType } from "@bitwarden/common/admin-console/enums";
 import { BillingApiServiceAbstraction } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction";
+import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
 import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
 import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
 import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
@@ -47,7 +47,6 @@ export class VaultFilterComponent implements OnInit, OnDestroy {
   isLoaded = false;
 
   protected destroy$: Subject<void> = new Subject<void>();
-  private router = inject(Router);
   get filtersList() {
     return this.filters ? Object.values(this.filters) : [];
   }
@@ -59,6 +58,9 @@ export class VaultFilterComponent implements OnInit, OnDestroy {
     if (this.activeFilter.isDeleted) {
       return "searchTrash";
     }
+    if (this.activeFilter.isArchived) {
+      return "searchArchive";
+    }
     if (this.activeFilter.cipherType === CipherType.Login) {
       return "searchLogin";
     }
@@ -185,6 +187,14 @@ export class VaultFilterComponent implements OnInit, OnDestroy {
     builderFilter.typeFilter = await this.addTypeFilter();
     builderFilter.folderFilter = await this.addFolderFilter();
     builderFilter.collectionFilter = await this.addCollectionFilter();
+    // PM19148: Innovation Archive
+    if (
+      await firstValueFrom(
+        this.configService.getFeatureFlag$(FeatureFlag.PM19148_InnovationArchive),
+      )
+    ) {
+      builderFilter.archiveFilter = await this.addArchiveFilter();
+    }
     builderFilter.trashFilter = await this.addTrashFilter();
     return builderFilter;
   }
@@ -322,4 +332,31 @@ export class VaultFilterComponent implements OnInit, OnDestroy {
     };
     return trashFilterSection;
   }
+
+  protected async addArchiveFilter(): Promise<VaultFilterSection> {
+    const archiveFilterSection: VaultFilterSection = {
+      data$: this.vaultFilterService.buildTypeTree(
+        {
+          id: "headArchive",
+          name: "HeadArchive",
+          type: "archive",
+          icon: "bwi-archive",
+        },
+        [
+          {
+            id: "archive",
+            name: this.i18nService.t("archive"),
+            type: "archive",
+            icon: "bwi-archive",
+          },
+        ],
+      ),
+      header: {
+        showHeader: false,
+        isSelectable: true,
+      },
+      action: this.applyTypeFilter,
+    };
+    return archiveFilterSection;
+  }
 }
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts b/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts
index 25874d683beb..936dfb0e6750 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/services/routed-vault-filter-bridge.service.ts
@@ -174,6 +174,11 @@ function createLegacyFilterForEndUser(
       { id: "trash", name: "", type: "trash", icon: "" },
       null,
     );
+  } else if (filter.type !== undefined && filter.type === "archive") {
+    legacyFilter.selectedCipherTypeNode = new TreeNode<CipherTypeFilter>(
+      { id: "archive", name: "", type: "archive", icon: "" },
+      null,
+    );
   } else if (filter.type !== undefined && filter.type !== "trash") {
     legacyFilter.selectedCipherTypeNode = ServiceUtils.getTreeNodeObject(
       cipherTypeTree,
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/filter-function.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/filter-function.ts
index a39918df4a7f..2c983d66a103 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/filter-function.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/filter-function.ts
@@ -6,7 +6,10 @@ import { All, RoutedVaultFilterModel } from "./routed-vault-filter.model";
 
 export type FilterFunction = (cipher: CipherView) => boolean;
 
-export function createFilterFunction(filter: RoutedVaultFilterModel): FilterFunction {
+export function createFilterFunction(
+  filter: RoutedVaultFilterModel,
+  archiveEnabled?: boolean,
+): FilterFunction {
   return (cipher) => {
     if (filter.type === "favorites" && !cipher.favorite) {
       return false;
@@ -33,6 +36,15 @@ export function createFilterFunction(filter: RoutedVaultFilterModel): FilterFunc
     if (filter.type !== "trash" && cipher.isDeleted) {
       return false;
     }
+    // Archive filter logic is only applied if the feature flag is enabled
+    if (archiveEnabled) {
+      if (filter.type === "archive" && !cipher.isArchived) {
+        return false;
+      }
+      if (filter.type !== "archive" && cipher.isArchived) {
+        return false;
+      }
+    }
     // No folder
     if (filter.folderId === Unassigned && cipher.folderId !== null) {
       return false;
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter-bridge.model.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter-bridge.model.ts
index fe236a089e02..a168b8001f9a 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter-bridge.model.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter-bridge.model.ts
@@ -129,6 +129,9 @@ export class RoutedVaultFilterBridge implements VaultFilter {
   get isDeleted(): boolean {
     return this.legacyFilter.isDeleted;
   }
+  get isArchived(): boolean {
+    return this.legacyFilter.isArchived;
+  }
   get organizationId(): string {
     return this.legacyFilter.organizationId;
   }
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter.model.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter.model.ts
index 866ba1d9848f..c333922864fd 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter.model.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/routed-vault-filter.model.ts
@@ -8,6 +8,7 @@ const itemTypes = [
   "identity",
   "note",
   "sshKey",
+  "archive",
   "trash",
   All,
 ] as const;
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter-section.type.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter-section.type.ts
index 0f949e17146d..7f91e7ba1338 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter-section.type.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter-section.type.ts
@@ -20,6 +20,7 @@ export enum VaultFilterLabel {
   TypeFilter = "typeFilter",
   FolderFilter = "folderFilter",
   CollectionFilter = "collectionFilter",
+  ArchiveFilter = "archiveFilter",
   TrashFilter = "trashFilter",
 }
 
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.ts
index c486ad800ab9..dadf482565e4 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.model.ts
@@ -72,6 +72,10 @@ export class VaultFilter {
     return this.selectedCipherTypeNode?.node.type === "trash" ? true : null;
   }
 
+  get isArchived(): boolean {
+    return this.selectedCipherTypeNode?.node.type === "archive";
+  }
+
   get organizationId(): string {
     return this.selectedOrganizationNode?.node.id;
   }
@@ -121,6 +125,9 @@ export class VaultFilter {
       if (this.isDeleted && cipherPassesFilter) {
         cipherPassesFilter = cipher.isDeleted;
       }
+      if (this.isArchived && cipherPassesFilter) {
+        cipherPassesFilter = cipher.isArchived;
+      }
       if (this.cipherType && cipherPassesFilter) {
         cipherPassesFilter = cipher.type === this.cipherType;
       }
diff --git a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.type.ts b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.type.ts
index 9259dd081147..7a92db6a3814 100644
--- a/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.type.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-filter/shared/models/vault-filter.type.ts
@@ -4,7 +4,7 @@ import { CipherType } from "@bitwarden/common/vault/enums";
 import { ITreeNodeObject } from "@bitwarden/common/vault/models/domain/tree-node";
 import { FolderView } from "@bitwarden/common/vault/models/view/folder.view";
 
-export type CipherStatus = "all" | "favorites" | "trash" | CipherType;
+export type CipherStatus = "all" | "favorites" | "archive" | "trash" | CipherType;
 
 export type CipherTypeFilter = ITreeNodeObject & { type: CipherStatus; icon: string };
 export type CollectionFilter = CollectionAdminView & {
diff --git a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts
index 489f42649f92..bdfcabb6a4b6 100644
--- a/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault-header/vault-header.component.ts
@@ -143,6 +143,10 @@ export class VaultHeaderComponent implements OnInit {
       return this.i18nService.t("myVault");
     }
 
+    if (this.filter.type === "archive") {
+      return this.i18nService.t("archive");
+    }
+
     const activeOrganization = this.activeOrganization;
     if (activeOrganization) {
       return `${activeOrganization.name} ${this.i18nService.t("vault").toLowerCase()}`;
diff --git a/apps/web/src/app/vault/individual-vault/vault.component.html b/apps/web/src/app/vault/individual-vault/vault.component.html
index 1a2a1fdbca6d..00f12a77cd9f 100644
--- a/apps/web/src/app/vault/individual-vault/vault.component.html
+++ b/apps/web/src/app/vault/individual-vault/vault.component.html
@@ -70,17 +70,20 @@
       class="tw-mt-6 tw-flex tw-h-full tw-flex-col tw-items-center tw-justify-start"
     >
       <bit-icon [icon]="noItemIcon" aria-hidden="true"></bit-icon>
-      <p>{{ "noItemsInList" | i18n }}</p>
-      <button
-        type="button"
-        buttonType="primary"
-        bitButton
-        (click)="addCipher()"
-        *ngIf="filter.type !== 'trash'"
-      >
-        <i class="bwi bwi-plus-f bwi-fw" aria-hidden="true"></i>
-        {{ "newItem" | i18n }}
-      </button>
+      @if (filter.type === "archive") {
+        <div bitTypography="h4" class="tw-mt-4">{{ "noItemsInArchive" | i18n }}</div>
+        <p class="tw-text-center tw-max-w-md">
+          {{ "archivedItemsDescription" | i18n }}
+        </p>
+      } @else {
+        <p>{{ "noItemsInList" | i18n }}</p>
+        @if (filter.type !== "trash") {
+          <button type="button" buttonType="primary" bitButton (click)="addCipher()">
+            <i class="bwi bwi-plus-f bwi-fw" aria-hidden="true"></i>
+            {{ "newItem" | i18n }}
+          </button>
+        }
+      }
     </div>
   </div>
 </div>
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 d4441c73719b..5eefd14f9b2e 100644
--- a/apps/web/src/app/vault/individual-vault/vault.component.ts
+++ b/apps/web/src/app/vault/individual-vault/vault.component.ts
@@ -1,7 +1,15 @@
 // FIXME: Update this file to be type safe and remove this and next line
 // @ts-strict-ignore
 import { DialogRef } from "@angular/cdk/dialog";
-import { ChangeDetectorRef, Component, NgZone, OnDestroy, OnInit, ViewChild } from "@angular/core";
+import {
+  ChangeDetectorRef,
+  Component,
+  NgZone,
+  OnDestroy,
+  OnInit,
+  ViewChild,
+  inject,
+} from "@angular/core";
 import { ActivatedRoute, Params, Router } from "@angular/router";
 import {
   BehaviorSubject,
@@ -50,7 +58,9 @@ import { OrganizationBillingServiceAbstraction } from "@bitwarden/common/billing
 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";
@@ -148,11 +158,13 @@ const SearchTextDebounceInterval = 200;
   ],
 })
 export class VaultComponent implements OnInit, OnDestroy {
+  private configService: ConfigService = inject(ConfigService);
   @ViewChild("vaultFilter", { static: true }) filterComponent: VaultFilterComponent;
 
   trashCleanupWarning: string = null;
   kdfIterations: number;
   activeFilter: VaultFilter = new VaultFilter();
+  archiveItemEnabled$: Observable<boolean>;
 
   protected noItemIcon = Icons.Search;
   protected performingInitialLoad = true;
@@ -270,7 +282,11 @@ export class VaultComponent implements OnInit, OnDestroy {
     private trialFlowService: TrialFlowService,
     private organizationBillingService: OrganizationBillingServiceAbstraction,
     private billingNotificationService: BillingNotificationService,
-  ) {}
+  ) {
+    this.archiveItemEnabled$ = this.configService.getFeatureFlag$(
+      FeatureFlag.PM19148_InnovationArchive,
+    );
+  }
 
   async ngOnInit() {
     this.trashCleanupWarning = this.i18nService.t(
@@ -346,13 +362,14 @@ export class VaultComponent implements OnInit, OnDestroy {
       this.cipherService.cipherViews$(activeUserId).pipe(filter((c) => c !== null)),
       filter$,
       this.currentSearchText$,
+      this.archiveItemEnabled$,
     ]).pipe(
       filter(([ciphers, filter]) => ciphers != undefined && filter != undefined),
-      concatMap(async ([ciphers, filter, searchText]) => {
+      concatMap(async ([ciphers, filter, searchText, archiveEnabled]) => {
         const failedCiphers = await firstValueFrom(
           this.cipherService.failedToDecryptCiphers$(activeUserId),
         );
-        const filterFunction = createFilterFunction(filter);
+        const filterFunction = createFilterFunction(filter, archiveEnabled);
         // Append any failed to decrypt ciphers to the top of the cipher list
         const allCiphers = [...failedCiphers, ...ciphers];
 
diff --git a/apps/web/src/locales/en/messages.json b/apps/web/src/locales/en/messages.json
index 7f9c89484c2a..afc3c950ea64 100644
--- a/apps/web/src/locales/en/messages.json
+++ b/apps/web/src/locales/en/messages.json
@@ -10570,5 +10570,17 @@
   },
   "cannotCreateCollection": {
     "message": "Free organizations may have up to 2 collections. Upgrade to a paid plan to add more collections."
+  },
+  "searchArchive": {
+    "message": "Search archive"
+  },
+  "archive": {
+    "message": "Archive"
+  },
+  "noItemsInArchive": {
+    "message": "No items in archive"
+  },
+  "archivedItemsDescription": {
+    "message": "Archived items will appear here and will be excluded from general search results and autofill suggestions."
   }
 }
diff --git a/libs/angular/src/scss/bwicons/fonts/bwi-font.svg b/libs/angular/src/scss/bwicons/fonts/bwi-font.svg
index c8535bebef87..b59907d0a7cb 100644
--- a/libs/angular/src/scss/bwicons/fonts/bwi-font.svg
+++ b/libs/angular/src/scss/bwicons/fonts/bwi-font.svg
@@ -217,6 +217,9 @@
 <glyph unicode="&#xe9bc;" glyph-name="tor" data-tags="tor" d="M513.050-34.88v62.067c196.601 0.57 355.795 160.083 355.795 356.827 0 196.73-159.194 356.246-355.795 356.813v62.066c230.879-0.582 417.843-187.873 417.843-418.879 0-231.022-186.963-418.324-417.843-418.894zM513.050 182.362c110.89 0.582 200.646 90.606 200.646 201.652 0 111.032-89.756 201.059-200.646 201.641v62.052c145.183-0.568 262.713-118.384 262.713-263.693 0-145.32-117.53-263.137-262.713-263.707v62.054zM513.050 492.563c59.483-0.568 107.555-48.924 107.555-108.548 0-59.639-48.072-107.995-107.555-108.563v217.111zM0 384.014c0-282.785 229.218-512.014 512-512.014 282.771 0 512 229.229 512 512.014 0 282.768-229.229 511.986-512 511.986-282.782 0-512-229.218-512-511.986z" />
 <glyph unicode="&#xe9bd;" glyph-name="vivaldi" data-tags="vivaldi" d="M568.914 148.378c63.212 110.191 126.427 220.156 189.64 330.12 7.648 13.322 10.797 27.548 8.544 42.676-4.499 35.225-40.493 60.74-75.136 53.063-42.515-9.484-63.435-53.515-43.866-92.804 7.2-14.225 10.573-29.58 10.803-47.644-0.096-0.842-0.192-2.072-0.301-3.512-0.154-2.036-0.339-4.494-0.602-6.874-6.298-55.773-55.115-93.933-107.53-90.771-37.117 2.258-65.012 20.096-83.908 51.933-8.444 14.028-16.604 28.339-24.787 42.689-4.462 7.825-8.931 15.662-13.456 23.471-7.513 12.982-14.985 26.004-22.451 39.015-10.196 17.767-20.38 35.514-30.639 53.111-13.047 22.354-32.844 34.321-58.488 32.966-48.591-2.483-76.035-54.191-51.74-96.642 14.731-25.841 29.546-51.597 44.342-77.321 9.38-16.309 18.754-32.605 28.093-48.9 6.112-10.667 12.225-21.339 18.338-32.013 33.489-58.474 67.028-117.036 100.889-175.269 13.272-22.579 33.969-33.645 60.063-31.84 23.395 1.805 40.492 14.003 52.19 34.547zM942.566-46.49c81.434 81.517 81.434 206.157 81.434 430.602s0 349.086-81.434 430.6c-81.658 81.288-206.285 81.288-430.566 81.288s-348.907 0-430.566-81.514c-81.434-81.514-81.434-206.155-81.434-430.599s0-349.084 81.434-430.601c81.659-81.286 206.285-81.286 430.566-81.286s348.909 0 430.566 81.51zM239.353 654.846c149.821 149.931 392.548 149.931 542.145 0 149.818-149.705 149.818-392.665 0-542.596-149.821-149.933-392.549-149.933-542.145 0-149.596 149.706-149.596 392.666 0 542.596z" />
 <glyph unicode="&#xe9be;" glyph-name="x-twitter" data-tags="x-twitter" d="M608.342 462.848l380.499 433.152h-90.154l-330.538-376.022-263.809 376.022h-304.341l399.018-568.662-399.018-454.186h90.155l348.844 397.184 278.656-397.184h304.339l-413.651 589.696zM484.822 322.346l-362.156 507.094h138.496l637.484-892.97h-138.496l-275.328 385.875z" />
+<glyph unicode="&#xe9bf;" glyph-name="archive1" data-tags="bwi-archive" d="M432.792 416.78c-26.509 0-48-21.528-48-48.083s21.491-48.083 48-48.083h160c26.509 0 48.001 21.528 48.001 48.083s-21.492 48.083-48.001 48.083h-160zM64.003 511.788h32.282l-0.001-447.564c0-70.816 57.308-128.224 128-128.224h576.586c70.694 0 128 57.408 128 128.224v447.564h31.136c35.341 0 64 28.703 64 64.111l-0.006 127.99c0 35.408-28.653 64.111-64 64.111h-896c-35.346 0-64-28.703-64-64.111l0.003-127.99c0-35.407 28.654-64.111 64-64.111zM96.003 607.955l-0.003 63.879h832l0.006-62.493h-831.722v-1.386h-0.282zM192.284 64.224l0.001 447.564h640.586v-447.564c0-17.702-14.33-32.058-32-32.058h-576.586c-17.673 0-32 14.355-32 32.058z" />
+<glyph unicode="&#xe9c0;" glyph-name="bwi-paypal" data-tags="bwi-paypal" d="M938.667 479.531c0-22.87-2.771-46.251-7.206-69.419-36.141-188.544-159.834-253.696-317.826-253.696h-24.406c-19.328 0-35.754-14.253-38.741-33.664l-34.261-217.171c-3.030-19.328-19.456-33.581-38.742-33.581h-116.736c-16.64 0-29.354 14.848-26.794 31.232l59.136 378.88 2.645 2.389h91.947c223.362 0 363.048 111.702 404.181 322.902 34.643-34.731 46.803-80.043 46.803-127.872v0zM332.12 298.112c4.949 35.243 19.584 50.219 59.093 50.304l96.427 0.085c195.155 0 307.117 89.174 342.317 272.64 34.131 176.384-89.69 274.859-257.325 274.859h-313.344c-22.059 0-40.875-16.299-44.288-38.443-98.304-632.962-126.72-793.897-129.621-843.010-0.896-15.443 11.477-28.672 27.093-28.672h170.197l49.451 312.237z" />
+<glyph unicode="&#xe9c1;" glyph-name="archive" data-tags="archive" d="M432.792 416.78c-26.509 0-48-21.528-48-48.083s21.491-48.083 48-48.083h160c26.509 0 48.001 21.528 48.001 48.083s-21.492 48.083-48.001 48.083h-160zM64.003 511.788h32.282l-0.001-447.564c0-70.816 57.308-128.224 128-128.224h576.586c70.694 0 128 57.408 128 128.224v447.564h31.136c35.341 0 64 28.703 64 64.111l-0.006 127.99c0 35.408-28.653 64.111-64 64.111h-896c-35.346 0-64-28.703-64-64.111l0.003-127.99c0-35.407 28.654-64.111 64-64.111zM96.003 607.955l-0.003 63.879h832l0.006-62.493h-831.722v-1.386h-0.282zM192.284 64.224l0.001 447.564h640.586v-447.564c0-17.702-14.33-32.058-32-32.058h-576.586c-17.673 0-32 14.355-32 32.058z" />
 <glyph unicode="&#xe9ee;" glyph-name="rocket" data-tags="rocket" d="M650.515 648.267c33.538 33.532 87.904 33.532 121.443 0 33.538-33.538 33.538-87.904 0-121.443s-87.904-33.538-121.443 0c-33.532 33.538-33.532 87.904 0 121.443zM750.801 627.113c-21.855 21.856-57.284 21.856-79.134 0-21.856-21.855-21.856-57.284 0-79.134 21.855-21.855 57.284-21.855 79.134 0s21.855 57.284 0 79.134zM493.141 680.645c113.184 90.608 223.416 148.836 310.181 180.552 43.273 15.818 81.527 25.336 111.933 28.691 15.138 1.668 29.339 1.929 41.709 0.19 11.507-1.615 25.903-5.552 36.583-16.232l3.981-3.981c10.68-10.679 14.617-25.076 16.232-36.582 1.739-12.377 1.478-26.572-0.19-41.71-3.356-30.406-12.874-68.659-28.691-111.932-31.716-86.771-89.944-196.998-180.552-310.187-29.487-36.837-59.902-73.855-91.847-111.076l30.789-145.412c4.388-20.715-0.21-42.314-12.654-59.447l-89.489-123.202c-35.299-48.598-110.586-37.857-130.894 18.67l-31.576 87.886-74.269-74.269c-5.844-5.844-15.313-5.844-21.151 0-5.844 5.845-5.844 15.313 0 21.152l80.747 80.747-47.795 47.794-162.229-162.229c-5.844-5.844-15.313-5.844-21.151 0s-5.844 15.313 0 21.151l162.229 162.229-54.059 54.060-306.392-306.392c-5.844-5.844-15.313-5.844-21.151 0-5.844 5.845-5.844 15.313 0 21.151l306.391 306.392-54.059 54.060-61.939-61.939c-5.845-5.844-15.313-5.844-21.151 0-5.845 5.844-5.845 15.313 0 21.151l61.938 61.939-47.794 47.794-112.086-112.086c-5.844-5.844-15.312-5.844-21.151 0-5.844 5.845-5.844 15.313 0 21.152l109.675 109.669-100.568 36.13c-56.526 20.307-67.261 95.6-18.663 130.894l123.202 89.489c17.132 12.444 38.73 17.041 59.446 12.654l145.412-30.789c37.221 31.945 74.238 62.36 111.076 91.847zM952.797 829.985c-0.744 0.223-2.062 0.551-4.14 0.84-5.79 0.812-14.652 0.934-26.837-0.411-24.234-2.675-57.643-10.683-97.952-25.414-80.389-29.379-184.973-84.318-293.329-171.062-38.013-30.432-76.092-61.749-114.295-94.665-2.919-4.249-6.879-7.644-11.433-9.895-54.88-47.714-110.027-98.85-165.607-155.478l258.391-258.39c56.628 55.58 107.765 110.728 155.48 165.609 2.25 4.551 5.643 8.51 9.89 11.427 32.912 38.205 64.235 76.284 94.667 114.298 86.744 108.362 141.683 212.941 171.063 293.329 14.73 40.309 22.744 73.723 25.414 97.952 1.345 12.179 1.222 21.047 0.411 26.837-0.29 2.078-0.619 3.397-0.84 4.14l-0.875 0.875zM224.258 561.056c-4.141 0.875-8.464-0.045-11.889-2.533l-123.202-89.489c-9.719-7.058-7.573-22.117 3.736-26.177l96.234-34.573c45.935 47.161 91.519 90.548 136.803 131.242l-101.677 21.529zM663.214 202.25c-40.694-45.278-84.081-90.868-131.243-136.803l34.574-96.235c4.061-11.304 19.119-13.455 26.177-3.736l89.489 123.202c2.488 3.425 3.408 7.748 2.533 11.889l-21.529 101.678z" />
 <glyph unicode="&#xe9ef;" glyph-name="ellipsis-h" data-tags="ellipsis-h" d="M876.633 299.353c-46.75 0-84.647 37.897-84.647 84.647s37.897 84.647 84.647 84.647c46.75 0 84.647-37.897 84.647-84.647s-37.897-84.647-84.647-84.647zM512 299.353c-46.75 0-84.647 37.897-84.647 84.647s37.897 84.647 84.647 84.647c46.75 0 84.647-37.897 84.647-84.647s-37.897-84.647-84.647-84.647zM147.367 299.353c-46.75 0-84.647 37.897-84.647 84.647s37.897 84.647 84.647 84.647c46.75 0 84.647-37.897 84.647-84.647s-37.897-84.647-84.647-84.647z" />
 <glyph unicode="&#xe9f0;" glyph-name="ellipsis-v" data-tags="ellipsis-v" d="M427.353 19.367c0 46.75 37.897 84.647 84.647 84.647s84.647-37.897 84.647-84.647c0-46.75-37.897-84.647-84.647-84.647s-84.647 37.897-84.647 84.647zM427.353 384c0 46.75 37.897 84.647 84.647 84.647s84.647-37.897 84.647-84.647c0-46.75-37.897-84.647-84.647-84.647s-84.647 37.897-84.647 84.647zM427.353 748.633c0 46.75 37.897 84.647 84.647 84.647s84.647-37.897 84.647-84.647c0-46.75-37.897-84.647-84.647-84.647s-84.647 37.897-84.647 84.647z" />
diff --git a/libs/angular/src/scss/bwicons/fonts/bwi-font.ttf b/libs/angular/src/scss/bwicons/fonts/bwi-font.ttf
index 9696152a4988..b61ad0f4e4e9 100644
Binary files a/libs/angular/src/scss/bwicons/fonts/bwi-font.ttf and b/libs/angular/src/scss/bwicons/fonts/bwi-font.ttf differ
diff --git a/libs/angular/src/scss/bwicons/fonts/bwi-font.woff b/libs/angular/src/scss/bwicons/fonts/bwi-font.woff
index 554375a1ce90..cbca17c53ebd 100644
Binary files a/libs/angular/src/scss/bwicons/fonts/bwi-font.woff and b/libs/angular/src/scss/bwicons/fonts/bwi-font.woff differ
diff --git a/libs/angular/src/scss/bwicons/fonts/bwi-font.woff2 b/libs/angular/src/scss/bwicons/fonts/bwi-font.woff2
index 80544871f3aa..04bee37352d5 100644
Binary files a/libs/angular/src/scss/bwicons/fonts/bwi-font.woff2 and b/libs/angular/src/scss/bwicons/fonts/bwi-font.woff2 differ
diff --git a/libs/angular/src/scss/bwicons/styles/style.scss b/libs/angular/src/scss/bwicons/styles/style.scss
index 3a0c9610bd46..c09769666840 100644
--- a/libs/angular/src/scss/bwicons/styles/style.scss
+++ b/libs/angular/src/scss/bwicons/styles/style.scss
@@ -295,6 +295,7 @@ $icons: (
   "icon-7": "\e9b7",
   "icon-8": "\e9b8",
   "icon-9": "\e9b9",
+  "archive": "\e9c1",
 );
 
 @each $name, $glyph in $icons {
diff --git a/libs/common/src/enums/feature-flag.enum.ts b/libs/common/src/enums/feature-flag.enum.ts
index dda27d202def..6622b309400d 100644
--- a/libs/common/src/enums/feature-flag.enum.ts
+++ b/libs/common/src/enums/feature-flag.enum.ts
@@ -46,6 +46,7 @@ export enum FeatureFlag {
   PM15179_AddExistingOrgsFromProviderPortal = "pm-15179-add-existing-orgs-from-provider-portal",
   PM12276_BreadcrumbEventLogs = "pm-12276-breadcrumbing-for-business-features",
   PM18794_ProviderPaymentMethod = "pm-18794-provider-payment-method",
+  PM19148_InnovationArchive = "pm-19148-innovation-archive",
 }
 
 export type AllowedFeatureFlagTypes = boolean | number | string;
@@ -102,6 +103,7 @@ export const DefaultFeatureFlagValue = {
   [FeatureFlag.PM15179_AddExistingOrgsFromProviderPortal]: FALSE,
   [FeatureFlag.PM12276_BreadcrumbEventLogs]: FALSE,
   [FeatureFlag.PM18794_ProviderPaymentMethod]: FALSE,
+  [FeatureFlag.PM19148_InnovationArchive]: FALSE,
 } satisfies Record<FeatureFlag, AllowedFeatureFlagTypes>;
 
 export type DefaultFeatureFlagValueType = typeof DefaultFeatureFlagValue;
diff --git a/libs/common/src/vault/models/data/cipher.data.ts b/libs/common/src/vault/models/data/cipher.data.ts
index ee5e5b3e72b9..47cf948b4220 100644
--- a/libs/common/src/vault/models/data/cipher.data.ts
+++ b/libs/common/src/vault/models/data/cipher.data.ts
@@ -40,6 +40,7 @@ export class CipherData {
   collectionIds?: string[];
   creationDate: string;
   deletedDate: string;
+  archivedDate: string | null;
   reprompt: CipherRepromptType;
   key: string;
 
@@ -63,6 +64,7 @@ export class CipherData {
     this.collectionIds = collectionIds != null ? collectionIds : response.collectionIds;
     this.creationDate = response.creationDate;
     this.deletedDate = response.deletedDate;
+    this.archivedDate = response.archivedDate;
     this.reprompt = response.reprompt;
     this.key = response.key;
 
diff --git a/libs/common/src/vault/models/domain/cipher.spec.ts b/libs/common/src/vault/models/domain/cipher.spec.ts
index 1b2b093a5538..fd058580330b 100644
--- a/libs/common/src/vault/models/domain/cipher.spec.ts
+++ b/libs/common/src/vault/models/domain/cipher.spec.ts
@@ -56,6 +56,7 @@ describe("Cipher DTO", () => {
       passwordHistory: null,
       key: null,
       permissions: undefined,
+      archivedDate: null,
     });
   });
 
@@ -80,6 +81,7 @@ describe("Cipher DTO", () => {
         permissions: new CipherPermissionsApi(),
         reprompt: CipherRepromptType.None,
         key: "EncryptedString",
+        archivedDate: null,
         login: {
           uris: [
             {
@@ -155,6 +157,7 @@ describe("Cipher DTO", () => {
         permissions: new CipherPermissionsApi(),
         reprompt: 0,
         key: { encryptedString: "EncryptedString", encryptionType: 0 },
+        archivedDate: null,
         login: {
           passwordRevisionDate: new Date("2022-01-31T12:00:00.000Z"),
           autofillOnPageLoad: false,
@@ -233,6 +236,7 @@ describe("Cipher DTO", () => {
       cipher.reprompt = CipherRepromptType.None;
       cipher.key = mockEnc("EncKey");
       cipher.permissions = new CipherPermissionsApi();
+      cipher.archivedDate = null;
 
       const loginView = new LoginView();
       loginView.username = "username";
@@ -276,6 +280,7 @@ describe("Cipher DTO", () => {
         reprompt: 0,
         localData: undefined,
         permissions: new CipherPermissionsApi(),
+        archivedDate: null,
       });
     });
   });
@@ -304,6 +309,7 @@ describe("Cipher DTO", () => {
           type: SecureNoteType.Generic,
         },
         permissions: new CipherPermissionsApi(),
+        archivedDate: null,
       };
     });
 
@@ -334,6 +340,7 @@ describe("Cipher DTO", () => {
         passwordHistory: null,
         key: { encryptedString: "EncKey", encryptionType: 0 },
         permissions: new CipherPermissionsApi(),
+        archivedDate: null,
       });
     });
 
@@ -362,6 +369,7 @@ describe("Cipher DTO", () => {
       cipher.secureNote.type = SecureNoteType.Generic;
       cipher.key = mockEnc("EncKey");
       cipher.permissions = new CipherPermissionsApi();
+      cipher.archivedDate = null;
 
       const keyService = mock<KeyService>();
       const encryptService = mock<EncryptService>();
@@ -397,6 +405,7 @@ describe("Cipher DTO", () => {
         reprompt: 0,
         localData: undefined,
         permissions: new CipherPermissionsApi(),
+        archivedDate: null,
       });
     });
   });
@@ -430,6 +439,7 @@ describe("Cipher DTO", () => {
           code: "EncryptedString",
         },
         key: "EncKey",
+        archivedDate: null,
       };
     });
 
@@ -467,6 +477,7 @@ describe("Cipher DTO", () => {
         passwordHistory: null,
         key: { encryptedString: "EncKey", encryptionType: 0 },
         permissions: new CipherPermissionsApi(),
+        archivedDate: null,
       });
     });
 
@@ -493,6 +504,7 @@ describe("Cipher DTO", () => {
       cipher.reprompt = CipherRepromptType.None;
       cipher.key = mockEnc("EncKey");
       cipher.permissions = new CipherPermissionsApi();
+      cipher.archivedDate = null;
 
       const cardView = new CardView();
       cardView.cardholderName = "cardholderName";
@@ -536,6 +548,7 @@ describe("Cipher DTO", () => {
         reprompt: 0,
         localData: undefined,
         permissions: new CipherPermissionsApi(),
+        archivedDate: null,
       });
     });
   });
@@ -561,6 +574,7 @@ describe("Cipher DTO", () => {
         permissions: new CipherPermissionsApi(),
         reprompt: CipherRepromptType.None,
         key: "EncKey",
+        archivedDate: null,
         identity: {
           title: "EncryptedString",
           firstName: "EncryptedString",
@@ -605,6 +619,7 @@ describe("Cipher DTO", () => {
         creationDate: new Date("2022-01-01T12:00:00.000Z"),
         deletedDate: null,
         reprompt: 0,
+        archivedDate: null,
         identity: {
           title: { encryptedString: "EncryptedString", encryptionType: 0 },
           firstName: { encryptedString: "EncryptedString", encryptionType: 0 },
@@ -656,6 +671,7 @@ describe("Cipher DTO", () => {
       cipher.reprompt = CipherRepromptType.None;
       cipher.key = mockEnc("EncKey");
       cipher.permissions = new CipherPermissionsApi();
+      cipher.archivedDate = null;
 
       const identityView = new IdentityView();
       identityView.firstName = "firstName";
@@ -699,6 +715,7 @@ describe("Cipher DTO", () => {
         reprompt: 0,
         localData: undefined,
         permissions: new CipherPermissionsApi(),
+        archivedDate: null,
       });
     });
   });
@@ -712,6 +729,7 @@ describe("Cipher DTO", () => {
 
       const revisionDate = new Date("2022-08-04T01:06:40.441Z");
       const deletedDate = new Date("2022-09-04T01:06:40.441Z");
+      const archivedDate = new Date("2022-10-04T01:06:40.441Z");
       const actual = Cipher.fromJSON({
         name: "myName",
         notes: "myNotes",
@@ -720,6 +738,7 @@ describe("Cipher DTO", () => {
         fields: ["field1", "field2"] as any,
         passwordHistory: ["ph1", "ph2"] as any,
         deletedDate: deletedDate.toISOString(),
+        archivedDate: archivedDate.toISOString(),
       } as Jsonify<Cipher>);
 
       expect(actual).toMatchObject({
@@ -730,6 +749,7 @@ describe("Cipher DTO", () => {
         fields: ["field1_fromJSON", "field2_fromJSON"],
         passwordHistory: ["ph1_fromJSON", "ph2_fromJSON"],
         deletedDate: deletedDate,
+        archivedDate: archivedDate,
       });
       expect(actual).toBeInstanceOf(Cipher);
     });
diff --git a/libs/common/src/vault/models/domain/cipher.ts b/libs/common/src/vault/models/domain/cipher.ts
index f23e3c0c579c..588e5017d526 100644
--- a/libs/common/src/vault/models/domain/cipher.ts
+++ b/libs/common/src/vault/models/domain/cipher.ts
@@ -54,6 +54,7 @@ export class Cipher extends Domain implements Decryptable<CipherView> {
   collectionIds: string[];
   creationDate: Date;
   deletedDate: Date;
+  archivedDate: Date;
   reprompt: CipherRepromptType;
   key: EncString;
 
@@ -92,6 +93,7 @@ export class Cipher extends Domain implements Decryptable<CipherView> {
     this.localData = localData;
     this.creationDate = obj.creationDate != null ? new Date(obj.creationDate) : null;
     this.deletedDate = obj.deletedDate != null ? new Date(obj.deletedDate) : null;
+    this.archivedDate = obj.archivedDate != null ? new Date(obj.archivedDate) : null;
     this.reprompt = obj.reprompt;
 
     switch (this.type) {
@@ -248,6 +250,7 @@ export class Cipher extends Domain implements Decryptable<CipherView> {
     c.reprompt = this.reprompt;
     c.key = this.key?.encryptedString;
     c.permissions = this.permissions;
+    c.archivedDate = this.archivedDate != null ? this.archivedDate.toISOString() : null;
 
     this.buildDataModel(this, c, {
       name: null,
@@ -300,6 +303,7 @@ export class Cipher extends Domain implements Decryptable<CipherView> {
     const fields = obj.fields?.map((f: any) => Field.fromJSON(f));
     const passwordHistory = obj.passwordHistory?.map((ph: any) => Password.fromJSON(ph));
     const key = EncString.fromJSON(obj.key);
+    const archivedDate = obj.archivedDate == null ? null : new Date(obj.archivedDate);
 
     Object.assign(domain, obj, {
       name,
@@ -310,6 +314,7 @@ export class Cipher extends Domain implements Decryptable<CipherView> {
       fields,
       passwordHistory,
       key,
+      archivedDate,
     });
 
     switch (obj.type) {
diff --git a/libs/common/src/vault/models/response/cipher.response.ts b/libs/common/src/vault/models/response/cipher.response.ts
index 944a19e088bb..d8d891ab48b4 100644
--- a/libs/common/src/vault/models/response/cipher.response.ts
+++ b/libs/common/src/vault/models/response/cipher.response.ts
@@ -37,6 +37,7 @@ export class CipherResponse extends BaseResponse {
   collectionIds: string[];
   creationDate: string;
   deletedDate: string;
+  archivedDate: string;
   reprompt: CipherRepromptType;
   key: string;
 
@@ -61,6 +62,7 @@ export class CipherResponse extends BaseResponse {
     this.collectionIds = this.getResponseProperty("CollectionIds");
     this.creationDate = this.getResponseProperty("CreationDate");
     this.deletedDate = this.getResponseProperty("DeletedDate");
+    this.archivedDate = this.getResponseProperty("ArchivedDate");
 
     const login = this.getResponseProperty("Login");
     if (login != null) {
diff --git a/libs/common/src/vault/models/view/cipher.view.ts b/libs/common/src/vault/models/view/cipher.view.ts
index 7ddba9e2ed53..8f778303cc85 100644
--- a/libs/common/src/vault/models/view/cipher.view.ts
+++ b/libs/common/src/vault/models/view/cipher.view.ts
@@ -46,6 +46,7 @@ export class CipherView implements View, InitializerMetadata {
   revisionDate: Date = null;
   creationDate: Date = null;
   deletedDate: Date = null;
+  archivedDate: Date = null;
   reprompt: CipherRepromptType = CipherRepromptType.None;
 
   /**
@@ -72,6 +73,7 @@ export class CipherView implements View, InitializerMetadata {
     this.revisionDate = c.revisionDate;
     this.creationDate = c.creationDate;
     this.deletedDate = c.deletedDate;
+    this.archivedDate = c.archivedDate;
     // Old locally stored ciphers might have reprompt == null. If so set it to None.
     this.reprompt = c.reprompt ?? CipherRepromptType.None;
   }
@@ -135,6 +137,10 @@ export class CipherView implements View, InitializerMetadata {
     return this.deletedDate != null;
   }
 
+  get isArchived(): boolean {
+    return this.archivedDate != null;
+  }
+
   get linkedFieldOptions() {
     return this.item?.linkedFieldOptions;
   }
diff --git a/libs/common/src/vault/services/cipher.service.spec.ts b/libs/common/src/vault/services/cipher.service.spec.ts
index def0c04dd167..76e1ce44018c 100644
--- a/libs/common/src/vault/services/cipher.service.spec.ts
+++ b/libs/common/src/vault/services/cipher.service.spec.ts
@@ -60,7 +60,9 @@ const cipherData: CipherData = {
   deletedDate: null,
   permissions: new CipherPermissionsApi(),
   key: "EncKey",
+  archivedDate: null,
   reprompt: CipherRepromptType.None,
+
   login: {
     uris: [
       { uri: "EncryptedString", uriChecksum: "EncryptedString", match: UriMatchStrategy.Domain },
diff --git a/libs/components/src/stories/icons.mdx b/libs/components/src/stories/icons.mdx
index f16b5d56b16e..b83230b36fbf 100644
--- a/libs/components/src/stories/icons.mdx
+++ b/libs/components/src/stories/icons.mdx
@@ -91,6 +91,7 @@ or an options menu icon.
 | <i class="bwi bwi-trash"></i>          | bwi-trash          | delete action or trash area                  |
 | <i class="bwi bwi-undo"></i>           | bwi-undo           | restore action                               |
 | <i class="bwi bwi-unlock"></i>         | bwi-unlock         | unlocked                                     |
+| <i class="bwi bwi-archive"></i>        | bwi-archive        | archive action or archive area               |
 
 ## Directional and Menu Indicators
 


Reviews:
user: login: shane-melton
body: Looks good! I had a couple questions and a non-blocking suggestion.
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-18T20:00:43Z
user: login: gbubemismith
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-18T20:22:06Z
user: login: gbubemismith
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-18T20:28:47Z
user: login: shane-melton
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-18T21:57:07Z
user: login: shane-melton
state: APPROVED
author_association: MEMBER
submitted_at: 2025-03-18T22:19:44Z
user: login: Jingo88
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-19T14:56:32Z
user: login: willmartian
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-19T17:26:50Z
user: login: shane-melton
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-19T18:07:48Z

Review comments:
diff_hunk: @@ -70,17 +70,28 @@
       class="tw-mt-6 tw-flex tw-h-full tw-flex-col tw-items-center tw-justify-start"
     >
       <bit-icon [icon]="noItemIcon" aria-hidden="true"></bit-icon>
path: apps/web/src/app/vault/individual-vault/vault.component.html
user: login: shane-melton
body: ❓ Probably more of a design question -- I saw a comment for a separate icon for "no archived items". Do we know if that's still something we want? 

cc: @danielleflinn 
created_at: 2025-03-18T19:38:52Z
author_association: MEMBER
diff_hunk: @@ -70,17 +70,28 @@
       class="tw-mt-6 tw-flex tw-h-full tw-flex-col tw-items-center tw-justify-start"
     >
       <bit-icon [icon]="noItemIcon" aria-hidden="true"></bit-icon>
-      <p>{{ "noItemsInList" | i18n }}</p>
-      <button
-        type="button"
-        buttonType="primary"
-        bitButton
-        (click)="addCipher()"
-        *ngIf="filter.type !== 'trash'"
+      <ng-container
path: apps/web/src/app/vault/individual-vault/vault.component.html
user: login: shane-melton
body: 🎨 (non-blocking): These nested templates and `*ngIfs` are a bit confusing imo. Perhaps we could try Angular's new [template syntax](https://angular.dev/guide/templates/control-flow) and re-arrange the conditions? Something like:

```html
@if (filter.type === 'archive') {
   <div> Archive icon, description </div>
} @else {
   <div> Default Icon, default empty description </div>
   @if (filter.type !== 'trash') {
       <button> New Item </button>
   }
}
```
created_at: 2025-03-18T19:48:20Z
author_association: MEMBER
diff_hunk: @@ -70,17 +70,28 @@
       class="tw-mt-6 tw-flex tw-h-full tw-flex-col tw-items-center tw-justify-start"
     >
       <bit-icon [icon]="noItemIcon" aria-hidden="true"></bit-icon>
-      <p>{{ "noItemsInList" | i18n }}</p>
-      <button
-        type="button"
-        buttonType="primary"
-        bitButton
-        (click)="addCipher()"
-        *ngIf="filter.type !== 'trash'"
+      <ng-container
+        *ngIf="filter.type !== 'archive' || !(archiveItemEnabled$ | async); else noArchiveContent"
path: apps/web/src/app/vault/individual-vault/vault.component.html
user: login: shane-melton
body: ❓ Do we need the extra check for the feature flag here? If we never show the filter option, the `filter.type` will never equal `'archive'`, right?
created_at: 2025-03-18T19:50:02Z
author_association: MEMBER
diff_hunk: @@ -70,17 +70,28 @@
       class="tw-mt-6 tw-flex tw-h-full tw-flex-col tw-items-center tw-justify-start"
     >
       <bit-icon [icon]="noItemIcon" aria-hidden="true"></bit-icon>
path: apps/web/src/app/vault/individual-vault/vault.component.html
user: login: gbubemismith
body: I think the `no archived items` icon needs some styling by the UIF team, so @danielleflinn suggested we just stick to the `noItemIcon`
created_at: 2025-03-18T20:22:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -70,17 +70,28 @@
       class="tw-mt-6 tw-flex tw-h-full tw-flex-col tw-items-center tw-justify-start"
     >
       <bit-icon [icon]="noItemIcon" aria-hidden="true"></bit-icon>
-      <p>{{ "noItemsInList" | i18n }}</p>
-      <button
-        type="button"
-        buttonType="primary"
-        bitButton
-        (click)="addCipher()"
-        *ngIf="filter.type !== 'trash'"
+      <ng-container
+        *ngIf="filter.type !== 'archive' || !(archiveItemEnabled$ | async); else noArchiveContent"
path: apps/web/src/app/vault/individual-vault/vault.component.html
user: login: gbubemismith
body: Yeah nice catch 
created_at: 2025-03-18T20:28:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -70,17 +70,28 @@
       class="tw-mt-6 tw-flex tw-h-full tw-flex-col tw-items-center tw-justify-start"
     >
       <bit-icon [icon]="noItemIcon" aria-hidden="true"></bit-icon>
path: apps/web/src/app/vault/individual-vault/vault.component.html
user: login: shane-melton
body: Sounds good, just wanted to double check!
created_at: 2025-03-18T21:57:07Z
author_association: MEMBER
diff_hunk: @@ -40,6 +40,7 @@ export class CipherData {
   collectionIds?: string[];
   creationDate: string;
   deletedDate: string;
+  archivedDate: string;
path: libs/common/src/vault/models/data/cipher.data.ts
user: login: shane-melton
body: ⛏️ (non-blocking): We should probably mark this as `string | null` to be more accurate since the date can be null. Probably should do something similar for  the other cipher models (response, view, etc.).
created_at: 2025-03-19T18:07:47Z
author_association: MEMBER

PR comments:
user: login: codecov[bot]
created_at: 2025-03-14T21:55:06Z
body: ## [Codecov](https://app.codecov.io/gh/bitwarden/clients/pull/13852?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) Report
Attention: Patch coverage is `18.42105%` with `31 lines` in your changes missing coverage. Please review.
> Project coverage is 36.38%. Comparing base [(`4537642`)](https://app.codecov.io/gh/bitwarden/clients/commit/45376420031e09a25b0617a90a438493208a6df8?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) to head [(`2fa01e4`)](https://app.codecov.io/gh/bitwarden/clients/commit/2fa01e42bace455c58474a2b88de131ed9d9552d?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden).
> Report is 1 commits behind head on innovation/archive/clients.

:white_check_mark: All tests successful. No failed tests found.

| [Files with missing lines](https://app.codecov.io/gh/bitwarden/clients/pull/13852?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) | Patch % | Lines |
|---|---|---|
| [.../vault-filter/components/vault-filter.component.ts](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&filepath=apps%2Fweb%2Fsrc%2Fapp%2Fvault%2Findividual-vault%2Fvault-filter%2Fcomponents%2Fvault-filter.component.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden#diff-YXBwcy93ZWIvc3JjL2FwcC92YXVsdC9pbmRpdmlkdWFsLXZhdWx0L3ZhdWx0LWZpbHRlci9jb21wb25lbnRzL3ZhdWx0LWZpbHRlci5jb21wb25lbnQudHM=) | 0.00% | [7 Missing :warning: ](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) |
| [.../src/app/vault/individual-vault/vault.component.ts](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&filepath=apps%2Fweb%2Fsrc%2Fapp%2Fvault%2Findividual-vault%2Fvault.component.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden#diff-YXBwcy93ZWIvc3JjL2FwcC92YXVsdC9pbmRpdmlkdWFsLXZhdWx0L3ZhdWx0LmNvbXBvbmVudC50cw==) | 0.00% | [7 Missing :warning: ](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) |
| [...ault/vault-filter/shared/models/filter-function.ts](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&filepath=apps%2Fweb%2Fsrc%2Fapp%2Fvault%2Findividual-vault%2Fvault-filter%2Fshared%2Fmodels%2Ffilter-function.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden#diff-YXBwcy93ZWIvc3JjL2FwcC92YXVsdC9pbmRpdmlkdWFsLXZhdWx0L3ZhdWx0LWZpbHRlci9zaGFyZWQvbW9kZWxzL2ZpbHRlci1mdW5jdGlvbi50cw==) | 16.66% | [5 Missing :warning: ](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) |
| [...ter/services/routed-vault-filter-bridge.service.ts](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&filepath=apps%2Fweb%2Fsrc%2Fapp%2Fvault%2Findividual-vault%2Fvault-filter%2Fservices%2Frouted-vault-filter-bridge.service.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden#diff-YXBwcy93ZWIvc3JjL2FwcC92YXVsdC9pbmRpdmlkdWFsLXZhdWx0L3ZhdWx0LWZpbHRlci9zZXJ2aWNlcy9yb3V0ZWQtdmF1bHQtZmlsdGVyLWJyaWRnZS5zZXJ2aWNlLnRz) | 0.00% | [2 Missing :warning: ](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) |
| [...t/vault-filter/shared/models/vault-filter.model.ts](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&filepath=apps%2Fweb%2Fsrc%2Fapp%2Fvault%2Findividual-vault%2Fvault-filter%2Fshared%2Fmodels%2Fvault-filter.model.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden#diff-YXBwcy93ZWIvc3JjL2FwcC92YXVsdC9pbmRpdmlkdWFsLXZhdWx0L3ZhdWx0LWZpbHRlci9zaGFyZWQvbW9kZWxzL3ZhdWx0LWZpbHRlci5tb2RlbC50cw==) | 33.33% | [1 Missing and 1 partial :warning: ](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) |
| [...idual-vault/vault-header/vault-header.component.ts](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&filepath=apps%2Fweb%2Fsrc%2Fapp%2Fvault%2Findividual-vault%2Fvault-header%2Fvault-header.component.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden#diff-YXBwcy93ZWIvc3JjL2FwcC92YXVsdC9pbmRpdmlkdWFsLXZhdWx0L3ZhdWx0LWhlYWRlci92YXVsdC1oZWFkZXIuY29tcG9uZW50LnRz) | 0.00% | [2 Missing :warning: ](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) |
| [libs/common/src/vault/models/domain/cipher.ts](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&filepath=libs%2Fcommon%2Fsrc%2Fvault%2Fmodels%2Fdomain%2Fcipher.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden#diff-bGlicy9jb21tb24vc3JjL3ZhdWx0L21vZGVscy9kb21haW4vY2lwaGVyLnRz) | 33.33% | [0 Missing and 2 partials :warning: ](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) |
| [.../shared/models/routed-vault-filter-bridge.model.ts](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&filepath=apps%2Fweb%2Fsrc%2Fapp%2Fvault%2Findividual-vault%2Fvault-filter%2Fshared%2Fmodels%2Frouted-vault-filter-bridge.model.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden#diff-YXBwcy93ZWIvc3JjL2FwcC92YXVsdC9pbmRpdmlkdWFsLXZhdWx0L3ZhdWx0LWZpbHRlci9zaGFyZWQvbW9kZWxzL3JvdXRlZC12YXVsdC1maWx0ZXItYnJpZGdlLm1vZGVsLnRz) | 0.00% | [1 Missing :warning: ](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) |
| [...-filter/shared/models/vault-filter-section.type.ts](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&filepath=apps%2Fweb%2Fsrc%2Fapp%2Fvault%2Findividual-vault%2Fvault-filter%2Fshared%2Fmodels%2Fvault-filter-section.type.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden#diff-YXBwcy93ZWIvc3JjL2FwcC92YXVsdC9pbmRpdmlkdWFsLXZhdWx0L3ZhdWx0LWZpbHRlci9zaGFyZWQvbW9kZWxzL3ZhdWx0LWZpbHRlci1zZWN0aW9uLnR5cGUudHM=) | 0.00% | [1 Missing :warning: ](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) |
| [...ommon/src/vault/models/response/cipher.response.ts](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&filepath=libs%2Fcommon%2Fsrc%2Fvault%2Fmodels%2Fresponse%2Fcipher.response.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden#diff-bGlicy9jb21tb24vc3JjL3ZhdWx0L21vZGVscy9yZXNwb25zZS9jaXBoZXIucmVzcG9uc2UudHM=) | 0.00% | [1 Missing :warning: ](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) |
| ... and [1 more](https://app.codecov.io/gh/bitwarden/clients/pull/13852?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden) | |

<details><summary>Additional details and impacted files</summary>


```diff
@@                      Coverage Diff                       @@
##           innovation/archive/clients   #13852      +/-   ##
==============================================================
- Coverage                       36.39%   36.38%   -0.02%     
==============================================================
  Files                            3173     3173              
  Lines                           92323    92355      +32     
  Branches                        16720    16732      +12     
==============================================================
+ Hits                            33598    33600       +2     
- Misses                          56135    56162      +27     
- Partials                         2590     2593       +3     
```

</details>

[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/bitwarden/clients/pull/13852?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden).   
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=bitwarden).

<details><summary>🚀 New features to boost your workflow: </summary>

- 📦 [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-14T22:03:25Z
body: ![Logo](https://cdn.ast.checkmarx.net/integrations/logo/Checkmarx.png)
**Checkmarx One – Scan Summary & Details** – [aff3ca74\-a02b\-4288\-8e33\-5698f455a60a](https://ast.checkmarx.net/projects/41bd746e-d417-4eda-afeb-01a59d162661/scans?id=aff3ca74-a02b-4288-8e33-5698f455a60a&branch=innovation%2Farchive%2Farchive-view)
<!--new issues section--><details><summary><b>New Issues (61)</b></summary>
Checkmarx found the following issues in this Pull Request

Severity|Issue|Source File / Package|Checkmarx Insight
---|---|---|---
![CRITICAL](https://cdn.ast.checkmarx.net/integrations/severity/Critical.png)|[CVE-2025-0611](https://devhub.checkmarx.com/cve-details/CVE-2025-0611)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![CRITICAL](https://cdn.ast.checkmarx.net/integrations/severity/Critical.png)|[CVE-2025-0998](https://devhub.checkmarx.com/cve-details/CVE-2025-0998)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-0451](https://devhub.checkmarx.com/cve-details/CVE-2025-0451)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-0612](https://devhub.checkmarx.com/cve-details/CVE-2025-0612)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-0762](https://devhub.checkmarx.com/cve-details/CVE-2025-0762)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-0995](https://devhub.checkmarx.com/cve-details/CVE-2025-0995)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-0997](https://devhub.checkmarx.com/cve-details/CVE-2025-0997)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-0999](https://devhub.checkmarx.com/cve-details/CVE-2025-0999)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-1426](https://devhub.checkmarx.com/cve-details/CVE-2025-1426)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-1914](https://devhub.checkmarx.com/cve-details/CVE-2025-1914)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-1915](https://devhub.checkmarx.com/cve-details/CVE-2025-1915)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-1916](https://devhub.checkmarx.com/cve-details/CVE-2025-1916)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-1918](https://devhub.checkmarx.com/cve-details/CVE-2025-1918)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-1919](https://devhub.checkmarx.com/cve-details/CVE-2025-1919)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-1920](https://devhub.checkmarx.com/cve-details/CVE-2025-1920)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-2135](https://devhub.checkmarx.com/cve-details/CVE-2025-2135)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-2136](https://devhub.checkmarx.com/cve-details/CVE-2025-2136)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-2137](https://devhub.checkmarx.com/cve-details/CVE-2025-2137)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[CVE-2025-27152](https://devhub.checkmarx.com/cve-details/CVE-2025-27152)|Npm\-axios\-1\.7\.9|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-axios-1.7.9%2FpackageDetailsGql)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[Client_DOM_XSS](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/79/10016977899842968824)|/apps/web/src/connectors/redirect\.ts: [6](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/web/src/connectors/redirect.ts#L6)|<details><summary>details</summary>The method Lambda embeds untrusted data in generated output with href, at line 16 of /apps/web/src/connectors/redirect\.ts\. This untrusted data is e\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=J8h77eFiSWyRh3XTl0AMwUPdp0s%3D&redirect=true)
![HIGH](https://cdn.ast.checkmarx.net/integrations/severity/High.png)|[Cxdca8e59f-8bfe](https://devhub.checkmarx.com/cve-details/Cxdca8e59f-8bfe)|Npm\-inflight\-1\.0\.6|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-inflight-1.0.6%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Absolute_Path_Traversal](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/36/8524053168912017772)|/apps/cli/src/oss\-serve\-configurator\.ts: [328](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/oss-serve-configurator.ts#L328)|<details><summary>details</summary>Method Lambda at line 328 of /apps/cli/src/oss\-serve\-configurator\.ts gets dynamic data from the query element\. This element’s value then flows thro\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=xU6aBpDqPWuKn3GA7yye22NEobI%3D&redirect=true)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Absolute_Path_Traversal](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/36/8524053168912017772)|/apps/cli/src/oss\-serve\-configurator\.ts: [328](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/oss-serve-configurator.ts#L328)|<details><summary>details</summary>Method Lambda at line 328 of /apps/cli/src/oss\-serve\-configurator\.ts gets dynamic data from the query element\. This element’s value then flows thro\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=vjfimO35DI7ZsiDqVkiJvrHBJCE%3D&redirect=true)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Absolute_Path_Traversal](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/36/8524053168912017772)|/apps/cli/src/oss\-serve\-configurator\.ts: [296](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/oss-serve-configurator.ts#L296)|<details><summary>details</summary>Method Lambda at line 296 of /apps/cli/src/oss\-serve\-configurator\.ts gets dynamic data from the query element\. This element’s value then flows thro\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=9PoOkG6Bv4mOj8o5TguZLxzc8Tc%3D&redirect=true)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Absolute_Path_Traversal](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/36/8524053168912017772)|/apps/cli/src/oss\-serve\-configurator\.ts: [296](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/oss-serve-configurator.ts#L296)|<details><summary>details</summary>Method Lambda at line 296 of /apps/cli/src/oss\-serve\-configurator\.ts gets dynamic data from the query element\. This element’s value then flows thro\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=jgxkD01MCbnLzfYAbofDQPt1O%2Bk%3D&redirect=true)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[CVE-2024-53382](https://devhub.checkmarx.com/cve-details/CVE-2024-53382)|Npm\-prismjs\-1\.29\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-prismjs-1.29.0%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[CVE-2024-6531](https://devhub.checkmarx.com/cve-details/CVE-2024-6531)|Npm\-bootstrap\-4\.6\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-bootstrap-4.6.0%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[CVE-2025-0444](https://devhub.checkmarx.com/cve-details/CVE-2025-0444)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[CVE-2025-0445](https://devhub.checkmarx.com/cve-details/CVE-2025-0445)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[CVE-2025-0996](https://devhub.checkmarx.com/cve-details/CVE-2025-0996)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[CVE-2025-1917](https://devhub.checkmarx.com/cve-details/CVE-2025-1917)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[CVE-2025-1921](https://devhub.checkmarx.com/cve-details/CVE-2025-1921)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[CVE-2025-1922](https://devhub.checkmarx.com/cve-details/CVE-2025-1922)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[CVE-2025-1923](https://devhub.checkmarx.com/cve-details/CVE-2025-1923)|Npm\-electron\-34\.0\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-electron-34.0.0%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[CVE-2025-24010](https://devhub.checkmarx.com/cve-details/CVE-2025-24010)|Npm\-vite\-5\.4\.6|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-vite-5.4.6%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Cxbb85e86c-2fac](https://devhub.checkmarx.com/cve-details/Cxbb85e86c-2fac)|Npm\-esbuild\-0\.21\.5|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-esbuild-0.21.5%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Cxbb85e86c-2fac](https://devhub.checkmarx.com/cve-details/Cxbb85e86c-2fac)|Npm\-esbuild\-wasm\-0\.23\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-esbuild-wasm-0.23.0%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Cxbb85e86c-2fac](https://devhub.checkmarx.com/cve-details/Cxbb85e86c-2fac)|Npm\-esbuild\-0\.23\.0|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-esbuild-0.23.0%2FpackageDetailsGql)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Insecure_Storage_of_Sensitive_Data](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/933/6840077199503929898)|/apps/cli/src/commands/get\.command\.ts: [365](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/commands/get.command.ts#L365)|<details><summary>details</summary>The application takes sensitive, personal data cipher, found at line 365 of /apps/cli/src/commands/get\.command\.ts, and stores it in an unprotected \.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=rpshZxdmqpePJXDLdkTezT%2B8fcE%3D&redirect=true)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Insecure_Storage_of_Sensitive_Data](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/933/6840077199503929898)|/apps/cli/src/commands/get\.command\.ts: [332](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/commands/get.command.ts#L332)|<details><summary>details</summary>The application takes sensitive, personal data cipher, found at line 332 of /apps/cli/src/commands/get\.command\.ts, and stores it in an unprotected \.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=n1zYbUEezgWkWFHV79kFweaVGlM%3D&redirect=true)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Insecure_Storage_of_Sensitive_Data](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/933/6840077199503929898)|/apps/cli/src/commands/get\.command\.ts: [382](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/commands/get.command.ts#L382)|<details><summary>details</summary>The application takes sensitive, personal data cipher, found at line 382 of /apps/cli/src/commands/get\.command\.ts, and stores it in an unprotected \.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=n2Zz6UjZ5DCyisNa7dn4KxmLszc%3D&redirect=true)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Insecure_Storage_of_Sensitive_Data](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/933/6840077199503929898)|/apps/cli/src/tools/export\.command\.ts: [69](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/tools/export.command.ts#L69)|<details><summary>details</summary>The application takes sensitive, personal data password, found at line 69 of /apps/cli/src/tools/export\.command\.ts, and stores it in an unprotected\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=h1PlgF463OVLGcyuOW7WEKqVeKM%3D&redirect=true)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Insecure_Storage_of_Sensitive_Data](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/933/6840077199503929898)|/apps/cli/src/tools/export\.command\.ts: [65](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/tools/export.command.ts#L65)|<details><summary>details</summary>The application takes sensitive, personal data password, found at line 65 of /apps/cli/src/tools/export\.command\.ts, and stores it in an unprotected\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=KAfyVidBmXV2GA%2BFbipEz8um1%2FE%3D&redirect=true)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Missing_HSTS_Header](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/346/7630264517191277634)|/apps/cli/src/auth/commands/login\.command\.ts: [737](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/auth/commands/login.command.ts#L737)|<details><summary>details</summary>The web\-application does not define an HSTS header, leaving it vulnerable to attack\.  </details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=aHcPuoK7i%2BRMEGxEFtwifOOfIkY%3D&redirect=true)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Relative_Path_Traversal](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/23/10255106208379598648)|/apps/cli/src/oss\-serve\-configurator\.ts: [365](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/oss-serve-configurator.ts#L365)|<details><summary>details</summary>Method Lambda at line 365 of /apps/cli/src/oss\-serve\-configurator\.ts gets dynamic data from the query element\. This element’s value then flows thro\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=Dhw0XW27xdPOWE%2FIcppLP2VXqLY%3D&redirect=true)
![MEDIUM](https://cdn.ast.checkmarx.net/integrations/severity/Medium.png)|[Relative_Path_Traversal](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/23/10255106208379598648)|/apps/cli/src/oss\-serve\-configurator\.ts: [365](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/oss-serve-configurator.ts#L365)|<details><summary>details</summary>Method Lambda at line 365 of /apps/cli/src/oss\-serve\-configurator\.ts gets dynamic data from the query element\. This element’s value then flows thro\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=hgbYDgHOAcKV7HYxThPrCwE9hKw%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Angular_Usage_of_Unsafe_DOM_Sanitizer](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/116/2211341642471709656)|/libs/components/src/icon/icon\.component\.ts: [21](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//libs/components/src/icon/icon.component.ts#L21)|<details><summary>details</summary>Usage of an unsafe class bypassSecurityTrustHtml, which overrides output sanitization, was found at /libs/components/src/icon/icon\.component\.ts in \.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=0z4jydOOEPGZiyG25SDZ%2ByJV8Ck%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Angular_Usage_of_Unsafe_DOM_Sanitizer](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/116/2211341642471709656)|/apps/desktop/src/app/components/avatar\.component\.ts: [77](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/desktop/src/app/components/avatar.component.ts#L77)|<details><summary>details</summary>Usage of an unsafe class bypassSecurityTrustResourceUrl, which overrides output sanitization, was found at /apps/desktop/src/app/components/avatar\.\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=CNQGHc6D4uMM3XMCuIuIWWjDYqE%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Angular_Usage_of_Unsafe_DOM_Sanitizer](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/116/2211341642471709656)|/libs/components/src/avatar/avatar\.component\.ts: [87](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//libs/components/src/avatar/avatar.component.ts#L87)|<details><summary>details</summary>Usage of an unsafe class bypassSecurityTrustResourceUrl, which overrides output sanitization, was found at /libs/components/src/avatar/avatar\.compo\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=wByHqNK0KpxBKKtHLlDY1eaDBjo%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Client_DOM_Open_Redirect](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/601/11100132039797172543)|/apps/web/src/connectors/redirect\.ts: [6](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/web/src/connectors/redirect.ts#L6)|<details><summary>details</summary>The potentially tainted value provided by href in /apps/web/src/connectors/redirect\.ts at line 6 is used as a destination URL by href in /apps/web/\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=0G7DL8Iyt64hjiyJ3OeBhAdhtxY%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Client_DOM_Open_Redirect](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/601/11100132039797172543)|/apps/desktop/src/auth/accessibility\-cookie\.component\.html: [18](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/desktop/src/auth/accessibility-cookie.component.html#L18)|<details><summary>details</summary>The potentially tainted value provided by link in /apps/desktop/src/auth/accessibility\-cookie\.component\.html at line 18 is used as a destination UR\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=9Dq5plqdcR0BId6VywInzPEPeDE%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Client_DOM_Open_Redirect](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/601/11100132039797172543)|/apps/desktop/src/auth/scripts/duo\.js: [277](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/desktop/src/auth/scripts/duo.js#L277)|<details><summary>details</summary>The potentially tainted value provided by substring in /apps/desktop/src/auth/scripts/duo\.js at line 277 is used as a destination URL by open in /a\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=pcJP%2FbnNng5dvuSH84%2FrQCzAaVU%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Client_Use_Of_Iframe_Without_Sandbox](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/829/12151859793050070545)|/apps/browser/src/autofill/deprecated/overlay/iframe\-content/autofill\-overlay\-iframe\.service\.deprecated\.ts: [92](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/browser/src/autofill/deprecated/overlay/iframe-content/autofill-overlay-iframe.service.deprecated.ts#L92)|<details><summary>details</summary>The application employs an HTML iframe at whose contents are not properly sandboxed</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=wru4h4qM3h5le988GV4sdeEnZ%2F0%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Client_Use_Of_Iframe_Without_Sandbox](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/829/12151859793050070545)|/apps/browser/src/autofill/overlay/inline\-menu/pages/menu\-container/autofill\-inline\-menu\-container\.ts: [68](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/browser/src/autofill/overlay/inline-menu/pages/menu-container/autofill-inline-menu-container.ts#L68)|<details><summary>details</summary>The application employs an HTML iframe at whose contents are not properly sandboxed</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=eC9rGjAaHK3DyR9G%2BtM7mnxXkNU%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Client_Use_Of_Iframe_Without_Sandbox](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/829/12151859793050070545)|/apps/browser/src/autofill/overlay/inline\-menu/iframe\-content/autofill\-inline\-menu\-iframe\.service\.ts: [87](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/browser/src/autofill/overlay/inline-menu/iframe-content/autofill-inline-menu-iframe.service.ts#L87)|<details><summary>details</summary>The application employs an HTML iframe at whose contents are not properly sandboxed</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=mfl0i7Wn6Zj3Z71nx1CQn0bYd3s%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Cx8bc4df28-fcf5](https://devhub.checkmarx.com/cve-details/Cx8bc4df28-fcf5)|Npm\-debug\-2\.6\.9|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-debug-2.6.9%2FpackageDetailsGql)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Cx8bc4df28-fcf5](https://devhub.checkmarx.com/cve-details/Cx8bc4df28-fcf5)|Npm\-debug\-3\.2\.7|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-debug-3.2.7%2FpackageDetailsGql)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Cxda14f253-4e52](https://devhub.checkmarx.com/cve-details/Cxda14f253-4e52)|Npm\-bluebird\-3\.7\.2|[Vulnerable Package](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sca?internalPath=%2Fpackages%2FNpm-bluebird-3.7.2%2FpackageDetailsGql)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[HttpOnly_Cookie_Flag_Not_Set](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/1004/9800224272094099502)|/apps/web/src/connectors/sso\.ts: [41](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/web/src/connectors/sso.ts#L41)|<details><summary>details</summary>The web application's initiateBrowserSso method creates a cookie cookie, at line 41 of /apps/web/src/connectors/sso\.ts, and returns it in the respo\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=ZbCgsk0TkHr%2BVQiVOhKwen9b2do%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Missing_CSP_Header](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/346/729519850006803664)|/apps/cli/src/auth/commands/login\.command\.ts: [737](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//apps/cli/src/auth/commands/login.command.ts#L737)|<details><summary>details</summary>A Content Security Policy is not explicitly defined within the web\-application\.  </details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=SlFPRqgPekq8k8fp0Mz%2FbdQR3mM%3D&redirect=true)
![LOW](https://cdn.ast.checkmarx.net/integrations/severity/Low.png)|[Use_of_Broken_or_Risky_Cryptographic_Algorithm](https://ast.checkmarx.net/results/41bd746e-d417-4eda-afeb-01a59d162661/aff3ca74-a02b-4288-8e33-5698f455a60a/sast/description/327/16841165964473079218)|/libs/node/src/services/node\-crypto\-function\.service\.ts: [352](https://github.com/bitwarden/clients/blob/innovation/archive/archive-view//libs/node/src/services/node-crypto-function.service.ts#L352)|<details><summary>details</summary>In toNodeCryptoAesMode, the application protects sensitive data using a cryptographic algorithm, "aes\-256\-ecb", that is considered weak or even tri\.\.\.</details>[Attack Vector](https://ast.checkmarx.net/results/aff3ca74-a02b-4288-8e33-5698f455a60a/41bd746e-d417-4eda-afeb-01a59d162661/sast?result-id=APc3r56e7IbfNhzEPvDuOqNCKuw%3D&redirect=true)

</details>

<!--new issues section-->
author_association: CONTRIBUTOR
user: login: sonarqubecloud[bot]
created_at: 2025-03-19T18:19:04Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=bitwarden_clients&pullRequest=13852) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=bitwarden_clients&pullRequest=13852&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=bitwarden_clients&pullRequest=13852&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=bitwarden_clients&pullRequest=13852&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=bitwarden_clients&pullRequest=13852&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=bitwarden_clients&pullRequest=13852&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=bitwarden_clients&pullRequest=13852)


author_association: NONE