github.com/antevens/oras@v0.8.1/pkg/auth/docker/resolver.go (about) 1 package docker 2 3 import ( 4 "context" 5 "net/http" 6 7 "github.com/containerd/containerd/remotes" 8 "github.com/containerd/containerd/remotes/docker" 9 ctypes "github.com/docker/cli/cli/config/types" 10 "github.com/docker/docker/registry" 11 ) 12 13 // Resolver returns a new authenticated resolver. 14 func (c *Client) Resolver(_ context.Context, client *http.Client, plainHTTP bool) (remotes.Resolver, error) { 15 return docker.NewResolver(docker.ResolverOptions{ 16 Credentials: c.Credential, 17 Client: client, 18 PlainHTTP: plainHTTP, 19 }), nil 20 } 21 22 // Credential returns the login credential of the request host. 23 func (c *Client) Credential(hostname string) (string, string, error) { 24 hostname = resolveHostname(hostname) 25 var ( 26 auth ctypes.AuthConfig 27 err error 28 ) 29 for _, cfg := range c.configs { 30 auth, err = cfg.GetAuthConfig(hostname) 31 if err != nil { 32 // fall back to next config 33 continue 34 } 35 if auth.IdentityToken != "" { 36 return "", auth.IdentityToken, nil 37 } 38 if auth.Username == "" && auth.Password == "" { 39 // fall back to next config 40 continue 41 } 42 return auth.Username, auth.Password, nil 43 } 44 return "", "", err 45 } 46 47 // resolveHostname resolves Docker specific hostnames 48 func resolveHostname(hostname string) string { 49 switch hostname { 50 case registry.IndexHostname, registry.IndexName, registry.DefaultV2Registry.Host: 51 return registry.IndexServer 52 } 53 return hostname 54 }