Merge pull request #8605 from electron/no-more-global-buffer

Delete Buffer global when node integration is disabled
This commit is contained in:
Kevin Sawicki 2017-02-14 09:07:24 -08:00 committed by GitHub
commit 624e44dd6f
10 changed files with 22 additions and 31 deletions

View file

@ -80,22 +80,3 @@ This is not bulletproof, but at the least, you should attempt the following:
Again, this list merely minimizes the risk, it does not remove it. If your goal
is to display a website, a browser will be a more secure option.
## Buffer Global
Node's [Buffer](https://nodejs.org/api/buffer.html) class is currently available
as a global even when the `nodeintegration` attribute is not added. You can
delete this in your app by doing the following in your `preload` script:
```js
delete global.Buffer
```
Deleting it may break Node modules used in your preload script and app since
many libraries expect it to be a global instead of requiring it directly via:
```js
const {Buffer} = require('buffer')
```
The `Buffer` global may be removed in future major versions of Electron.

View file

@ -127,6 +127,7 @@ if (nodeIntegration === 'true') {
// Delete Node's symbols after the Environment has been loaded.
process.once('loaded', function () {
delete global.process
delete global.Buffer
delete global.setImmediate
delete global.clearImmediate
delete global.global

View file

@ -801,8 +801,9 @@ describe('BrowserWindow module', function () {
describe('"node-integration" option', function () {
it('disables node integration when specified to false', function (done) {
var preload = path.join(fixtures, 'module', 'send-later.js')
ipcMain.once('answer', function (event, test) {
assert.equal(test, 'undefined')
ipcMain.once('answer', function (event, typeofProcess, typeofBuffer) {
assert.equal(typeofProcess, 'undefined')
assert.equal(typeofBuffer, 'undefined')
done()
})
w.destroy()

View file

@ -0,0 +1,2 @@
const Buffer = 'declared Buffer'
module.exports = Buffer

View file

@ -1,6 +1,6 @@
setImmediate(function () {
try {
console.log([typeof process, typeof setImmediate, typeof global].join(' '))
console.log([typeof process, typeof setImmediate, typeof global, typeof Buffer].join(' '))
} catch (e) {
console.log(e.message)
}

View file

@ -1 +1 @@
console.log([typeof require, typeof module, typeof process].join(' '))
console.log([typeof require, typeof module, typeof process, typeof Buffer].join(' '))

View file

@ -1,4 +1,4 @@
var ipcRenderer = require('electron').ipcRenderer
window.onload = function () {
ipcRenderer.send('answer', typeof window.process)
ipcRenderer.send('answer', typeof window.process, typeof window.Buffer)
}

View file

@ -69,6 +69,12 @@ describe('third-party module', function () {
assert.strictEqual(require('./fixtures/module/declare-global'), 'declared global')
})
})
describe('Buffer', function () {
it('can be declared in a module', function () {
assert.strictEqual(require('./fixtures/module/declare-buffer'), 'declared Buffer')
})
})
})
})

View file

@ -171,7 +171,7 @@ describe('<webview> tag', function () {
describe('preload attribute', function () {
it('loads the script before other scripts in window', function (done) {
var listener = function (e) {
assert.equal(e.message, 'function object object')
assert.equal(e.message, 'function object object function')
webview.removeEventListener('console-message', listener)
done()
}
@ -181,9 +181,9 @@ describe('<webview> tag', function () {
document.body.appendChild(webview)
})
it('preload script can still use "process" in required modules when nodeintegration is off', function (done) {
it('preload script can still use "process" and "Buffer" in required modules when nodeintegration is off', function (done) {
webview.addEventListener('console-message', function (e) {
assert.equal(e.message, 'object undefined object')
assert.equal(e.message, 'object undefined object function')
done()
})
webview.setAttribute('preload', fixtures + '/module/preload-node-off.js')
@ -212,7 +212,7 @@ describe('<webview> tag', function () {
it('works without script tag in page', function (done) {
var listener = function (e) {
assert.equal(e.message, 'function object object')
assert.equal(e.message, 'function object object function')
webview.removeEventListener('console-message', listener)
done()
}
@ -224,7 +224,7 @@ describe('<webview> tag', function () {
it('resolves relative URLs', function (done) {
var listener = function (e) {
assert.equal(e.message, 'function object object')
assert.equal(e.message, 'function object object function')
webview.removeEventListener('console-message', listener)
done()
}
@ -318,7 +318,7 @@ describe('<webview> tag', function () {
it('does not break preload script', function (done) {
var listener = function (e) {
assert.equal(e.message, 'function object object')
assert.equal(e.message, 'function object object function')
webview.removeEventListener('console-message', listener)
done()
}

2
vendor/node vendored

@ -1 +1 @@
Subproject commit b64908216a6d5f84862b2b947985a513a6521cb3
Subproject commit 9eeeb53aa697a54561ffc6c94f06b3ac5963f398