Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2010-06-17 03:32:15 +0400
committerJunio C Hamano <gitster@pobox.com>2010-06-17 03:32:15 +0400
commit356169c1f66287629ea08e8c9c6e27b00ff8707a (patch)
treedbcaccfc020329501fb6eaa9c84c06e5d4ab7bf6
parent3b3b9a6152a9458718119aa27db52248bf8df911 (diff)
parent42653c09c85015addc6fa8dd4d49cb250253412e (diff)
Merge branch 'sc/http-late-auth' into maint
* sc/http-late-auth: Prompt for a username when an HTTP request 401s
-rw-r--r--http.c22
-rw-r--r--http.h2
-rw-r--r--remote-curl.c2
3 files changed, 24 insertions, 2 deletions
diff --git a/http.c b/http.c
index 901e597297..1320c50e32 100644
--- a/http.c
+++ b/http.c
@@ -816,7 +816,21 @@ static int http_request(const char *url, void *result, int target, int options)
ret = HTTP_OK;
else if (missing_target(&results))
ret = HTTP_MISSING_TARGET;
- else
+ else if (results.http_code == 401) {
+ if (user_name) {
+ ret = HTTP_NOAUTH;
+ } else {
+ /*
+ * git_getpass is needed here because its very likely stdin/stdout are
+ * pipes to our parent process. So we instead need to use /dev/tty,
+ * but that is non-portable. Using git_getpass() can at least be stubbed
+ * on other platforms with a different implementation if/when necessary.
+ */
+ user_name = xstrdup(git_getpass("Username: "));
+ init_curl_http_auth(slot->curl);
+ ret = HTTP_REAUTH;
+ }
+ } else
ret = HTTP_ERROR;
} else {
error("Unable to start HTTP request for %s", url);
@@ -832,7 +846,11 @@ static int http_request(const char *url, void *result, int target, int options)
int http_get_strbuf(const char *url, struct strbuf *result, int options)
{
- return http_request(url, result, HTTP_REQUEST_STRBUF, options);
+ int http_ret = http_request(url, result, HTTP_REQUEST_STRBUF, options);
+ if (http_ret == HTTP_REAUTH) {
+ http_ret = http_request(url, result, HTTP_REQUEST_STRBUF, options);
+ }
+ return http_ret;
}
/*
diff --git a/http.h b/http.h
index b431b8bd5b..a0b5901594 100644
--- a/http.h
+++ b/http.h
@@ -127,6 +127,8 @@ extern void end_url_with_slash(struct strbuf *buf, const char *url);
#define HTTP_MISSING_TARGET 1
#define HTTP_ERROR 2
#define HTTP_START_FAILED 3
+#define HTTP_REAUTH 4
+#define HTTP_NOAUTH 5
/*
* Requests an url and stores the result in a strbuf.
diff --git a/remote-curl.c b/remote-curl.c
index 9c7fcf2956..24fbb9a9b9 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -132,6 +132,8 @@ static struct discovery* discover_refs(const char *service)
case HTTP_MISSING_TARGET:
die("%s not found: did you run git update-server-info on the"
" server?", refs_url);
+ case HTTP_NOAUTH:
+ die("Authentication failed");
default:
http_error(refs_url, http_ret);
die("HTTP request failed");