blob: 5c18ef48a39c7992cfcf17b8a287f276c819ca55 [file] [log] [blame]
// from https://github.com/KlausTrainer/sandbox.js
exports.runInSandbox = function(src, ctx, whitelist) {
var vm = require('vm');
var sandbox;
if (ctx && ctx.require) {
whitelist = whitelist || [];
var insecureRequire = ctx.require;
var module = require('module');
var oldModulePrototype = module.prototype;
var secureRequire = function(moduleName) {
if (whitelist.indexOf(moduleName) === -1) {
module.prototype = oldModulePrototype;
throw new Error("'" + moduleName + "' is not whitelisted");
} else {
var requiredModule = insecureRequire(moduleName);
module.prototype = oldModulePrototype;
return requiredModule;
}
};
module.prototype = {
require: secureRequire,
load: module.prototype.load,
_compile: module.prototype._compile
};
module._cache = {};
ctx.require = secureRequire;
sandbox = Object.freeze(vm.createContext(ctx));
ctx.require = insecureRequire;
} else {
sandbox = Object.freeze(vm.createContext(ctx || {}));
}
return vm.createScript('(function() {"use strict"; return (' + src + ')()}())').runInContext(sandbox);
};