mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Validate page bounds
This commit is contained in:
		| @@ -1524,7 +1524,7 @@ class BulkEditSerializer( | |||||||
|         else: |         else: | ||||||
|             parameters["archive_fallback"] = False |             parameters["archive_fallback"] = False | ||||||
|  |  | ||||||
|     def _validate_parameters_edit_pdf(self, parameters): |     def _validate_parameters_edit_pdf(self, parameters, document_id): | ||||||
|         if "operations" not in parameters: |         if "operations" not in parameters: | ||||||
|             raise serializers.ValidationError("operations not specified") |             raise serializers.ValidationError("operations not specified") | ||||||
|         if not isinstance(parameters["operations"], list): |         if not isinstance(parameters["operations"], list): | ||||||
| @@ -1556,6 +1556,15 @@ class BulkEditSerializer( | |||||||
|                     "update_document only allowed with a single output document", |                     "update_document only allowed with a single output document", | ||||||
|                 ) |                 ) | ||||||
|  |  | ||||||
|  |         doc = Document.objects.get(id=document_id) | ||||||
|  |         # doc existence is already validated | ||||||
|  |         if doc.page_count: | ||||||
|  |             for op in parameters["operations"]: | ||||||
|  |                 if op["page"] < 1 or op["page"] > doc.page_count: | ||||||
|  |                     raise serializers.ValidationError( | ||||||
|  |                         f"Page {op['page']} is out of bounds for document with {doc.page_count} pages.", | ||||||
|  |                     ) | ||||||
|  |  | ||||||
|     def validate(self, attrs): |     def validate(self, attrs): | ||||||
|         method = attrs["method"] |         method = attrs["method"] | ||||||
|         parameters = attrs["parameters"] |         parameters = attrs["parameters"] | ||||||
| @@ -1595,7 +1604,7 @@ class BulkEditSerializer( | |||||||
|                 raise serializers.ValidationError( |                 raise serializers.ValidationError( | ||||||
|                     "Edit PDF method only supports one document", |                     "Edit PDF method only supports one document", | ||||||
|                 ) |                 ) | ||||||
|             self._validate_parameters_edit_pdf(parameters) |             self._validate_parameters_edit_pdf(parameters, attrs["documents"][0]) | ||||||
|  |  | ||||||
|         return attrs |         return attrs | ||||||
|  |  | ||||||
|   | |||||||
| @@ -41,6 +41,7 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase): | |||||||
|             title="B", |             title="B", | ||||||
|             correspondent=self.c1, |             correspondent=self.c1, | ||||||
|             document_type=self.dt1, |             document_type=self.dt1, | ||||||
|  |             page_count=5, | ||||||
|         ) |         ) | ||||||
|         self.doc3 = Document.objects.create( |         self.doc3 = Document.objects.create( | ||||||
|             checksum="C", |             checksum="C", | ||||||
| @@ -1555,6 +1556,32 @@ class TestBulkEditAPI(DirectoriesMixin, APITestCase): | |||||||
|             response.content, |             response.content, | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|  |     @mock.patch("documents.serialisers.bulk_edit.edit_pdf") | ||||||
|  |     def test_edit_pdf_page_out_of_bounds(self, m): | ||||||
|  |         """ | ||||||
|  |         GIVEN: | ||||||
|  |             - API data for editing PDF is called | ||||||
|  |             - The page number is out of bounds | ||||||
|  |         WHEN: | ||||||
|  |             - API is called | ||||||
|  |         THEN: | ||||||
|  |             - The API fails with a correct error code | ||||||
|  |         """ | ||||||
|  |         self.setup_mock(m, "edit_pdf") | ||||||
|  |         response = self.client.post( | ||||||
|  |             "/api/documents/bulk_edit/", | ||||||
|  |             json.dumps( | ||||||
|  |                 { | ||||||
|  |                     "documents": [self.doc2.id], | ||||||
|  |                     "method": "edit_pdf", | ||||||
|  |                     "parameters": {"operations": [{"page": 99}]}, | ||||||
|  |                 }, | ||||||
|  |             ), | ||||||
|  |             content_type="application/json", | ||||||
|  |         ) | ||||||
|  |         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) | ||||||
|  |         self.assertIn(b"out of bounds", response.content) | ||||||
|  |  | ||||||
|     @override_settings(AUDIT_LOG_ENABLED=True) |     @override_settings(AUDIT_LOG_ENABLED=True) | ||||||
|     def test_bulk_edit_audit_log_enabled_simple_field(self): |     def test_bulk_edit_audit_log_enabled_simple_field(self): | ||||||
|         """ |         """ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 shamoon
					shamoon