From 6ec79402cc21e9d3e1fed539f5483204028ae39d Mon Sep 17 00:00:00 2001
From: bctiemann
{e}
+{escape(e)}
{message2}
""") diff --git a/netbox/extras/tests/test_dashboard.py b/netbox/extras/tests/test_dashboard.py index 866b46477..529ab5f9e 100644 --- a/netbox/extras/tests/test_dashboard.py +++ b/netbox/extras/tests/test_dashboard.py @@ -1,6 +1,7 @@ -from django.test import TestCase, tag +from django.test import RequestFactory, TestCase, tag from extras.dashboard.widgets import ObjectListWidget +from extras.templatetags.dashboard import render_widget class ObjectListWidgetTestCase(TestCase): @@ -46,3 +47,32 @@ class ObjectListWidgetTestCase(TestCase): widget = ObjectListWidget(id='2829fd9b-5dee-4c9a-81f2-5bd84c350a27', **config) rendered = widget.render(mock_request) self.assertTrue('Unable to load content. Could not resolve list URL for:' in rendered) + + +class RenderWidgetTemplateTagTestCase(TestCase): + + def _make_context(self): + request = RequestFactory().get('/') + return {'request': request} + + def test_render_widget_escapes_exception_html(self): + """Exception text with HTML special chars must be escaped, not rendered as markup.""" + + class BrokenWidget: + def render(self, request): + raise Exception('') + + output = render_widget(self._make_context(), BrokenWidget()) + self.assertIn('<script>', output) + self.assertNotIn('