refactor(security): extract _block_message helper to unify block logic in _parse_response
Both the `action=block` and `decision=block` branches in _parse_response shared identical field-priority and type-validation logic. Extract it into a single _block_message(primary, secondary) helper so the two branches are one line each and the type guard lives in exactly one place. No functional change: existing tests (TestParseResponse, 14 tests) all pass unchanged, confirming identical behaviour.
This commit is contained in:
@@ -482,6 +482,17 @@ def _serialize_payload(event: str, kwargs: Dict[str, Any]) -> str:
|
|||||||
return json.dumps(payload, ensure_ascii=False, default=str)
|
return json.dumps(payload, ensure_ascii=False, default=str)
|
||||||
|
|
||||||
|
|
||||||
|
def _block_message(primary: Any, secondary: Any) -> str:
|
||||||
|
"""Return a validated string block message, falling back to the default.
|
||||||
|
|
||||||
|
Accepts two candidate fields (primary wins over secondary) so callers
|
||||||
|
can express field-priority differences between the two hook wire formats
|
||||||
|
without duplicating the type-check logic.
|
||||||
|
"""
|
||||||
|
raw = primary or secondary
|
||||||
|
return raw if isinstance(raw, str) and raw else _DEFAULT_BLOCK_MESSAGE
|
||||||
|
|
||||||
|
|
||||||
def _parse_response(event: str, stdout: str) -> Optional[Dict[str, Any]]:
|
def _parse_response(event: str, stdout: str) -> Optional[Dict[str, Any]]:
|
||||||
"""Translate stdout JSON into a Hermes wire-shape dict.
|
"""Translate stdout JSON into a Hermes wire-shape dict.
|
||||||
|
|
||||||
@@ -516,13 +527,9 @@ def _parse_response(event: str, stdout: str) -> Optional[Dict[str, Any]]:
|
|||||||
|
|
||||||
if event == "pre_tool_call":
|
if event == "pre_tool_call":
|
||||||
if data.get("action") == "block":
|
if data.get("action") == "block":
|
||||||
raw = data.get("message") or data.get("reason")
|
return {"action": "block", "message": _block_message(data.get("message"), data.get("reason"))}
|
||||||
message = raw if isinstance(raw, str) and raw else _DEFAULT_BLOCK_MESSAGE
|
|
||||||
return {"action": "block", "message": message}
|
|
||||||
if data.get("decision") == "block":
|
if data.get("decision") == "block":
|
||||||
raw = data.get("reason") or data.get("message")
|
return {"action": "block", "message": _block_message(data.get("reason"), data.get("message"))}
|
||||||
message = raw if isinstance(raw, str) and raw else _DEFAULT_BLOCK_MESSAGE
|
|
||||||
return {"action": "block", "message": message}
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
context = data.get("context")
|
context = data.get("context")
|
||||||
|
|||||||
Reference in New Issue
Block a user