|
11 | 11 | Formula Rule |
12 | 12 | """ |
13 | 13 |
|
| 14 | +# Import safe modules |
| 15 | +import math |
14 | 16 | from argparse import ArgumentError as _ArgumentError |
15 | 17 | from typing import Dict, List |
16 | 18 |
|
| 19 | +import numpy |
17 | 20 | from RestrictedPython import compile_restricted as _compile_restricted |
18 | 21 | from RestrictedPython import safe_builtins as _safe_builtins |
19 | 22 |
|
@@ -85,23 +88,22 @@ def execute(self, values: Dict[str, float], logger: ILogger) -> float: |
85 | 88 | return float(local_variables[self.formula_output_name]) |
86 | 89 |
|
87 | 90 | def _setup_environment(self): |
88 | | - self._safe_modules = frozenset( |
89 | | - ( |
90 | | - "math", |
91 | | - "numpy", |
92 | | - ) |
93 | | - ) |
| 91 | + # use standard libraries that are considered safe |
| 92 | + self._safe_modules_dict = { |
| 93 | + "math": math, |
| 94 | + "numpy": numpy, |
| 95 | + } |
94 | 96 |
|
95 | 97 | # Global data available in restricted code |
96 | | - self._global_variables = ( |
97 | | - { # MDK: THIS NEEDS TO CHANGE TO A MORE GENERAL APPROACH |
98 | | - "__builtins__": {**_safe_builtins, "__import__": self._safe_import}, |
99 | | - } |
100 | | - ) |
| 98 | + self._global_variables = { |
| 99 | + "__builtins__": {**_safe_builtins, "__import__": self._safe_import}, |
| 100 | + **self._safe_modules_dict, |
| 101 | + } |
| 102 | + |
101 | 103 | self._byte_code = None |
102 | 104 |
|
103 | 105 | def _safe_import(self, name, *args, **kwargs): |
104 | 106 | # Redefine import, to only import from safe modules |
105 | | - if name not in self._safe_modules: |
| 107 | + if name not in self._safe_modules_dict: |
106 | 108 | raise _ArgumentError(None, f"Importing {name!r} is not allowed!") |
107 | 109 | return __import__(name, *args, **kwargs) |
0 commit comments