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:
@@ -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 },
|
||||||
|
},
|
||||||
|
),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
25
package-lock.json
generated
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user