From 6c1ec1803a800cbbdee006e20cf6e7e0b1429a88 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Thu, 16 Dec 2010 19:38:39 +0100 Subject: [PATCH] [FIX] safe_eval: support for allowing auto-loading of python submodules, such as _strptime bzr revid: odo@openerp.com-20101216183839-7mor9xfzbor2s9r7 --- bin/tools/safe_eval.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bin/tools/safe_eval.py b/bin/tools/safe_eval.py index 156899908fb..740b426f050 100644 --- a/bin/tools/safe_eval.py +++ b/bin/tools/safe_eval.py @@ -39,6 +39,8 @@ import os __all__ = ['test_expr', 'literal_eval', 'safe_eval', 'const_eval', 'ext_eval' ] +_ALLOWED_MODULES = ['_strptime'] + _CONST_OPCODES = set(opmap[x] for x in [ 'POP_TOP', 'ROT_TWO', 'ROT_THREE', 'ROT_FOUR', 'DUP_TOP','POP_BLOCK','SETUP_LOOP', 'BUILD_LIST', 'BUILD_MAP', 'BUILD_TUPLE', @@ -207,7 +209,10 @@ except ImportError: node_or_string = node_or_string.body return _convert(node_or_string) - +def _import(name, globals={}, locals={}, fromlist=[], level=-1): + if name in _ALLOWED_MODULES: + return __import__(name, globals, locals, level) + raise ImportError(name) def safe_eval(expr, globals_dict=None, locals_dict=None, mode="eval", nocopy=False): """safe_eval(expression[, globals[, locals[, mode[, nocopy]]]]) -> result @@ -253,6 +258,7 @@ def safe_eval(expr, globals_dict=None, locals_dict=None, mode="eval", nocopy=Fal globals_dict.update( __builtins__ = { + '__import__': _import, 'True': True, 'False': False, 'None': None,