git/list[1] front-page[2] threads[3] people[4] search[5] about
 

No negotiation for repos on HTTP servers?

From
CHChristoffer Haglund <christoffer.haglund@gmail.com>
Date
Sep 13, 2015, 19:31 UTC
Message-ID
<CAGHtn=oXUa2=n2aMWQKndDSfGZ2bPm-dxZ7jin7QOx8dRxp3Kw@mail.gmail.com>
Hi,
I wonder if I've hit a bug in git, or perhaps in libcurl.

Our team that use git repos hosted on a number of different environments, including HTTP servers using Kerberos or NTLM to authenticate users. Command-line git needs explicit credentials to work against these repos, while Visual Studio (i.e. libgit2) does not. The other day I noticed that when I give null credentials (i.e. empty username and password) normal command-line git works beautifully, authenticating as the currently signed-in user.

I digged around a bit and found a potential bug in how libcurl is used; when using CURLAUTH_ANY, no handshaking will actually be done unless a user name is specified - even if it's a fake one.

This is consistent with the documentation for curl itself, http://curl.haxx.se/docs/manpage.html#--negotiate , however I see no mention of this quirk in the libcurl API documentation.

The fix I'm using locally is quite straightforward:
diff --git a/http.c b/http.c
index 9dce380..f62f6b6 100644
--- a/http.c
+++ b/http.c
@@ -668,6 +668,10 @@ struct active_request_slot *get_active_slot(void)
 #endif
        if (http_auth.password)
                init_curl_http_auth(slot->curl);
+#ifdef LIBCURL_CAN_HANDLE_AUTH_ANY
+       else
+               curl_easy_setopt(slot->curl, CURLOPT_USERNAME, "");
+#endif
        return slot;
 }


As far as I can tell this works fine against NTLM and Kerberos HTTP
servers, and has no effect on servers allowing anonymous access.

Against a server using Basic authentication the patch will cause git
to fire off a redundant 'GET' with the empty username before asking
the user for credentials. I'm not sure if that could cause problems
for other users, I would expect that anyone working against a server
with Basic authentication uses stored credentials anyway :-)

But perhaps there is some other case I've not considered?

  // Christoffer
Next: brian m. carlson
Message 1 of 2 in “No negotiation for repos on HTTP servers?”
  1. Christoffer HaglundSep 13, 2015
  2. brian m. carlsonSep 13, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.