Use remote/fs to read preload script during sandboxed setup
authorThiago de Arruda <tpadilha84@gmail.com>
Thu, 16 Mar 2017 17:23:00 +0000 (14:23 -0300)
committerThiago de Arruda <tpadilha84@gmail.com>
Thu, 16 Mar 2017 17:23:00 +0000 (14:23 -0300)
Also expose the "fs" module to preload scripts, as a shortcut to
`require('electron').remote.require('fs')`

lib/browser/rpc-server.js
lib/sandboxed_renderer/init.js

index 2cafc93..13d6f88 100644 (file)
@@ -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])
index aba3b65..6773166 100644 (file)
@@ -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: