From e9b955b9ec353817fafb2db21edec8dd5cb8847e Mon Sep 17 00:00:00 2001 From: Thiago de Arruda Date: Thu, 16 Mar 2017 14:23:00 -0300 Subject: [PATCH] Use remote/fs to read preload script during sandboxed setup Also expose the "fs" module to preload scripts, as a shortcut to `require('electron').remote.require('fs')` --- lib/browser/rpc-server.js | 9 --------- lib/sandboxed_renderer/init.js | 15 +++++++++------ 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/lib/browser/rpc-server.js b/lib/browser/rpc-server.js index 2cafc93..13d6f88 100644 --- a/lib/browser/rpc-server.js +++ b/lib/browser/rpc-server.js @@ -7,8 +7,6 @@ const {WebContents} = process.atomBinding('web_contents') const {ipcMain, isPromise, webContents} = electron -const fs = require('fs') - const objectsRegistry = require('./objects-registry') const hasProp = {}.hasOwnProperty @@ -268,13 +266,6 @@ ipcMain.on('ELECTRON_BROWSER_REQUIRE', function (event, module) { } }) -ipcMain.on('ELECTRON_BROWSER_READ_FILE', function (event, file) { - fs.readFile(file, (err, data) => { - if (err) event.returnValue = {err: err.message} - else event.returnValue = {data: data.toString()} - }) -}) - ipcMain.on('ELECTRON_BROWSER_GET_BUILTIN', function (event, module) { try { event.returnValue = valueToMeta(event.sender, electron[module]) diff --git a/lib/sandboxed_renderer/init.js b/lib/sandboxed_renderer/init.js index aba3b65..6773166 100644 --- a/lib/sandboxed_renderer/init.js +++ b/lib/sandboxed_renderer/init.js @@ -22,13 +22,16 @@ const preloadModules = new Map([ ['electron', electron] ]) -// Fetch the preload script. This needs to be done through the browser process -// since we may not have filesystem access in a sandboxed renderer. -let preloadSrc = electron.ipcRenderer.sendSync('ELECTRON_BROWSER_READ_FILE', preloadPath) -if (preloadSrc.err) { - throw new Error(preloadSrc.err) +const extraModules = [ + 'fs' +] +for (let extraModule of extraModules) { + preloadModules.set(extraModule, electron.remote.require(extraModule)) } +// Fetch the preload script using the "fs" module proxy. +let preloadSrc = preloadModules.get('fs').readFileSync(preloadPath).toString() + // Pass different process object to the preload script(which should not have // access to things like `process.atomBinding`). const preloadProcess = new events.EventEmitter() @@ -62,7 +65,7 @@ function preloadRequire (module) { // since browserify won't try to include `electron` in the bundle, falling back // to the `preloadRequire` function above. let preloadWrapperSrc = `(function(require, process, Buffer, global) { -${preloadSrc.data} +${preloadSrc} })` // eval in window scope: -- 2.7.4