events: include event user in webhook notification (#5524)

* events: include event user in webhook notification

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* update other transports

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
This commit is contained in:
Jens L 2023-05-08 15:34:21 +02:00 committed by GitHub
parent 9bddc9b577
commit 8215ee19c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 28 additions and 6 deletions

View File

@ -353,6 +353,9 @@ class NotificationTransport(SerializerModel):
"user_email": notification.user.email, "user_email": notification.user.email,
"user_username": notification.user.username, "user_username": notification.user.username,
} }
if notification.event and notification.event.user:
default_body["event_user_email"] = notification.event.user.get("email", None)
default_body["event_user_username"] = notification.event.user.get("username", None)
if self.webhook_mapping: if self.webhook_mapping:
default_body = sanitize_item( default_body = sanitize_item(
self.webhook_mapping.evaluate( self.webhook_mapping.evaluate(
@ -391,6 +394,14 @@ class NotificationTransport(SerializerModel):
}, },
] ]
if notification.event: if notification.event:
if notification.event.user:
fields.append(
{
"title": _("Event user"),
"value": str(notification.event.user.get("username")),
"short": True,
},
)
for key, value in notification.event.context.items(): for key, value in notification.event.context.items():
if not isinstance(value, str): if not isinstance(value, str):
continue continue
@ -429,7 +440,13 @@ class NotificationTransport(SerializerModel):
def send_email(self, notification: "Notification") -> list[str]: def send_email(self, notification: "Notification") -> list[str]:
"""Send notification via global email configuration""" """Send notification via global email configuration"""
subject = "authentik Notification: " subject = "authentik Notification: "
key_value = {} key_value = {
"user_email": notification.user.email,
"user_username": notification.user.username,
}
if notification.event and notification.event.user:
key_value["event_user_email"] = notification.event.user.get("email", None)
key_value["event_user_username"] = notification.event.user.get("username", None)
if notification.event: if notification.event:
subject += notification.event.action subject += notification.event.action
for key, value in notification.event.context.items(): for key, value in notification.event.context.items():

View File

@ -52,6 +52,8 @@ class TestEventTransports(TestCase):
"severity": "alert", "severity": "alert",
"user_email": self.user.email, "user_email": self.user.email,
"user_username": self.user.username, "user_username": self.user.username,
"event_user_email": self.user.email,
"event_user_username": self.user.username,
}, },
) )
@ -107,6 +109,7 @@ class TestEventTransports(TestCase):
"value": self.user.username, "value": self.user.username,
"short": True, "short": True,
}, },
{"short": True, "title": "Event user", "value": self.user.username},
{"title": "foo", "value": "bar,"}, {"title": "foo", "value": "bar,"},
], ],
"footer": f"authentik {get_full_version()}", "footer": f"authentik {get_full_version()}",

View File

@ -25,7 +25,6 @@ class OAuthTestCase(TestCase):
def setUpClass(cls) -> None: def setUpClass(cls) -> None:
cls.keypair = create_test_cert() cls.keypair = create_test_cert()
super().setUpClass() super().setUpClass()
cls.maxDiff = None
def assert_non_none_or_unset(self, container: dict, key: str): def assert_non_none_or_unset(self, container: dict, key: str):
"""Check that a key, if set, is not none""" """Check that a key, if set, is not none"""

View File

@ -8,6 +8,7 @@ from authentik.lib.config import CONFIG
from authentik.lib.sentry import sentry_init from authentik.lib.sentry import sentry_init
from tests.e2e.utils import get_docker_tag from tests.e2e.utils import get_docker_tag
# globally set maxDiff to none to show full assert error
TestCase.maxDiff = None TestCase.maxDiff = None

View File

@ -54,8 +54,6 @@ class SeleniumTestCase(StaticLiveServerTestCase):
if IS_CI: if IS_CI:
print("::group::authentik Logs", file=stderr) print("::group::authentik Logs", file=stderr)
super().setUp() super().setUp()
# pylint: disable=invalid-name
self.maxDiff = None
self.wait_timeout = 60 self.wait_timeout = 60
self.driver = self._get_driver() self.driver = self._get_driver()
self.driver.implicitly_wait(30) self.driver.implicitly_wait(30)

View File

@ -12,8 +12,12 @@ This will send a POST request to the given URL with the following contents:
{ {
"body": "body of the notification message", "body": "body of the notification message",
"severity": "severity level as configured in the trigger", "severity": "severity level as configured in the trigger",
"user_email": "user's email", // User that the notification was created for, i.e. a member of the group selected in the rule
"user_username": "user's username" "user_email": "notification user's email",
"user_username": "notification user's username",
// User that created the event
"event_user_email": "event user's email",
"event_user_username": "event user's username"
} }
``` ```