Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 31 additions & 13 deletions oci/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,21 @@ func WithCache(cache *oci.Store) Modifier {
}
}

// WithTransport sets the transport for the remote
func WithTransport(transport *http.Transport) Modifier {
return func(o *OrasRemote) {
o.progTransport = helpers.NewTransport(transport, nil)
client, ok := o.repo.Client.(*auth.Client)
if ok {
client.Client.Transport = o.progTransport
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
client.Client.Transport = o.progTransport
client.Client.Transport = transport

return
}
if o.log != nil {
o.log.Warn("unable to set repo client transport, client is not an auth.Client")
}
}
}

// NewOrasRemote returns an oras remote repository client and context for the given url.
//
// Registry auth is handled by the Docker CLI's credential store and checked before returning the client
Expand All @@ -104,19 +119,30 @@ func NewOrasRemote(url string, platform ocispec.Platform, mods ...Modifier) (*Or
if err != nil {
return nil, fmt.Errorf("failed to parse OCI reference %q: %w", url, err)
}

httpTransport, ok := http.DefaultTransport.(*http.Transport)
if !ok {
return nil, fmt.Errorf("http.DefaultTransport is not an *http.Transport, something mutated global net/http variables")
}

transport := httpTransport.Clone()

storeOpts := credentials.StoreOptions{}
credStore, err := credentials.NewStoreFromDocker(storeOpts)
if err != nil {
return nil, fmt.Errorf("failed to get credentials: %w", err)
}

client := &auth.Client{
Client: retry.DefaultClient,
Header: http.Header{
"User-Agent": {"oras-go"},
},
Cache: auth.DefaultCache,
Cache: auth.NewCache(),
Credential: credentials.Credential(credStore),
}
client.Client.Transport = transport

o := &OrasRemote{
repo: &remote.Repository{Client: client},
progTransport: helpers.NewTransport(transport, nil),
Expand All @@ -128,6 +154,10 @@ func NewOrasRemote(url string, platform ocispec.Platform, mods ...Modifier) (*Or
mod(o)
}

if o.log != nil {
o.log.Debug("gathered credentials from default Docker config file", "credentials_configured", credStore.IsAuthConfigured())
}

if err := o.setRepository(ref); err != nil {
return nil, err
}
Expand Down Expand Up @@ -184,20 +214,8 @@ func (o *OrasRemote) setRepository(ref registry.Reference) error {
ref.Registry = "ghcr.io"
ref.Repository = "defenseunicorns/packages/" + ref.Repository
}
storeOpts := credentials.StoreOptions{}
credStore, err := credentials.NewStoreFromDocker(storeOpts)
if err != nil {
return fmt.Errorf("failed to get credentials: %w", err)
}
client := &auth.Client{
Client: retry.DefaultClient,
Cache: auth.NewCache(),
Credential: credentials.Credential(credStore),
}
o.log.Debug("gathering credentials from default Docker config file", "credentials_configured", credStore.IsAuthConfigured())

o.repo.Reference = ref
o.repo.Client = client

return nil
}
Loading