diff --git a/app/notifications/rest.py b/app/notifications/rest.py index 0ba52e8bd..594ba5613 100644 --- a/app/notifications/rest.py +++ b/app/notifications/rest.py @@ -38,7 +38,6 @@ register_errors(notifications) def process_ses_response(): try: ses_request = json.loads(request.data) - if 'Message' not in ses_request: current_app.logger.error( "SES callback failed: message missing" @@ -47,7 +46,9 @@ def process_ses_response(): result="error", message="SES callback failed: message missing" ), 400 - if 'notificationType' not in ses_request['Message']: + ses_message = json.loads(ses_request['Message']) + + if 'notificationType' not in ses_message: current_app.logger.error( "SES callback failed: notificationType missing" ) @@ -55,19 +56,19 @@ def process_ses_response(): result="error", message="SES callback failed: notificationType missing" ), 400 - status = ses_response_status.get(ses_request['Message']['notificationType'], None) + status = ses_response_status.get(ses_message['notificationType'], None) if not status: current_app.logger.info( "SES callback failed: status {} not found.".format(status) ) return jsonify( result="error", - message="SES callback failed: status {} not found".format(ses_request['Message']['notificationType']) + message="SES callback failed: status {} not found".format(ses_message['notificationType']) ), 400 try: - source = ses_request['Message']['mail']['source'] - if is_not_a_notification(ses_request['Message']['mail']['source']): + source = ses_message['mail']['source'] + if is_not_a_notification(source): current_app.logger.info( "SES callback for notify success:. source {} status {}".format(source, status['notify_status']) ) @@ -75,7 +76,7 @@ def process_ses_response(): result="success", message="SES callback succeeded" ), 200 - reference = ses_request['Message']['mail']['messageId'] + reference = ses_message['mail']['messageId'] if notifications_dao.update_notification_status_by_reference(reference, status['notify_status']) == 0: current_app.logger.info( "SES callback failed: notification not found. Status {}".format(status['notify_status']) diff --git a/test_ses_responses/ses_response.json b/test_ses_responses/ses_response.json deleted file mode 100644 index 92e5ffe38..000000000 --- a/test_ses_responses/ses_response.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "MessageId": "35efe472-ba36-5808-89bb-ab2925158b13", - "UnsubscribeURL": "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:123456789012:preview-emails:12345678-1234-1234-1234-123456789012", - "SignatureVersion": "1", - "TopicArn": "arn:aws:sns:eu-west-1:123456789012:testing", - "Timestamp": "2016-03-10T16:12:19.876Z", - "Type": "Notification", - "Signature": "sig", - "Message": { - "notificationType": "Delivery", - "mail": { - "timestamp": "2016-03-10T16:12:19.016Z", - "source": "invites@testing-notify.com", - "sourceArn": "arn:aws:ses:eu-west-1:123456789012:identity/testing-notify", - "sendingAccountId": "123456789012", - "messageId": "01020153614cd6c8-2ec4bd32-7ddc-4344-811e-65d05519251f-000000", - "destination": [ - "testing@digital.cabinet-office.gov.uk" - ] - }, - "delivery": { - "timestamp": "2016-03-10T16:12:19.751Z", - "processingTimeMillis": 735, - "recipients": [ - "testing@digital.cabinet-office.gov.uk" - ], - "smtpResponse": "250 2.0.0 OK 1457626339 u62si5491824wme.91 - gsmtp", - "reportingMTA": "a6-15.smtp-out.eu-west-1.amazonses.com" - } - }, - "SigningCertURL": "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-bb750dd426d95ee9390147a5624348ee.pem" -} \ No newline at end of file diff --git a/tests/app/__init__.py b/tests/app/__init__.py index 350e701f8..75631cf9a 100644 --- a/tests/app/__init__.py +++ b/tests/app/__init__.py @@ -5,9 +5,3 @@ def load_example_csv(file): file_path = os.path.join("test_csv_files", "{}.csv".format(file)) with open(file_path) as f: return f.read() - - -def load_example_ses(file): - file_path = os.path.join("test_ses_responses", "{}.json".format(file)) - with open(file_path) as f: - return f.read() diff --git a/tests/app/notifications/test_rest.py b/tests/app/notifications/test_rest.py index f8602737f..1d6428e5e 100644 --- a/tests/app/notifications/test_rest.py +++ b/tests/app/notifications/test_rest.py @@ -9,7 +9,6 @@ from app.dao.templates_dao import dao_get_all_templates_for_service from app.dao.services_dao import dao_update_service from app.dao.notifications_dao import get_notification_by_id from freezegun import freeze_time -from tests.app import load_example_ses def test_get_notification_by_id(notify_api, sample_notification): @@ -1048,7 +1047,7 @@ def test_ses_callback_should_not_need_auth(notify_api): with notify_api.test_client() as client: response = client.post( path='/notifications/email/ses', - data=load_example_ses('ses_response'), + data=ses_notification_callback(), headers=[('Content-Type', 'text/plain; charset=UTF-8')] ) assert response.status_code == 404 @@ -1071,12 +1070,10 @@ def test_ses_callback_should_fail_if_invalid_json(notify_api): def test_ses_callback_should_fail_if_invalid_notification_type(notify_api): with notify_api.test_request_context(): with notify_api.test_client() as client: - ses_response = json.loads(load_example_ses('ses_response')) - ses_response['Message']['notificationType'] = 'Unknown' response = client.post( path='/notifications/email/ses', - data=json.dumps(ses_response), + data=ses_invalid_notification_type_callback(), headers=[('Content-Type', 'text/plain; charset=UTF-8')] ) json_resp = json.loads(response.get_data(as_text=True)) @@ -1088,12 +1085,10 @@ def test_ses_callback_should_fail_if_invalid_notification_type(notify_api): def test_ses_callback_should_fail_if_missing_message_id(notify_api): with notify_api.test_request_context(): with notify_api.test_client() as client: - ses_response = json.loads(load_example_ses('ses_response')) - del(ses_response['Message']['mail']['messageId']) response = client.post( path='/notifications/email/ses', - data=json.dumps(ses_response), + data=ses_missing_notification_id_callback(), headers=[('Content-Type', 'text/plain; charset=UTF-8')] ) json_resp = json.loads(response.get_data(as_text=True)) @@ -1105,16 +1100,13 @@ def test_ses_callback_should_fail_if_missing_message_id(notify_api): def test_ses_callback_should_fail_if_notification_cannot_be_found(notify_db, notify_db_session, notify_api): with notify_api.test_request_context(): with notify_api.test_client() as client: - ses_response = json.loads(load_example_ses('ses_response')) - ses_response['Message']['mail']['messageId'] = 'wont find this' response = client.post( path='/notifications/email/ses', - data=json.dumps(ses_response), + data=ses_invalid_notification_id_callback(), headers=[('Content-Type', 'text/plain; charset=UTF-8')] ) json_resp = json.loads(response.get_data(as_text=True)) - print(json_resp) assert response.status_code == 404 assert json_resp['result'] == 'error' assert json_resp['message'] == 'SES callback failed: notification not found. Status delivered' @@ -1128,12 +1120,9 @@ def test_ses_callback_should_update_notification_status(notify_api, notify_db, n assert get_notification_by_id(notification.id).status == 'sent' - ses_response = json.loads(load_example_ses('ses_response')) - ses_response['Message']['mail']['messageId'] = 'ref' - response = client.post( path='/notifications/email/ses', - data=json.dumps(ses_response), + data=ses_notification_callback(), headers=[('Content-Type', 'text/plain; charset=UTF-8')] ) json_resp = json.loads(response.get_data(as_text=True)) @@ -1150,13 +1139,9 @@ def test_should_handle_invite_email_callbacks(notify_api, notify_db, notify_db_s notify_api.config['INVITATION_EMAIL_FROM'] = 'test-invite' notify_api.config['NOTIFY_EMAIL_DOMAIN'] = 'test-domain.com' - ses_response = json.loads(load_example_ses('ses_response')) - ses_response['Message']['mail']['messageId'] = 'ref' - ses_response['Message']['mail']['source'] = 'test-invite@test-domain.com' - response = client.post( path='/notifications/email/ses', - data=json.dumps(ses_response), + data=ses_invite_callback(), headers=[('Content-Type', 'text/plain; charset=UTF-8')] ) json_resp = json.loads(response.get_data(as_text=True)) @@ -1171,16 +1156,36 @@ def test_should_handle_validation_code_callbacks(notify_api, notify_db, notify_d notify_api.config['VERIFY_CODE_FROM_EMAIL_ADDRESS'] = 'valid-code@test.com' - ses_response = json.loads(load_example_ses('ses_response')) - ses_response['Message']['mail']['messageId'] = 'ref' - ses_response['Message']['mail']['source'] = 'valid-code@test.com' - response = client.post( path='/notifications/email/ses', - data=json.dumps(ses_response), + data=ses_validation_code_callback(), headers=[('Content-Type', 'text/plain; charset=UTF-8')] ) json_resp = json.loads(response.get_data(as_text=True)) assert response.status_code == 200 assert json_resp['result'] == 'success' assert json_resp['message'] == 'SES callback succeeded' + + +def ses_validation_code_callback(): + return b'{\n "Type" : "Notification",\n "MessageId" : "ref",\n "TopicArn" : "arn:aws:sns:eu-west-1:123456789012:testing",\n "Message" : "{\\"notificationType\\":\\"Delivery\\",\\"mail\\":{\\"timestamp\\":\\"2016-03-14T12:35:25.909Z\\",\\"source\\":\\"valid-code@test.com\\",\\"sourceArn\\":\\"arn:aws:ses:eu-west-1:123456789012:identity/testing-notify\\",\\"sendingAccountId\\":\\"123456789012\\",\\"messageId\\":\\"ref\\",\\"destination\\":[\\"testing@digital.cabinet-office.gov.uk\\"]},\\"delivery\\":{\\"timestamp\\":\\"2016-03-14T12:35:26.567Z\\",\\"processingTimeMillis\\":658,\\"recipients\\":[\\"testing@digital.cabinet-office.gov.u\\"],\\"smtpResponse\\":\\"250 2.0.0 OK 1457958926 uo5si26480932wjc.221 - gsmtp\\",\\"reportingMTA\\":\\"a6-238.smtp-out.eu-west-1.amazonses.com\\"}}",\n "Timestamp" : "2016-03-14T12:35:26.665Z",\n "SignatureVersion" : "1",\n "Signature" : "X8d7eTAOZ6wlnrdVVPYanrAlsX0SMPfOzhoTEBnQqYkrNWTqQY91C0f3bxtPdUhUtOowyPAOkTQ4KnZuzphfhVb2p1MyVYMxNKcBFB05/qaCX99+92fjw4x9LeUOwyGwMv5F0Vkfi5qZCcEw69uVrhYLVSTFTrzi/yCtru+yFULMQ6UhbY09GwiP6hjxZMVr8aROQy5lLHglqQzOuSZ4KeD85JjifHdKzlx8jjQ+uj+FLzHXPMAPmPU1JK9kpoHZ1oPshAFgPDpphJe+HwcJ8ezmk+3AEUr3wWli3xF+49y8Z2anASSVp6YI2YP95UT8Rlh3qT3T+V9V8rbSVislxA==",\n "SigningCertURL" : "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-bb750dd426d95ee9390147a5624348ee.pem",\n "UnsubscribeURL" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:302763885840:preview-emails:d6aad3ef-83d6-4cf3-a470-54e2e75916da"\n}' # noqa + + +def ses_invite_callback(): + return b'{\n "Type" : "Notification",\n "MessageId" : "ref",\n "TopicArn" : "arn:aws:sns:eu-west-1:123456789012:testing",\n "Message" : "{\\"notificationType\\":\\"Delivery\\",\\"mail\\":{\\"timestamp\\":\\"2016-03-14T12:35:25.909Z\\",\\"source\\":\\"test-invite@test-domain.com\\",\\"sourceArn\\":\\"arn:aws:ses:eu-west-1:123456789012:identity/testing-notify\\",\\"sendingAccountId\\":\\"123456789012\\",\\"messageId\\":\\"ref\\",\\"destination\\":[\\"testing@digital.cabinet-office.gov.uk\\"]},\\"delivery\\":{\\"timestamp\\":\\"2016-03-14T12:35:26.567Z\\",\\"processingTimeMillis\\":658,\\"recipients\\":[\\"testing@digital.cabinet-office.gov.u\\"],\\"smtpResponse\\":\\"250 2.0.0 OK 1457958926 uo5si26480932wjc.221 - gsmtp\\",\\"reportingMTA\\":\\"a6-238.smtp-out.eu-west-1.amazonses.com\\"}}",\n "Timestamp" : "2016-03-14T12:35:26.665Z",\n "SignatureVersion" : "1",\n "Signature" : "X8d7eTAOZ6wlnrdVVPYanrAlsX0SMPfOzhoTEBnQqYkrNWTqQY91C0f3bxtPdUhUtOowyPAOkTQ4KnZuzphfhVb2p1MyVYMxNKcBFB05/qaCX99+92fjw4x9LeUOwyGwMv5F0Vkfi5qZCcEw69uVrhYLVSTFTrzi/yCtru+yFULMQ6UhbY09GwiP6hjxZMVr8aROQy5lLHglqQzOuSZ4KeD85JjifHdKzlx8jjQ+uj+FLzHXPMAPmPU1JK9kpoHZ1oPshAFgPDpphJe+HwcJ8ezmk+3AEUr3wWli3xF+49y8Z2anASSVp6YI2YP95UT8Rlh3qT3T+V9V8rbSVislxA==",\n "SigningCertURL" : "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-bb750dd426d95ee9390147a5624348ee.pem",\n "UnsubscribeURL" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:302763885840:preview-emails:d6aad3ef-83d6-4cf3-a470-54e2e75916da"\n}' # noqa + + +def ses_notification_callback(): + return b'{\n "Type" : "Notification",\n "MessageId" : "ref",\n "TopicArn" : "arn:aws:sns:eu-west-1:123456789012:testing",\n "Message" : "{\\"notificationType\\":\\"Delivery\\",\\"mail\\":{\\"timestamp\\":\\"2016-03-14T12:35:25.909Z\\",\\"source\\":\\"test@test-domain.com\\",\\"sourceArn\\":\\"arn:aws:ses:eu-west-1:123456789012:identity/testing-notify\\",\\"sendingAccountId\\":\\"123456789012\\",\\"messageId\\":\\"ref\\",\\"destination\\":[\\"testing@digital.cabinet-office.gov.uk\\"]},\\"delivery\\":{\\"timestamp\\":\\"2016-03-14T12:35:26.567Z\\",\\"processingTimeMillis\\":658,\\"recipients\\":[\\"testing@digital.cabinet-office.gov.uk\\"],\\"smtpResponse\\":\\"250 2.0.0 OK 1457958926 uo5si26480932wjc.221 - gsmtp\\",\\"reportingMTA\\":\\"a6-238.smtp-out.eu-west-1.amazonses.com\\"}}",\n "Timestamp" : "2016-03-14T12:35:26.665Z",\n "SignatureVersion" : "1",\n "Signature" : "X8d7eTAOZ6wlnrdVVPYanrAlsX0SMPfOzhoTEBnQqYkrNWTqQY91C0f3bxtPdUhUtOowyPAOkTQ4KnZuzphfhVb2p1MyVYMxNKcBFB05/qaCX99+92fjw4x9LeUOwyGwMv5F0Vkfi5qZCcEw69uVrhYLVSTFTrzi/yCtru+yFULMQ6UhbY09GwiP6hjxZMVr8aROQy5lLHglqQzOuSZ4KeD85JjifHdKzlx8jjQ+uj+FLzHXPMAPmPU1JK9kpoHZ1oPshAFgPDpphJe+HwcJ8ezmk+3AEUr3wWli3xF+49y8Z2anASSVp6YI2YP95UT8Rlh3qT3T+V9V8rbSVislxA==",\n "SigningCertURL" : "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-bb750dd426d95ee9390147a5624348ee.pem",\n "UnsubscribeURL" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:302763885840:preview-emails:d6aad3ef-83d6-4cf3-a470-54e2e75916da"\n}' # noqa + + +def ses_invalid_notification_id_callback(): + return b'{\n "Type" : "Notification",\n "MessageId" : "missing",\n "TopicArn" : "arn:aws:sns:eu-west-1:123456789012:testing",\n "Message" : "{\\"notificationType\\":\\"Delivery\\",\\"mail\\":{\\"timestamp\\":\\"2016-03-14T12:35:25.909Z\\",\\"source\\":\\"test@test-domain.com\\",\\"sourceArn\\":\\"arn:aws:ses:eu-west-1:123456789012:identity/testing-notify\\",\\"sendingAccountId\\":\\"123456789012\\",\\"messageId\\":\\"missing\\",\\"destination\\":[\\"testing@digital.cabinet-office.gov.uk\\"]},\\"delivery\\":{\\"timestamp\\":\\"2016-03-14T12:35:26.567Z\\",\\"processingTimeMillis\\":658,\\"recipients\\":[\\"testing@digital.cabinet-office.gov.uk\\"],\\"smtpResponse\\":\\"250 2.0.0 OK 1457958926 uo5si26480932wjc.221 - gsmtp\\",\\"reportingMTA\\":\\"a6-238.smtp-out.eu-west-1.amazonses.com\\"}}",\n "Timestamp" : "2016-03-14T12:35:26.665Z",\n "SignatureVersion" : "1",\n "Signature" : "X8d7eTAOZ6wlnrdVVPYanrAlsX0SMPfOzhoTEBnQqYkrNWTqQY91C0f3bxtPdUhUtOowyPAOkTQ4KnZuzphfhVb2p1MyVYMxNKcBFB05/qaCX99+92fjw4x9LeUOwyGwMv5F0Vkfi5qZCcEw69uVrhYLVSTFTrzi/yCtru+yFULMQ6UhbY09GwiP6hjxZMVr8aROQy5lLHglqQzOuSZ4KeD85JjifHdKzlx8jjQ+uj+FLzHXPMAPmPU1JK9kpoHZ1oPshAFgPDpphJe+HwcJ8ezmk+3AEUr3wWli3xF+49y8Z2anASSVp6YI2YP95UT8Rlh3qT3T+V9V8rbSVislxA==",\n "SigningCertURL" : "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-bb750dd426d95ee9390147a5624348ee.pem",\n "UnsubscribeURL" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:302763885840:preview-emails:d6aad3ef-83d6-4cf3-a470-54e2e75916da"\n}' # noqa + + +def ses_missing_notification_id_callback(): + return b'{\n "Type" : "Notification",\n "TopicArn" : "arn:aws:sns:eu-west-1:123456789012:testing",\n "Message" : "{\\"notificationType\\":\\"Delivery\\",\\"mail\\":{\\"timestamp\\":\\"2016-03-14T12:35:25.909Z\\",\\"source\\":\\"test@test-domain.com\\",\\"sourceArn\\":\\"arn:aws:ses:eu-west-1:123456789012:identity/testing-notify\\",\\"sendingAccountId\\":\\"123456789012\\",\\"destination\\":[\\"testing@digital.cabinet-office.gov.uk\\"]},\\"delivery\\":{\\"timestamp\\":\\"2016-03-14T12:35:26.567Z\\",\\"processingTimeMillis\\":658,\\"recipients\\":[\\"testing@digital.cabinet-office.gov.uk\\"],\\"smtpResponse\\":\\"250 2.0.0 OK 1457958926 uo5si26480932wjc.221 - gsmtp\\",\\"reportingMTA\\":\\"a6-238.smtp-out.eu-west-1.amazonses.com\\"}}",\n "Timestamp" : "2016-03-14T12:35:26.665Z",\n "SignatureVersion" : "1",\n "Signature" : "X8d7eTAOZ6wlnrdVVPYanrAlsX0SMPfOzhoTEBnQqYkrNWTqQY91C0f3bxtPdUhUtOowyPAOkTQ4KnZuzphfhVb2p1MyVYMxNKcBFB05/qaCX99+92fjw4x9LeUOwyGwMv5F0Vkfi5qZCcEw69uVrhYLVSTFTrzi/yCtru+yFULMQ6UhbY09GwiP6hjxZMVr8aROQy5lLHglqQzOuSZ4KeD85JjifHdKzlx8jjQ+uj+FLzHXPMAPmPU1JK9kpoHZ1oPshAFgPDpphJe+HwcJ8ezmk+3AEUr3wWli3xF+49y8Z2anASSVp6YI2YP95UT8Rlh3qT3T+V9V8rbSVislxA==",\n "SigningCertURL" : "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-bb750dd426d95ee9390147a5624348ee.pem",\n "UnsubscribeURL" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:302763885840:preview-emails:d6aad3ef-83d6-4cf3-a470-54e2e75916da"\n}' # noqa + + +def ses_invalid_notification_type_callback(): + return b'{\n "Type" : "Notification",\n "TopicArn" : "arn:aws:sns:eu-west-1:123456789012:testing",\n "Message" : "{\\"notificationType\\":\\"Unknown\\",\\"mail\\":{\\"timestamp\\":\\"2016-03-14T12:35:25.909Z\\",\\"source\\":\\"test@test-domain.com\\",\\"sourceArn\\":\\"arn:aws:ses:eu-west-1:123456789012:identity/testing-notify\\",\\"sendingAccountId\\":\\"123456789012\\",\\"destination\\":[\\"testing@digital.cabinet-office.gov.uk\\"]},\\"delivery\\":{\\"timestamp\\":\\"2016-03-14T12:35:26.567Z\\",\\"processingTimeMillis\\":658,\\"recipients\\":[\\"testing@digital.cabinet-office.gov.uk\\"],\\"smtpResponse\\":\\"250 2.0.0 OK 1457958926 uo5si26480932wjc.221 - gsmtp\\",\\"reportingMTA\\":\\"a6-238.smtp-out.eu-west-1.amazonses.com\\"}}",\n "Timestamp" : "2016-03-14T12:35:26.665Z",\n "SignatureVersion" : "1",\n "Signature" : "X8d7eTAOZ6wlnrdVVPYanrAlsX0SMPfOzhoTEBnQqYkrNWTqQY91C0f3bxtPdUhUtOowyPAOkTQ4KnZuzphfhVb2p1MyVYMxNKcBFB05/qaCX99+92fjw4x9LeUOwyGwMv5F0Vkfi5qZCcEw69uVrhYLVSTFTrzi/yCtru+yFULMQ6UhbY09GwiP6hjxZMVr8aROQy5lLHglqQzOuSZ4KeD85JjifHdKzlx8jjQ+uj+FLzHXPMAPmPU1JK9kpoHZ1oPshAFgPDpphJe+HwcJ8ezmk+3AEUr3wWli3xF+49y8Z2anASSVp6YI2YP95UT8Rlh3qT3T+V9V8rbSVislxA==",\n "SigningCertURL" : "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-bb750dd426d95ee9390147a5624348ee.pem",\n "UnsubscribeURL" : "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1:302763885840:preview-emails:d6aad3ef-83d6-4cf3-a470-54e2e75916da"\n}' # noqa