summaryrefslogtreecommitdiff
path: root/httpd-2.4.57-pr37355.patch
diff options
context:
space:
mode:
Diffstat (limited to 'httpd-2.4.57-pr37355.patch')
-rw-r--r--httpd-2.4.57-pr37355.patch143
1 files changed, 143 insertions, 0 deletions
diff --git a/httpd-2.4.57-pr37355.patch b/httpd-2.4.57-pr37355.patch
new file mode 100644
index 0000000..7f57e2b
--- /dev/null
+++ b/httpd-2.4.57-pr37355.patch
@@ -0,0 +1,143 @@
+diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c
+index 537c3c2..596320d 100644
+--- a/modules/proxy/mod_proxy.c
++++ b/modules/proxy/mod_proxy.c
+@@ -1460,11 +1460,20 @@ static int proxy_handler(request_rec *r)
+ /* handle the scheme */
+ ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01142)
+ "Trying to run scheme_handler against proxy");
++
++ if (ents[i].creds) {
++ apr_table_set(r->notes, "proxy-basic-creds", ents[i].creds);
++ ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r,
++ "Using proxy auth creds %s", ents[i].creds);
++ }
++
+ access_status = proxy_run_scheme_handler(r, worker,
+ conf, url,
+ ents[i].hostname,
+ ents[i].port);
+
++ if (ents[i].creds) apr_table_unset(r->notes, "proxy-basic-creds");
++
+ /* Did the scheme handler process the request? */
+ if (access_status != DECLINED) {
+ const char *cl_a;
+@@ -1902,8 +1911,8 @@ static void *merge_proxy_dir_config(apr_pool_t *p, void *basev, void *addv)
+ return new;
+ }
+
+-static const char *
+- add_proxy(cmd_parms *cmd, void *dummy, const char *f1, const char *r1, int regex)
++static const char *add_proxy(cmd_parms *cmd, void *dummy, const char *f1,
++ const char *r1, const char *creds, int regex)
+ {
+ server_rec *s = cmd->server;
+ proxy_server_conf *conf =
+@@ -1961,19 +1970,24 @@ static const char *
+ new->port = port;
+ new->regexp = reg;
+ new->use_regex = regex;
++ if (creds) {
++ new->creds = apr_pstrcat(cmd->pool, "Basic ",
++ ap_pbase64encode(cmd->pool, (char *)creds),
++ NULL);
++ }
+ return NULL;
+ }
+
+-static const char *
+- add_proxy_noregex(cmd_parms *cmd, void *dummy, const char *f1, const char *r1)
++static const char *add_proxy_noregex(cmd_parms *cmd, void *dummy, const char *f1,
++ const char *r1, const char *creds)
+ {
+- return add_proxy(cmd, dummy, f1, r1, 0);
++ return add_proxy(cmd, dummy, f1, r1, creds, 0);
+ }
+
+-static const char *
+- add_proxy_regex(cmd_parms *cmd, void *dummy, const char *f1, const char *r1)
++static const char *add_proxy_regex(cmd_parms *cmd, void *dummy, const char *f1,
++ const char *r1, const char *creds)
+ {
+- return add_proxy(cmd, dummy, f1, r1, 1);
++ return add_proxy(cmd, dummy, f1, r1, creds, 1);
+ }
+
+ PROXY_DECLARE(const char *) ap_proxy_de_socketfy(apr_pool_t *p, const char *url)
+@@ -3012,9 +3026,9 @@ static const command_rec proxy_cmds[] =
+ "location, in regular expression syntax"),
+ AP_INIT_FLAG("ProxyRequests", set_proxy_req, NULL, RSRC_CONF,
+ "on if the true proxy requests should be accepted"),
+- AP_INIT_TAKE2("ProxyRemote", add_proxy_noregex, NULL, RSRC_CONF,
++ AP_INIT_TAKE23("ProxyRemote", add_proxy_noregex, NULL, RSRC_CONF,
+ "a scheme, partial URL or '*' and a proxy server"),
+- AP_INIT_TAKE2("ProxyRemoteMatch", add_proxy_regex, NULL, RSRC_CONF,
++ AP_INIT_TAKE23("ProxyRemoteMatch", add_proxy_regex, NULL, RSRC_CONF,
+ "a regex pattern and a proxy server"),
+ AP_INIT_FLAG("ProxyPassInterpolateEnv", ap_set_flag_slot_char,
+ (void*)APR_OFFSETOF(proxy_dir_conf, interpolate_env),
+diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h
+index c51145e..eaf431d 100644
+--- a/modules/proxy/mod_proxy.h
++++ b/modules/proxy/mod_proxy.h
+@@ -121,6 +121,7 @@ struct proxy_remote {
+ const char *protocol; /* the scheme used to talk to this proxy */
+ const char *hostname; /* the hostname of this proxy */
+ ap_regex_t *regexp; /* compiled regex (if any) for the remote */
++ const char *creds; /* auth credentials (if any) for the proxy */
+ int use_regex; /* simple boolean. True if we have a regex pattern */
+ apr_port_t port; /* the port for this proxy */
+ };
+diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c
+index caafde0..ea36465 100644
+--- a/modules/proxy/proxy_util.c
++++ b/modules/proxy/proxy_util.c
+@@ -2708,11 +2708,14 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r,
+ * So let's make it configurable by env.
+ * The logic here is the same used in mod_proxy_http.
+ */
+- proxy_auth = apr_table_get(r->headers_in, "Proxy-Authorization");
++ proxy_auth = apr_table_get(r->notes, "proxy-basic-creds");
++ if (proxy_auth == NULL)
++ proxy_auth = apr_table_get(r->headers_in, "Proxy-Authorization");
++
+ if (proxy_auth != NULL &&
+ proxy_auth[0] != '\0' &&
+- r->user == NULL && /* we haven't yet authenticated */
+- apr_table_get(r->subprocess_env, "Proxy-Chain-Auth")) {
++ (r->user == NULL /* we haven't yet authenticated */
++ || apr_table_get(r->subprocess_env, "Proxy-Chain-Auth"))) {
+ forward->proxy_auth = apr_pstrdup(conn->pool, proxy_auth);
+ }
+ }
+@@ -2948,7 +2951,8 @@ static apr_status_t send_http_connect(proxy_conn_rec *backend,
+ nbytes = apr_snprintf(buffer, sizeof(buffer),
+ "CONNECT %s:%d HTTP/1.0" CRLF,
+ forward->target_host, forward->target_port);
+- /* Add proxy authorization from the initial request if necessary */
++ /* Add proxy authorization from the configuration, or initial
++ * request if necessary */
+ if (forward->proxy_auth != NULL) {
+ nbytes += apr_snprintf(buffer + nbytes, sizeof(buffer) - nbytes,
+ "Proxy-Authorization: %s" CRLF,
+@@ -3909,6 +3913,7 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbrgd(apr_pool_t *p,
+ int force10 = 0, do_100_continue = 0;
+ conn_rec *origin = p_conn->connection;
+ const char *host, *val;
++ const char *creds;
+ proxy_dir_conf *dconf = ap_get_module_config(r->per_dir_config, &proxy_module);
+
+ /*
+@@ -4131,6 +4136,11 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbrgd(apr_pool_t *p,
+ /* run hook to fixup the request we are about to send */
+ proxy_run_fixups(r);
+
++ creds = apr_table_get(r->notes, "proxy-basic-creds");
++ if (creds) {
++ apr_table_mergen(r->headers_in, "Proxy-Authorization", creds);
++ }
++
+ /* We used to send `Host: ` always first, so let's keep it that
+ * way. No telling which legacy backend is relying on this.
+ * If proxy_run_fixups() changed the value, use it (though removal