99 "net/http"
1010 "net/url"
1111 "strings"
12- "sync"
1312 "time"
1413
1514 "github.com/elazarl/goproxy"
@@ -36,9 +35,8 @@ type nugetV3IndexResponse struct {
3635
3736// NugetFeedHandler handles requests to nuget feeds, adding auth.
3837type NugetFeedHandler struct {
39- credentials []nugetFeedCredentials
40- oidcCredentials map [string ]* oidc.OIDCCredential
41- mutex sync.RWMutex
38+ credentials []nugetFeedCredentials
39+ oidcRegistry * oidc.OIDCRegistry
4240}
4341
4442type nugetFeedCredentials struct {
@@ -52,8 +50,8 @@ type nugetFeedCredentials struct {
5250// NewNugetFeedHandler returns a new NugetFeedHandler.
5351func NewNugetFeedHandler (creds config.Credentials ) * NugetFeedHandler {
5452 handler := NugetFeedHandler {
55- credentials : []nugetFeedCredentials {},
56- oidcCredentials : make ( map [ string ] * oidc.OIDCCredential ),
53+ credentials : []nugetFeedCredentials {},
54+ oidcRegistry : oidc .NewOIDCRegistry ( ),
5755 }
5856
5957 httpClient := & http.Client {
@@ -72,54 +70,43 @@ func NewNugetFeedHandler(creds config.Credentials) *NugetFeedHandler {
7270 username := cred .GetString ("username" )
7371 password := cred .GetString ("password" )
7472
75- oidcCredential , _ := oidc .CreateOIDCCredential (cred )
76- if oidcCredential != nil {
77- key := url
78- if key == "" {
79- key = host
73+ oidcCredential , key , ok := handler .oidcRegistry .Register (cred , []string {"url" }, "nuget feed" )
74+ if ok {
75+ // Query all resources to add to the authentication list
76+ req , err := http .NewRequestWithContext (context .Background (), "GET" , key , nil )
77+ if err != nil {
78+ logging .RequestLogf (nil , "error creating http request (%s): %v" , key , err )
79+ continue
8080 }
8181
82- if key != "" {
83- handler .oidcCredentials [key ] = oidcCredential
84- logging .RequestLogf (nil , "registered %s OIDC credentials for nuget feed: %s" , oidcCredential .Provider (), key )
82+ if handler .oidcRegistry .TryAuth (req , nil ) {
83+ rawRsp , err := httpClient .Do (req )
84+ if err != nil {
85+ logging .RequestLogf (nil , "error retrieving http response (%s): %v" , key , err )
86+ continue
87+ }
8588
86- // now query all resources to add to the authentication list
87- req , err := http .NewRequestWithContext (context .Background (), "GET" , key , nil )
89+ body , err := io .ReadAll (rawRsp .Body )
8890 if err != nil {
89- logging .RequestLogf (nil , "error creating http request (%s): %v" , key , err )
91+ logging .RequestLogf (nil , "error reading http response body" )
92+ continue
93+ }
94+ rawRsp .Body .Close ()
95+
96+ switch rawRsp .StatusCode {
97+ case 401 , 403 :
98+ logging .RequestLogf (nil , "unauthorized for nuget feed %s" , key )
99+ continue
100+ }
101+
102+ if rawRsp .StatusCode >= 400 {
103+ logging .RequestLogf (nil , "unexpected http response %d for nuget feed %s" , rawRsp .StatusCode , key )
90104 continue
91105 }
92106
93- if oidc .TryAuthOIDCRequestWithPrefix (& handler .mutex , handler .oidcCredentials , req , nil ) {
94- rawRsp , err := httpClient .Do (req )
95- if err != nil {
96- logging .RequestLogf (nil , "error retrieving http response (%s): %v" , key , err )
97- continue
98- }
99-
100- body , err := io .ReadAll (rawRsp .Body )
101- if err != nil {
102- logging .RequestLogf (nil , "error reading http response body" )
103- continue
104- }
105- rawRsp .Body .Close ()
106-
107- switch rawRsp .StatusCode {
108- case 401 , 403 :
109- logging .RequestLogf (nil , "unauthorized for nuget feed %s" , key )
110- continue
111- }
112-
113- if rawRsp .StatusCode >= 400 {
114- logging .RequestLogf (nil , "unexpected http response %d for nuget feed %s" , rawRsp .StatusCode , key )
115- continue
116- }
117-
118- urlsToAuthenticate := extraUrlsFromSourceResponse (body , key )
119- for _ , url := range urlsToAuthenticate {
120- handler .oidcCredentials [url ] = oidcCredential
121- logging .RequestLogf (nil , " registered %s OIDC credentials for nuget resource: %s" , oidcCredential .Provider (), url )
122- }
107+ urlsToAuthenticate := extraUrlsFromSourceResponse (body , key )
108+ for _ , discoveredURL := range urlsToAuthenticate {
109+ handler .oidcRegistry .RegisterURL (discoveredURL , oidcCredential , "nuget resource" )
123110 }
124111 }
125112 continue
@@ -262,7 +249,7 @@ func (h *NugetFeedHandler) HandleRequest(req *http.Request, ctx *goproxy.ProxyCt
262249 }
263250
264251 // Try OIDC credentials first
265- if oidc . TryAuthOIDCRequestWithPrefix ( & h . mutex , h . oidcCredentials , req , ctx ) {
252+ if h . oidcRegistry . TryAuth ( req , ctx ) {
266253 return req , nil
267254 }
268255
0 commit comments