From 32a40a91f50fcb0d26e72c838c6bedbb2aff6dc4 Mon Sep 17 00:00:00 2001 From: Alex <55413326+AlexRubik@users.noreply.github.com> Date: Mon, 27 Oct 2025 14:38:49 -0400 Subject: [PATCH 1/4] [PM-26929] filter at risk passwords count to only critical apps (#16879) * filter at risk passwords count to only critical apps * PM-26929 assign tasks to those apps that are marked as critical --------- Co-authored-by: voommen-livefront --- .../services/view/all-activities.service.ts | 9 +++------ .../activity-cards/password-change-metric.component.ts | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/bitwarden_license/bit-common/src/dirt/reports/risk-insights/services/view/all-activities.service.ts b/bitwarden_license/bit-common/src/dirt/reports/risk-insights/services/view/all-activities.service.ts index 97db491823c..c275ad8c355 100644 --- a/bitwarden_license/bit-common/src/dirt/reports/risk-insights/services/view/all-activities.service.ts +++ b/bitwarden_license/bit-common/src/dirt/reports/risk-insights/services/view/all-activities.service.ts @@ -76,12 +76,9 @@ export class AllActivitiesService { } setAllAppsReportDetails(applications: ApplicationHealthReportDetailEnriched[]) { - // Only count at-risk passwords for CRITICAL applications - const criticalApps = applications.filter((app) => app.isMarkedAsCritical); - const totalAtRiskPasswords = criticalApps.reduce( - (sum, app) => sum + app.atRiskPasswordCount, - 0, - ); + const totalAtRiskPasswords = applications + .filter((app) => app.isMarkedAsCritical) + .reduce((sum, app) => sum + app.atRiskPasswordCount, 0); this.atRiskPasswordsCountSubject$.next(totalAtRiskPasswords); this.allApplicationsDetailsSubject$.next(applications); diff --git a/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/activity-cards/password-change-metric.component.ts b/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/activity-cards/password-change-metric.component.ts index 941d693940b..5c03534720e 100644 --- a/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/activity-cards/password-change-metric.component.ts +++ b/bitwarden_license/bit-web/src/app/dirt/access-intelligence/activity/activity-cards/password-change-metric.component.ts @@ -191,7 +191,7 @@ export class PasswordChangeMetricComponent implements OnInit { async assignTasks() { await this.accessIntelligenceSecurityTasksService.assignTasks( this.organizationId, - this.allApplicationsDetails, + this.allApplicationsDetails.filter((app) => app.isMarkedAsCritical), ); } } From 47975fda37d5e68109de9485fe073f67a1bfe3c2 Mon Sep 17 00:00:00 2001 From: Daniel James Smith <2670567+djsmith85@users.noreply.github.com> Date: Mon, 27 Oct 2025 20:24:36 +0100 Subject: [PATCH 2/4] Address issues with eslint rules regarding signals and OnPush change detection (#17057) Co-authored-by: Daniel James Smith --- .../auto-confirm-edit-policy-dialog.component.ts | 16 ++++++++++------ .../auto-confirm-policy.component.ts | 6 ++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/apps/web/src/app/admin-console/organizations/policies/auto-confirm-edit-policy-dialog.component.ts b/apps/web/src/app/admin-console/organizations/policies/auto-confirm-edit-policy-dialog.component.ts index 18a9306b7d1..55894aafd53 100644 --- a/apps/web/src/app/admin-console/organizations/policies/auto-confirm-edit-policy-dialog.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/auto-confirm-edit-policy-dialog.component.ts @@ -63,6 +63,8 @@ export type AutoConfirmPolicyDialogData = PolicyEditDialogData & { * Satisfies the PolicyDialogComponent interface structurally * via its static open() function. */ +// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush +// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ templateUrl: "auto-confirm-edit-policy-dialog.component.html", imports: [SharedModule], @@ -73,8 +75,8 @@ export class AutoConfirmPolicyDialogComponent { policyType = PolicyType; - protected firstTimeDialog = signal(false); - protected currentStep = signal(0); + protected readonly firstTimeDialog = signal(false); + protected readonly currentStep = signal(0); protected multiStepSubmit: Observable = of([]); protected autoConfirmEnabled$: Observable = this.accountService.activeAccount$.pipe( getUserId, @@ -82,11 +84,13 @@ export class AutoConfirmPolicyDialogComponent map((policies) => policies.find((p) => p.type === PolicyType.AutoConfirm)?.enabled ?? false), ); - private submitPolicy: Signal | undefined> = viewChild("step0"); - private openExtension: Signal | undefined> = viewChild("step1"); + private readonly submitPolicy: Signal | undefined> = viewChild("step0"); + private readonly openExtension: Signal | undefined> = viewChild("step1"); - private submitPolicyTitle: Signal | undefined> = viewChild("step0Title"); - private openExtensionTitle: Signal | undefined> = viewChild("step1Title"); + private readonly submitPolicyTitle: Signal | undefined> = + viewChild("step0Title"); + private readonly openExtensionTitle: Signal | undefined> = + viewChild("step1Title"); override policyComponent: AutoConfirmPolicyEditComponent | undefined; diff --git a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/auto-confirm-policy.component.ts b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/auto-confirm-policy.component.ts index a5ea2ef8790..7fa4fc2eea7 100644 --- a/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/auto-confirm-policy.component.ts +++ b/apps/web/src/app/admin-console/organizations/policies/policy-edit-definitions/auto-confirm-policy.component.ts @@ -26,14 +26,16 @@ export class AutoConfirmPolicy extends BasePolicyEditDefinition { } } +// FIXME(https://bitwarden.atlassian.net/browse/CL-764): Migrate to OnPush +// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection @Component({ templateUrl: "auto-confirm-policy.component.html", imports: [SharedModule], }) export class AutoConfirmPolicyEditComponent extends BasePolicyEditComponent implements OnInit { protected readonly autoConfirmSvg = AutoConfirmSvg; - private policyForm: Signal | undefined> = viewChild("step0"); - private extensionButton: Signal | undefined> = viewChild("step1"); + private readonly policyForm: Signal | undefined> = viewChild("step0"); + private readonly extensionButton: Signal | undefined> = viewChild("step1"); protected step: number = 0; protected steps = [this.policyForm, this.extensionButton]; From 2b2b1f4a2744e497960d0445eea155438705721d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 27 Oct 2025 17:29:45 -0400 Subject: [PATCH 3/4] [deps] Platform: Update @types/node to v22.18.11 (#15698) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .../native-messaging-test-runner/package-lock.json | 8 ++++---- apps/desktop/native-messaging-test-runner/package.json | 2 +- package-lock.json | 8 ++++---- package.json | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/apps/desktop/native-messaging-test-runner/package-lock.json b/apps/desktop/native-messaging-test-runner/package-lock.json index 3b976891014..b6e402a3ef6 100644 --- a/apps/desktop/native-messaging-test-runner/package-lock.json +++ b/apps/desktop/native-messaging-test-runner/package-lock.json @@ -19,7 +19,7 @@ "yargs": "18.0.0" }, "devDependencies": { - "@types/node": "22.15.3", + "@types/node": "22.18.11", "typescript": "5.4.2" } }, @@ -117,9 +117,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", - "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "version": "22.18.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.11.tgz", + "integrity": "sha512-Gd33J2XIrXurb+eT2ktze3rJAfAp9ZNjlBdh4SVgyrKEOADwCbdUDaK7QgJno8Ue4kcajscsKqu6n8OBG3hhCQ==", "license": "MIT", "peer": true, "dependencies": { diff --git a/apps/desktop/native-messaging-test-runner/package.json b/apps/desktop/native-messaging-test-runner/package.json index 0ca9cdc3a17..285997f6482 100644 --- a/apps/desktop/native-messaging-test-runner/package.json +++ b/apps/desktop/native-messaging-test-runner/package.json @@ -24,7 +24,7 @@ "yargs": "18.0.0" }, "devDependencies": { - "@types/node": "22.15.3", + "@types/node": "22.18.11", "typescript": "5.4.2" }, "_moduleAliases": { diff --git a/package-lock.json b/package-lock.json index 747576d4ca2..e131618ee4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -112,7 +112,7 @@ "@types/koa-json": "2.0.23", "@types/lowdb": "1.0.15", "@types/lunr": "2.3.7", - "@types/node": "22.15.3", + "@types/node": "22.18.11", "@types/node-fetch": "2.6.4", "@types/node-forge": "1.3.11", "@types/papaparse": "5.3.16", @@ -14391,9 +14391,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", - "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + "version": "22.18.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.11.tgz", + "integrity": "sha512-Gd33J2XIrXurb+eT2ktze3rJAfAp9ZNjlBdh4SVgyrKEOADwCbdUDaK7QgJno8Ue4kcajscsKqu6n8OBG3hhCQ==", "license": "MIT", "dependencies": { "undici-types": "~6.21.0" diff --git a/package.json b/package.json index c241e07e2e1..2c02ff68824 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "@types/koa-json": "2.0.23", "@types/lowdb": "1.0.15", "@types/lunr": "2.3.7", - "@types/node": "22.15.3", + "@types/node": "22.18.11", "@types/node-fetch": "2.6.4", "@types/node-forge": "1.3.11", "@types/papaparse": "5.3.16", From 8eef78960d0334ac6dd2dd12cfff9007d405c977 Mon Sep 17 00:00:00 2001 From: Daniel James Smith <2670567+djsmith85@users.noreply.github.com> Date: Tue, 28 Oct 2025 11:13:58 +0100 Subject: [PATCH 4/4] [PM-27358] Remove unused getInstalledBrowsers method (#17019) * Remove unused getInstalledBrowsers metthod * Run cargo fmt --------- Co-authored-by: Daniel James Smith --- apps/desktop/desktop_native/napi/index.d.ts | 1 - apps/desktop/desktop_native/napi/src/lib.rs | 10 ++-------- .../src/app/tools/import/chromium-importer.service.ts | 4 ---- apps/desktop/src/app/tools/preload.ts | 2 -- 4 files changed, 2 insertions(+), 15 deletions(-) diff --git a/apps/desktop/desktop_native/napi/index.d.ts b/apps/desktop/desktop_native/napi/index.d.ts index cd49e5ac27a..0a8beb8c427 100644 --- a/apps/desktop/desktop_native/napi/index.d.ts +++ b/apps/desktop/desktop_native/napi/index.d.ts @@ -247,7 +247,6 @@ export declare namespace chromium_importer { } /** Returns OS aware metadata describing supported Chromium based importers as a JSON string. */ export function getMetadata(): Record - export function getInstalledBrowsers(): Array export function getAvailableProfiles(browser: string): Array export function importLogins(browser: string, profileId: string): Promise> } diff --git a/apps/desktop/desktop_native/napi/src/lib.rs b/apps/desktop/desktop_native/napi/src/lib.rs index 61453994d72..39e57bd0bb5 100644 --- a/apps/desktop/desktop_native/napi/src/lib.rs +++ b/apps/desktop/desktop_native/napi/src/lib.rs @@ -1066,8 +1066,8 @@ pub mod logging { pub mod chromium_importer { use chromium_importer::{ chromium::{ - DefaultInstalledBrowserRetriever, InstalledBrowserRetriever, - LoginImportResult as _LoginImportResult, ProfileInfo as _ProfileInfo, + DefaultInstalledBrowserRetriever, LoginImportResult as _LoginImportResult, + ProfileInfo as _ProfileInfo, }, metadata::NativeImporterMetadata as _NativeImporterMetadata, }; @@ -1159,12 +1159,6 @@ pub mod chromium_importer { .collect() } - #[napi] - pub fn get_installed_browsers() -> napi::Result> { - chromium_importer::chromium::DefaultInstalledBrowserRetriever::get_installed_browsers() - .map_err(|e| napi::Error::from_reason(e.to_string())) - } - #[napi] pub fn get_available_profiles(browser: String) -> napi::Result> { chromium_importer::chromium::get_available_profiles(&browser) diff --git a/apps/desktop/src/app/tools/import/chromium-importer.service.ts b/apps/desktop/src/app/tools/import/chromium-importer.service.ts index 5273eef4b54..0faff81974a 100644 --- a/apps/desktop/src/app/tools/import/chromium-importer.service.ts +++ b/apps/desktop/src/app/tools/import/chromium-importer.service.ts @@ -8,10 +8,6 @@ export class ChromiumImporterService { return await chromium_importer.getMetadata(); }); - ipcMain.handle("chromium_importer.getInstalledBrowsers", async (event) => { - return await chromium_importer.getInstalledBrowsers(); - }); - ipcMain.handle("chromium_importer.getAvailableProfiles", async (event, browser: string) => { return await chromium_importer.getAvailableProfiles(browser); }); diff --git a/apps/desktop/src/app/tools/preload.ts b/apps/desktop/src/app/tools/preload.ts index b872f108551..c21a1ac0bfc 100644 --- a/apps/desktop/src/app/tools/preload.ts +++ b/apps/desktop/src/app/tools/preload.ts @@ -5,8 +5,6 @@ import type { chromium_importer } from "@bitwarden/desktop-napi"; const chromiumImporter = { getMetadata: (): Promise> => ipcRenderer.invoke("chromium_importer.getMetadata"), - getInstalledBrowsers: (): Promise => - ipcRenderer.invoke("chromium_importer.getInstalledBrowsers"), getAvailableProfiles: (browser: string): Promise => ipcRenderer.invoke("chromium_importer.getAvailableProfiles", browser), importLogins: (browser: string, profileId: string): Promise =>