Skip to content

Commit 39028eb

Browse files
authored
Merge pull request libgit2#5212 from libgit2/ethomson/creds_for_scheme
Use an HTTP scheme that supports the given credentials
2 parents 5fc27aa + 4de51f9 commit 39028eb

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

src/transports/auth.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,6 @@ int git_http_auth_dummy(
7070
GIT_UNUSED(url);
7171

7272
*out = NULL;
73-
return 0;
73+
return GIT_PASSTHROUGH;
7474
}
7575

src/transports/http.c

Lines changed: 16 additions & 8 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
}
@@ -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

Comments
 (0)