GH13983 - Add additional check for bad templates

This commit is contained in:
David O Neill
2024-02-02 15:48:17 +00:00
committed by Dave
parent 5d1bb2125e
commit 19f80c0a26
2 changed files with 21 additions and 5 deletions

View File

@@ -5,6 +5,7 @@ from copy import deepcopy
import datetime import datetime
import logging import logging
import json import json
import traceback
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
@@ -484,14 +485,29 @@ class JobNotificationMixin(object):
if msg_template: if msg_template:
try: try:
msg = env.from_string(msg_template).render(**context) msg = env.from_string(msg_template).render(**context)
except (TemplateSyntaxError, UndefinedError, SecurityError): except (TemplateSyntaxError, UndefinedError, SecurityError) as e:
msg = '' msg = '\r\n'.join([e.message, ''.join(traceback.format_exception(None, e, e.__traceback__).replace('\n', '\r\n'))])
if body_template: if body_template:
try: try:
body = env.from_string(body_template).render(**context) body = env.from_string(body_template).render(**context)
except (TemplateSyntaxError, UndefinedError, SecurityError): except (TemplateSyntaxError, UndefinedError, SecurityError) as e:
body = '' body = '\r\n'.join([e.message, ''.join(traceback.format_exception(None, e, e.__traceback__).replace('\n', '\r\n'))])
# https://datatracker.ietf.org/doc/html/rfc2822#section-2.2
# Body should have at least 2 CRLF, some clients will interpret
# the email incorrectly with blank body. So we will check that
if len(body.strip().splitlines()) <= 2:
# blank body
body = '\r\n'.join(
[
"The template rendering return a blank body.",
"Please check the template.",
"Refer to https://github.com/ansible/awx/issues/13983",
"for further information.",
]
)
return (msg, body) return (msg, body)

View File

@@ -155,4 +155,4 @@ def test_build_notification_message_undefined(run_module, admin_user, organizati
nt = NotificationTemplate.objects.get(id=result['id']) nt = NotificationTemplate.objects.get(id=result['id'])
body = job.build_notification_message(nt, 'running') body = job.build_notification_message(nt, 'running')
assert '{"started_by": "My Placeholder"}' in body[1] assert 'The template rendering return a blank body' in body[1]