From e208f81dabce304cadacd3f1b29f74447ad2fd45 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Mon, 19 Jul 2021 14:26:30 +0200 Subject: [PATCH] ovh: handle error during token request (#55667) --- passerelle/apps/ovh/views.py | 23 +++++++++++++++++++---- tests/test_sms.py | 24 ++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/passerelle/apps/ovh/views.py b/passerelle/apps/ovh/views.py index bfa5b13d..2cfd7232 100644 --- a/passerelle/apps/ovh/views.py +++ b/passerelle/apps/ovh/views.py @@ -6,6 +6,7 @@ from django.contrib import messages from django.shortcuts import reverse from django.utils.translation import ugettext_lazy as _ from django.views.generic.base import RedirectView +from requests import RequestException from .models import OVHSMSGateway @@ -25,10 +26,24 @@ class RequestTokenView(RedirectView): } headers = {"X-Ovh-Application": connector.application_key} - resp = connector.requests.post( - 'https://eu.api.ovh.com/1.0/auth/credential', json=data, headers=headers - ) - result = resp.json() + try: + resp = connector.requests.post( + 'https://eu.api.ovh.com/1.0/auth/credential', json=data, headers=headers + ) + except RequestException as e: + messages.error(self.request, _('There has been an error requesting token: %s.') % e) + return connector.get_absolute_url() + try: + result = resp.json() + except ValueError as e: + messages.error(self.request, _('There has been an error requesting token: bad JSON response.')) + return connector.get_absolute_url() + try: + resp.raise_for_status() + except RequestException as e: + error_text = result.get('message', result) + messages.error(self.request, _('There has been an error requesting token: %s.') % error_text) + return connector.get_absolute_url() self.request.session['ovh-token-%s' % request_id] = result['consumerKey'] return result['validationUrl'] diff --git a/tests/test_sms.py b/tests/test_sms.py index 8eb31d9c..334cfedf 100644 --- a/tests/test_sms.py +++ b/tests/test_sms.py @@ -502,6 +502,30 @@ def test_ovh_token_request(admin_user, app): assert connector.consumer_key == 'xyz' +def test_ovh_token_request_error(admin_user, app): + connector = OVHSMSGateway.objects.create( + slug='test-ovh', + title='Test OVH', + account='sms-test42', + application_key='wrong', + application_secret='oups', + ) + + app = login(app) + resp = app.get(connector.get_absolute_url()) + ovh_request_token_url = 'https://eu.api.ovh.com/1.0/auth/credential' + ovh_response = {'message': 'Invalid application key'} + + with utils.mock_url(ovh_request_token_url, ovh_response, 401) as mocked: + resp = resp.click('request access').follow() + assert 'error requesting token: Invalid application key.' in resp.text + + ovh_response = 'not-json' + with utils.mock_url(ovh_request_token_url, ovh_response, 401) as mocked: + resp = resp.click('request access').follow() + assert 'error requesting token: bad JSON response' in resp.text + + @pytest.mark.parametrize('connector', [ChoositSMSGateway], indirect=True) def test_manager(admin_user, app, connector): app = login(app) -- 2.20.1