feat(sandbox) add load mode to string functions

This commit is contained in:
eskerda 2020-12-11 17:22:17 +01:00 committed by Enrique García Cota
parent ddbc7e12cc
commit 8974b8869c
2 changed files with 15 additions and 3 deletions

View File

@ -138,8 +138,6 @@ end
-- Public interface: sandbox.protect -- Public interface: sandbox.protect
function sandbox.protect(f, options) function sandbox.protect(f, options)
if type(f) == 'string' then f = assert(loadstring(f)) end
options = options or {} options = options or {}
local quota = false local quota = false
@ -150,7 +148,11 @@ function sandbox.protect(f, options)
local env = merge(options.env or {}, BASE_ENV) local env = merge(options.env or {}, BASE_ENV)
env._G = env._G or env env._G = env._G or env
setfenv(f, env) if type(f) == 'string' then
f = assert(load(f, nil, options.mode, env))
else
setfenv(f, env)
end
return function(...) return function(...)

View File

@ -13,6 +13,16 @@ describe('sandbox.run', function()
assert.equal(r, 'hello') assert.equal(r, 'hello')
end) end)
it('can run bytecode strings by default', function()
local fn = function() end
assert.has_no.error(function() sandbox.run(string.dump(fn)) end)
end)
it('can\'t run bytecode strings if given a \'t\' mode option', function()
local fn = function() end
assert.error(function() sandbox.run(string.dump(fn), { mode = 't' }) end)
end)
it('has access to safe methods', function() it('has access to safe methods', function()
assert.equal(10, sandbox.run("return tonumber('10')")) assert.equal(10, sandbox.run("return tonumber('10')"))
assert.equal('HELLO', sandbox.run("return string.upper('hello')")) assert.equal('HELLO', sandbox.run("return string.upper('hello')"))