VEX product purl detected from pyproject.toml keeps the raw project name (pkg:pypi/My_Service) instead of the normalized pypi name
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 80/100
Línea de trabajo
El error está en parse_pyproject en crates/socket-patch-core/src/vex/product.rs (alrededor de las líneas 157-167), que construye el purl de pypi a partir del nombre de proyecto sin procesar. Compáralo con las ramas de npm y composer del mismo archivo, que ya pasan los nombres a minúsculas, y revisa los helpers de PEP 503 que menciona el issue. Está listo cuando My_Service produce pkg:pypi/[email protected] y Demo_Pkg.Core produce pkg:pypi/[email protected], con un test unitario que cubra ambos casos.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
[agent] Found by the scheduled Poetry bug-hunt routine (ledger #311).
Summary
When vex (or scan --vex / apply --vex) auto-detects the top-level product from pyproject.toml, it copies the project name verbatim into the purl. A Poetry project named My_Service gets the product pkg:pypi/[email protected], and Demo_Pkg.Core gets pkg:pypi/[email protected]. The purl spec's pypi type says the name must be lowercased with _ replaced by - (PyPI compares names in PEP 503 form, which also maps . to -). So the expected products are pkg:pypi/[email protected] and pkg:pypi/[email protected] (demo-pkg-core in full PEP 503 form).
The npm and composer branches of the same detector already lowercase their names (product.rs, e.g. parse_composer_json), and the rest of the codebase compares PyPI names in PEP 503 form (crawlers/fuzzy_match.rs, crawlers/hatch_env.rs). Only the pyproject branch skips it.
Impact
An OpenVEX consumer matches products[].@id against the product identifier in the SBOM or scan it is applied to. SBOM generators emit the normalized pypi purl, so a VEX document saying pkg:pypi/My_Service@… won't match the project by exact purl, and its not_affected statements are silently ignored. That affects every Python project whose name has uppercase letters or _, which is common: Poetry, PDM and hatch all accept and preserve such names. It isn't Poetry-specific; any pyproject-based product goes through parse_pyproject. --vex-product / --product work around it.
Repro (Linux, main fc1b4f9)
Uses a local mock of the patch API serving one patched six-1.16.0 wheel. The same result comes from any pypi patch.
# Poetry 2.5.1, PEP 621 layout, agent mode + standalone vex
mkdir proj && cd proj
printf '[project]\nname = "My_Service"\nversion = "1.2.0"\nrequires-python = ">=3.9"\ndependencies = ["six==1.16.0"]\n\n[tool.poetry]\npackage-mode = false\n' > pyproject.toml
POETRY_VIRTUALENVS_IN_PROJECT=true poetry lock && poetry install
socket-patch scan --mode agent --json --yes --api-url $MOCK --api-token x --org test-org
socket-patch vex -O v.json --json --api-url $MOCK --api-token x --org test-org
jq -r '.statements[].products[]."@id"' v.json
# → pkg:pypi/[email protected] (expected pkg:pypi/[email protected])
# Poetry 1.8.5, legacy [tool.poetry] layout, hosted + same-run VEX
# [tool.poetry] name = "My_Service", version = "0.1.0", six = "1.16.0"
socket-patch scan --mode hosted --vex out.vex.json --json --yes …
# → pkg:pypi/[email protected]
# Poetry 2.5.1, [tool.poetry] name = "Demo_Pkg.Core"
# → pkg:pypi/[email protected]
For reference, packaging.utils.canonicalize_name("My_Service") is my-service.
Expected vs actual
- Expected: CLI_CONTRACT.md /
product.rs's module doc saypyproject.tomlmaps topkg:pypi/<name>@<version>, and a pypi purl's name is the normalized one (purl spec, pypi type: lowercase,_→-), as the component purls in the same document already are (pkg:pypi/[email protected]). - Actual: the name is emitted byte for byte as written in
[project].name/[tool.poetry].name.
OS × version
| OS | Poetry | Layout | Path | Result |
|---|---|---|---|---|
| Linux | 1.8.5 | [tool.poetry] |
scan --mode hosted --vex |
reproduces |
| Linux | 2.5.1 | [project] |
agent scan + vex |
reproduces |
| Linux | 2.5.1 | [tool.poetry] |
scan --mode hosted --vex |
reproduces |
| macOS / Windows | any | any | — | not run (the code path is OS-independent string handling) |
Suspect code
crates/socket-patch-core/src/vex/product.rs:157-167 (parse_pyproject builds format!("pkg:pypi/{name}@{version}") from pyproject_name_version without normalizing). The PEP 503 helper consolidated under #883 could be reused here.
- Lenguaje dominante
- Rust
- Estrellas
- 8
- Forks
- 1
- Merge medio
- 16 h 35 min
- PR fusionados (30 d)
- 574
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de SocketDev/socket-patch
-
agent:triaged bug bughunt pm:bundler priority:p1
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
SocketDev/socket-patch#1573 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
agent:triaged bug bughunt pm:npm priority:p3 ux
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
SocketDev/socket-patch#1072 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
agent:triaged bug bughunt pm:yarn-berry priority:p1
Dificultad 2/5 1-3 horas Aptitud para principiantes 73/100
SocketDev/socket-patch#783 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Vendored cargo warns cargo_multi_version_old_cargo ("declares no rust-version") when the root package inherits rust-version from [workspace.package]Posiblemente ocupada @mikolalysenko la tomó hace 3 días. Abiertoagent:triaged bug bughunt pm:cargo priority:p2
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
SocketDev/socket-patch#651 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
bug bughunt pm:npm
Dificultad 3/5 Medio día Aptitud para principiantes 62/100
SocketDev/socket-patch#1576 ·
Los mantenedores suelen responder en 1 día
Todos los issues de SocketDev/socket-patch
Issues similares
-
priority: low
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
storytold/photocraft#6286 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Four problem loader browser tests fail on WindowsPosiblemente ocupada @Patriciaath999 la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
original-bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
Los mantenedores suelen responder en 1 día
-
effort/S kind/docs
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
Claude Code guards in .claude/settings.json never block: they read unset variables and exit 1Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
starkware-libs/sequencer#15229 ·
Los mantenedores suelen responder en 1 día