Merge branch 'js/https-proxy-config'
A handful of options to configure SSL when talking to proxies have been added. * js/https-proxy-config: http: add environment variable support for HTTPS proxies http: add client cert support for HTTPS proxies
This commit is contained in:
		| @ -29,6 +29,27 @@ http.proxyAuthMethod:: | |||||||
| * `ntlm` - NTLM authentication (compare the --ntlm option of `curl(1)`) | * `ntlm` - NTLM authentication (compare the --ntlm option of `curl(1)`) | ||||||
| -- | -- | ||||||
|  |  | ||||||
|  | http.proxySSLCert:: | ||||||
|  | 	The pathname of a file that stores a client certificate to use to authenticate | ||||||
|  | 	with an HTTPS proxy. Can be overridden by the `GIT_PROXY_SSL_CERT` environment | ||||||
|  | 	variable. | ||||||
|  |  | ||||||
|  | http.proxySSLKey:: | ||||||
|  | 	The pathname of a file that stores a private key to use to authenticate with | ||||||
|  | 	an HTTPS proxy. Can be overridden by the `GIT_PROXY_SSL_KEY` environment | ||||||
|  | 	variable. | ||||||
|  |  | ||||||
|  | http.proxySSLCertPasswordProtected:: | ||||||
|  | 	Enable Git's password prompt for the proxy SSL certificate.  Otherwise OpenSSL | ||||||
|  | 	will prompt the user, possibly many times, if the certificate or private key | ||||||
|  | 	is encrypted. Can be overriden by the `GIT_PROXY_SSL_CERT_PASSWORD_PROTECTED` | ||||||
|  | 	environment variable. | ||||||
|  |  | ||||||
|  | http.proxySSLCAInfo:: | ||||||
|  | 	Pathname to the file containing the certificate bundle that should be used to | ||||||
|  | 	verify the proxy with when using an HTTPS proxy. Can be overriden by the | ||||||
|  | 	`GIT_PROXY_SSL_CAINFO` environment variable. | ||||||
|  |  | ||||||
| http.emptyAuth:: | http.emptyAuth:: | ||||||
| 	Attempt authentication without seeking a username or password.  This | 	Attempt authentication without seeking a username or password.  This | ||||||
| 	can be used to attempt GSS-Negotiate authentication without specifying | 	can be used to attempt GSS-Negotiate authentication without specifying | ||||||
|  | |||||||
							
								
								
									
										72
									
								
								http.c
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								http.c
									
									
									
									
									
								
							| @ -86,6 +86,13 @@ static long curl_low_speed_time = -1; | |||||||
| static int curl_ftp_no_epsv; | static int curl_ftp_no_epsv; | ||||||
| static const char *curl_http_proxy; | static const char *curl_http_proxy; | ||||||
| static const char *http_proxy_authmethod; | static const char *http_proxy_authmethod; | ||||||
|  |  | ||||||
|  | static const char *http_proxy_ssl_cert; | ||||||
|  | static const char *http_proxy_ssl_key; | ||||||
|  | static const char *http_proxy_ssl_ca_info; | ||||||
|  | static struct credential proxy_cert_auth = CREDENTIAL_INIT; | ||||||
|  | static int proxy_ssl_cert_password_required; | ||||||
|  |  | ||||||
| static struct { | static struct { | ||||||
| 	const char *name; | 	const char *name; | ||||||
| 	long curlauth_param; | 	long curlauth_param; | ||||||
| @ -365,6 +372,20 @@ static int http_options(const char *var, const char *value, void *cb) | |||||||
| 	if (!strcmp("http.proxyauthmethod", var)) | 	if (!strcmp("http.proxyauthmethod", var)) | ||||||
| 		return git_config_string(&http_proxy_authmethod, var, value); | 		return git_config_string(&http_proxy_authmethod, var, value); | ||||||
|  |  | ||||||
|  | 	if (!strcmp("http.proxysslcert", var)) | ||||||
|  | 		return git_config_string(&http_proxy_ssl_cert, var, value); | ||||||
|  |  | ||||||
|  | 	if (!strcmp("http.proxysslkey", var)) | ||||||
|  | 		return git_config_string(&http_proxy_ssl_key, var, value); | ||||||
|  |  | ||||||
|  | 	if (!strcmp("http.proxysslcainfo", var)) | ||||||
|  | 		return git_config_string(&http_proxy_ssl_ca_info, var, value); | ||||||
|  |  | ||||||
|  | 	if (!strcmp("http.proxysslcertpasswordprotected", var)) { | ||||||
|  | 		proxy_ssl_cert_password_required = git_config_bool(var, value); | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (!strcmp("http.cookiefile", var)) | 	if (!strcmp("http.cookiefile", var)) | ||||||
| 		return git_config_pathname(&curl_cookie_file, var, value); | 		return git_config_pathname(&curl_cookie_file, var, value); | ||||||
| 	if (!strcmp("http.savecookies", var)) { | 	if (!strcmp("http.savecookies", var)) { | ||||||
| @ -565,6 +586,21 @@ static int has_cert_password(void) | |||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #if LIBCURL_VERSION_NUM >= 0x073400 | ||||||
|  | static int has_proxy_cert_password(void) | ||||||
|  | { | ||||||
|  | 	if (http_proxy_ssl_cert == NULL || proxy_ssl_cert_password_required != 1) | ||||||
|  | 		return 0; | ||||||
|  | 	if (!proxy_cert_auth.password) { | ||||||
|  | 		proxy_cert_auth.protocol = xstrdup("cert"); | ||||||
|  | 		proxy_cert_auth.username = xstrdup(""); | ||||||
|  | 		proxy_cert_auth.path = xstrdup(http_proxy_ssl_cert); | ||||||
|  | 		credential_fill(&proxy_cert_auth); | ||||||
|  | 	} | ||||||
|  | 	return 1; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
| #if LIBCURL_VERSION_NUM >= 0x071900 | #if LIBCURL_VERSION_NUM >= 0x071900 | ||||||
| static void set_curl_keepalive(CURL *c) | static void set_curl_keepalive(CURL *c) | ||||||
| { | { | ||||||
| @ -924,8 +960,14 @@ static CURL *get_curl_handle(void) | |||||||
| #if LIBCURL_VERSION_NUM >= 0x073400 | #if LIBCURL_VERSION_NUM >= 0x073400 | ||||||
| 		curl_easy_setopt(result, CURLOPT_PROXY_CAINFO, NULL); | 		curl_easy_setopt(result, CURLOPT_PROXY_CAINFO, NULL); | ||||||
| #endif | #endif | ||||||
| 	} else if (ssl_cainfo != NULL) | 	} else if (ssl_cainfo != NULL || http_proxy_ssl_ca_info != NULL) { | ||||||
|  | 		if (ssl_cainfo != NULL) | ||||||
| 			curl_easy_setopt(result, CURLOPT_CAINFO, ssl_cainfo); | 			curl_easy_setopt(result, CURLOPT_CAINFO, ssl_cainfo); | ||||||
|  | #if LIBCURL_VERSION_NUM >= 0x073400 | ||||||
|  | 		if (http_proxy_ssl_ca_info != NULL) | ||||||
|  | 			curl_easy_setopt(result, CURLOPT_PROXY_CAINFO, http_proxy_ssl_ca_info); | ||||||
|  | #endif | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (curl_low_speed_limit > 0 && curl_low_speed_time > 0) { | 	if (curl_low_speed_limit > 0 && curl_low_speed_time > 0) { | ||||||
| 		curl_easy_setopt(result, CURLOPT_LOW_SPEED_LIMIT, | 		curl_easy_setopt(result, CURLOPT_LOW_SPEED_LIMIT, | ||||||
| @ -1018,9 +1060,18 @@ static CURL *get_curl_handle(void) | |||||||
| 				CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4); | 				CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4); | ||||||
| #endif | #endif | ||||||
| #if LIBCURL_VERSION_NUM >= 0x073400 | #if LIBCURL_VERSION_NUM >= 0x073400 | ||||||
| 		else if (starts_with(curl_http_proxy, "https")) | 		else if (starts_with(curl_http_proxy, "https")) { | ||||||
| 			curl_easy_setopt(result, | 			curl_easy_setopt(result, CURLOPT_PROXYTYPE, CURLPROXY_HTTPS); | ||||||
| 				CURLOPT_PROXYTYPE, CURLPROXY_HTTPS); |  | ||||||
|  | 			if (http_proxy_ssl_cert) | ||||||
|  | 				curl_easy_setopt(result, CURLOPT_PROXY_SSLCERT, http_proxy_ssl_cert); | ||||||
|  |  | ||||||
|  | 			if (http_proxy_ssl_key) | ||||||
|  | 				curl_easy_setopt(result, CURLOPT_PROXY_SSLKEY, http_proxy_ssl_key); | ||||||
|  |  | ||||||
|  | 			if (has_proxy_cert_password()) | ||||||
|  | 				curl_easy_setopt(result, CURLOPT_PROXY_KEYPASSWD, proxy_cert_auth.password); | ||||||
|  | 		} | ||||||
| #endif | #endif | ||||||
| 		if (strstr(curl_http_proxy, "://")) | 		if (strstr(curl_http_proxy, "://")) | ||||||
| 			credential_from_url(&proxy_auth, curl_http_proxy); | 			credential_from_url(&proxy_auth, curl_http_proxy); | ||||||
| @ -1160,6 +1211,13 @@ void http_init(struct remote *remote, const char *url, int proactive_auth) | |||||||
| 		max_requests = DEFAULT_MAX_REQUESTS; | 		max_requests = DEFAULT_MAX_REQUESTS; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | 	set_from_env(&http_proxy_ssl_cert, "GIT_PROXY_SSL_CERT"); | ||||||
|  | 	set_from_env(&http_proxy_ssl_key, "GIT_PROXY_SSL_KEY"); | ||||||
|  | 	set_from_env(&http_proxy_ssl_ca_info, "GIT_PROXY_SSL_CAINFO"); | ||||||
|  |  | ||||||
|  | 	if (getenv("GIT_PROXY_SSL_CERT_PASSWORD_PROTECTED")) | ||||||
|  | 		proxy_ssl_cert_password_required = 1; | ||||||
|  |  | ||||||
| 	if (getenv("GIT_CURL_FTP_NO_EPSV")) | 	if (getenv("GIT_CURL_FTP_NO_EPSV")) | ||||||
| 		curl_ftp_no_epsv = 1; | 		curl_ftp_no_epsv = 1; | ||||||
|  |  | ||||||
| @ -1230,6 +1288,12 @@ void http_cleanup(void) | |||||||
| 	} | 	} | ||||||
| 	ssl_cert_password_required = 0; | 	ssl_cert_password_required = 0; | ||||||
|  |  | ||||||
|  | 	if (proxy_cert_auth.password != NULL) { | ||||||
|  | 		memset(proxy_cert_auth.password, 0, strlen(proxy_cert_auth.password)); | ||||||
|  | 		FREE_AND_NULL(proxy_cert_auth.password); | ||||||
|  | 	} | ||||||
|  | 	proxy_ssl_cert_password_required = 0; | ||||||
|  |  | ||||||
| 	FREE_AND_NULL(cached_accept_language); | 	FREE_AND_NULL(cached_accept_language); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Junio C Hamano
					Junio C Hamano