Skip to content

Commit 32a29c2

Browse files
committed
Migrate Docker registry handler to AWS SDK v2
Replace aws-sdk-go with aws-sdk-go-v2 for ECR authentication. Changes: - Use config.LoadDefaultConfig() instead of session.NewSession() - Use credentials.NewStaticCredentialsProvider() for static creds - Add context.Context to GetAuthorizationToken calls - Define ECRClient interface (v2 removed ecriface) - Use aws.ToString() helper for pointer dereferencing - Update AuthorizationData from pointer slice to value slice
1 parent 72f780a commit 32a29c2

537 files changed

Lines changed: 103969 additions & 100686 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

go.mod

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ module github.com/dependabot/proxy
33
go 1.25.0
44

55
require (
6-
github.com/aws/aws-sdk-go v1.55.8
76
github.com/aws/aws-sdk-go-v2 v1.41.1
7+
github.com/aws/aws-sdk-go-v2/config v1.32.7
8+
github.com/aws/aws-sdk-go-v2/credentials v1.19.7
9+
github.com/aws/aws-sdk-go-v2/service/ecr v1.55.1
810
github.com/elazarl/goproxy v0.0.0-20240726154733-8b0c20506380
911
github.com/evalphobia/logrus_sentry v0.8.2
1012
github.com/getsentry/raven-go v0.2.0
@@ -21,6 +23,16 @@ require (
2123
)
2224

2325
require (
26+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 // indirect
27+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 // indirect
28+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 // indirect
29+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
30+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect
31+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 // indirect
32+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 // indirect
33+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 // indirect
34+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 // indirect
35+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 // indirect
2436
github.com/aws/smithy-go v1.24.0 // indirect
2537
github.com/cenk/backoff v2.2.1+incompatible // indirect
2638
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40 // indirect
@@ -29,7 +41,6 @@ require (
2941
github.com/docker/distribution v2.8.3+incompatible // indirect
3042
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect
3143
github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a // indirect
32-
github.com/jmespath/go-jmespath v0.4.0 // indirect
3344
github.com/kr/pretty v0.1.0 // indirect
3445
github.com/opencontainers/go-digest v1.0.0 // indirect
3546
github.com/opencontainers/image-spec v1.0.2 // indirect

go.sum

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,31 @@
1-
github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ=
2-
github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk=
31
github.com/aws/aws-sdk-go-v2 v1.41.1 h1:ABlyEARCDLN034NhxlRUSZr4l71mh+T5KAeGh6cerhU=
42
github.com/aws/aws-sdk-go-v2 v1.41.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
3+
github.com/aws/aws-sdk-go-v2/config v1.32.7 h1:vxUyWGUwmkQ2g19n7JY/9YL8MfAIl7bTesIUykECXmY=
4+
github.com/aws/aws-sdk-go-v2/config v1.32.7/go.mod h1:2/Qm5vKUU/r7Y+zUk/Ptt2MDAEKAfUtKc1+3U1Mo3oY=
5+
github.com/aws/aws-sdk-go-v2/credentials v1.19.7 h1:tHK47VqqtJxOymRrNtUXN5SP/zUTvZKeLx4tH6PGQc8=
6+
github.com/aws/aws-sdk-go-v2/credentials v1.19.7/go.mod h1:qOZk8sPDrxhf+4Wf4oT2urYJrYt3RejHSzgAquYeppw=
7+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 h1:I0GyV8wiYrP8XpA70g1HBcQO1JlQxCMTW9npl5UbDHY=
8+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17/go.mod h1:tyw7BOl5bBe/oqvoIeECFJjMdzXoa/dfVz3QQ5lgHGA=
9+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 h1:xOLELNKGp2vsiteLsvLPwxC+mYmO6OZ8PYgiuPJzF8U=
10+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17/go.mod h1:5M5CI3D12dNOtH3/mk6minaRwI2/37ifCURZISxA/IQ=
11+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 h1:WWLqlh79iO48yLkj1v3ISRNiv+3KdQoZ6JWyfcsyQik=
12+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17/go.mod h1:EhG22vHRrvF8oXSTYStZhJc1aUgKtnJe+aOiFEV90cM=
13+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=
14+
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=
15+
github.com/aws/aws-sdk-go-v2/service/ecr v1.55.1 h1:B7f9R99lCF83XlolTg6d6Lvghyto+/VU83ZrneAVfK8=
16+
github.com/aws/aws-sdk-go-v2/service/ecr v1.55.1/go.mod h1:cpYRXx5BkmS3mwWRKPbWSPKmyAUNL7aLWAPiiinwk/U=
17+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E=
18+
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow=
19+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 h1:RuNSMoozM8oXlgLG/n6WLaFGoea7/CddrCfIiSA+xdY=
20+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17/go.mod h1:F2xxQ9TZz5gDWsclCtPQscGpP0VUOc8RqgFM3vDENmU=
21+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 h1:VrhDvQib/i0lxvr3zqlUwLwJP4fpmpyD9wYG1vfSu+Y=
22+
github.com/aws/aws-sdk-go-v2/service/signin v1.0.5/go.mod h1:k029+U8SY30/3/ras4G/Fnv/b88N4mAfliNn08Dem4M=
23+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 h1:v6EiMvhEYBoHABfbGB4alOYmCIrcgyPPiBE1wZAEbqk=
24+
github.com/aws/aws-sdk-go-v2/service/sso v1.30.9/go.mod h1:yifAsgBxgJWn3ggx70A3urX2AN49Y5sJTD1UQFlfqBw=
25+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 h1:gd84Omyu9JLriJVCbGApcLzVR3XtmC4ZDPcAI6Ftvds=
26+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13/go.mod h1:sTGThjphYE4Ohw8vJiRStAcu3rbjtXRsdNB0TvZ5wwo=
27+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 h1:5fFjR/ToSOzB2OQ/XqWpZBmNvmP/pJ1jOWYlFDJTjRQ=
28+
github.com/aws/aws-sdk-go-v2/service/sts v1.41.6/go.mod h1:qgFDZQSD/Kys7nJnVqYlWKnh0SSdMjAi0uSwON4wgYQ=
529
github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk=
630
github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=
731
github.com/cenk/backoff v2.2.1+incompatible h1:djdFT7f4gF2ttuzRKPbMOWgZajgesItGLwG5FTQKmmE=
@@ -33,10 +57,6 @@ github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
3357
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
3458
github.com/jarcoal/httpmock v1.4.1 h1:0Ju+VCFuARfFlhVXFc2HxlcQkfB+Xq12/EotHko+x2A=
3559
github.com/jarcoal/httpmock v1.4.1/go.mod h1:ftW1xULwo+j0R0JJkJIIi7UKigZUXCLLanykgjwBXL0=
36-
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
37-
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
38-
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
39-
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
4060
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
4161
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
4262
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -82,8 +102,6 @@ golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
82102
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
83103
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
84104
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
85-
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
86-
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
87105
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
88106
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
89107
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

internal/handlers/docker_registry.go

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11
package handlers
22

33
import (
4+
"context"
45
"encoding/base64"
56
"fmt"
67
"net/http"
78
"regexp"
89
"strings"
910
"sync"
1011

11-
"github.com/aws/aws-sdk-go/aws"
12-
"github.com/aws/aws-sdk-go/aws/credentials"
13-
"github.com/aws/aws-sdk-go/aws/session"
14-
"github.com/aws/aws-sdk-go/service/ecr"
15-
"github.com/aws/aws-sdk-go/service/ecr/ecriface"
12+
"github.com/aws/aws-sdk-go-v2/aws"
13+
"github.com/aws/aws-sdk-go-v2/config"
14+
"github.com/aws/aws-sdk-go-v2/credentials"
15+
"github.com/aws/aws-sdk-go-v2/service/ecr"
1616
"github.com/elazarl/goproxy"
1717
"github.com/stackrox/docker-registry-client/registry"
1818

19-
"github.com/dependabot/proxy/internal/config"
19+
proxyconfig "github.com/dependabot/proxy/internal/config"
2020
"github.com/dependabot/proxy/internal/helpers"
2121
"github.com/dependabot/proxy/internal/logging"
2222
"github.com/dependabot/proxy/internal/oidc"
@@ -27,7 +27,12 @@ var (
2727
ecrRe = regexp.MustCompile(`\A\d+.dkr.ecr.([a-z0-9-]+)\.amazonaws\.com\z`)
2828
)
2929

30-
type getECRClient func(region, keyID, secretKey string) (ecriface.ECRAPI, error)
30+
// ECRClient interface for ECR API operations (for testing)
31+
type ECRClient interface {
32+
GetAuthorizationToken(ctx context.Context, params *ecr.GetAuthorizationTokenInput, optFns ...func(*ecr.Options)) (*ecr.GetAuthorizationTokenOutput, error)
33+
}
34+
35+
type getECRClient func(region, keyID, secretKey string) (ECRClient, error)
3136

3237
// DockerRegistryHandler handles requests to Docker registries, adding auth.
3338
type DockerRegistryHandler struct {
@@ -38,7 +43,7 @@ type DockerRegistryHandler struct {
3843
}
3944

4045
// NewDockerRegistryHandler returns a new DockerRegistryHandler.
41-
func NewDockerRegistryHandler(creds config.Credentials, transport http.RoundTripper, getECRClient getECRClient) *DockerRegistryHandler {
46+
func NewDockerRegistryHandler(creds proxyconfig.Credentials, transport http.RoundTripper, getECRClient getECRClient) *DockerRegistryHandler {
4247
handler := DockerRegistryHandler{
4348
credentials: []*dockerRegistryCredentials{},
4449
transport: transport,
@@ -150,16 +155,16 @@ func (h *DockerRegistryHandler) HandleRequest(req *http.Request, ctx *goproxy.Pr
150155
return req, nil
151156
}
152157

153-
func defaultGetECRClient(region, keyID, secretKey string) (ecriface.ECRAPI, error) {
154-
sess, err := session.NewSession(&aws.Config{
155-
Region: aws.String(region),
156-
Credentials: credentials.NewStaticCredentials(keyID, secretKey, ""),
157-
})
158+
func defaultGetECRClient(region, keyID, secretKey string) (ECRClient, error) {
159+
cfg, err := config.LoadDefaultConfig(context.Background(),
160+
config.WithRegion(region),
161+
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(keyID, secretKey, "")),
162+
)
158163
if err != nil {
159164
return nil, err
160165
}
161166

162-
return ecr.New(sess), nil
167+
return ecr.NewFromConfig(cfg), nil
163168
}
164169

165170
type dockerRegistryCredentials struct {
@@ -193,15 +198,15 @@ func (c *dockerRegistryCredentials) getECRCredentials(ctx *goproxy.ProxyCtx) boo
193198
return false
194199
}
195200

196-
rsp, err := ecrSvc.GetAuthorizationToken(&ecr.GetAuthorizationTokenInput{})
201+
rsp, err := ecrSvc.GetAuthorizationToken(context.Background(), &ecr.GetAuthorizationTokenInput{})
197202
if err != nil {
198203
logging.RequestLogf(ctx, "! failed to get ecr authorization token (key_id=%s)", c.username)
199204
return false
200205
}
201206

202207
for _, ad := range rsp.AuthorizationData {
203208
if ad.AuthorizationToken != nil {
204-
decoded, err := base64.StdEncoding.DecodeString(*ad.AuthorizationToken)
209+
decoded, err := base64.StdEncoding.DecodeString(aws.ToString(ad.AuthorizationToken))
205210
if err != nil {
206211
continue
207212
}

internal/handlers/docker_registry_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package handlers
22

33
import (
4+
"context"
45
"encoding/base64"
56
"net/http"
67
"net/http/httptest"
78
"testing"
89

9-
"github.com/aws/aws-sdk-go/aws"
10-
"github.com/aws/aws-sdk-go/service/ecr"
11-
"github.com/aws/aws-sdk-go/service/ecr/ecriface"
10+
"github.com/aws/aws-sdk-go-v2/aws"
11+
"github.com/aws/aws-sdk-go-v2/service/ecr"
12+
"github.com/aws/aws-sdk-go-v2/service/ecr/types"
1213
"github.com/elazarl/goproxy"
1314
"github.com/stackrox/docker-registry-client/registry"
1415
"github.com/stretchr/testify/assert"
@@ -57,7 +58,7 @@ func TestDockerRegistryHandler(t *testing.T) {
5758
"password": hubPassword,
5859
},
5960
}
60-
getECRClient := func(region, keyID, secretKey string) (ecriface.ECRAPI, error) {
61+
getECRClient := func(region, keyID, secretKey string) (ECRClient, error) {
6162
return &mockECRClient{user: ecrDockerUser, token: ecrDockerPassword}, nil
6263
}
6364
handler := NewDockerRegistryHandler(credentials, &http.Transport{}, getECRClient)
@@ -150,15 +151,14 @@ func TestDockerRegistryHandler(t *testing.T) {
150151
}
151152

152153
type mockECRClient struct {
153-
ecriface.ECRAPI
154154
user string
155155
token string
156156
}
157157

158-
func (c *mockECRClient) GetAuthorizationToken(*ecr.GetAuthorizationTokenInput) (*ecr.GetAuthorizationTokenOutput, error) {
158+
func (c *mockECRClient) GetAuthorizationToken(ctx context.Context, params *ecr.GetAuthorizationTokenInput, optFns ...func(*ecr.Options)) (*ecr.GetAuthorizationTokenOutput, error) {
159159
authToken := base64.StdEncoding.EncodeToString([]byte(c.user + ":" + c.token))
160160
return &ecr.GetAuthorizationTokenOutput{
161-
AuthorizationData: []*ecr.AuthorizationData{
161+
AuthorizationData: []types.AuthorizationData{
162162
{
163163
AuthorizationToken: aws.String(authToken),
164164
},

vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/auto.go

Lines changed: 38 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/configuration.go

Lines changed: 43 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/defaults.go

Lines changed: 50 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/aws/aws-sdk-go-v2/aws/defaults/doc.go

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)