GeezerVison is showing github.com — Match denylist entries the way each ecosystem spells names by simonchrz · Pull Request #555 · git-pkgs/proxy
Conversation
simonchrz
commented
Oct 22, 2026
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
Denylist entries were compared as plain PURL strings, while handlers build PURLs from download URLs that spell packages differently. Some denied versions were still served:
- PyPI:
. vs -/_ (wheel filenames always use _)
- NuGet: entries with capitals never matched the lowercased ids
- RubyGems: platform gems such as
nokogiri-1.16.0-x86_64-linux.gem
- conda: the handler's
channel/name never matched a plain entry, and qualifiers were rejected
Entries and checked PURLs now go through one comparison form in internal/denylist. Handlers, cache keys and DB rows are unchanged. A conda entry matches every channel unless it has a channel qualifier. The docs list how each ecosystem is matched and drop the claim that PyPI separators were already handled.
A second commit covers more spellings: Composer's leading v, OCI repositories written as a path (manifests are now checked by tag and digest too), Swift registry packages in either form and when streaming, Go versions with escaped uppercase letters, and gems with a dash followed by a digit in their name. Gems like devise-2fa were parsed with the wrong name and version, so their cached copies are fetched again once.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Denylist entries were compared as plain PURL strings, but handlers build
PURLs from download URLs that spell packages differently, so some denied
versions were still served. Entries and checked PURLs now go through one
per-ecosystem comparison form: PyPI names follow PEP 503 (case and runs of
-, _ and . are equivalent), NuGet ids and versions ignore case, a gem
version also matches its platform builds, and a conda entry matches the
package in every channel unless it carries a channel qualifier. Cache keys
are unchanged.
Denylist entries now also match Composer versions with Packagist's
leading v, OCI repositories written as a path, Swift registry packages
in either form (also when streaming), Go versions with escaped uppercase
letters, and gems whose names contain a dash followed by a digit. OCI
manifests are checked by tag and digest, and denied blobs and Swift
archives answer 403 instead of 500 or 502.
Uh oh!
There was an error while loading. Please reload this page.
Reviewers
andrew
andrew approved these changes
Uh oh!
There was an error while loading. Please reload this page.
Assignees
No one assigned
Labels
breaking
Changes behaviour users rely on; needs a minor release
Milestone
No milestone
Development
Successfully merging this pull request may close these issues.
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.