From be4b36a6616567ba3c5480ef52439d055a32581f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Wed, 20 Dec 2017 11:40:56 +0100 Subject: [PATCH] Also accept user-modified webhook when old email address is unknown. When the old email address is unknown, and the new one does map to a user, use the webhook to update the new user. --- cloud/webhooks.py | 6 ++++-- tests/test_webhooks.py | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/cloud/webhooks.py b/cloud/webhooks.py index f3e6069..39374d3 100644 --- a/cloud/webhooks.py +++ b/cloud/webhooks.py @@ -76,8 +76,10 @@ def user_modified(): users_coll = current_app.db('users') db_user = users_coll.find_one({'email': payload['old_email']}) if not db_user: - my_log.info('Received update for unknown user %r', payload['old_email']) - return '', 204 + db_user = users_coll.find_one({'email': payload['email']}) + if not db_user: + my_log.info('Received update for unknown user %r', payload['old_email']) + return '', 204 # Use direct database updates to change the email and full name. updates = {} diff --git a/tests/test_webhooks.py b/tests/test_webhooks.py index 05238ea..f61284f 100644 --- a/tests/test_webhooks.py +++ b/tests/test_webhooks.py @@ -79,6 +79,27 @@ class UserModifiedTest(AbstractCloudTest): self.assertEqual('ကြယ်ဆွတ်', db_user['full_name']) self.assertEqual(['subscriber'], db_user['roles']) + def test_change_email_unknown_old(self): + payload = {'id': 1112333, + 'old_email': 'ancient@email.address', + 'full_name': 'ကြယ်ဆွတ်', + 'email': 'old@email.address', + 'roles': ['cloud_demo']} + as_json = json.dumps(payload).encode() + mac = hmac.new(self.hmac_secret, + as_json, hashlib.sha256) + self.post('/api/webhooks/user-modified', + data=as_json, + content_type='application/json', + headers={'X-Webhook-HMAC': mac.hexdigest()}, + expected_status=204) + + # Check the effect on the user + db_user = self.fetch_user_from_db(self.uid) + self.assertEqual('old@email.address', db_user['email']) + self.assertEqual('ကြယ်ဆွတ်', db_user['full_name']) + self.assertEqual(['demo'], db_user['roles']) + def test_change_roles(self): payload = {'id': 1112333, 'old_email': 'old@email.address',