1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-10 21:33:27 +00:00

[PM-20615] Only process incoming messages once (#14645)

* feat: start ipc client

* fix: payload serialization issues

* feat: filter incoming messages by destination

* fix: adapt to SDK renames

* feat: update sdk
This commit is contained in:
Andreas Coroiu
2025-06-12 10:17:03 +02:00
committed by GitHub
parent ed169335bf
commit 0e608639cc
6 changed files with 49 additions and 17 deletions

View File

@@ -23,14 +23,14 @@ export class IpcBackgroundService extends IpcService {
await SdkLoadService.Ready; await SdkLoadService.Ready;
this.communicationBackend = new IpcCommunicationBackend({ this.communicationBackend = new IpcCommunicationBackend({
async send(message: OutgoingMessage): Promise<void> { async send(message: OutgoingMessage): Promise<void> {
if (typeof message.destination === "object") { if (typeof message.destination === "object" && message.destination.Web != undefined) {
await BrowserApi.tabSendMessage( await BrowserApi.tabSendMessage(
{ id: message.destination.Web.id } as chrome.tabs.Tab, { id: message.destination.Web.id } as chrome.tabs.Tab,
{ {
type: "bitwarden-ipc-message", type: "bitwarden-ipc-message",
message: { message: {
destination: message.destination, destination: message.destination,
payload: message.payload, payload: [...message.payload],
topic: message.topic, topic: message.topic,
}, },
} satisfies IpcMessage, } satisfies IpcMessage,
@@ -44,7 +44,7 @@ export class IpcBackgroundService extends IpcService {
}); });
BrowserApi.messageListener("platform.ipc", (message, sender) => { BrowserApi.messageListener("platform.ipc", (message, sender) => {
if (!isIpcMessage(message)) { if (!isIpcMessage(message) || message.message.destination !== "BrowserBackground") {
return; return;
} }
@@ -53,10 +53,14 @@ export class IpcBackgroundService extends IpcService {
return; return;
} }
this.communicationBackend?.deliver_message( this.communicationBackend?.receive(
new IncomingMessage(message.message.payload, message.message.destination, { new IncomingMessage(
Web: { id: sender.tab.id }, new Uint8Array(message.message.payload),
}), message.message.destination,
{
Web: { id: sender.tab.id },
},
),
); );
}); });

View File

@@ -27,7 +27,7 @@ export class WebIpcService extends IpcService {
type: "bitwarden-ipc-message", type: "bitwarden-ipc-message",
message: { message: {
destination: message.destination, destination: message.destination,
payload: message.payload, payload: [...message.payload],
topic: message.topic, topic: message.topic,
}, },
} satisfies IpcMessage, } satisfies IpcMessage,
@@ -50,9 +50,16 @@ export class WebIpcService extends IpcService {
return; return;
} }
this.communicationBackend?.deliver_message( if (
typeof message.message.destination !== "object" ||
message.message.destination.Web == undefined
) {
return;
}
this.communicationBackend?.receive(
new IncomingMessage( new IncomingMessage(
message.message.payload, new Uint8Array(message.message.payload),
message.message.destination, message.message.destination,
"BrowserBackground", "BrowserBackground",
message.message.topic, message.message.topic,

View File

@@ -2,7 +2,11 @@ import type { OutgoingMessage } from "@bitwarden/sdk-internal";
export interface IpcMessage { export interface IpcMessage {
type: "bitwarden-ipc-message"; type: "bitwarden-ipc-message";
message: Omit<OutgoingMessage, "free">; message: SerializedOutgoingMessage;
}
export interface SerializedOutgoingMessage extends Omit<OutgoingMessage, "free" | "payload"> {
payload: number[];
} }
export function isIpcMessage(message: any): message is IpcMessage { export function isIpcMessage(message: any): message is IpcMessage {

View File

@@ -23,6 +23,8 @@ export abstract class IpcService {
protected async initWithClient(client: IpcClient): Promise<void> { protected async initWithClient(client: IpcClient): Promise<void> {
this._client = client; this._client = client;
await this._client.start();
this._messages$ = new Observable<IncomingMessage>((subscriber) => { this._messages$ = new Observable<IncomingMessage>((subscriber) => {
let isSubscribed = true; let isSubscribed = true;
const receiveLoop = async () => { const receiveLoop = async () => {

25
package-lock.json generated
View File

@@ -24,7 +24,7 @@
"@angular/platform-browser": "19.2.14", "@angular/platform-browser": "19.2.14",
"@angular/platform-browser-dynamic": "19.2.14", "@angular/platform-browser-dynamic": "19.2.14",
"@angular/router": "19.2.14", "@angular/router": "19.2.14",
"@bitwarden/sdk-internal": "0.2.0-main.177", "@bitwarden/sdk-internal": "0.2.0-main.198",
"@electron/fuses": "1.8.0", "@electron/fuses": "1.8.0",
"@emotion/css": "11.13.5", "@emotion/css": "11.13.5",
"@koa/multer": "3.1.0", "@koa/multer": "3.1.0",
@@ -4378,10 +4378,25 @@
"link": true "link": true
}, },
"node_modules/@bitwarden/sdk-internal": { "node_modules/@bitwarden/sdk-internal": {
"version": "0.2.0-main.177", "version": "0.2.0-main.198",
"resolved": "https://registry.npmjs.org/@bitwarden/sdk-internal/-/sdk-internal-0.2.0-main.177.tgz", "resolved": "https://registry.npmjs.org/@bitwarden/sdk-internal/-/sdk-internal-0.2.0-main.198.tgz",
"integrity": "sha512-2fp/g0WJDPPrIqrU88QrwoJsZTzoi7S7eCf+Qq0/8x3ImqQyoYJEdHdz06YHjUdS0CzucPrwTo5zJ/ZvcLNOmQ==", "integrity": "sha512-/MRdlcBqGxFEK/p6bU4hu5ZRoa+PqU88S+xnQaFrCXsWCTXrC8Nvm46iiz6gAqdbfFQWFNLCtmoNx6LFUdRuNg==",
"license": "GPL-3.0" "license": "GPL-3.0",
"dependencies": {
"type-fest": "^4.41.0"
}
},
"node_modules/@bitwarden/sdk-internal/node_modules/type-fest": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
}, },
"node_modules/@bitwarden/send-ui": { "node_modules/@bitwarden/send-ui": {
"resolved": "libs/tools/send/send-ui", "resolved": "libs/tools/send/send-ui",

View File

@@ -160,7 +160,7 @@
"@angular/platform-browser": "19.2.14", "@angular/platform-browser": "19.2.14",
"@angular/platform-browser-dynamic": "19.2.14", "@angular/platform-browser-dynamic": "19.2.14",
"@angular/router": "19.2.14", "@angular/router": "19.2.14",
"@bitwarden/sdk-internal": "0.2.0-main.177", "@bitwarden/sdk-internal": "0.2.0-main.198",
"@electron/fuses": "1.8.0", "@electron/fuses": "1.8.0",
"@emotion/css": "11.13.5", "@emotion/css": "11.13.5",
"@koa/multer": "3.1.0", "@koa/multer": "3.1.0",