Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,11 @@ serve = [
"msgpack>=1.0",
"opencv-python-headless>=4.8", # JPEG-on-wire serialization for ZMQ transport
]
safety = ["yourdfpy"]
safety = [
"yourdfpy",
# CVE-2026-41066: older iterparse defaults can resolve local-file entities.
"lxml>=6.1.0",
]
# Offline EU evidence-pack generator. No runtime deps today; kept as an extra
# so pilots can install with `pip install fastcrest-tether[serve,comply]`.
comply = []
Expand Down
21 changes: 21 additions & 0 deletions tests/test_pyproject_metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
from pathlib import Path

import pytest
from packaging.requirements import Requirement
from packaging.version import Version


REPO_ROOT = Path(__file__).parent.parent
Expand All @@ -29,6 +31,25 @@ def test_serve_extra_installs_cpu_onnxruntime():
)


def test_safety_extra_requires_xxe_safe_lxml():
"""Keep the URDF parser above the CVE-2026-41066 security floor."""
pyproject = _toml_loads((REPO_ROOT / "pyproject.toml").read_text())
safety_deps = pyproject["project"]["optional-dependencies"]["safety"]
requirements = {Requirement(dep).name: Requirement(dep) for dep in safety_deps}

assert "lxml" in requirements
assert str(requirements["lxml"].specifier) == ">=6.1.0"


def test_lockfile_selects_xxe_safe_lxml():
"""Frozen safety installs must not restore a vulnerable lxml release."""
lock = _toml_loads((REPO_ROOT / "uv.lock").read_text())
lxml_packages = [package for package in lock["package"] if package["name"] == "lxml"]

assert len(lxml_packages) == 1
assert Version(lxml_packages[0]["version"]) >= Version("6.1.0")


def test_package_install_smoke_uploads_deploy_proof_packet():
workflow = (REPO_ROOT / ".github/workflows/package-install-smoke.yml").read_text()

Expand Down
Loading
Loading