...
1
15
16 package docker
17
18 import (
19 "context"
20 "net/http"
21
22 "github.com/containerd/containerd/remotes"
23 "github.com/containerd/containerd/remotes/docker"
24 ctypes "github.com/docker/cli/cli/config/types"
25 "github.com/docker/docker/registry"
26
27 iface "oras.land/oras-go/pkg/auth"
28 )
29
30
31
32 func (c *Client) Resolver(_ context.Context, client *http.Client, plainHTTP bool) (remotes.Resolver, error) {
33 return docker.NewResolver(docker.ResolverOptions{
34 Credentials: c.Credential,
35 Client: client,
36 PlainHTTP: plainHTTP,
37 }), nil
38 }
39
40
41 func (c *Client) ResolverWithOpts(options ...iface.ResolverOption) (remotes.Resolver, error) {
42 settings := &iface.ResolverSettings{}
43 for _, option := range options {
44 option(settings)
45 }
46 return docker.NewResolver(docker.ResolverOptions{
47 Credentials: c.Credential,
48 Client: settings.Client,
49 PlainHTTP: settings.PlainHTTP,
50 Headers: settings.Headers,
51 }), nil
52 }
53
54
55 func (c *Client) Credential(hostname string) (string, string, error) {
56 hostname = resolveHostname(hostname)
57 var (
58 auth ctypes.AuthConfig
59 err error
60 )
61 for _, cfg := range c.configs {
62 auth, err = cfg.GetAuthConfig(hostname)
63 if err != nil {
64
65 continue
66 }
67 if auth.IdentityToken != "" {
68 return "", auth.IdentityToken, nil
69 }
70 if auth.Username == "" && auth.Password == "" {
71
72 continue
73 }
74 return auth.Username, auth.Password, nil
75 }
76 return "", "", err
77 }
78
79
80 func resolveHostname(hostname string) string {
81 switch hostname {
82 case registry.IndexHostname, registry.IndexName, registry.DefaultV2Registry.Host:
83 return registry.IndexServer
84 }
85 return hostname
86 }
87
View as plain text