From dcb788b57bb0786083b2f27fb8cf9a4e1d8809e0 Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Fri, 13 Mar 2026 16:32:56 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=92=EF=B8=8F(backend)=20avoid=20inform?= =?UTF-8?q?ation=20exposure=20through=20exception=20messages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sanitize error handling to prevent leaking internal details when invalid or malicious requests are sent to the API. Return generic error responses to reduce the risk of information disclosure during probing attempts. --- CHANGELOG.md | 1 + src/backend/core/api/viewsets.py | 8 +++----- .../tests/recording/test_api_recordings_storage_hook.py | 4 ++-- src/backend/core/tests/rooms/test_api_rooms_webhook.py | 4 +--- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ebf87ed..9e2c67f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ and this project adheres to - ♻️(backend) align Application model field with `is_active` convention #1133 - 🔐(backend) avoids revealing the inactive status of an application #1135 - ⚡️(helm) reduce initialDelaySeconds and add periods seconds #1139 +- 🔒️(backend) avoid information exposure through exception messages #1144 ### Fixed diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index ad3e3c64..8375ccd1 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -488,9 +488,7 @@ class RoomViewSet( if status_code == drf_status.HTTP_500_INTERNAL_SERVER_ERROR: raise e - return drf_response.Response( - {"status": "error", "message": str(e)}, status=status_code - ) + return drf_response.Response({"status": "error"}, status=status_code) @decorators.action( detail=False, @@ -757,10 +755,10 @@ class RecordingViewSet( recording_id = parser.get_recording_id(request.data) except ParsingEventDataError as e: - raise drf_exceptions.PermissionDenied(f"Invalid request data: {e}") from e + raise drf_exceptions.PermissionDenied("Invalid request data.") from e except InvalidBucketError as e: - raise drf_exceptions.PermissionDenied("Invalid bucket specified") from e + raise drf_exceptions.PermissionDenied("Invalid bucket specified.") from e except InvalidFilepathError: return drf_response.Response( diff --git a/src/backend/core/tests/recording/test_api_recordings_storage_hook.py b/src/backend/core/tests/recording/test_api_recordings_storage_hook.py index fe85cb76..2ef88798 100644 --- a/src/backend/core/tests/recording/test_api_recordings_storage_hook.py +++ b/src/backend/core/tests/recording/test_api_recordings_storage_hook.py @@ -95,7 +95,7 @@ def test_save_recording_parsing_error(recording_settings, mock_get_parser, clien ) assert response.status_code == 403 - assert response.json() == {"detail": "Invalid request data: Error message"} + assert response.json() == {"detail": "Invalid request data."} def test_save_recording_bucket_error(recording_settings, mock_get_parser, client): @@ -112,7 +112,7 @@ def test_save_recording_bucket_error(recording_settings, mock_get_parser, client ) assert response.status_code == 403 - assert response.json() == {"detail": "Invalid bucket specified"} + assert response.json() == {"detail": "Invalid bucket specified."} def test_save_recording_filetype_error(recording_settings, mock_get_parser): diff --git a/src/backend/core/tests/rooms/test_api_rooms_webhook.py b/src/backend/core/tests/rooms/test_api_rooms_webhook.py index 8de9f8b0..356dedb5 100644 --- a/src/backend/core/tests/rooms/test_api_rooms_webhook.py +++ b/src/backend/core/tests/rooms/test_api_rooms_webhook.py @@ -77,7 +77,6 @@ def test_missing_auth_header(client, serialized_event_data, mock_livekit_config) assert response.status_code == 401 assert response.json() == { "status": "error", - "message": "Authorization header missing", } @@ -91,7 +90,7 @@ def test_invalid_payload(client, auth_token, mock_livekit_config): ) assert response.status_code == 400 - assert response.json() == {"status": "error", "message": "Invalid webhook payload"} + assert response.json() == {"status": "error"} def test_unknown_event_type(client, mock_livekit_config): @@ -116,7 +115,6 @@ def test_unknown_event_type(client, mock_livekit_config): assert response.status_code == 422 assert response.json() == { "status": "error", - "message": "Unknown webhook type: unknown_event_type", }