From 22b741e9a140eb70ea1772c1b6a43ef2ff3e1512 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Mon, 16 Sep 2013 15:20:04 +0200 Subject: Update custom header patch --- openvpn/src/openvpn/proxy.c | 113 +++++++++++++++++++++++++++++--------------- 1 file changed, 76 insertions(+), 37 deletions(-) (limited to 'openvpn/src') diff --git a/openvpn/src/openvpn/proxy.c b/openvpn/src/openvpn/proxy.c index a2721cdc..80f5b87a 100644 --- a/openvpn/src/openvpn/proxy.c +++ b/openvpn/src/openvpn/proxy.c @@ -488,6 +488,75 @@ http_proxy_close (struct http_proxy_info *hp) free (hp); } +bool +add_proxy_header (struct http_proxy_info *p, + socket_descriptor_t sd, /* already open to proxy */ + const char *host, /* openvpn server remote */ + const char *port /* openvpn server port */ + ) +{ + char buf[512]; + int i; + bool hostheadercustom=false; + + /* Check if any of the custom headers already provides Host: */ + i=0; + while (p->options.custom_headers[i].name) + { + if( + ((!strcasecmp(p->options.custom_headers[i].name, "Host")) && + (p->options.custom_headers[i].content)) + || + ((!strncasecmp(p->options.custom_headers[i].name, "Host:", 5)) && + p->options.custom_headers[i].content == NULL) + ) + hostheadercustom=true; + i++; + } + + if (!hostheadercustom) + { + openvpn_snprintf (buf, sizeof(buf), "Host: %s", host); + msg (D_PROXY, "Send to HTTP proxy: '%s'", buf); + if (!send_line_crlf(sd, buf)) + return false; + } + + /* send User-Agent string if provided */ + if (p->options.user_agent) + { + openvpn_snprintf (buf, sizeof(buf), "User-Agent: %s", + p->options.user_agent); + msg (D_PROXY, "Send to HTTP proxy: '%s'", buf); + if (!send_line_crlf (sd, buf)) + return false; + } + + /* + * Send custom headers if provided + * If content is NULL whole header is in name + */ + i=0; + while (p->options.custom_headers[i].name) + { + if (p->options.custom_headers[i].content) + openvpn_snprintf (buf, sizeof(buf), "%s: %s", + p->options.custom_headers[i].name, + p->options.custom_headers[i].content); + else + openvpn_snprintf (buf, sizeof(buf), "%s", + p->options.custom_headers[i].name); + + msg (D_PROXY, "Send to HTTP proxy: '%s'", buf); + if (!send_line_crlf (sd, buf)) + return false; + i++; + } + + return true; +} + + bool establish_http_proxy_passthru (struct http_proxy_info *p, socket_descriptor_t sd, /* already open to proxy */ @@ -519,7 +588,6 @@ establish_http_proxy_passthru (struct http_proxy_info *p, } else { - int i=0; /* format HTTP CONNECT message */ openvpn_snprintf (buf, sizeof(buf), "CONNECT %s:%s HTTP/%s", host, @@ -531,35 +599,10 @@ establish_http_proxy_passthru (struct http_proxy_info *p, /* send HTTP CONNECT message to proxy */ if (!send_line_crlf (sd, buf)) goto error; - - openvpn_snprintf(buf, sizeof(buf), "Host: %s", host); - if (!send_line_crlf(sd, buf)) + + if(!add_proxy_header (p, sd, host, port)) goto error; - /* send User-Agent string if provided */ - if (p->options.user_agent) - { - openvpn_snprintf (buf, sizeof(buf), "User-Agent: %s", - p->options.user_agent); - if (!send_line_crlf (sd, buf)) - goto error; - } - /* Send custom headers if provided */ - while (p->options.custom_headers[i].name) - { - if (p->options.custom_headers[i].content) - openvpn_snprintf (buf, sizeof(buf), "%s: %s", - p->options.custom_headers[i].name, - p->options.custom_headers[i].content); - else - openvpn_snprintf (buf, sizeof(buf), "%s", - p->options.custom_headers[i].name); - - if (!send_line_crlf (sd, buf)) - goto error; - i++; - } - /* auth specified? */ switch (p->auth_method) { @@ -675,12 +718,10 @@ establish_http_proxy_passthru (struct http_proxy_info *p, /* send HOST etc, */ - openvpn_snprintf (buf, sizeof(buf), "Host: %s", host); - msg (D_PROXY, "Send to HTTP proxy: '%s'", buf); - if (!send_line_crlf (sd, buf)) - goto error; + if(!add_proxy_header (p, sd, host, port)) + goto error; - msg (D_PROXY, "Attempting NTLM Proxy-Authorization phase 3"); + msg (D_PROXY, "Attempting NTLM Proxy-Authorization phase 3"); { const char *np3 = ntlm_phase_3 (p, buf2, &gc); if (!np3) @@ -786,10 +827,8 @@ establish_http_proxy_passthru (struct http_proxy_info *p, goto error; /* send HOST etc, */ - openvpn_snprintf (buf, sizeof(buf), "Host: %s", host); - msg (D_PROXY, "Send to HTTP proxy: '%s'", buf); - if (!send_line_crlf (sd, buf)) - goto error; + if(!add_proxy_header (p, sd, host, port)) + goto error; /* send digest response */ openvpn_snprintf (buf, sizeof(buf), "Proxy-Authorization: Digest username=\"%s\", realm=\"%s\", nonce=\"%s\", uri=\"%s\", qop=%s, nc=%s, cnonce=\"%s\", response=\"%s\"%s", -- cgit v1.2.3