Fix username and password extraction from HTTP URLs
Change the authentification initialisation to percent-decode username and password for HTTP URLs. Signed-off-by: Gabriel Corona <gabriel.corona@enst-bretagne.fr> Acked-by: Tay Ray Chuan <rctay89@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
3cf8fe1d26
commit
f39f72d8cf
12
http.c
12
http.c
@ -2,6 +2,7 @@
|
|||||||
#include "pack.h"
|
#include "pack.h"
|
||||||
#include "sideband.h"
|
#include "sideband.h"
|
||||||
#include "run-command.h"
|
#include "run-command.h"
|
||||||
|
#include "url.h"
|
||||||
|
|
||||||
int data_received;
|
int data_received;
|
||||||
int active_requests;
|
int active_requests;
|
||||||
@ -297,7 +298,7 @@ static CURL *get_curl_handle(void)
|
|||||||
|
|
||||||
static void http_auth_init(const char *url)
|
static void http_auth_init(const char *url)
|
||||||
{
|
{
|
||||||
char *at, *colon, *cp, *slash;
|
char *at, *colon, *cp, *slash, *decoded;
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
cp = strstr(url, "://");
|
cp = strstr(url, "://");
|
||||||
@ -322,16 +323,25 @@ static void http_auth_init(const char *url)
|
|||||||
user_name = xmalloc(len + 1);
|
user_name = xmalloc(len + 1);
|
||||||
memcpy(user_name, cp, len);
|
memcpy(user_name, cp, len);
|
||||||
user_name[len] = '\0';
|
user_name[len] = '\0';
|
||||||
|
decoded = url_decode(user_name);
|
||||||
|
free(user_name);
|
||||||
|
user_name = decoded;
|
||||||
user_pass = NULL;
|
user_pass = NULL;
|
||||||
} else {
|
} else {
|
||||||
len = colon - cp;
|
len = colon - cp;
|
||||||
user_name = xmalloc(len + 1);
|
user_name = xmalloc(len + 1);
|
||||||
memcpy(user_name, cp, len);
|
memcpy(user_name, cp, len);
|
||||||
user_name[len] = '\0';
|
user_name[len] = '\0';
|
||||||
|
decoded = url_decode(user_name);
|
||||||
|
free(user_name);
|
||||||
|
user_name = decoded;
|
||||||
len = at - (colon + 1);
|
len = at - (colon + 1);
|
||||||
user_pass = xmalloc(len + 1);
|
user_pass = xmalloc(len + 1);
|
||||||
memcpy(user_pass, colon + 1, len);
|
memcpy(user_pass, colon + 1, len);
|
||||||
user_pass[len] = '\0';
|
user_pass[len] = '\0';
|
||||||
|
decoded = url_decode(user_pass);
|
||||||
|
free(user_pass);
|
||||||
|
user_pass = decoded;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@ test_expect_success 'clone http repository' '
|
|||||||
test_cmp file clone/file
|
test_cmp file clone/file
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_failure 'clone http repository with authentication' '
|
test_expect_success 'clone http repository with authentication' '
|
||||||
mkdir "$HTTPD_DOCUMENT_ROOT_PATH/auth/" &&
|
mkdir "$HTTPD_DOCUMENT_ROOT_PATH/auth/" &&
|
||||||
cp -Rf "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" "$HTTPD_DOCUMENT_ROOT_PATH/auth/repo.git" &&
|
cp -Rf "$HTTPD_DOCUMENT_ROOT_PATH/repo.git" "$HTTPD_DOCUMENT_ROOT_PATH/auth/repo.git" &&
|
||||||
git clone $AUTH_HTTPD_URL/auth/repo.git clone-auth &&
|
git clone $AUTH_HTTPD_URL/auth/repo.git clone-auth &&
|
||||||
|
Reference in New Issue
Block a user