ci: Fix formatting check in Python CI (#20860)

This commit is contained in:
Iván Ovejero
2025-10-16 13:13:18 +02:00
committed by GitHub
parent 5c74a0bb6c
commit 8b74461bc8
4 changed files with 30 additions and 18 deletions
+1 -1
View File
@@ -35,7 +35,7 @@ jobs:
run: just sync-all
- name: Format check
run: just format check
run: just format-check
- name: Typecheck
run: just typecheck
@@ -20,7 +20,8 @@ class HealthCheckServer:
self.server = await asyncio.start_server(
self._handle_request, config.host, config.port
)
actual_port = self.server.sockets[0].getsockname()[1] # for OS-assigned port in tests
# for OS-assigned port in tests
actual_port = self.server.sockets[0].getsockname()[1]
self.logger.info(
f"Health check server listening on {config.host}, port {actual_port}"
)
@@ -87,22 +87,32 @@ class SecurityValidator(ast.NodeVisitor):
self.generic_visit(node)
def visit_Subscript(self, node: ast.Subscript) -> None:
"""Detect dict access to blocked attributes, e.g. __builtins__['__spec__']"""
"""Detect dict access to blocked attributes, e.g. __builtins__['__spec__']"""
is_builtins_access = (
# __builtins__['__spec__']
(isinstance(node.value, ast.Name) and node.value.id in {"__builtins__", "builtins"})
(
isinstance(node.value, ast.Name)
and node.value.id in {"__builtins__", "builtins"}
)
# obj.__builtins__['__spec__']
or (isinstance(node.value, ast.Attribute) and node.value.attr in {"__builtins__", "builtins"})
or (
isinstance(node.value, ast.Attribute)
and node.value.attr in {"__builtins__", "builtins"}
)
)
if is_builtins_access and isinstance(node.slice, ast.Constant) and isinstance(node.slice.value, str):
if (
is_builtins_access
and isinstance(node.slice, ast.Constant)
and isinstance(node.slice.value, str)
):
key = node.slice.value
if key in BLOCKED_ATTRIBUTES:
self._add_violation(
node.lineno, ERROR_DANGEROUS_ATTRIBUTE.format(attr=key)
)
self.generic_visit(node)
# ========== Validation ==========
@@ -114,7 +114,7 @@ async def test_per_item_with_explicit_json_and_binary(broker, manager):
{
"json": {"custom": "data"},
"binary": {"file": "data"},
"pairedItem": {"item": 0}
"pairedItem": {"item": 0},
}
]
@@ -130,11 +130,7 @@ async def test_per_item_with_binary_only(broker, manager):
result = await wait_for_task_done(broker, task_id)
assert result["data"]["result"] == [
{
"json": {},
"binary": {"file": "data"},
"pairedItem": {"item": 0}
}
{"json": {}, "binary": {"file": "data"}, "pairedItem": {"item": 0}}
]
@@ -305,7 +301,9 @@ async def test_cannot_bypass_import_restrictions_via_builtins_dict(broker, manag
@pytest.mark.asyncio
async def test_cannot_bypass_import_restrictions_via_builtins_spec_loader(broker, manager):
async def test_cannot_bypass_import_restrictions_via_builtins_spec_loader(
broker, manager
):
task_id = nanoid()
code = textwrap.dedent("""
sys = __builtins__['__spec__'].loader.load_module('sys')
@@ -320,8 +318,11 @@ async def test_cannot_bypass_import_restrictions_via_builtins_spec_loader(broker
assert error_msg["taskId"] == task_id
assert "error" in error_msg
@pytest.mark.asyncio
async def test_cannot_bypass_import_restrictions_via_sys_builtins_spec_leader(broker, manager_with_stdlib_wildcard):
async def test_cannot_bypass_import_restrictions_via_sys_builtins_spec_leader(
broker, manager_with_stdlib_wildcard
):
task_id = nanoid()
code = textwrap.dedent("""
import sys
@@ -331,6 +332,6 @@ async def test_cannot_bypass_import_restrictions_via_sys_builtins_spec_leader(br
task_settings = create_task_settings(code=code, node_mode="all_items")
await broker.send_task(task_id=task_id, task_settings=task_settings)
error_msg = await wait_for_task_error(broker, task_id)
assert error_msg["taskId"] == task_id
assert "error" in error_msg