Escape special characters in search by recipient

SQLAlchemy handles escaping anything that could allow a SQL injection
attack. But it doesn’t escape the characters used for wildcard
searching. This is the reason we’re able to do `.like('%example%')`
at all.

But we shouldn’t be letting our users search with wildcard characters,
so we need to escape them. Which is what this commit does.
This commit is contained in:
Chris Hill-Scott
2018-03-14 10:34:45 +00:00
parent 2219dbf80b
commit bdd77f9150
2 changed files with 45 additions and 0 deletions

View File

@@ -1769,6 +1769,45 @@ def test_dao_get_notifications_by_to_field_matches_partial_emails(sample_email_t
assert notification_2.id not in notification_ids
@pytest.mark.parametrize('search_term, expected_result_count', [
('foobar', 1),
('foo', 2),
('bar', 2),
('foo%', 1),
('%%bar', 1),
('%_', 1),
('%', 2),
('_', 1),
('/', 1),
('%foo', 0),
('%_%', 0),
('example.com', 4),
])
def test_dao_get_notifications_by_to_field_escapes(
sample_email_template,
search_term,
expected_result_count,
):
for email_address in {
'foo%_@example.com',
'%%bar@example.com',
'foobar@example.com',
'/@example.com',
}:
create_notification(
template=sample_email_template,
to_field=email_address,
normalised_to=email_address,
)
assert len(dao_get_notifications_by_to_field(
sample_email_template.service_id,
search_term,
notification_type='email',
)) == expected_result_count
@pytest.mark.parametrize('search_term', [
'001',
'100',