test_wp09_critical_remediation.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from __future__ import annotations
  2. import uuid
  3. import pytest
  4. from app.core.llm.runtime_server import (
  5. RuntimeServerContext,
  6. RuntimeServerError,
  7. ServerGovernedInvocationService,
  8. )
  9. class _Repository:
  10. def __init__(self):
  11. self.calls = []
  12. def grant_context(self, *, agent_uid, grant_uid, actor_uid):
  13. if agent_uid != "agent-1" or grant_uid != "grant-1" or actor_uid != "owner-1":
  14. raise RuntimeServerError("server_scope_denied")
  15. return {
  16. "tenant_id": "tenant-1", "principal_id": "owner-1",
  17. "business_domain_uid": str(uuid.UUID(int=1)), "environment": "test",
  18. "provider": "controlled-provider", "model": "controlled-model-v1",
  19. "prompt_version": "prompt-v1", "generation": "generation-1",
  20. "interface_type": "mcp", "tool_name": "knowledge.search", "action": "read",
  21. "risk_level": "low",
  22. }
  23. def authorize_claim(self, request):
  24. self.calls.append(request)
  25. return {"decision": "authorized", "invocation_id": "invocation-1"}
  26. def test_server_context_is_the_only_scope_source_and_payload_scope_is_rejected():
  27. repository = _Repository()
  28. service = ServerGovernedInvocationService(repository)
  29. context = RuntimeServerContext(agent_uid="agent-1", actor_uid="owner-1", roles=frozenset({"operator"}))
  30. result = service.authorize(context, {
  31. "grant_uid": "grant-1", "idempotency_key": "request-1", "input_text": "查询定义",
  32. "evidence_refs": [], "estimated_tokens": 1, "estimated_cost_micros": "1.00",
  33. "requested_time_ms": 1,
  34. })
  35. assert result["decision"] == "authorized"
  36. assert repository.calls[0]["tenant_id"] == "tenant-1"
  37. for field in ("tenant_id", "principal_id", "business_domain_uid", "environment", "provider", "model", "generation"):
  38. with pytest.raises(RuntimeServerError, match="payload_scope_forbidden"):
  39. service.authorize(context, {
  40. "grant_uid": "grant-1", "idempotency_key": f"request-{field}", "input_text": "查询定义",
  41. "evidence_refs": [], "estimated_tokens": 1, "estimated_cost_micros": "1.00",
  42. "requested_time_ms": 1, field: "forged",
  43. })
  44. def test_server_path_rejects_bool_zero_negative_nan_and_ambiguous_budget_units():
  45. service = ServerGovernedInvocationService(_Repository())
  46. context = RuntimeServerContext(agent_uid="agent-1", actor_uid="owner-1", roles=frozenset({"operator"}))
  47. base = {"grant_uid": "grant-1", "idempotency_key": "request-1", "input_text": "查询定义", "evidence_refs": [], "estimated_tokens": 1, "estimated_cost_micros": "1.00", "requested_time_ms": 1}
  48. for field, value in (("estimated_tokens", True), ("estimated_tokens", 0), ("estimated_tokens", -1), ("estimated_cost_micros", "NaN"), ("estimated_cost_micros", "Infinity"), ("requested_time_ms", 0)):
  49. with pytest.raises(RuntimeServerError, match="budget_value_invalid"):
  50. service.authorize(context, {**base, field: value})
  51. def test_server_path_requires_approval_for_high_risk_and_forwards_only_the_bound_task_uid():
  52. class _HighRiskRepository(_Repository):
  53. def grant_context(self, **kwargs):
  54. result = super().grant_context(**kwargs)
  55. result["action"] = "execute"
  56. result["risk_level"] = "high"
  57. return result
  58. service = ServerGovernedInvocationService(_HighRiskRepository())
  59. context = RuntimeServerContext(agent_uid="agent-1", actor_uid="owner-1", roles=frozenset({"operator"}))
  60. payload = {
  61. "grant_uid": "grant-1", "idempotency_key": "request-1", "input_text": "查询定义",
  62. "evidence_refs": [], "estimated_tokens": 1, "estimated_cost_micros": "1",
  63. "requested_time_ms": 1,
  64. }
  65. with pytest.raises(RuntimeServerError, match="human_approval_required"):
  66. service.authorize(context, {
  67. **payload,
  68. })
  69. result = service.authorize(context, {
  70. **payload, "approval_task_uid": "00000000-0000-0000-0000-000000000001",
  71. })
  72. assert result["decision"] == "authorized"
  73. assert service.repository.calls[-1]["approval_task_uid"].endswith("0001")