Fetch an IPv6 source host written without a port (closes #295)
check / check (push) Canceled after 0s
check / check (push) Canceled after 0s
The fetcher's check of a source URL cut a port off the host with net.SplitHostPort, which fails when an IPv6 address in brackets has no port, so the brackets stayed on, the name lookup failed and the request answered 500. The check now parses the URL and takes the host from Hostname(), which drops the brackets with or without a port, so the address is looked up and a private one is refused with 403. Model: opus-5-5
This commit is contained in:
@@ -30,6 +30,12 @@ P2: security: per-origin rate limiting
|
||||
|
||||
# Completed Steps
|
||||
|
||||
- 2026-10-16 a source host that is an IPv6 address in brackets with no port,
|
||||
such as `[2001:db8::a]`, is fetched like one with a port, through `/v1/image/`
|
||||
and through an encrypted URL (closes #295). The fetcher's check of the source
|
||||
URL kept the brackets when no port followed them, could not look the host up,
|
||||
and the request answered 500. It now checks the address without brackets, so a
|
||||
private one is refused with 403, as with a port.
|
||||
- 2026-10-16 a size with one side `0` keeps the side computed from the source's
|
||||
proportions at 1 or more (closes #283): it was rounded down, so for a thin
|
||||
source it came out at 0, and libvips then made the size square. An 8192x1
|
||||
|
||||
@@ -473,16 +473,16 @@ func validateURL(ctx context.Context, rawURL string, allowHTTP bool) error {
|
||||
return ErrUnsupportedScheme
|
||||
}
|
||||
|
||||
// Parse to extract host
|
||||
host := extractHost(rawURL)
|
||||
if host == "" {
|
||||
return ErrInvalidHost
|
||||
parsedURL, err := neturl.Parse(rawURL)
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w: %w", ErrInvalidHost, err)
|
||||
}
|
||||
|
||||
// Remove port if present
|
||||
h, _, err := net.SplitHostPort(host)
|
||||
if err == nil {
|
||||
host = h
|
||||
// Hostname drops any port, and the brackets of an IPv6 address whether
|
||||
// or not a port follows them
|
||||
host := parsedURL.Hostname()
|
||||
if host == "" {
|
||||
return ErrInvalidHost
|
||||
}
|
||||
|
||||
// Block obvious localhost patterns
|
||||
|
||||
Reference in New Issue
Block a user