-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathexecgate.py
31 lines (25 loc) · 1.11 KB
/
execgate.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import ast
class GateSecurityError(Exception): pass
class GatedNodeVisitor(ast.NodeVisitor):
def visit_Attribute(self, node):
if('__' in node.attr):
raise GateSecurityError("Attempting to access private attribute")
def gated_compile(source, filename='<unknown>', mode='exec'):
code_node = ast.parse(source, filename, mode)
GatedNodeVisitor().visit(code_node)
return compile(code_node, filename, mode)
def gated_exec_eval(source, globals={}, locals={}, mode='exec'):
if globals is None:
globals = { '__builtins__': {} }
if globals.get('__builtins__', None) is None:
globals['__builtins__'] = {}
if mode is 'exec':
return exec(gated_compile(source, '<string>', mode), globals, locals)
elif mode is 'eval':
return eval(gated_compile(source, '<string>', mode), globals, locals)
else:
raise GatedEvalException('invalid mode {}'.format(mode))
def gated_exec(source, globals={}, locals={}):
gated_exec_eval(source, globals, locals)
def gated_eval(source, globals={}, locals={}):
return gated_exec_eval(source, globals, locals, 'eval')