diff --git a/src/documents/tests/test_api_document_versions.py b/src/documents/tests/test_api_document_versions.py index 417aa4b16..b1eb3c737 100644 --- a/src/documents/tests/test_api_document_versions.py +++ b/src/documents/tests/test_api_document_versions.py @@ -1173,3 +1173,27 @@ class TestVersionActionPermissions(DirectoriesMixin, APITestCase): self.version.save(update_fields=["owner"]) response = self.client.get(f"/api/documents/{self.version.pk}/history/") self.assertEqual(response.status_code, 200) + + def test_selection_data_rejects_stale_version_ownership(self): + for owner in (None, self.user): + self.version.owner = owner + self.version.save(update_fields=["owner"]) + with self.subTest(owner=owner): + response = self.client.post( + "/api/documents/selection_data/", + {"documents": [self.version.pk]}, + format="json", + ) + self.assertEqual(response.status_code, 403) + + def test_selection_data_allows_private_version_of_permitted_root(self): + self.version.owner = UserFactory() + self.version.save(update_fields=["owner"]) + grant_object(self.user, self.root, "view_document") + other = DocumentFactory(owner=self.user) + response = self.client.post( + "/api/documents/selection_data/", + {"documents": [self.version.pk, other.pk]}, + format="json", + ) + self.assertEqual(response.status_code, 200) diff --git a/src/documents/views.py b/src/documents/views.py index 5b3b5d76e..87fe2ced6 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -3624,8 +3624,11 @@ class SelectionDataView(DocumentSelectionMixin, GenericAPIView[Any]): user=request.user, validated_data=serializer.validated_data, ) - permitted_documents = Document.objects.filter( - id__in=permitted_document_ids(request.user), + # Versions are authorized by their root document + permitted_documents = Document.objects.annotate( + root_id=Coalesce("root_document_id", "id"), + ).filter( + root_id__in=permitted_document_ids(request.user), ) if permitted_documents.filter(pk__in=ids).count() != len(ids): return HttpResponseForbidden("Insufficient permissions")