Skip to content

Commit 2849345

Browse files
committed
fix(security): sanitize provider span failures
1 parent abc20e3 commit 2849345

4 files changed

Lines changed: 8 additions & 33 deletions

File tree

src/cas_reference_product/app.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@
1313
_tracer = trace.get_tracer(__name__)
1414

1515

16-
def _raise_workflow_backend_failure(error: WorkflowAgentServiceError) -> None:
17-
raise HTTPException(status_code=502, detail="Workflow backend request failed") from error
18-
19-
2016
def create_app(settings: Settings | None = None) -> FastAPI:
2117
app_settings = settings or get_settings()
2218

@@ -59,7 +55,7 @@ def execute(envelope: PromptEnvelope, request: Request) -> WorkflowResult:
5955
orchestrator = WorkflowOrchestrator(service, app_settings.repository)
6056
try:
6157
result = orchestrator.execute(envelope)
62-
except WorkflowAgentServiceError as error:
58+
except WorkflowAgentServiceError:
6359
span.add_event(
6460
"workflow.failed",
6561
attributes={
@@ -68,7 +64,9 @@ def execute(envelope: PromptEnvelope, request: Request) -> WorkflowResult:
6864
"error": True,
6965
},
7066
)
71-
_raise_workflow_backend_failure(error)
67+
raise HTTPException(
68+
status_code=502, detail="Workflow backend request failed"
69+
) from None
7270
span.add_event(
7371
"workflow.completed",
7472
attributes={

src/cas_reference_product/workflow.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ def run(self, envelope: PromptEnvelope) -> str:
5656
}
5757
},
5858
)
59-
except Exception as error:
60-
raise WorkflowAgentServiceError("Foundry workflow invocation failed") from error
59+
except Exception:
60+
raise WorkflowAgentServiceError("Foundry workflow invocation failed") from None
6161
return response.output_text
6262

6363

tests/test_api.py

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
from typing import Any
22
from unittest.mock import patch
33

4-
import pytest
5-
from fastapi import HTTPException
64
from fastapi.testclient import TestClient
75

8-
from cas_reference_product.app import _raise_workflow_backend_failure, create_app
6+
from cas_reference_product.app import create_app
97
from cas_reference_product.config import Settings
108
from cas_reference_product.workflow import WorkflowAgentServiceError
119

@@ -71,23 +69,3 @@ def test_workflow_api_sanitizes_external_service_failures(envelope: "Any") -> No
7169
assert response.status_code == 502
7270
assert response.json() == {"detail": "Workflow backend request failed"}
7371
assert "sensitive" not in response.text
74-
75-
76-
def test_workflow_backend_failure_preserves_exception_chain() -> None:
77-
with pytest.raises(HTTPException) as caught:
78-
try:
79-
raise RuntimeError("sensitive provider detail")
80-
except RuntimeError as provider_error:
81-
try:
82-
raise WorkflowAgentServiceError("Foundry workflow invocation failed") from (
83-
provider_error
84-
)
85-
except WorkflowAgentServiceError as workflow_error:
86-
_raise_workflow_backend_failure(workflow_error)
87-
88-
assert caught.value.status_code == 502
89-
assert caught.value.detail == "Workflow backend request failed"
90-
assert isinstance(caught.value.__cause__, WorkflowAgentServiceError)
91-
assert str(caught.value.__cause__) == "Foundry workflow invocation failed"
92-
assert isinstance(caught.value.__cause__.__cause__, RuntimeError)
93-
assert str(caught.value.__cause__.__cause__) == "sensitive provider detail"

tests/test_service_factory.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,5 +93,4 @@ def test_foundry_service_sanitizes_sdk_failure(envelope: "Any") -> None:
9393
) as caught:
9494
service.run(envelope)
9595

96-
assert isinstance(caught.value.__cause__, RuntimeError)
97-
assert str(caught.value.__cause__) == "sensitive provider detail"
96+
assert caught.value.__cause__ is None

0 commit comments

Comments
 (0)