remote-curl: fall back to basic auth if Negotiate fails

When the username and password are supplied in a url like this
https://myuser:secret@git.exampe/myrepo.git and the server supports the
negotiate authenticaten method, git does not fall back to basic auth and
libcurl hardly tries to authenticate with the negotiate method.

Stop using the Negotiate authentication method after the first failure
because if it fails on the first try it will never succeed.

Signed-off-by: Christopher Schenk <christopher@cschenk.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Christopher Schenk 2021-03-22 11:51:16 +00:00 коммит произвёл Junio C Hamano
Родитель 98164e9585
Коммит 1b0d9545bb
1 изменённых файлов: 8 добавлений и 7 удалений

15
http.c
Просмотреть файл

@ -1641,17 +1641,18 @@ static int handle_curl_result(struct slot_results *results)
} else if (missing_target(results)) } else if (missing_target(results))
return HTTP_MISSING_TARGET; return HTTP_MISSING_TARGET;
else if (results->http_code == 401) { else if (results->http_code == 401) {
#ifdef LIBCURL_CAN_HANDLE_AUTH_ANY
http_auth_methods &= ~CURLAUTH_GSSNEGOTIATE;
if (results->auth_avail) {
http_auth_methods &= results->auth_avail;
http_auth_methods_restricted = 1;
return HTTP_REAUTH;
}
#endif
if (http_auth.username && http_auth.password) { if (http_auth.username && http_auth.password) {
credential_reject(&http_auth); credential_reject(&http_auth);
return HTTP_NOAUTH; return HTTP_NOAUTH;
} else { } else {
#ifdef LIBCURL_CAN_HANDLE_AUTH_ANY
http_auth_methods &= ~CURLAUTH_GSSNEGOTIATE;
if (results->auth_avail) {
http_auth_methods &= results->auth_avail;
http_auth_methods_restricted = 1;
}
#endif
return HTTP_REAUTH; return HTTP_REAUTH;
} }
} else { } else {