Fix /api/v2/person/person to work with Robot apikey. Commit ready for merge.

- Legacy-Id: 19101
This commit is contained in:
Ryan Cross 2021-06-09 18:13:17 +00:00
parent c8ed251ae3
commit 92f2d02207
4 changed files with 12 additions and 19 deletions

View file

@ -257,9 +257,9 @@ class CustomApiTests(TestCase):
def test_api_v2_person_export_view(self):
url = urlreverse('ietf.api.views.ApiV2PersonExportView')
secretariat_role = RoleFactory(group__acronym='secretariat', name_id='secr')
secretariat = secretariat_role.person
apikey = PersonalApiKey.objects.create(endpoint=url, person=secretariat)
robot = PersonFactory(user__is_staff=True)
RoleFactory(name_id='robot', person=robot, email=robot.email(), group__acronym='secretariat')
apikey = PersonalApiKey.objects.create(endpoint=url, person=robot)
# error cases
r = self.client.post(url, {})
@ -270,25 +270,19 @@ class CustomApiTests(TestCase):
badrole.person.user.last_login = timezone.now()
badrole.person.user.save()
r = self.client.post(url, {'apikey': badapikey.hash()})
self.assertContains(r, "Restricted to role: Secretariat", status_code=403)
r = self.client.post(url, {'apikey': apikey.hash()})
self.assertContains(r, "Too long since last regular login", status_code=400)
secretariat.user.last_login = timezone.now()
secretariat.user.save()
self.assertContains(r, "Restricted to role: Robot", status_code=403)
r = self.client.post(url, {'apikey': apikey.hash()})
self.assertContains(r, "No filters provided", status_code=400)
# working case
r = self.client.post(url, {'apikey': apikey.hash(), 'email': secretariat.email().address, '_expand': 'user'})
r = self.client.post(url, {'apikey': apikey.hash(), 'email': robot.email().address, '_expand': 'user'})
self.assertEqual(r.status_code, 200)
jsondata = r.json()
data = jsondata['person.person'][str(secretariat.id)]
self.assertEqual(data['name'], secretariat.name)
self.assertEqual(data['ascii'], secretariat.ascii)
self.assertEqual(data['user']['email'], secretariat.user.email)
data = jsondata['person.person'][str(robot.id)]
self.assertEqual(data['name'], robot.name)
self.assertEqual(data['ascii'], robot.ascii)
self.assertEqual(data['user']['email'], robot.user.email)
def test_api_new_meeting_registration(self):
meeting = MeetingFactory(type_id='ietf')

View file

@ -91,7 +91,7 @@ class PersonalInformationExportView(DetailView, JsonExportMixin):
return self.json_view(request, filter={'id':person.id}, expand=expand)
@method_decorator((csrf_exempt, require_api_key, role_required('Secretariat')), name='dispatch')
@method_decorator((csrf_exempt, require_api_key, role_required('Robot')), name='dispatch')
class ApiV2PersonExportView(DetailView, JsonExportMixin):
model = Person
@ -214,4 +214,4 @@ def version(request):
}),
content_type='application/json',
)

View file

@ -531,7 +531,7 @@ class IetfAuthTests(TestCase):
def test_apikey_management(self):
# Create a person with a role that will give at least one valid apikey
person = RoleFactory(name_id='secr', group__acronym='secretariat').person
person = RoleFactory(name_id='robot', group__acronym='secretariat').person
url = urlreverse('ietf.ietfauth.views.apikey_index')

View file

@ -348,7 +348,6 @@ def salt():
# Manual maintenance: List all endpoints that use @require_api_key here
PERSON_API_KEY_VALUES = [
("/api/iesg/position", "/api/iesg/position", "Area Director"),
("/api/v2/person/person", "/api/v2/person/person", "Secretariat"),
("/api/v2/person/person", "/api/v2/person/person", "Robot"),
("/api/meeting/session/video/url", "/api/meeting/session/video/url", "Recording Manager"),
("/api/notify/meeting/registration", "/api/notify/meeting/registration", "Robot"),