diff --git a/authentik/lib/expression/evaluator.py b/authentik/lib/expression/evaluator.py index 22c6532da..3e98843ff 100644 --- a/authentik/lib/expression/evaluator.py +++ b/authentik/lib/expression/evaluator.py @@ -180,6 +180,11 @@ class BaseEvaluator: full_expression += f"\nresult = handler({handler_signature})" return full_expression + def compile(self, expression: str) -> Any: + """Parse expression. Raises SyntaxError or ValueError if the syntax is incorrect.""" + param_keys = self._context.keys() + return compile(self.wrap_expression(expression, param_keys), self._filename, "exec") + def evaluate(self, expression_source: str) -> Any: """Parse and evaluate expression. If the syntax is incorrect, a SyntaxError is raised. If any exception is raised during execution, it is raised. @@ -188,13 +193,8 @@ class BaseEvaluator: span: Span span.description = self._filename span.set_data("expression", expression_source) - param_keys = self._context.keys() try: - ast_obj = compile( - self.wrap_expression(expression_source, param_keys), - self._filename, - "exec", - ) + ast_obj = self.compile(expression_source) except (SyntaxError, ValueError) as exc: self.handle_error(exc, expression_source) raise exc @@ -221,13 +221,8 @@ class BaseEvaluator: def validate(self, expression: str) -> bool: """Validate expression's syntax, raise ValidationError if Syntax is invalid""" - param_keys = self._context.keys() try: - compile( - self.wrap_expression(expression, param_keys), - self._filename, - "exec", - ) + self.compile(expression) return True except (ValueError, SyntaxError) as exc: raise ValidationError(f"Expression Syntax Error: {str(exc)}") from exc