Merge branch 'gc/http-with-non-ascii-username-url'

* gc/http-with-non-ascii-username-url:
  Fix username and password extraction from HTTP URLs
  t5550: test HTTP authentication and userinfo decoding

Conflicts:
	t/lib-httpd/apache.conf
This commit is contained in:
Junio C Hamano 2010-12-08 11:24:14 -08:00
Родитель 09a8fbd59c f39f72d8cf
Коммит 16c06fcb39
5 изменённых файлов: 51 добавлений и 1 удалений

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;
@ -302,7 +303,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, "://");
@ -327,16 +328,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;
} }
} }

Просмотреть файл

@ -75,12 +75,14 @@ fi
prepare_httpd() { prepare_httpd() {
mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH" mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH"
cp "$TEST_PATH"/passwd "$HTTPD_ROOT_PATH"
ln -s "$LIB_HTTPD_MODULE_PATH" "$HTTPD_ROOT_PATH/modules" ln -s "$LIB_HTTPD_MODULE_PATH" "$HTTPD_ROOT_PATH/modules"
if test -n "$LIB_HTTPD_SSL" if test -n "$LIB_HTTPD_SSL"
then then
HTTPD_URL=https://127.0.0.1:$LIB_HTTPD_PORT HTTPD_URL=https://127.0.0.1:$LIB_HTTPD_PORT
AUTH_HTTPD_URL=https://user%40host:user%40host@127.0.0.1:$LIB_HTTPD_PORT
RANDFILE_PATH="$HTTPD_ROOT_PATH"/.rnd openssl req \ RANDFILE_PATH="$HTTPD_ROOT_PATH"/.rnd openssl req \
-config "$TEST_PATH/ssl.cnf" \ -config "$TEST_PATH/ssl.cnf" \
@ -92,6 +94,7 @@ prepare_httpd() {
HTTPD_PARA="$HTTPD_PARA -DSSL" HTTPD_PARA="$HTTPD_PARA -DSSL"
else else
HTTPD_URL=http://127.0.0.1:$LIB_HTTPD_PORT HTTPD_URL=http://127.0.0.1:$LIB_HTTPD_PORT
AUTH_HTTPD_URL=http://user%40host:user%40host@127.0.0.1:$LIB_HTTPD_PORT
fi fi
if test -n "$LIB_HTTPD_DAV" -o -n "$LIB_HTTPD_SVN" if test -n "$LIB_HTTPD_DAV" -o -n "$LIB_HTTPD_SVN"

Просмотреть файл

@ -20,8 +20,30 @@ ErrorLog error.log
<IfModule !mod_rewrite.c> <IfModule !mod_rewrite.c>
LoadModule rewrite_module modules/mod_rewrite.so LoadModule rewrite_module modules/mod_rewrite.so
</IFModule> </IFModule>
<IfModule !mod_version.c>
LoadModule version_module modules/mod_version.so
</IfModule>
<IfVersion < 2.1>
<IfModule !mod_auth.c>
LoadModule auth_module modules/mod_auth.so
</IfModule>
</IfVersion>
<IfVersion >= 2.1>
<IfModule !mod_auth_basic.c>
LoadModule auth_basic_module modules/mod_auth_basic.so
</IfModule>
<IfModule !mod_authn_file.c>
LoadModule authn_file_module modules/mod_authn_file.so
</IfModule>
<IfModule !mod_authz_user.c>
LoadModule authz_user_module modules/mod_authz_user.so
</IfModule>
</IfVersion>
Alias /dumb/ www/ Alias /dumb/ www/
Alias /auth/ www/auth/
<Location /smart/> <Location /smart/>
SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH} SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH}
@ -55,6 +77,13 @@ SSLMutex file:ssl_mutex
SSLEngine On SSLEngine On
</IfDefine> </IfDefine>
<Location /auth/>
AuthType Basic
AuthName "git-auth"
AuthUserFile passwd
Require valid-user
</Location>
<IfDefine DAV> <IfDefine DAV>
LoadModule dav_module modules/mod_dav.so LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so LoadModule dav_fs_module modules/mod_dav_fs.so

1
t/lib-httpd/passwd Normal file
Просмотреть файл

@ -0,0 +1 @@
user@host:nKpa8pZUHx/ic

Просмотреть файл

@ -34,6 +34,13 @@ test_expect_success 'clone http repository' '
test_cmp file clone/file test_cmp file clone/file
' '
test_expect_success 'clone http repository with authentication' '
mkdir "$HTTPD_DOCUMENT_ROOT_PATH/auth/" &&
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 &&
test_cmp file clone-auth/file
'
test_expect_success 'fetch changes via http' ' test_expect_success 'fetch changes via http' '
echo content >>file && echo content >>file &&
git commit -a -m two && git commit -a -m two &&