From 706d9ede9b39e8eda64df7906d181409561d68f3 Mon Sep 17 00:00:00 2001 From: Jeremy Rose Date: Tue, 9 Feb 2021 17:12:26 -0800 Subject: [PATCH] refactor: only allow internal messages from the main process (#27676) --- lib/renderer/api/remote.ts | 2 +- lib/renderer/init.ts | 4 ++++ lib/renderer/ipc-renderer-internal-utils.ts | 2 +- lib/renderer/ipc-renderer-internal.ts | 23 -------------------- lib/renderer/web-view/guest-view-internal.ts | 6 ++--- lib/renderer/window-setup.ts | 6 ++--- lib/sandboxed_renderer/init.ts | 4 ++++ typings/internal-electron.d.ts | 2 -- 8 files changed, 16 insertions(+), 33 deletions(-) diff --git a/lib/renderer/api/remote.ts b/lib/renderer/api/remote.ts index bd923ab936..35a9a5b1ba 100644 --- a/lib/renderer/api/remote.ts +++ b/lib/renderer/api/remote.ts @@ -305,7 +305,7 @@ function metaToError (meta: { type: 'error', value: any, members: ObjectMember[] } function handleMessage (channel: string, handler: Function) { - ipcRendererInternal.onMessageFromMain(channel, (event, passedContextId, id, ...args) => { + ipcRendererInternal.on(channel, (event, passedContextId, id, ...args) => { if (passedContextId === contextId) { handler(id, ...args); } else { diff --git a/lib/renderer/init.ts b/lib/renderer/init.ts index 9b7be2868f..c41fa56188 100644 --- a/lib/renderer/init.ts +++ b/lib/renderer/init.ts @@ -44,6 +44,10 @@ const ipcRenderer = require('@electron/internal/renderer/api/ipc-renderer').defa v8Util.setHiddenValue(global, 'ipcNative', { onMessage (internal: boolean, channel: string, ports: any[], args: any[], senderId: number) { + if (internal && senderId !== 0) { + console.error(`Message ${channel} sent by unexpected WebContents (${senderId})`); + return; + } const sender = internal ? ipcRendererInternal : ipcRenderer; sender.emit(channel, { sender, senderId, ports }, ...args); } diff --git a/lib/renderer/ipc-renderer-internal-utils.ts b/lib/renderer/ipc-renderer-internal-utils.ts index 62d12da389..709880ffe5 100644 --- a/lib/renderer/ipc-renderer-internal-utils.ts +++ b/lib/renderer/ipc-renderer-internal-utils.ts @@ -3,7 +3,7 @@ import { ipcRendererInternal } from '@electron/internal/renderer/ipc-renderer-in type IPCHandler = (event: Electron.IpcRendererEvent, ...args: any[]) => any export const handle = function (channel: string, handler: T) { - ipcRendererInternal.onMessageFromMain(channel, async (event, requestId, ...args) => { + ipcRendererInternal.on(channel, async (event, requestId, ...args) => { const replyChannel = `${channel}_RESPONSE_${requestId}`; try { event.sender.send(replyChannel, null, await handler(event, ...args)); diff --git a/lib/renderer/ipc-renderer-internal.ts b/lib/renderer/ipc-renderer-internal.ts index 766787dbc7..d69dc14c5d 100644 --- a/lib/renderer/ipc-renderer-internal.ts +++ b/lib/renderer/ipc-renderer-internal.ts @@ -25,27 +25,4 @@ ipcRendererInternal.invoke = async function (channel: string, ...args: any[]) return result; }; -ipcRendererInternal.onMessageFromMain = function (channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void) { - return ipcRendererInternal.on(channel, (event, ...args) => { - if (event.senderId !== 0) { - console.error(`Message ${channel} sent by unexpected WebContents (${event.senderId})`); - return; - } - - listener(event, ...args); - }); -}; - -ipcRendererInternal.onceMessageFromMain = function (channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void) { - return ipcRendererInternal.on(channel, function wrapper (event, ...args) { - if (event.senderId !== 0) { - console.error(`Message ${channel} sent by unexpected WebContents (${event.senderId})`); - return; - } - - ipcRendererInternal.removeListener(channel, wrapper); - listener(event, ...args); - }); -}; - export { ipcRendererInternal }; diff --git a/lib/renderer/web-view/guest-view-internal.ts b/lib/renderer/web-view/guest-view-internal.ts index 228854d04f..db1e19bdc2 100644 --- a/lib/renderer/web-view/guest-view-internal.ts +++ b/lib/renderer/web-view/guest-view-internal.ts @@ -32,17 +32,17 @@ const dispatchEvent = function ( }; export function registerEvents (webView: WebViewImpl, viewInstanceId: number) { - ipcRendererInternal.onMessageFromMain(`${IPC_MESSAGES.GUEST_VIEW_INTERNAL_DESTROY_GUEST}-${viewInstanceId}`, function () { + ipcRendererInternal.on(`${IPC_MESSAGES.GUEST_VIEW_INTERNAL_DESTROY_GUEST}-${viewInstanceId}`, function () { webView.guestInstanceId = undefined; webView.reset(); webView.dispatchEvent('destroyed'); }); - ipcRendererInternal.onMessageFromMain(`${IPC_MESSAGES.GUEST_VIEW_INTERNAL_DISPATCH_EVENT}-${viewInstanceId}`, function (event, eventName, ...args) { + ipcRendererInternal.on(`${IPC_MESSAGES.GUEST_VIEW_INTERNAL_DISPATCH_EVENT}-${viewInstanceId}`, function (event, eventName, ...args) { dispatchEvent(webView, eventName, eventName, ...args); }); - ipcRendererInternal.onMessageFromMain(`${IPC_MESSAGES.GUEST_VIEW_INTERNAL_IPC_MESSAGE}-${viewInstanceId}`, function (event, channel, ...args) { + ipcRendererInternal.on(`${IPC_MESSAGES.GUEST_VIEW_INTERNAL_IPC_MESSAGE}-${viewInstanceId}`, function (event, channel, ...args) { webView.dispatchEvent('ipc-message', { channel, args }); }); } diff --git a/lib/renderer/window-setup.ts b/lib/renderer/window-setup.ts index 3f3600ad0d..6b33899991 100644 --- a/lib/renderer/window-setup.ts +++ b/lib/renderer/window-setup.ts @@ -182,7 +182,7 @@ class BrowserWindowProxy { this.guestId = guestId; this._location = new LocationProxy(guestId); - ipcRendererInternal.onceMessageFromMain(`${IPC_MESSAGES.GUEST_WINDOW_MANAGER_WINDOW_CLOSED}_${guestId}`, () => { + ipcRendererInternal.once(`${IPC_MESSAGES.GUEST_WINDOW_MANAGER_WINDOW_CLOSED}_${guestId}`, () => { removeProxy(guestId); this.closed = true; }); @@ -282,7 +282,7 @@ export const windowSetup = ( if (contextIsolationEnabled) internalContextBridge.overrideGlobalValueFromIsolatedWorld(['prompt'], window.prompt); if (!usesNativeWindowOpen || openerId != null) { - ipcRendererInternal.onMessageFromMain(IPC_MESSAGES.GUEST_WINDOW_POSTMESSAGE, function ( + ipcRendererInternal.on(IPC_MESSAGES.GUEST_WINDOW_POSTMESSAGE, function ( _event, sourceId: number, message: any, sourceOrigin: string ) { // Manually dispatch event instead of using postMessage because we also need to @@ -337,7 +337,7 @@ export const windowSetup = ( let cachedVisibilityState = isHiddenPage ? 'hidden' : 'visible'; // Subscribe to visibilityState changes. - ipcRendererInternal.onMessageFromMain(IPC_MESSAGES.GUEST_INSTANCE_VISIBILITY_CHANGE, function (_event, visibilityState: VisibilityState) { + ipcRendererInternal.on(IPC_MESSAGES.GUEST_INSTANCE_VISIBILITY_CHANGE, function (_event, visibilityState: VisibilityState) { if (cachedVisibilityState !== visibilityState) { cachedVisibilityState = visibilityState; document.dispatchEvent(new Event('visibilitychange')); diff --git a/lib/sandboxed_renderer/init.ts b/lib/sandboxed_renderer/init.ts index 301072850c..a23082ef04 100644 --- a/lib/sandboxed_renderer/init.ts +++ b/lib/sandboxed_renderer/init.ts @@ -43,6 +43,10 @@ const loadableModules = new Map([ // invoking the 'onMessage' callback. v8Util.setHiddenValue(global, 'ipcNative', { onMessage (internal: boolean, channel: string, ports: MessagePort[], args: any[], senderId: number) { + if (internal && senderId !== 0) { + console.error(`Message ${channel} sent by unexpected WebContents (${senderId})`); + return; + } const sender = internal ? ipcRendererInternal : electron.ipcRenderer; sender.emit(channel, { sender, senderId, ports }, ...args); } diff --git a/typings/internal-electron.d.ts b/typings/internal-electron.d.ts index 851eb5a733..89eedb4d64 100644 --- a/typings/internal-electron.d.ts +++ b/typings/internal-electron.d.ts @@ -246,8 +246,6 @@ declare namespace ElectronInternal { interface IpcRendererInternal extends Electron.IpcRenderer { invoke(channel: string, ...args: any[]): Promise; - onMessageFromMain(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void): this; - onceMessageFromMain(channel: string, listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void): this; } // Internal IPC has _replyInternal and NO reply method