// FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16: //go:build go1.25 package registry import ( "net" "strings" "github.com/distribution/reference" "github.com/moby/moby/api/types/registry" ) // IndexName is the name of the index const IndexName = "docker.io" func normalizeIndexName(val string) string { if val == "index.docker.io" { return "docker.io" } return val } // NewIndexInfo creates a new [registry.IndexInfo] or the given // repository-name, and detects whether the registry is considered // "secure" (non-localhost). func NewIndexInfo(reposName reference.Named) *registry.IndexInfo { indexName := normalizeIndexName(reference.Domain(reposName)) if indexName == IndexName { return ®istry.IndexInfo{ Name: IndexName, Secure: true, Official: true, } } return ®istry.IndexInfo{ Name: indexName, Secure: !isInsecure(indexName), } } // isInsecure is used to detect whether a registry domain or IP-address is allowed // to use an insecure (non-TLS, or self-signed cert) connection according to the // defaults, which allows for insecure connections with registries running on a // loopback address ("localhost", "::1/128", "127.0.0.0/8"). // // It is used in situations where we don't have access to the daemon's configuration, // for example, when used from the client / CLI. func isInsecure(hostNameOrIP string) bool { // Attempt to strip port if present; this also strips brackets for // IPv6 addresses with a port (e.g. "[::1]:5000"). // // This is best-effort; we'll continue using the address as-is if it fails. if host, _, err := net.SplitHostPort(hostNameOrIP); err == nil { hostNameOrIP = host } if hostNameOrIP == "127.0.0.1" || hostNameOrIP == "::1" || strings.EqualFold(hostNameOrIP, "localhost") { // Fast path; no need to resolve these, assuming nobody overrides // "localhost" for anything else than a loopback address (sorry, not sorry). return true } var addresses []net.IP if ip := net.ParseIP(hostNameOrIP); ip != nil { addresses = append(addresses, ip) } else { // Try to resolve the host's IP-addresses. addrs, _ := net.LookupIP(hostNameOrIP) addresses = append(addresses, addrs...) } for _, addr := range addresses { if addr.IsLoopback() { return true } } return false }