From 44341f0224bc57363894fb23bb357d6af7303429 Mon Sep 17 00:00:00 2001 From: Jens L Date: Mon, 22 May 2023 00:18:54 +0200 Subject: [PATCH] lib: add tests for ak_create_event (#5710) Signed-off-by: Jens Langhammer --- authentik/events/models.py | 5 +-- authentik/lib/expression/evaluator.py | 14 ++++--- authentik/lib/tests/test_evaluator.py | 21 ++++++++-- locale/en/LC_MESSAGES/django.po | 58 ++++++++++++++------------- 4 files changed, 57 insertions(+), 41 deletions(-) diff --git a/authentik/events/models.py b/authentik/events/models.py index 50ec8a71be..82d215fbc2 100644 --- a/authentik/events/models.py +++ b/authentik/events/models.py @@ -7,7 +7,6 @@ from smtplib import SMTPException from typing import TYPE_CHECKING, Optional from uuid import uuid4 -from django.conf import settings from django.db import models from django.db.models import Count, ExpressionWrapper, F from django.db.models.fields import DurationField @@ -207,9 +206,7 @@ class Event(SerializerModel, ExpiringModel): self.user = get_user(user) return self - def from_http( - self, request: HttpRequest, user: Optional[settings.AUTH_USER_MODEL] = None - ) -> "Event": + def from_http(self, request: HttpRequest, user: Optional[User] = None) -> "Event": """Add data from a Django-HttpRequest, allowing the creation of Events independently from requests. `user` arguments optionally overrides user from requests.""" diff --git a/authentik/lib/expression/evaluator.py b/authentik/lib/expression/evaluator.py index 2365e4494e..7a7f070224 100644 --- a/authentik/lib/expression/evaluator.py +++ b/authentik/lib/expression/evaluator.py @@ -140,17 +140,19 @@ class BaseEvaluator: def expr_event_create(self, action: str, **kwargs): """Create event with supplied data and try to extract as much relevant data from the context""" + context = self._context.copy() # If the result was a complex variable, we don't want to re-use it - self._context.pop("result", None) - self._context.pop("handler", None) - kwargs["context"] = self._context + context.pop("result", None) + context.pop("handler", None) + event_kwargs = context + event_kwargs.update(kwargs) event = Event.new( action, app=self._filename, - **kwargs, + **event_kwargs, ) - if "request" in self._context and isinstance(self._context["request"], PolicyRequest): - policy_request: PolicyRequest = self._context["request"] + if "request" in context and isinstance(context["request"], PolicyRequest): + policy_request: PolicyRequest = context["request"] if policy_request.http_request: event.from_http(policy_request) return diff --git a/authentik/lib/tests/test_evaluator.py b/authentik/lib/tests/test_evaluator.py index 44cc6e299f..bb029304d6 100644 --- a/authentik/lib/tests/test_evaluator.py +++ b/authentik/lib/tests/test_evaluator.py @@ -2,28 +2,41 @@ from django.test import TestCase from authentik.core.tests.utils import create_test_admin_user +from authentik.events.models import Event from authentik.lib.expression.evaluator import BaseEvaluator +from authentik.lib.generators import generate_id class TestEvaluator(TestCase): """Test Evaluator base functions""" - def test_regex_match(self): + def test_expr_regex_match(self): """Test expr_regex_match""" self.assertFalse(BaseEvaluator.expr_regex_match("foo", "bar")) self.assertTrue(BaseEvaluator.expr_regex_match("foo", "foo")) - def test_regex_replace(self): + def test_expr_regex_replace(self): """Test expr_regex_replace""" self.assertEqual(BaseEvaluator.expr_regex_replace("foo", "o", "a"), "faa") - def test_user_by(self): + def test_expr_user_by(self): """Test expr_user_by""" user = create_test_admin_user() self.assertIsNotNone(BaseEvaluator.expr_user_by(username=user.username)) self.assertIsNone(BaseEvaluator.expr_user_by(username="bar")) self.assertIsNone(BaseEvaluator.expr_user_by(foo="bar")) - def test_is_group_member(self): + def test_expr_is_group_member(self): """Test expr_is_group_member""" self.assertFalse(BaseEvaluator.expr_is_group_member(create_test_admin_user(), name="test")) + + def test_expr_event_create(self): + """Test expr_event_create""" + evaluator = BaseEvaluator(generate_id()) + evaluator._context = { + "foo": "bar", + } + evaluator.evaluate("ak_create_event('foo', bar='baz')") + event = Event.objects.filter(action="custom_foo").first() + self.assertIsNotNone(event) + self.assertEqual(event.context, {"bar": "baz", "foo": "bar"}) diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 0c3fcef916..7499d20f47 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-05-19 22:00+0000\n" +"POT-Creation-Date: 2023-05-21 21:59+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -31,12 +31,16 @@ msgstr "" msgid "Validation Error" msgstr "" -#: authentik/blueprints/api.py:53 +#: authentik/blueprints/api.py:43 +msgid "Blueprint file does not exist" +msgstr "" + +#: authentik/blueprints/api.py:54 #, python-format msgid "Failed to validate blueprint: %(logs)s" msgstr "" -#: authentik/blueprints/api.py:58 +#: authentik/blueprints/api.py:59 msgid "Either path or content must be set." msgstr "" @@ -321,105 +325,105 @@ msgstr "" msgid "Certificate-Key Pairs" msgstr "" -#: authentik/events/models.py:293 +#: authentik/events/models.py:290 msgid "Event" msgstr "" -#: authentik/events/models.py:294 +#: authentik/events/models.py:291 msgid "Events" msgstr "" -#: authentik/events/models.py:300 +#: authentik/events/models.py:297 msgid "authentik inbuilt notifications" msgstr "" -#: authentik/events/models.py:301 +#: authentik/events/models.py:298 msgid "Generic Webhook" msgstr "" -#: authentik/events/models.py:302 +#: authentik/events/models.py:299 msgid "Slack Webhook (Slack/Discord)" msgstr "" -#: authentik/events/models.py:303 +#: authentik/events/models.py:300 msgid "Email" msgstr "" -#: authentik/events/models.py:321 +#: authentik/events/models.py:318 msgid "" "Only send notification once, for example when sending a webhook into a chat " "channel." msgstr "" -#: authentik/events/models.py:386 +#: authentik/events/models.py:383 msgid "Severity" msgstr "" -#: authentik/events/models.py:391 +#: authentik/events/models.py:388 msgid "Dispatched for user" msgstr "" -#: authentik/events/models.py:400 +#: authentik/events/models.py:397 msgid "Event user" msgstr "" -#: authentik/events/models.py:487 +#: authentik/events/models.py:484 msgid "Notification Transport" msgstr "" -#: authentik/events/models.py:488 +#: authentik/events/models.py:485 msgid "Notification Transports" msgstr "" -#: authentik/events/models.py:494 +#: authentik/events/models.py:491 msgid "Notice" msgstr "" -#: authentik/events/models.py:495 +#: authentik/events/models.py:492 msgid "Warning" msgstr "" -#: authentik/events/models.py:496 +#: authentik/events/models.py:493 msgid "Alert" msgstr "" -#: authentik/events/models.py:521 +#: authentik/events/models.py:518 msgid "Notification" msgstr "" -#: authentik/events/models.py:522 +#: authentik/events/models.py:519 msgid "Notifications" msgstr "" -#: authentik/events/models.py:532 +#: authentik/events/models.py:529 msgid "" "Select which transports should be used to notify the user. If none are " "selected, the notification will only be shown in the authentik UI." msgstr "" -#: authentik/events/models.py:540 +#: authentik/events/models.py:537 msgid "Controls which severity level the created notifications will have." msgstr "" -#: authentik/events/models.py:545 +#: authentik/events/models.py:542 msgid "" "Define which group of users this notification should be sent and shown to. " "If left empty, Notification won't ben sent." msgstr "" -#: authentik/events/models.py:563 +#: authentik/events/models.py:560 msgid "Notification Rule" msgstr "" -#: authentik/events/models.py:564 +#: authentik/events/models.py:561 msgid "Notification Rules" msgstr "" -#: authentik/events/models.py:584 +#: authentik/events/models.py:581 msgid "Webhook Mapping" msgstr "" -#: authentik/events/models.py:585 +#: authentik/events/models.py:582 msgid "Webhook Mappings" msgstr ""