Skip to content

Commit f8625d3

Browse files
committed
Validate subject doesn’t contain file placeholders
1 parent 0c85f9f commit f8625d3

File tree

3 files changed

+57
-3
lines changed

3 files changed

+57
-3
lines changed

app/main/forms.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from markupsafe import Markup
1717
from notifications_utils.countries.data import Postage
1818
from notifications_utils.eventlet import SoftEventletTimeout
19+
from notifications_utils.field import Field as UtilsField
1920
from notifications_utils.formatters import strip_all_whitespace
2021
from notifications_utils.insensitive_dict import InsensitiveDict, InsensitiveSet
2122
from notifications_utils.recipient_validation.email_address import format_email_address, validate_email_address
@@ -1479,6 +1480,10 @@ def validate_address(self, field):
14791480

14801481

14811482
class EmailTemplateForm(BaseTemplateForm, TemplateNameMixin):
1483+
def __init__(self, *args, email_file_filenames=None, **kwargs):
1484+
super().__init__()
1485+
self.email_file_filenames = email_file_filenames or set()
1486+
14821487
subject = GovukTextareaField("Subject", validators=[NotifyDataRequired(thing="the subject of the email")])
14831488
has_unsubscribe_link = GovukCheckboxField(
14841489
"Add an unsubscribe link",
@@ -1492,6 +1497,13 @@ class EmailTemplateForm(BaseTemplateForm, TemplateNameMixin):
14921497
},
14931498
)
14941499

1500+
def validate_subject(self, field):
1501+
if field.errors:
1502+
return
1503+
1504+
if InsensitiveSet(UtilsField(field.data).placeholders).intersection(self.email_file_filenames):
1505+
raise ValidationError("You can put a file in the subject")
1506+
14951507

14961508
class LetterTemplateForm(BaseTemplateForm, TemplateNameMixin):
14971509
subject = GovukTextareaField("Heading", validators=[NotifyDataRequired(thing="a main heading for your letter")])

app/main/views/templates.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,13 @@
7878
from app.utils.user import user_has_permissions
7979

8080

81-
def get_template_form(template_type: Literal["email", "sms", "letter"], language: Literal["welsh"] | None = None):
81+
def get_template_form(
82+
template_type: Literal["email", "sms", "letter"],
83+
email_file_filenames=None,
84+
language: Literal["welsh"] | None = None,
85+
):
8286
if template_type == "email":
83-
return EmailTemplateForm
87+
return partial(EmailTemplateForm, email_file_filenames=email_file_filenames)
8488
elif template_type == "sms":
8589
return SMSTemplateForm
8690
else:
@@ -734,7 +738,11 @@ def edit_service_template(service_id, template_id, language=None): # noqa
734738

735739
abort_for_unauthorised_bilingual_letters_or_invalid_options(language, template)
736740

737-
form = get_template_form(template.template_type, language=language)(**template._template)
741+
form = get_template_form(
742+
template.template_type,
743+
email_file_filenames=getattr(template, "filenames", None),
744+
language=language,
745+
)(**template._template)
738746

739747
if form.validate_on_submit():
740748
new_template = get_template(

tests/app/main/views/test_templates.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3842,6 +3842,40 @@ def test_edit_service_template_archives_email_files(
38423842
assert normalize_spaces(page.select(".banner-default-with-tick")[0].text) == expected_banner_text
38433843

38443844

3845+
def test_edit_service_template_does_not_allow_email_file_in_subject(
3846+
client_request,
3847+
fake_uuid,
3848+
mocker,
3849+
):
3850+
email_template = create_template(
3851+
template_type="email",
3852+
email_files=[
3853+
{
3854+
"id": str(uuid.UUID(int=1, version=4)),
3855+
"filename": "invite.pdf",
3856+
"link_text": None,
3857+
"retention_period": 90,
3858+
"validate_users_email": False,
3859+
},
3860+
],
3861+
)
3862+
mocker.patch("app.service_api_client.get_service_template", return_value={"data": email_template})
3863+
3864+
page = client_request.post(
3865+
".edit_service_template",
3866+
service_id=SERVICE_ONE_ID,
3867+
template_id=fake_uuid,
3868+
_data={
3869+
"name": email_template["name"],
3870+
"template_content": email_template["content"],
3871+
"subject": "Please download ((INVITE.PDF))",
3872+
"service": SERVICE_ONE_ID,
3873+
},
3874+
_expected_status=200,
3875+
)
3876+
assert normalize_spaces(page.select_one(".govuk-error-message")) == ""
3877+
3878+
38453879
def test_should_redirect_when_saving_a_template_letter(
38463880
client_request,
38473881
mock_get_service_letter_template,

0 commit comments

Comments
 (0)