From e2a543506ad85324836ba99d2394196e1d8479c7 Mon Sep 17 00:00:00 2001 From: Jason Ng Date: Wed, 6 Mar 2024 10:48:27 -0500 Subject: [PATCH] PM-6558 Vault Onboarding Extension Check on Install (#8216) updated browser runtime background to send hasBWInstalled message on installation --- .../content/content-message-handler.spec.ts | 8 +++++-- .../content/content-message-handler.ts | 4 +++- .../src/background/runtime.background.ts | 24 +++++++++++++++++++ .../content/send-on-installed-message.ts | 5 ++++ apps/browser/webpack.config.js | 1 + .../vault-onboarding.component.spec.ts | 11 ++++++--- .../vault-onboarding.component.ts | 5 ++-- .../src/vault/enums/vault-onboarding.enum.ts | 6 +++++ 8 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 apps/browser/src/vault/content/send-on-installed-message.ts create mode 100644 libs/common/src/vault/enums/vault-onboarding.enum.ts diff --git a/apps/browser/src/autofill/content/content-message-handler.spec.ts b/apps/browser/src/autofill/content/content-message-handler.spec.ts index 07532e606da..11880592b6a 100644 --- a/apps/browser/src/autofill/content/content-message-handler.spec.ts +++ b/apps/browser/src/autofill/content/content-message-handler.spec.ts @@ -1,5 +1,7 @@ import { mock } from "jest-mock-extended"; +import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; + import { postWindowMessage, sendExtensionRuntimeMessage } from "../spec/testing-utils"; describe("ContentMessageHandler", () => { @@ -30,9 +32,11 @@ describe("ContentMessageHandler", () => { const mockPostMessage = jest.fn(); window.postMessage = mockPostMessage; - postWindowMessage({ command: "checkIfBWExtensionInstalled" }); + postWindowMessage({ command: VaultOnboardingMessages.checkBwInstalled }); - expect(mockPostMessage).toHaveBeenCalled(); + expect(mockPostMessage).toHaveBeenCalledWith({ + command: VaultOnboardingMessages.HasBwInstalled, + }); }); }); diff --git a/apps/browser/src/autofill/content/content-message-handler.ts b/apps/browser/src/autofill/content/content-message-handler.ts index 8df9b90e11c..ef542896492 100644 --- a/apps/browser/src/autofill/content/content-message-handler.ts +++ b/apps/browser/src/autofill/content/content-message-handler.ts @@ -1,3 +1,5 @@ +import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; + import { ContentMessageWindowData, ContentMessageWindowEventHandlers, @@ -33,7 +35,7 @@ const windowMessageHandlers: ContentMessageWindowEventHandlers = { * Handles the post to the web vault showing the extension has been installed */ function handleExtensionInstallCheck() { - window.postMessage({ command: "hasBWInstalled" }); + window.postMessage({ command: VaultOnboardingMessages.HasBwInstalled }); } /** diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index adf9e6ab3d1..436515d7ccd 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -345,10 +345,34 @@ export default class RuntimeBackground { if (await this.environmentService.hasManagedEnvironment()) { await this.environmentService.setUrlsToManagedEnvironment(); } + + await this.sendBwInstalledMessageToVault(); } this.onInstalledReason = null; } }, 100); } + + async sendBwInstalledMessageToVault() { + try { + const vaultUrl = this.environmentService.getWebVaultUrl(); + const urlObj = new URL(vaultUrl); + + const tabs = await BrowserApi.tabsQuery({ url: `${urlObj.href}*` }); + + if (!tabs?.length) { + return; + } + + for (const tab of tabs) { + await BrowserApi.executeScriptInTab(tab.id, { + file: "content/send-on-installed-message.js", + runAt: "document_end", + }); + } + } catch (e) { + this.logService.error(`Error sending on installed message to vault: ${e}`); + } + } } diff --git a/apps/browser/src/vault/content/send-on-installed-message.ts b/apps/browser/src/vault/content/send-on-installed-message.ts new file mode 100644 index 00000000000..9df15eb0d51 --- /dev/null +++ b/apps/browser/src/vault/content/send-on-installed-message.ts @@ -0,0 +1,5 @@ +import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; + +(function (globalContext) { + globalContext.postMessage({ command: VaultOnboardingMessages.HasBwInstalled }); +})(window); diff --git a/apps/browser/webpack.config.js b/apps/browser/webpack.config.js index 19d65dbf05c..b9c482eaf3e 100644 --- a/apps/browser/webpack.config.js +++ b/apps/browser/webpack.config.js @@ -179,6 +179,7 @@ const mainConfig = { "overlay/list": "./src/autofill/overlay/pages/list/bootstrap-autofill-overlay-list.ts", "encrypt-worker": "../../libs/common/src/platform/services/cryptography/encrypt.worker.ts", "content/lp-fileless-importer": "./src/tools/content/lp-fileless-importer.ts", + "content/send-on-installed-message": "./src/vault/content/send-on-installed-message.ts", "content/lp-suppress-import-download": "./src/tools/content/lp-suppress-import-download.ts", }, optimization: { diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts index 7e7660ddbf8..34247176305 100644 --- a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts +++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.spec.ts @@ -9,6 +9,7 @@ import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstraction import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { StateProvider } from "@bitwarden/common/platform/state"; +import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; import { VaultOnboardingService as VaultOnboardingServiceAbstraction } from "./services/abstraction/vault-onboarding.service"; import { VaultOnboardingComponent } from "./vault-onboarding.component"; @@ -143,7 +144,9 @@ describe("VaultOnboardingComponent", () => { describe("checkBrowserExtension", () => { it("should call getMessages when showOnboarding is true", () => { const messageEventSubject = new Subject(); - const messageEvent = new MessageEvent("message", { data: "hasBWInstalled" }); + const messageEvent = new MessageEvent("message", { + data: VaultOnboardingMessages.HasBwInstalled, + }); const getMessagesSpy = jest.spyOn(component, "getMessages"); (component as any).showOnboarding = true; @@ -151,7 +154,9 @@ describe("VaultOnboardingComponent", () => { messageEventSubject.next(messageEvent); void fixture.whenStable().then(() => { - expect(window.postMessage).toHaveBeenCalledWith({ command: "checkIfBWExtensionInstalled" }); + expect(window.postMessage).toHaveBeenCalledWith({ + command: VaultOnboardingMessages.checkBwInstalled, + }); expect(getMessagesSpy).toHaveBeenCalled(); }); }); @@ -168,7 +173,7 @@ describe("VaultOnboardingComponent", () => { installExtension: false, }); - const eventData = { data: { command: "hasBWInstalled" } }; + const eventData = { data: { command: VaultOnboardingMessages.HasBwInstalled } }; (component as any).showOnboarding = true; diff --git a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts index ac7584a88e0..22f56a85a9d 100644 --- a/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts +++ b/apps/web/src/app/vault/individual-vault/vault-onboarding/vault-onboarding.component.ts @@ -19,6 +19,7 @@ import { Organization } from "@bitwarden/common/admin-console/models/domain/orga import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum"; import { ConfigServiceAbstraction } from "@bitwarden/common/platform/abstractions/config/config.service.abstraction"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; +import { VaultOnboardingMessages } from "@bitwarden/common/vault/enums/vault-onboarding.enum"; import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view"; import { LinkModule } from "@bitwarden/components"; @@ -95,12 +96,12 @@ export class VaultOnboardingComponent implements OnInit, OnChanges, OnDestroy { void this.getMessages(event); }); - window.postMessage({ command: "checkIfBWExtensionInstalled" }); + window.postMessage({ command: VaultOnboardingMessages.checkBwInstalled }); } } async getMessages(event: any) { - if (event.data.command === "hasBWInstalled" && this.showOnboarding) { + if (event.data.command === VaultOnboardingMessages.HasBwInstalled && this.showOnboarding) { const currentTasks = await firstValueFrom(this.onboardingTasks$); const updatedTasks = { createAccount: currentTasks.createAccount, diff --git a/libs/common/src/vault/enums/vault-onboarding.enum.ts b/libs/common/src/vault/enums/vault-onboarding.enum.ts new file mode 100644 index 00000000000..11e072b3284 --- /dev/null +++ b/libs/common/src/vault/enums/vault-onboarding.enum.ts @@ -0,0 +1,6 @@ +const VaultOnboardingMessages = { + HasBwInstalled: "hasBwInstalled", + checkBwInstalled: "checkIfBWExtensionInstalled", +} as const; + +export { VaultOnboardingMessages };