Skip to content

Commit 4de51f9

Browse files
ianhattendorfethomson
authored andcommitted
http: ensure the scheme supports the credentials
When a server responds with multiple scheme support - for example, Negotiate and NTLM are commonly used together - we need to ensure that we choose a scheme that supports the credentials.
1 parent 1c84716 commit 4de51f9

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

src/transports/http.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
@@ -433,7 +438,7 @@ static int init_auth(http_server *server)
433438
int error;
434439

435440
git_vector_foreach(&server->auth_challenges, i, c) {
436-
s = scheme_for_challenge(c);
441+
s = scheme_for_challenge(c, server->cred);
437442

438443
if (s && !!(s->credtypes & server->credtypes)) {
439444
scheme = s;

0 commit comments

Comments
 (0)