diff --git a/arkindex/ponos/api.py b/arkindex/ponos/api.py index d112bccde8ba1b44081d828a3a5418f505f3769a..2689f09e60d4a4c53da2e3162435ecc33f8ddcc6 100644 --- a/arkindex/ponos/api.py +++ b/arkindex/ponos/api.py @@ -152,11 +152,12 @@ class AgentDetails(RetrieveAPIView): """ Retrieve details of an agent including its running tasks - Requires authentication with a verified e-mail address. + Requires authentication with a verified e-mail address. Cannot be used with Ponos agent or task authentication. """ + authentication_classes = (TokenAuthentication, SessionAuthentication) permission_classes = (IsVerified, ) serializer_class = AgentDetailsSerializer - queryset = Agent.objects.all() + queryset = Agent.objects.select_related('farm') @extend_schema( diff --git a/arkindex/ponos/tests/test_api.py b/arkindex/ponos/tests/test_api.py index 40bc1c910ca61d52dd083c0b7f7fa19e0d08640f..917ffa0553ab9893eecf820884701b02f61a1d87 100644 --- a/arkindex/ponos/tests/test_api.py +++ b/arkindex/ponos/tests/test_api.py @@ -1948,6 +1948,25 @@ class TestAPI(FixtureAPITestCase): }, ) + def test_retrieve_agent_requires_login(self): + with self.assertNumQueries(0): + response = self.client.get( + reverse("api:agent-details", kwargs={"pk": str(self.agent.id)}), + HTTP_AUTHORIZATION=f"Bearer {self.agent.token.access_token}", + ) + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + + def test_retrieve_agent_requires_verified(self): + self.user.verified_email = False + self.user.save() + self.client.force_login(self.user) + + with self.assertNumQueries(2): + response = self.client.get( + reverse("api:agent-details", kwargs={"pk": str(self.agent.id)}), + ) + self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + def test_retrieve_agent_details(self): """ The view returns an agents with its details and associated running tasks @@ -1967,8 +1986,9 @@ class TestAPI(FixtureAPITestCase): ] ) running_task = self.agent.tasks.get(state=State.Running) - self.client.force_login(self.superuser) - with self.assertNumQueries(7): + self.client.force_login(self.user) + + with self.assertNumQueries(6): response = self.client.get( reverse("api:agent-details", kwargs={"pk": str(self.agent.id)}) ) @@ -2023,6 +2043,22 @@ class TestAPI(FixtureAPITestCase): }, ) + def test_retrieve_agent_agent_forbidden(self): + with self.assertNumQueries(0): + response = self.client.get( + reverse("api:agent-details", kwargs={"pk": str(self.agent.id)}), + HTTP_AUTHORIZATION=f"Bearer {self.agent.token.access_token}", + ) + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + + def test_retrieve_agent_task_forbidden(self): + with self.assertNumQueries(0): + response = self.client.get( + reverse("api:agent-details", kwargs={"pk": str(self.agent.id)}), + HTTP_AUTHORIZATION=f"Ponos {self.task1.token}", + ) + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + def test_list_farms_requires_login(self): with self.assertNumQueries(0): response = self.client.get(reverse("api:farm-list")) diff --git a/arkindex/project/tests/test_ponos_view.py b/arkindex/project/tests/test_ponos_view.py index d30e5393f1edc12a5d4de6180984569d65b24da8..f4f3cd4400ec05b8728e2afc087de0d17d0d25c0 100644 --- a/arkindex/project/tests/test_ponos_view.py +++ b/arkindex/project/tests/test_ponos_view.py @@ -4,7 +4,7 @@ from rest_framework import status from arkindex.documents.models import Corpus from arkindex.ponos.authentication import AgentUser -from arkindex.ponos.models import Agent, Artifact, Farm +from arkindex.ponos.models import Artifact, Farm from arkindex.process.models import ProcessMode from arkindex.project.tests import FixtureAPITestCase from arkindex.users.models import Role, User @@ -30,36 +30,6 @@ class TestPonosView(FixtureAPITestCase): process.corpus = cls.process_corpus process.save() - cls.agent = Agent.objects.create( - cpu_cores=3, - cpu_frequency=3e9, - farm=Farm.objects.create(), - ram_total=2e9, - last_ping='1999-09-09', - ) - - def test_retrieve_agent_requires_login(self): - """ - Only authenticated users should have the ability to retrieve details of an agent - """ - response = self.client.get(reverse('api:agent-details', kwargs={'pk': str(self.agent.id)})) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - def test_retrieve_agent_requires_verified(self): - """ - Only verified users should have the ability to retrieve details of an agent - """ - self.user.verified_email = False - self.user.save() - self.client.force_login(self.user) - response = self.client.get(reverse('api:agent-details', kwargs={'pk': str(self.agent.id)})) - self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) - - def test_retrieve_agent(self): - self.client.force_login(self.user) - response = self.client.get(reverse('api:agent-details', kwargs={'pk': str(self.agent.id)})) - self.assertEqual(response.status_code, status.HTTP_200_OK) - def test_update_task(self): """ Only users with an admin privilege have the ability to update a process task