diff --git a/backend/src/baserow/core/registries.py b/backend/src/baserow/core/registries.py index c480a84ed..86bf7afc0 100644 --- a/backend/src/baserow/core/registries.py +++ b/backend/src/baserow/core/registries.py @@ -12,6 +12,7 @@ from rest_framework.serializers import Serializer from baserow.contrib.database.constants import IMPORT_SERIALIZED_IMPORTING from baserow.core.utils import ChildProgressBuilder +from baserow_enterprise.exceptions import SubjectTypeNotExist from .exceptions import ( ApplicationTypeAlreadyRegistered, @@ -628,6 +629,7 @@ class SubjectTypeRegistry(Registry[SubjectType], ModelRegistryMixin): """ name = "subject" + does_not_exist_exception_class = SubjectTypeNotExist def get_serializer(self, model_instance, **kwargs) -> Serializer: """ diff --git a/enterprise/backend/src/baserow_enterprise/api/role/views.py b/enterprise/backend/src/baserow_enterprise/api/role/views.py index 1b54e0a55..8eb2fd312 100644 --- a/enterprise/backend/src/baserow_enterprise/api/role/views.py +++ b/enterprise/backend/src/baserow_enterprise/api/role/views.py @@ -84,12 +84,26 @@ class RoleAssignmentsView(APIView): "ERROR_REQUEST_BODY_VALIDATION", ] ), + 404: get_error_schema( + [ + "ERROR_SCOPE_DOES_NOT_EXIST", + "ERROR_GROUP_DOES_NOT_EXIST", + "ERROR_OBJECT_SCOPE_TYPE_DOES_NOT_EXIST", + "ERROR_SUBJECT_TYPE_DOES_NOT_EXIST", + "ERROR_ROLE_DOES_NOT_EXIST", + ] + ), }, ) @map_exceptions( { + GroupDoesNotExist: ERROR_GROUP_DOES_NOT_EXIST, UserNotInGroup: ERROR_USER_NOT_IN_GROUP, + ObjectScopeTypeDoesNotExist: ERROR_OBJECT_SCOPE_TYPE_DOES_NOT_EXIST, + SubjectTypeNotExist: ERROR_SUBJECT_TYPE_DOES_NOT_EXIST, + SubjectNotExist: ERROR_SUBJECT_DOES_NOT_EXIST, ScopeNotExist: ERROR_SCOPE_DOES_NOT_EXIST, + RoleNotExist: ERROR_ROLE_DOES_NOT_EXIST, } ) @validate_body(CreateRoleAssignmentSerializer, return_validated=True) diff --git a/enterprise/backend/tests/baserow_enterprise_tests/api/role/test_role_views.py b/enterprise/backend/tests/baserow_enterprise_tests/api/role/test_role_views.py index d40335cd9..a9295218d 100644 --- a/enterprise/backend/tests/baserow_enterprise_tests/api/role/test_role_views.py +++ b/enterprise/backend/tests/baserow_enterprise_tests/api/role/test_role_views.py @@ -4,7 +4,12 @@ from django.shortcuts import reverse from django.test.utils import override_settings import pytest -from rest_framework.status import HTTP_200_OK, HTTP_204_NO_CONTENT +from rest_framework.status import ( + HTTP_200_OK, + HTTP_204_NO_CONTENT, + HTTP_400_BAD_REQUEST, + HTTP_404_NOT_FOUND, +) from baserow.core.subjects import UserSubjectType from baserow_enterprise.role.handler import RoleAssignmentHandler @@ -139,6 +144,143 @@ def test_create_role_assignment( assert role_assignment_user_2 is None +def test_create_role_assignment_invalid_requests(api_client, data_fixture): + user, token = data_fixture.create_user_and_token() + user_2 = data_fixture.create_user() + user_3 = data_fixture.create_user() + group = data_fixture.create_group(user=user, members=[user_2]) + group_2 = data_fixture.create_group() + role = Role.objects.get(uid="ADMIN") + + url = reverse("api:enterprise:role:list", kwargs={"group_id": group.id}) + + response = api_client.post( + url, + data=json.dumps( + { + "scope_id": 9999, + "scope_type": "group", + "subject_id": user_2.id, + "subject_type": UserSubjectType.type, + "role": role.uid, + } + ), + content_type="application/json", + **{"HTTP_AUTHORIZATION": f"JWT {token}"}, + ) + + assert response.status_code == HTTP_404_NOT_FOUND + assert response.json()["error"] == "ERROR_SCOPE_DOES_NOT_EXIST" + + response = api_client.post( + url, + data=json.dumps( + { + "scope_id": group.id, + "scope_type": "nonsense", + "subject_id": user_2.id, + "subject_type": UserSubjectType.type, + "role": role.uid, + } + ), + content_type="application/json", + **{"HTTP_AUTHORIZATION": f"JWT {token}"}, + ) + + assert response.status_code == HTTP_404_NOT_FOUND + assert response.json()["error"] == "ERROR_OBJECT_SCOPE_TYPE_DOES_NOT_EXIST" + + response = api_client.post( + url, + data=json.dumps( + { + "scope_id": group.id, + "scope_type": "group", + "subject_id": 99999, + "subject_type": UserSubjectType.type, + "role": role.uid, + } + ), + content_type="application/json", + **{"HTTP_AUTHORIZATION": f"JWT {token}"}, + ) + + assert response.status_code == HTTP_404_NOT_FOUND + assert response.json()["error"] == "ERROR_SUBJECT_DOES_NOT_EXIST" + + response = api_client.post( + url, + data=json.dumps( + { + "scope_id": group.id, + "scope_type": "group", + "subject_id": user_2.id, + "subject_type": "nonsense", + "role": role.uid, + } + ), + content_type="application/json", + **{"HTTP_AUTHORIZATION": f"JWT {token}"}, + ) + + assert response.status_code == HTTP_404_NOT_FOUND + assert response.json()["error"] == "ERROR_SUBJECT_TYPE_DOES_NOT_EXIST" + + response = api_client.post( + url, + data=json.dumps( + { + "scope_id": group.id, + "scope_type": "group", + "subject_id": user_2.id, + "subject_type": UserSubjectType.type, + "role": 999999, + } + ), + content_type="application/json", + **{"HTTP_AUTHORIZATION": f"JWT {token}"}, + ) + + assert response.status_code == HTTP_404_NOT_FOUND + assert response.json()["error"] == "ERROR_ROLE_DOES_NOT_EXIST" + + response = api_client.post( + reverse("api:enterprise:role:list", kwargs={"group_id": group_2.id}), + data=json.dumps( + { + "scope_id": group_2.id, + "scope_type": "group", + "subject_id": user_3.id, + "subject_type": UserSubjectType.type, + "role": role.uid, + } + ), + content_type="application/json", + **{"HTTP_AUTHORIZATION": f"JWT {token}"}, + ) + + assert response.status_code == HTTP_400_BAD_REQUEST + assert response.json()["error"] == "ERROR_USER_NOT_IN_GROUP" + + response = api_client.post( + reverse("api:enterprise:role:list", kwargs={"group_id": 999999}), + data=json.dumps( + { + "scope_id": group.id, + "scope_type": "group", + "subject_id": user_2.id, + "subject_type": UserSubjectType.type, + "role": role.uid, + } + ), + content_type="application/json", + **{"HTTP_AUTHORIZATION": f"JWT {token}"}, + ) + + assert response.status_code == HTTP_404_NOT_FOUND + assert response.json()["error"] == "ERROR_GROUP_DOES_NOT_EXIST" + + @pytest.mark.django_db @override_settings(DEBUG=True) def test_get_role_assignments_group_level(data_fixture, api_client):