import six
from exporters.filters.base_filter import BaseFilter
from exporters.python_interpreter import Interpreter, create_context
from importlib import import_module
[docs]def load_imports(imports):
# XXX: should we blacklist (or whitelist?) imports here?
return {name: import_module(mod) for name, mod in imports.items()}
[docs]class PythonexpFilter(BaseFilter):
"""
Filter items depending on python expression. This is NOT sure, so make sure you only use
it in contained environments
- python_expression (str)
Python expression to filter by
- imports(dict)
An object with neede imports for expressions
"""
# List of options
supported_options = {
'python_expression': {'type': six.string_types},
'imports': {'type': dict, 'default': {}},
}
def __init__(self, *args, **kwargs):
super(PythonexpFilter, self).__init__(*args, **kwargs)
self.logger.warning('PythonexpFilter can import insecure code'
' -- only use it in contained environments')
self.expression = self.read_option('python_expression')
self.imports = load_imports(self.read_option('imports'))
self.interpreter = Interpreter()
self.logger.info('PythonexpFilter has been initiated.'
' Expression: {!r}'.format(self.expression))
[docs] def filter(self, item):
try:
context = create_context(item=item, **self.imports)
return self.interpreter.eval(self.expression, context=context)
except Exception as ex:
self.logger.error(str(ex))
raise