From eb4fd4215336f1d9392f88e33e11a3545e1f7d58 Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Thu, 27 Nov 2025 00:22:59 +0100 Subject: [PATCH] [PM-28446] Log package types (#17496) * User agent * Update to use header * Fix build on cli * Replace unsandboxed with unknown * Apply feedback * Prevent sending null values --- .../browser-platform-utils.service.ts | 19 +++++++++++++++++++ .../services/cli-platform-utils.service.ts | 4 ++++ apps/desktop/src/main/window.main.ts | 1 + .../electron-platform-utils.service.ts | 16 ++++++++++++++++ .../app/core/web-platform-utils.service.ts | 4 ++++ .../abstractions/platform-utils.service.ts | 1 + libs/common/src/services/api.service.ts | 5 +++++ 7 files changed, 50 insertions(+) diff --git a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts index 5a933d9715..c3dd3adb8c 100644 --- a/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts +++ b/apps/browser/src/platform/services/platform-utils/browser-platform-utils.service.ts @@ -329,6 +329,25 @@ export abstract class BrowserPlatformUtilsService implements PlatformUtilsServic return autofillCommand; } + async packageType(): Promise { + switch (this.getDevice()) { + case DeviceType.ChromeExtension: + return "Chrome Extension"; + case DeviceType.FirefoxExtension: + return "Firefox Extension"; + case DeviceType.OperaExtension: + return "Opera Extension"; + case DeviceType.EdgeExtension: + return "Edge Extension"; + case DeviceType.VivaldiExtension: + return "Vivaldi Extension"; + case DeviceType.SafariExtension: + return "Safari Extension"; + default: + return "Unknown Browser Extension"; + } + } + /** * Triggers the offscreen document API to copy the text to the clipboard. */ diff --git a/apps/cli/src/platform/services/cli-platform-utils.service.ts b/apps/cli/src/platform/services/cli-platform-utils.service.ts index 27f8e5268b..acd2009a6d 100644 --- a/apps/cli/src/platform/services/cli-platform-utils.service.ts +++ b/apps/cli/src/platform/services/cli-platform-utils.service.ts @@ -152,4 +152,8 @@ export class CliPlatformUtilsService implements PlatformUtilsService { getAutofillKeyboardShortcut(): Promise { return null; } + + async packageType(): Promise { + return null; + } } diff --git a/apps/desktop/src/main/window.main.ts b/apps/desktop/src/main/window.main.ts index d148a1a35f..0e234126ea 100644 --- a/apps/desktop/src/main/window.main.ts +++ b/apps/desktop/src/main/window.main.ts @@ -185,6 +185,7 @@ export class WindowMain { await this.createWindow(); resolve(); + if (this.argvCallback != null) { this.argvCallback(process.argv); } diff --git a/apps/desktop/src/platform/services/electron-platform-utils.service.ts b/apps/desktop/src/platform/services/electron-platform-utils.service.ts index de63c6b28a..9377ac567e 100644 --- a/apps/desktop/src/platform/services/electron-platform-utils.service.ts +++ b/apps/desktop/src/platform/services/electron-platform-utils.service.ts @@ -151,4 +151,20 @@ export class ElectronPlatformUtilsService implements PlatformUtilsService { getAutofillKeyboardShortcut(): Promise { return null; } + + async packageType(): Promise { + if (ipc.platform.isMacAppStore) { + return "MacAppStore"; + } else if (ipc.platform.isWindowsStore) { + return "WindowsStore"; + } else if (ipc.platform.isAppImage) { + return "AppImage"; + } else if (ipc.platform.isSnapStore) { + return "Snap"; + } else if (ipc.platform.isFlatpak) { + return "Flatpak"; + } else { + return "Unknown"; + } + } } diff --git a/apps/web/src/app/core/web-platform-utils.service.ts b/apps/web/src/app/core/web-platform-utils.service.ts index dea4323bcc..037ee0f906 100644 --- a/apps/web/src/app/core/web-platform-utils.service.ts +++ b/apps/web/src/app/core/web-platform-utils.service.ts @@ -219,4 +219,8 @@ export class WebPlatformUtilsService implements PlatformUtilsService { getAutofillKeyboardShortcut(): Promise { return null; } + + packageType(): Promise { + return null; + } } diff --git a/libs/common/src/platform/abstractions/platform-utils.service.ts b/libs/common/src/platform/abstractions/platform-utils.service.ts index 4d126aeab8..0aabd7aa5a 100644 --- a/libs/common/src/platform/abstractions/platform-utils.service.ts +++ b/libs/common/src/platform/abstractions/platform-utils.service.ts @@ -55,4 +55,5 @@ export abstract class PlatformUtilsService { abstract readFromClipboard(): Promise; abstract supportsSecureStorage(): boolean; abstract getAutofillKeyboardShortcut(): Promise; + abstract packageType(): Promise; } diff --git a/libs/common/src/services/api.service.ts b/libs/common/src/services/api.service.ts index 633c7eedcc..5f4d3de11b 100644 --- a/libs/common/src/services/api.service.ts +++ b/libs/common/src/services/api.service.ts @@ -1325,6 +1325,11 @@ export class ApiService implements ApiServiceAbstraction { "Bitwarden-Client-Version", await this.platformUtilsService.getApplicationVersionNumber(), ); + + const packageType = await this.platformUtilsService.packageType(); + if (packageType != null) { + request.headers.set("Bitwarden-Package-Type", packageType); + } return this.nativeFetch(request); }