Check permissions for a tool call.
This implements the same security logic as the CLI permission tool,
checking for dangerous patterns and restricted tools.
Source code in ccproxy/api/routes/mcp.py
| async def check_permission(
request: PermissionCheckRequest,
settings: SettingsDep,
) -> (
PermissionToolAllowResponse
| PermissionToolDenyResponse
| PermissionToolPendingResponse
):
"""Check permissions for a tool call.
This implements the same security logic as the CLI permission tool,
checking for dangerous patterns and restricted tools.
"""
logger.info(
"permission_check",
tool_name=request.tool_name,
retry=request.permission_id is not None,
)
permission_service = get_permission_service()
if request.permission_id:
status = await permission_service.get_status(request.permission_id)
if status == PermissionStatus.ALLOWED:
return PermissionToolAllowResponse(updated_input=request.input)
elif status == PermissionStatus.DENIED:
return PermissionToolDenyResponse(message="User denied the operation")
elif status == PermissionStatus.EXPIRED:
return PermissionToolDenyResponse(message="Permission request expired")
logger.info(
"permission_requires_authorization",
tool_name=request.tool_name,
)
permission_id = await permission_service.request_permission(
tool_name=request.tool_name,
input=request.input,
)
# Wait for permission to be resolved
try:
final_status = await permission_service.wait_for_permission(
permission_id,
timeout_seconds=settings.security.confirmation_timeout_seconds,
)
if final_status == PermissionStatus.ALLOWED:
logger.info(
"permission_allowed_after_authorization",
tool_name=request.tool_name,
permission_id=permission_id,
)
return PermissionToolAllowResponse(updated_input=request.input)
else:
logger.info(
"permission_denied_after_authorization",
tool_name=request.tool_name,
permission_id=permission_id,
status=final_status.value,
)
return PermissionToolDenyResponse(
message=f"User denied the operation (status: {final_status.value})"
)
except TimeoutError:
logger.warning(
"permission_authorization_timeout",
tool_name=request.tool_name,
permission_id=permission_id,
timeout_seconds=settings.security.confirmation_timeout_seconds,
)
return PermissionToolDenyResponse(message="Permission request timed out")
|