From dc833aa85c09dc3bdccc1c46294f43371a17d660 Mon Sep 17 00:00:00 2001 From: Kesara Rathnayake Date: Mon, 6 Sep 2021 11:42:16 +0000 Subject: [PATCH] Implements /api/appauth/authortools API endpoint. Fixes #3396. Commit ready for merge. - Legacy-Id: 19344 --- ietf/api/tests.py | 21 ++++++++++++++++++++- ietf/api/urls.py | 2 ++ ietf/api/views.py | 7 +++++++ ietf/person/models.py | 1 + 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/ietf/api/tests.py b/ietf/api/tests.py index 12d91573b..c01fe3a64 100644 --- a/ietf/api/tests.py +++ b/ietf/api/tests.py @@ -355,7 +355,6 @@ class CustomApiTests(TestCase): missing_fields = [ f.strip() for f in fields.split(',') ] self.assertEqual(set(missing_fields), set(drop_fields)) - def test_api_version(self): url = urlreverse('ietf.api.views.version') r = self.client.get(url) @@ -363,6 +362,26 @@ class CustomApiTests(TestCase): self.assertEqual(data['version'], ietf.__version__+ietf.__patch__) self.assertIn(data['date'], ietf.__date__) + def test_api_appauth_authortools(self): + url = urlreverse('ietf.api.views.author_tools') + person = PersonFactory() + apikey = PersonalApiKey.objects.create(endpoint=url, person=person) + + # error cases + # missing apikey + r = self.client.post(url, {}) + self.assertContains(r, 'Missing apikey parameter', status_code=400) + + # invalid apikey + r = self.client.post(url, {'apikey': 'foobar'}) + self.assertContains(r, 'Invalid apikey', status_code=403) + + # working case + r = self.client.post(url, {'apikey': apikey.hash()}) + self.assertEqual(r.status_code, 200) + jsondata = r.json() + self.assertEqual(data['success'], True) + class TastypieApiTestCase(ResourceTestCaseMixin, TestCase): def __init__(self, *args, **kwargs): diff --git a/ietf/api/urls.py b/ietf/api/urls.py index 34b9061be..887558a3e 100644 --- a/ietf/api/urls.py +++ b/ietf/api/urls.py @@ -40,6 +40,8 @@ urlpatterns = [ url(r'^submit/?$', submit_views.api_submit), # Datatracker version url(r'^version/?$', api_views.version), + # Authtools API key + url(r'^appauth/authortools', api_views.author_tools), ] # Additional (standard) Tastypie endpoints diff --git a/ietf/api/views.py b/ietf/api/views.py index bdc549709..d24ae11cc 100644 --- a/ietf/api/views.py +++ b/ietf/api/views.py @@ -215,3 +215,10 @@ def version(request): content_type='application/json', ) + +@require_api_key +@csrf_exempt +def author_tools(request): + return HttpResponse( + json.dumps({'success': True}), + content_type='application/json') diff --git a/ietf/person/models.py b/ietf/person/models.py index a287fac17..7b85e6c36 100644 --- a/ietf/person/models.py +++ b/ietf/person/models.py @@ -368,6 +368,7 @@ PERSON_API_KEY_VALUES = [ ("/api/meeting/session/video/url", "/api/meeting/session/video/url", "Recording Manager"), ("/api/notify/meeting/registration", "/api/notify/meeting/registration", "Robot"), ("/api/notify/meeting/bluesheet", "/api/notify/meeting/bluesheet", "Recording Manager"), + ("/api/appauth/authortools", "/api/appauth/authortools", None), ] PERSON_API_KEY_ENDPOINTS = sorted(list(set([ (v, n) for (v, n, r) in PERSON_API_KEY_VALUES ])))