@@ -129,17 +129,22 @@ typedef struct {
129129 size_t * bytes_read ;
130130} parser_context ;
131131
132- static git_http_auth_scheme * scheme_for_challenge (const char * challenge )
132+ static git_http_auth_scheme * scheme_for_challenge (
133+ const char * challenge ,
134+ git_cred * cred )
133135{
134136 git_http_auth_scheme * scheme = NULL ;
135137 size_t i ;
136138
137139 for (i = 0 ; i < ARRAY_SIZE (auth_schemes ); i ++ ) {
138140 const char * scheme_name = auth_schemes [i ].name ;
141+ const git_credtype_t scheme_types = auth_schemes [i ].credtypes ;
139142 size_t scheme_len ;
140143
141144 scheme_len = strlen (scheme_name );
142- if (strncasecmp (challenge , scheme_name , scheme_len ) == 0 &&
145+
146+ if ((!cred || (cred -> credtype & scheme_types )) &&
147+ strncasecmp (challenge , scheme_name , scheme_len ) == 0 &&
143148 (challenge [scheme_len ] == '\0' || challenge [scheme_len ] == ' ' )) {
144149 scheme = & auth_schemes [i ];
145150 break ;
@@ -256,7 +261,7 @@ static int set_authentication_types(http_server *server)
256261 size_t i ;
257262
258263 git_vector_foreach (& server -> auth_challenges , i , challenge ) {
259- if ((scheme = scheme_for_challenge (challenge )) != NULL ) {
264+ if ((scheme = scheme_for_challenge (challenge , NULL )) != NULL ) {
260265 server -> authtypes |= scheme -> type ;
261266 server -> credtypes |= scheme -> credtypes ;
262267 }
@@ -430,9 +435,10 @@ static int init_auth(http_server *server)
430435 git_http_auth_scheme * s , * scheme = NULL ;
431436 char * c , * challenge = NULL ;
432437 size_t i ;
438+ int error ;
433439
434440 git_vector_foreach (& server -> auth_challenges , i , c ) {
435- s = scheme_for_challenge (c );
441+ s = scheme_for_challenge (c , server -> cred );
436442
437443 if (s && !!(s -> credtypes & server -> credtypes )) {
438444 scheme = s ;
@@ -446,12 +452,14 @@ static int init_auth(http_server *server)
446452 return -1 ;
447453 }
448454
449- if (scheme -> init_context (& server -> auth_context , & server -> url ) < 0 )
450- return -1 ;
455+ if ((error = scheme -> init_context (& server -> auth_context , & server -> url )) == GIT_PASSTHROUGH )
456+ return 0 ;
457+ else if (error < 0 )
458+ return error ;
451459
452460 if (server -> auth_context -> set_challenge &&
453- server -> auth_context -> set_challenge (server -> auth_context , challenge ) < 0 )
454- return -1 ;
461+ ( error = server -> auth_context -> set_challenge (server -> auth_context , challenge ) ) < 0 )
462+ return error ;
455463
456464 return 0 ;
457465}
0 commit comments