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  }