Merge branch 'gc/http-with-non-ascii-username-url' into maint
* 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.confmaint
						commit
						187b259dce
					
				
							
								
								
									
										12
									
								
								http.c
								
								
								
								
							
							
						
						
									
										12
									
								
								http.c
								
								
								
								
							| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
#include "pack.h"
 | 
			
		||||
#include "sideband.h"
 | 
			
		||||
#include "run-command.h"
 | 
			
		||||
#include "url.h"
 | 
			
		||||
 | 
			
		||||
int data_received;
 | 
			
		||||
int active_requests;
 | 
			
		||||
| 
						 | 
				
			
			@ -302,7 +303,7 @@ static CURL *get_curl_handle(void)
 | 
			
		|||
 | 
			
		||||
static void http_auth_init(const char *url)
 | 
			
		||||
{
 | 
			
		||||
	char *at, *colon, *cp, *slash;
 | 
			
		||||
	char *at, *colon, *cp, *slash, *decoded;
 | 
			
		||||
	int len;
 | 
			
		||||
 | 
			
		||||
	cp = strstr(url, "://");
 | 
			
		||||
| 
						 | 
				
			
			@ -327,16 +328,25 @@ static void http_auth_init(const char *url)
 | 
			
		|||
		user_name = xmalloc(len + 1);
 | 
			
		||||
		memcpy(user_name, cp, len);
 | 
			
		||||
		user_name[len] = '\0';
 | 
			
		||||
		decoded = url_decode(user_name);
 | 
			
		||||
		free(user_name);
 | 
			
		||||
		user_name = decoded;
 | 
			
		||||
		user_pass = NULL;
 | 
			
		||||
	} else {
 | 
			
		||||
		len = colon - cp;
 | 
			
		||||
		user_name = xmalloc(len + 1);
 | 
			
		||||
		memcpy(user_name, cp, len);
 | 
			
		||||
		user_name[len] = '\0';
 | 
			
		||||
		decoded = url_decode(user_name);
 | 
			
		||||
		free(user_name);
 | 
			
		||||
		user_name = decoded;
 | 
			
		||||
		len = at - (colon + 1);
 | 
			
		||||
		user_pass = xmalloc(len + 1);
 | 
			
		||||
		memcpy(user_pass, colon + 1, len);
 | 
			
		||||
		user_pass[len] = '\0';
 | 
			
		||||
		decoded = url_decode(user_pass);
 | 
			
		||||
		free(user_pass);
 | 
			
		||||
		user_pass = decoded;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -75,12 +75,14 @@ fi
 | 
			
		|||
 | 
			
		||||
prepare_httpd() {
 | 
			
		||||
	mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH"
 | 
			
		||||
	cp "$TEST_PATH"/passwd "$HTTPD_ROOT_PATH"
 | 
			
		||||
 | 
			
		||||
	ln -s "$LIB_HTTPD_MODULE_PATH" "$HTTPD_ROOT_PATH/modules"
 | 
			
		||||
 | 
			
		||||
	if test -n "$LIB_HTTPD_SSL"
 | 
			
		||||
	then
 | 
			
		||||
		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 \
 | 
			
		||||
			-config "$TEST_PATH/ssl.cnf" \
 | 
			
		||||
| 
						 | 
				
			
			@ -92,6 +94,7 @@ prepare_httpd() {
 | 
			
		|||
		HTTPD_PARA="$HTTPD_PARA -DSSL"
 | 
			
		||||
	else
 | 
			
		||||
		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
 | 
			
		||||
 | 
			
		||||
	if test -n "$LIB_HTTPD_DAV" -o -n "$LIB_HTTPD_SVN"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,8 +20,30 @@ ErrorLog error.log
 | 
			
		|||
<IfModule !mod_rewrite.c>
 | 
			
		||||
	LoadModule rewrite_module modules/mod_rewrite.so
 | 
			
		||||
</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 /auth/ www/auth/
 | 
			
		||||
 | 
			
		||||
<Location /smart/>
 | 
			
		||||
	SetEnv GIT_EXEC_PATH ${GIT_EXEC_PATH}
 | 
			
		||||
| 
						 | 
				
			
			@ -55,6 +77,13 @@ SSLMutex file:ssl_mutex
 | 
			
		|||
SSLEngine On
 | 
			
		||||
</IfDefine>
 | 
			
		||||
 | 
			
		||||
<Location /auth/>
 | 
			
		||||
	AuthType Basic
 | 
			
		||||
	AuthName "git-auth"
 | 
			
		||||
	AuthUserFile passwd
 | 
			
		||||
	Require valid-user
 | 
			
		||||
</Location>
 | 
			
		||||
 | 
			
		||||
<IfDefine DAV>
 | 
			
		||||
	LoadModule dav_module modules/mod_dav.so
 | 
			
		||||
	LoadModule dav_fs_module modules/mod_dav_fs.so
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
user@host:nKpa8pZUHx/ic
 | 
			
		||||
| 
						 | 
				
			
			@ -34,6 +34,13 @@ test_expect_success 'clone http repository' '
 | 
			
		|||
	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' '
 | 
			
		||||
	echo content >>file &&
 | 
			
		||||
	git commit -a -m two &&
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue