diff --git a/CHANGELOG.md b/CHANGELOG.md index 47679f4b..771fb919 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,7 +53,7 @@ and this project adheres to - ♿️(frontend) add focus on open to modals #1948 ### Fixed - +- 🐛 (backend) prevent privileged users from requesting access #1898 - 🐛(frontend) fix broadcast store sync #1846 - 🐛(helm) use celery resources instead of backend resources #1887 - 🐛(helm) reverse liveness and readiness for backend deployment #1887 diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index bef130b0..3b36c456 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -2523,6 +2523,12 @@ class DocumentAskForAccessViewSet( """Create a document ask for access resource.""" document = self.get_document_or_404() + if document.get_role(request.user) in models.PRIVILEGED_ROLES: + return drf.response.Response( + {"detail": "You already have privileged access to this document."}, + status=drf.status.HTTP_400_BAD_REQUEST, + ) + serializer = serializers.DocumentAskForAccessCreateSerializer(data=request.data) serializer.is_valid(raise_exception=True) diff --git a/src/backend/core/tests/documents/test_api_documents_ask_for_access.py b/src/backend/core/tests/documents/test_api_documents_ask_for_access.py index c5aad35f..9c260f40 100644 --- a/src/backend/core/tests/documents/test_api_documents_ask_for_access.py +++ b/src/backend/core/tests/documents/test_api_documents_ask_for_access.py @@ -9,6 +9,7 @@ import pytest from rest_framework.test import APIClient from core.api.serializers import UserSerializer +from core.choices import PRIVILEGED_ROLES from core.factories import ( DocumentAskForAccessFactory, DocumentFactory, @@ -199,6 +200,27 @@ def test_api_documents_ask_for_access_create_authenticated_already_has_ask_for_a assert response.json() == {"detail": "You already ask to access to this document."} +@pytest.mark.parametrize("role", PRIVILEGED_ROLES) +def test_api_documents_ask_for_access_create_authenticated_already_has_privileged_access( + role, +): + """ + Authenticated users with privileged access (owner or admin) should not be able to + create a document ask for access. + """ + user = UserFactory() + document = DocumentFactory(users=[(user, role)]) + + client = APIClient() + client.force_login(user) + + response = client.post(f"/api/v1.0/documents/{document.id}/ask-for-access/") + assert response.status_code == 400 + assert response.json() == { + "detail": "You already have privileged access to this document." + } + + ## List