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:
parent
9bddc9b577
commit
8215ee19c6
|
@ -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():
|
||||||
|
|
|
@ -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()}",
|
||||||
|
|
|
@ -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"""
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
Reference in a new issue