internal/secretsengine: unexport what only tests use

Provider, HubClient, and New were only used inside the package and by FakeCli. FakeCli now returns its configuration file as the auth provider, which is what the signed-out Docker Hub stub fell back to. NewDesktop returns an AuthProvider. Remove DockerCli.RegistryAuthProvider: EncodedRegistryAuth already falls back to RetrieveAuthTokenFromImage, which uses the Docker Desktop session, so the method only added to the public API.

Signed-off-by: Alano Terblanche <18033717+Benehiko@users.noreply.github.com>
This commit is contained in:
Alano Terblanche
2026-10-23 08:29:09 +02:00
parent ec9ac08675
commit 59e40e6347
4 changed files with 23 additions and 39 deletions
-4
View File
@@ -218,10 +218,6 @@ func EncodedRegistryAuth(dockerCLI Cli, image string) (string, error) {
return RetrieveAuthTokenFromImage(dockerCLI.ConfigFile(), image)
}
func (cli *DockerCli) RegistryAuthProvider() secretsengine.AuthProvider {
return secretsengine.NewDesktop(cli.ConfigFile())
}
func retrieveAuthTokenFromImage(auth secretsengine.AuthProvider, image string) (string, error) {
registryRef, err := reference.ParseNormalizedNamed(image)
if err != nil {
+14 -14
View File
@@ -32,25 +32,25 @@ var (
errSessionExpired = errors.New("the session has expired (not signed in to Docker Desktop?)")
)
type HubClient interface {
type hubClient interface {
GetDefaultSession(ctx context.Context) (dockerhub.UserSession, error)
GetDefaultProfile(ctx context.Context) (dockerhub.Profile, error)
}
var _ HubClient = dockerhub.ClientAuth(nil)
var _ hubClient = dockerhub.ClientAuth(nil)
type AuthProvider interface {
GetAuthConfig(registryHostname string) (types.AuthConfig, error)
}
type Provider struct {
type provider struct {
fallback AuthProvider
hub *session
staging *session
}
func New(fallback AuthProvider, hub, staging HubClient) *Provider {
return &Provider{
func newProvider(fallback AuthProvider, hub, staging hubClient) *provider {
return &provider{
fallback: fallback,
hub: newSession("Docker Hub", hub),
staging: newSession("Docker Hub staging", staging),
@@ -62,15 +62,15 @@ var (
desktopStagingSession = newDesktopSession("Docker Hub staging", dockerhub.Staging())
)
func NewDesktop(fallback AuthProvider) *Provider {
return &Provider{
func NewDesktop(fallback AuthProvider) AuthProvider {
return &provider{
fallback: fallback,
hub: desktopHubSession,
staging: desktopStagingSession,
}
}
func (p *Provider) GetAuthConfig(registryHostname string) (types.AuthConfig, error) {
func (p *provider) GetAuthConfig(registryHostname string) (types.AuthConfig, error) {
if s, serverAddress := p.sessionFor(registryHostname); s != nil {
if auth, ok := s.auth(); ok {
auth.ServerAddress = serverAddress
@@ -80,7 +80,7 @@ func (p *Provider) GetAuthConfig(registryHostname string) (types.AuthConfig, err
return p.fallback.GetAuthConfig(registryHostname)
}
func (p *Provider) sessionFor(registryHostname string) (*session, string) {
func (p *provider) sessionFor(registryHostname string) (*session, string) {
switch credentials.ConvertToHostname(registryHostname) {
case registry.IndexName, registry.IndexHostname, registry.DefaultRegistryHost:
return p.hub, registry.IndexServer
@@ -95,18 +95,18 @@ func (p *Provider) sessionFor(registryHostname string) (*session, string) {
type session struct {
name string
connect func() (HubClient, error)
connect func() (hubClient, error)
timeout time.Duration
now func() time.Time
mu sync.Mutex
hub HubClient
hub hubClient
retryAt time.Time
cached *types.AuthConfig
validUntil time.Time
}
func newSession(name string, hub HubClient) *session {
func newSession(name string, hub hubClient) *session {
return &session{
name: name,
hub: hub,
@@ -117,13 +117,13 @@ func newSession(name string, hub HubClient) *session {
func newDesktopSession(name string, opts ...dockerhub.Option) *session {
s := newSession(name, nil)
s.connect = func() (HubClient, error) {
s.connect = func() (hubClient, error) {
return connect(api.DesktopSocketPath(), opts...)
}
return s
}
func connect(socketPath string, opts ...dockerhub.Option) (HubClient, error) {
func connect(socketPath string, opts ...dockerhub.Option) (hubClient, error) {
if _, err := os.Lstat(socketPath); errors.Is(err, fs.ErrNotExist) {
return nil, err
}
+8 -8
View File
@@ -90,20 +90,20 @@ func stagingCredentials() types.AuthConfig {
}
type testProvider struct {
*Provider
*provider
fallback *recordingFallback
clock *fakeClock
staging *fakeHub
}
func newTestProvider(hub HubClient) *testProvider {
func newTestProvider(hub hubClient) *testProvider {
tp := &testProvider{
fallback: &recordingFallback{},
clock: &fakeClock{t: testNow},
staging: &fakeHub{sessionErr: dockerhub.ErrNoDefaultProfile},
}
tp.Provider = New(tp.fallback, hub, tp.staging)
for _, s := range []*session{tp.Provider.hub, tp.Provider.staging} {
tp.provider = newProvider(tp.fallback, hub, tp.staging)
for _, s := range []*session{tp.provider.hub, tp.provider.staging} {
s.timeout = time.Second
s.now = tp.clock.now
}
@@ -125,8 +125,8 @@ func connectError(reason seclient.ConnectReason) error {
}
func TestNewDesktopSharesOneSessionPerEnvironment(t *testing.T) {
a := NewDesktop(&recordingFallback{})
b := NewDesktop(&recordingFallback{})
a := NewDesktop(&recordingFallback{}).(*provider)
b := NewDesktop(&recordingFallback{}).(*provider)
assert.Assert(t, a.hub == b.hub, "providers must share the process-wide Docker Hub session")
assert.Assert(t, a.staging == b.staging, "providers must share the process-wide Docker Hub staging session")
assert.Assert(t, a.hub != a.staging, "production and staging sessions must be separate")
@@ -278,11 +278,11 @@ func TestFallsBackWithoutUsableSession(t *testing.T) {
func TestDesktopFallsBackWhenClientCannotBeCreated(t *testing.T) {
var connects atomic.Int32
s := newSession("Docker Hub", nil)
s.connect = func() (HubClient, error) {
s.connect = func() (hubClient, error) {
connects.Add(1)
return nil, errors.New("no socket path")
}
p := &Provider{fallback: &recordingFallback{}, hub: s}
p := &provider{fallback: &recordingFallback{}, hub: s}
for range 2 {
got, err := p.GetAuthConfig("docker.io")
+1 -13
View File
@@ -2,7 +2,6 @@ package test
import (
"bytes"
"context"
"io"
"strings"
@@ -14,7 +13,6 @@ import (
"github.com/docker/cli/cli/streams"
"github.com/docker/cli/internal/registryclient"
"github.com/docker/cli/internal/secretsengine"
"github.com/docker/secrets-engine/client/dockerhub"
"github.com/moby/moby/client"
)
@@ -179,18 +177,8 @@ func (c *FakeCli) SetRegistryClient(registryClient registryclient.RegistryClient
c.registryClient = registryClient
}
type signedOutHub struct{}
func (signedOutHub) GetDefaultSession(context.Context) (dockerhub.UserSession, error) {
return dockerhub.UserSession{}, dockerhub.ErrNoSession
}
func (signedOutHub) GetDefaultProfile(context.Context) (dockerhub.Profile, error) {
return dockerhub.Profile{}, dockerhub.ErrNoSession
}
func (c *FakeCli) RegistryAuthProvider() secretsengine.AuthProvider {
return secretsengine.New(c.configfile, signedOutHub{}, signedOutHub{})
return c.configfile
}
// BuildKitEnabled on the fake cli