Index: test/snippets.js |
=================================================================== |
--- a/test/snippets.js |
+++ b/test/snippets.js |
@@ -189,23 +189,60 @@ |
throw new Error("Value mismatch"); |
}; |
` |
]; |
let template = ` |
"use strict"; |
{ |
+ let globals = {}; |
Manish Jethani
2018/07/31 14:17:08
This is copied and pasted from lib/snippets.js (it
|
+ |
+ for (let name of typeof window != "undefined" ? Object.keys(window) : []) |
+ globals[name] = null; |
+ |
+ for (let name of typeof global != "undefined" ? Object.keys(global) : []) |
+ globals[name] = null; |
+ |
+ if (typeof browser != "undefined") |
+ { |
+ globals.browser = { |
+ runtime: { |
+ getURL: browser.runtime.getURL |
+ } |
+ }; |
+ } |
+ |
+ if (typeof document != "undefined") |
+ { |
+ globals.document = new Proxy(document, { |
+ get(target, property) |
+ { |
+ if (property == "defaultView") |
+ return null; |
+ |
+ let value = target[property]; |
+ if (typeof value == "function") |
+ return value.bind(target); |
+ |
+ return value; |
+ } |
+ }); |
+ } |
+ |
const libraries = ${JSON.stringify(libraries)}; |
const script = {{{script}}}; |
let imports = Object.create(null); |
for (let library of libraries) |
- new Function("exports", library)(imports); |
+ { |
+ let func = new Function("exports", ...Object.keys(globals), library); |
+ func(imports, ...Object.keys(globals).map(key => globals[key])); |
+ } |
for (let [name, ...args] of script) |
{ |
if (Object.prototype.hasOwnProperty.call(imports, name)) |
{ |
let value = imports[name]; |
if (typeof value == "function") |
value(...args); |
@@ -234,10 +271,23 @@ |
// between executions. In the example below, assertFoo does not find 456 but |
// it doesn't find 123 either. It's the initial value 0. |
new Function( |
compileScript("setFoo 456; assertFoo 0", [ |
...libraries, "let foo = 1; exports.setFoo = value => { foo = value; };" |
]) |
)(); |
+ // Test sandboxing. |
Manish Jethani
2018/07/31 14:17:08
This is where we test the sandboxing. The process
|
+ test.throws( |
+ new Function( |
+ compileScript("do-evil", [ |
+ // The global process object is shadowed to null so this snippet throws |
+ // an error. |
+ "exports['do-evil'] = function() { process.pid; };" |
+ ]) |
+ ), |
+ TypeError, |
+ "Cannot read property 'pid' of null" |
+ ); |
+ |
test.done(); |
}; |