diff --git a/app/main/views/send.py b/app/main/views/send.py index 76faba72f..954a3a1cb 100644 --- a/app/main/views/send.py +++ b/app/main/views/send.py @@ -46,6 +46,7 @@ from app.utils import ( get_errors_for_csv, get_help_argument, get_template, + unicode_truncate, user_has_permissions, ) @@ -555,7 +556,10 @@ def _check_messages(service_id, template_id, upload_id, preview_row, letters_as_ notification_count=len(recipients), template_id=str(template_id), valid=True, - original_file_name=request.args.get('original_file_name'), + original_file_name=unicode_truncate( + request.args.get('original_file_name', ''), + 1872 + ), ) else: session['file_uploads'].pop(upload_id) diff --git a/app/utils.py b/app/utils.py index 3aeb6f373..ddf023f86 100644 --- a/app/utils.py +++ b/app/utils.py @@ -568,3 +568,8 @@ class GovernmentEmailDomain(AgreementInfo): )) except StopIteration: raise NotGovernmentEmailDomain() + + +def unicode_truncate(s, length): + encoded = s.encode('utf-8')[:length] + return encoded.decode('utf-8', 'ignore') diff --git a/tests/app/main/views/test_send.py b/tests/app/main/views/test_send.py index 41e172ab2..21abc0958 100644 --- a/tests/app/main/views/test_send.py +++ b/tests/app/main/views/test_send.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import sys import uuid from functools import partial from glob import glob @@ -662,6 +663,46 @@ def test_upload_valid_csv_shows_preview_and_table( assert normalize_spaces(str(row.select('td')[index + 1])) == cell +def test_file_name_truncated_to_fit_in_s3_metadata( + client_request, + mocker, + mock_get_live_service, + mock_get_service_template_with_placeholders, + mock_get_users_by_service, + mock_get_detailed_service_for_today, + mock_s3_set_metadata, + fake_uuid, +): + + with client_request.session_transaction() as session: + session['file_uploads'] = { + fake_uuid: {'template_id': fake_uuid} + } + + mocker.patch('app.main.views.send.s3download', return_value=""" + phone number,name,thing,thing,thing + 07700900001, A, foo, foo, foo + """) + + file_name = 'ü😁' * 2000 + + client_request.get( + 'main.check_messages', + service_id=SERVICE_ONE_ID, + template_id=fake_uuid, + upload_id=fake_uuid, + original_file_name=file_name, + ) + assert sys.getsizeof( + file_name.encode('utf-8') + ) > 2000 + + assert sys.getsizeof(''.join(( + '{}{}'.format(key, value) for key, value in + mock_s3_set_metadata.call_args_list[0][1].items() + )).encode('utf-8')) == 1998 + + def test_show_all_columns_if_there_are_duplicate_recipient_columns( client_request, mocker,