fix: execute session preload scripts in sandboxed renderers (#16538)
This commit is contained in:
parent
a25f82c91f
commit
fa5442f211
5 changed files with 47 additions and 33 deletions
|
@ -534,8 +534,7 @@ ipcMain.on('ELECTRON_BROWSER_CLIPBOARD_WRITE_FIND_TEXT', function (event, text)
|
||||||
setReturnValue(event, () => electron.clipboard.writeFindText(text))
|
setReturnValue(event, () => electron.clipboard.writeFindText(text))
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('ELECTRON_BROWSER_SANDBOX_LOAD', function (event) {
|
const getPreloadScript = function (preloadPath) {
|
||||||
const preloadPath = event.sender._getPreloadPath()
|
|
||||||
let preloadSrc = null
|
let preloadSrc = null
|
||||||
let preloadError = null
|
let preloadError = null
|
||||||
if (preloadPath) {
|
if (preloadPath) {
|
||||||
|
@ -545,10 +544,17 @@ ipcMain.on('ELECTRON_BROWSER_SANDBOX_LOAD', function (event) {
|
||||||
preloadError = errorUtils.serialize(err)
|
preloadError = errorUtils.serialize(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return { preloadPath, preloadSrc, preloadError }
|
||||||
|
}
|
||||||
|
|
||||||
|
ipcMain.on('ELECTRON_BROWSER_SANDBOX_LOAD', function (event) {
|
||||||
|
const preloadPaths = [
|
||||||
|
...(event.sender.session ? event.sender.session.getPreloads() : []),
|
||||||
|
event.sender._getPreloadPath()
|
||||||
|
]
|
||||||
|
|
||||||
event.returnValue = {
|
event.returnValue = {
|
||||||
preloadPath,
|
preloadScripts: preloadPaths.map(path => getPreloadScript(path)),
|
||||||
preloadSrc,
|
|
||||||
preloadError,
|
|
||||||
isRemoteModuleEnabled: event.sender._isRemoteModuleEnabled(),
|
isRemoteModuleEnabled: event.sender._isRemoteModuleEnabled(),
|
||||||
isWebViewTagEnabled: guestViewManager.isWebViewTagEnabled(event.sender),
|
isWebViewTagEnabled: guestViewManager.isWebViewTagEnabled(event.sender),
|
||||||
process: {
|
process: {
|
||||||
|
|
|
@ -29,7 +29,7 @@ Object.setPrototypeOf(process, EventEmitter.prototype)
|
||||||
const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal')
|
const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal')
|
||||||
|
|
||||||
const {
|
const {
|
||||||
preloadPath, preloadSrc, preloadError, isRemoteModuleEnabled, isWebViewTagEnabled, process: processProps
|
preloadScripts, isRemoteModuleEnabled, isWebViewTagEnabled, process: processProps
|
||||||
} = ipcRenderer.sendSync('ELECTRON_BROWSER_SANDBOX_LOAD')
|
} = ipcRenderer.sendSync('ELECTRON_BROWSER_SANDBOX_LOAD')
|
||||||
|
|
||||||
process.isRemoteModuleEnabled = isRemoteModuleEnabled
|
process.isRemoteModuleEnabled = isRemoteModuleEnabled
|
||||||
|
@ -151,6 +151,7 @@ function runPreloadScript (preloadSrc) {
|
||||||
preloadFn(preloadRequire, preloadProcess, Buffer, global, setImmediate, clearImmediate)
|
preloadFn(preloadRequire, preloadProcess, Buffer, global, setImmediate, clearImmediate)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const { preloadPath, preloadSrc, preloadError } of preloadScripts) {
|
||||||
try {
|
try {
|
||||||
if (preloadSrc) {
|
if (preloadSrc) {
|
||||||
runPreloadScript(preloadSrc)
|
runPreloadScript(preloadSrc)
|
||||||
|
@ -163,6 +164,7 @@ try {
|
||||||
|
|
||||||
ipcRenderer.send('ELECTRON_BROWSER_PRELOAD_ERROR', preloadPath, errorUtils.serialize(error))
|
ipcRenderer.send('ELECTRON_BROWSER_PRELOAD_ERROR', preloadPath, errorUtils.serialize(error))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Warn about security issues
|
// Warn about security issues
|
||||||
if (process.isMainFrame) {
|
if (process.isMainFrame) {
|
||||||
|
|
|
@ -1384,24 +1384,30 @@ describe('BrowserWindow module', () => {
|
||||||
assert.deepStrictEqual(defaultSession.getPreloads(), preloads)
|
assert.deepStrictEqual(defaultSession.getPreloads(), preloads)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const generateSpecs = (description, sandbox) => {
|
||||||
|
describe(description, () => {
|
||||||
it('loads the script before other scripts in window including normal preloads', function (done) {
|
it('loads the script before other scripts in window including normal preloads', function (done) {
|
||||||
ipcMain.once('vars', function (event, preload1, preload2, preload3) {
|
ipcMain.once('vars', function (event, preload1, preload2) {
|
||||||
assert.strictEqual(preload1, 'preload-1')
|
assert.strictEqual(preload1, 'preload-1')
|
||||||
assert.strictEqual(preload2, 'preload-1-2')
|
assert.strictEqual(preload2, 'preload-1-2')
|
||||||
assert.strictEqual(preload3, 'preload-1-2-3')
|
|
||||||
done()
|
done()
|
||||||
})
|
})
|
||||||
w.destroy()
|
w.destroy()
|
||||||
w = new BrowserWindow({
|
w = new BrowserWindow({
|
||||||
show: false,
|
show: false,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: true,
|
sandbox,
|
||||||
preload: path.join(fixtures, 'module', 'set-global-preload-3.js')
|
preload: path.join(fixtures, 'module', 'get-global-preload.js')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
w.loadFile(path.join(fixtures, 'api', 'preloads.html'))
|
w.loadURL('about:blank')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
generateSpecs('without sandbox', false)
|
||||||
|
generateSpecs('with sandbox', true)
|
||||||
|
})
|
||||||
|
|
||||||
describe('"additionalArguments" option', () => {
|
describe('"additionalArguments" option', () => {
|
||||||
it('adds extra args to process.argv in the renderer process', (done) => {
|
it('adds extra args to process.argv in the renderer process', (done) => {
|
||||||
|
|
1
spec/fixtures/module/get-global-preload.js
vendored
Normal file
1
spec/fixtures/module/get-global-preload.js
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
require('electron').ipcRenderer.send('vars', window.preload1, window.preload2)
|
1
spec/fixtures/module/set-global-preload-3.js
vendored
1
spec/fixtures/module/set-global-preload-3.js
vendored
|
@ -1 +0,0 @@
|
||||||
window.preload3 = window.preload2 + '-3'
|
|
Loading…
Reference in a new issue