From dc91cfda69808e4def81162510a63f7146df1869 Mon Sep 17 00:00:00 2001 From: Andreas Coroiu Date: Fri, 18 Nov 2022 15:24:46 +0100 Subject: [PATCH] [EC-598] feat: add ability to return responses --- .../src/background/runtime.background.ts | 6 +---- .../src/content/webauthn/content-script.ts | 23 +++++++++++-------- .../content/webauthn/messaging/messenger.ts | 19 ++------------- .../src/content/webauthn/page-script.ts | 2 +- .../src/services/fido2/fido2.service.ts | 2 +- 5 files changed, 19 insertions(+), 33 deletions(-) diff --git a/apps/browser/src/background/runtime.background.ts b/apps/browser/src/background/runtime.background.ts index 4e7387ca062..3b7d4fe2056 100644 --- a/apps/browser/src/background/runtime.background.ts +++ b/apps/browser/src/background/runtime.background.ts @@ -205,11 +205,7 @@ export default class RuntimeBackground { this.platformUtilsService.copyToClipboard(msg.identifier, { window: window }); break; case "fido2RegisterCredentialRequest": - BrowserApi.tabSendMessageData( - sender.tab, - "fido2RegisterCredentialResponse", - await this.main.fido2Service.createCredential(msg.data) - ); + sendResponse(await this.main.fido2Service.createCredential(msg.data)); break; default: break; diff --git a/apps/browser/src/content/webauthn/content-script.ts b/apps/browser/src/content/webauthn/content-script.ts index ce9ba8ab2e4..0bc2ac4a428 100644 --- a/apps/browser/src/content/webauthn/content-script.ts +++ b/apps/browser/src/content/webauthn/content-script.ts @@ -8,19 +8,24 @@ const s = document.createElement("script"); s.src = chrome.runtime.getURL("content/webauthn/page-script.js"); (document.head || document.documentElement).appendChild(s); -const messenger = Messenger.createInExtensionContext(window, chrome.runtime.connect()); +const messenger = Messenger.forDOMCommunication(window); messenger.addHandler(async (message) => { if (message.type === MessageType.CredentialCreationRequest) { - chrome.runtime.sendMessage({ - command: "fido2RegisterCredentialRequest", - data: message.data, + return new Promise((resolve, reject) => { + chrome.runtime.sendMessage( + { + command: "fido2RegisterCredentialRequest", + data: message.data, + }, + (response) => { + resolve({ + type: MessageType.CredentialCreationResponse, + approved: true, + }); + } + ); }); - - return { - type: MessageType.CredentialCreationResponse, - approved: true, - }; } return undefined; diff --git a/apps/browser/src/content/webauthn/messaging/messenger.ts b/apps/browser/src/content/webauthn/messaging/messenger.ts index bbba5d067a7..3b9f54d5464 100644 --- a/apps/browser/src/content/webauthn/messaging/messenger.ts +++ b/apps/browser/src/content/webauthn/messaging/messenger.ts @@ -2,7 +2,7 @@ import { concatMap, filter, firstValueFrom, Observable } from "rxjs"; import { Message } from "./message"; -type PostMessageFunction = Window["postMessage"] | chrome.runtime.Port["postMessage"]; +type PostMessageFunction = (message: MessageWithMetadata) => void; type Channel = { messages$: Observable; @@ -17,22 +17,7 @@ type MessageWithMetadata = Message & { metadata: Metadata }; // If you see this in a code review please comment on it! export class Messenger { - static createInPageContext(window: Window) { - return new Messenger({ - postMessage: window.postMessage.bind(window), - messages$: new Observable((subscriber) => { - const eventListener = (event: MessageEvent) => { - subscriber.next(event.data); - }; - - window.addEventListener("message", eventListener); - - return () => window.removeEventListener("message", eventListener); - }), - }); - } - - static createInExtensionContext(window: Window, port: chrome.runtime.Port) { + static forDOMCommunication(window: Window) { return new Messenger({ postMessage: window.postMessage.bind(window), messages$: new Observable((subscriber) => { diff --git a/apps/browser/src/content/webauthn/page-script.ts b/apps/browser/src/content/webauthn/page-script.ts index d01dacc4c78..e34a0720f4c 100644 --- a/apps/browser/src/content/webauthn/page-script.ts +++ b/apps/browser/src/content/webauthn/page-script.ts @@ -9,7 +9,7 @@ const browserCredentials = { get: navigator.credentials.get.bind(navigator.credentials), }; -const messenger = Messenger.createInPageContext(window); +const messenger = Messenger.forDOMCommunication(window); navigator.credentials.create = async (options?: CredentialCreationOptions): Promise => { await messenger.request({ diff --git a/libs/common/src/services/fido2/fido2.service.ts b/libs/common/src/services/fido2/fido2.service.ts index 97dfe25bac9..7b765d1bc52 100644 --- a/libs/common/src/services/fido2/fido2.service.ts +++ b/libs/common/src/services/fido2/fido2.service.ts @@ -7,7 +7,7 @@ export class Fido2Service implements Fido2ServiceAbstraction { createCredential(params: CredentialRegistrationParams): unknown { // eslint-disable-next-line no-console console.log("Fido2Service.registerCredential"); - return undefined; + return "createCredential response"; } assertCredential(): unknown {