Re: svn commit: r1861542 - in /httpd/httpd/trunk: docs/manual/mod/mod_alias.xml modules/mappers/mod_alias.c

2019-06-18 Thread Eric Covener
On Tue, Jun 18, 2019 at 9:34 AM William A Rowe Jr  wrote:
>
> Hi Eric,
>
> Looking at this feature, and the new allowance effective June 2014,
> is this something we would want to toggle by envvar (in addition to
> or in lieu of a directive) similar to various gzip, caching, downgrade
> and particularly the redirect-carefully overrides? This seems like
> the sort of feature to dodge for older unsuspecting clients based
> on browsermatch, once the exceptions are identified;
>
> https://httpd.apache.org/docs/2.4/env.html#special

I think in-addition-to would be confusing.

I considered the envvar in lieu of the directive, but over the years
I've come to think that style is not preferred.

My guess is that old browsers handled relative redirects long before
723X, but it would suck to have to use  or add the envvar if
someone really need to turn on this obscure flag AND cope with a
client that got confused by them.


Re: svn commit: r1861542 - in /httpd/httpd/trunk: docs/manual/mod/mod_alias.xml modules/mappers/mod_alias.c

2019-06-18 Thread William A Rowe Jr
Hi Eric,

Looking at this feature, and the new allowance effective June 2014,
is this something we would want to toggle by envvar (in addition to
or in lieu of a directive) similar to various gzip, caching, downgrade
and particularly the redirect-carefully overrides? This seems like
the sort of feature to dodge for older unsuspecting clients based
on browsermatch, once the exceptions are identified;

https://httpd.apache.org/docs/2.4/env.html#special



On Mon, Jun 17, 2019 at 1:35 PM  wrote:

> Author: covener
> Date: Mon Jun 17 18:35:24 2019
> New Revision: 1861542
>
> URL: http://svn.apache.org/viewvc?rev=1861542=rev
> Log:
> add RedirectRelative directive to allow relative Redirect targets
>
> 2616 forbade relative redirect URLs, but 7231 allows them
> Early 2.2 maintenance levels did not fix them up, but later 2.2 and all 2.4
> fixed them up with ap_construct_url().
>
> Allow opt-in to not fixing up relative URLs with RedirectRelative
>
>
>
> Modified:
> httpd/httpd/trunk/docs/manual/mod/mod_alias.xml
> httpd/httpd/trunk/modules/mappers/mod_alias.c
>
> Modified: httpd/httpd/trunk/docs/manual/mod/mod_alias.xml
> URL:
> http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/mod_alias.xml?rev=1861542=1861541=1861542=diff
>
> ==
> --- httpd/httpd/trunk/docs/manual/mod/mod_alias.xml (original)
> +++ httpd/httpd/trunk/docs/manual/mod/mod_alias.xml Mon Jun 17 18:35:24
> 2019
> @@ -621,4 +621,25 @@ ScriptAliasMatch "(?i)^/cgi-bin(.*)" "/u
>  
>  
>
> +
> +RedirectRelative
> +Allows relative redirect targets.
> +RedirectRelative OFF|ON
> +RedirectRelative OFF
> +server configvirtual
> host
> +directory
> +2.5.1 and later
> +
> +
> +
> +By default, if the target URL of a Redirect
> +directive is a relative URL beginning with a '/' character, the
> server
> +converts it to a an absolute URL before responding to the client. By
> +setting RedirectRelative to the value "ON",
> +the relative URL is presented to the client directly.
> +
> +
> +
> +
> +
>  
>
> Modified: httpd/httpd/trunk/modules/mappers/mod_alias.c
> URL:
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mappers/mod_alias.c?rev=1861542=1861541=1861542=diff
>
> ==
> --- httpd/httpd/trunk/modules/mappers/mod_alias.c (original)
> +++ httpd/httpd/trunk/modules/mappers/mod_alias.c Mon Jun 17 18:35:24 2019
> @@ -37,6 +37,10 @@
>  #include "ap_expr.h"
>
>
> +#define ALIAS_FLAG_DEFAULT -1
> +#define ALIAS_FLAG_OFF 0
> +#define ALIAS_FLAG_ON  1
> +
>  typedef struct {
>  const char *real;
>  const char *fake;
> @@ -58,6 +62,7 @@ typedef struct {
>  char *handler;
>  const ap_expr_info_t *redirect;
>  int redirect_status;/* 301, 302, 303, 410, etc */
> +int allow_relative; /* skip ap_construct_url() */
>  } alias_dir_conf;
>
>  module AP_MODULE_DECLARE_DATA alias_module;
> @@ -80,6 +85,7 @@ static void *create_alias_dir_config(apr
>  alias_dir_conf *a =
>  (alias_dir_conf *) apr_pcalloc(p, sizeof(alias_dir_conf));
>  a->redirects = apr_array_make(p, 2, sizeof(alias_entry));
> +a->allow_relative = ALIAS_FLAG_DEFAULT;
>  return a;
>  }
>
> @@ -111,7 +117,9 @@ static void *merge_alias_dir_config(apr_
>  a->redirect = (overrides->redirect_set == 0) ? base->redirect :
> overrides->redirect;
>  a->redirect_status = (overrides->redirect_set == 0) ?
> base->redirect_status : overrides->redirect_status;
>  a->redirect_set = overrides->redirect_set || base->redirect_set;
> -
> +a->allow_relative = (overrides->allow_relative != ALIAS_FLAG_DEFAULT)
> +  ? overrides->allow_relative
> +  : base->allow_relative;
>  return a;
>  }
>
> @@ -591,31 +599,33 @@ static int translate_alias_redir(request
>  if (ret == PREGSUB_ERROR)
>  return HTTP_INTERNAL_SERVER_ERROR;
>  if (ap_is_HTTP_REDIRECT(status)) {
> -if (ret[0] == '/') {
> -char *orig_target = ret;
> -
> -ret = ap_construct_url(r->pool, ret, r);
> -ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
> APLOGNO(00673)
> -  "incomplete redirection target of '%s' for "
> -  "URI '%s' modified to '%s'",
> -  orig_target, r->uri, ret);
> -}
> -if (!ap_is_url(ret)) {
> -status = HTTP_INTERNAL_SERVER_ERROR;
> -ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(00674)
> -  "cannot redirect '%s' to '%s'; "
> -  "target is not a valid absoluteURI or
> abs_path",
> -  r->uri, ret);
> -}
> -else {
> -/* append requested query only, if the config 

Re: svn commit: r1861542 - in /httpd/httpd/trunk: docs/manual/mod/mod_alias.xml modules/mappers/mod_alias.c

2019-06-18 Thread Eric Covener
> In the old code path we did not set the Location header and did not append 
> the args if
> apr_is_url fails. So shouldn't we do a

Thanks, r1861569


Re: svn commit: r1861542 - in /httpd/httpd/trunk: docs/manual/mod/mod_alias.xml modules/mappers/mod_alias.c

2019-06-17 Thread Ruediger Pluem



On 06/17/2019 08:35 PM, cove...@apache.org wrote:
> Author: covener
> Date: Mon Jun 17 18:35:24 2019
> New Revision: 1861542
> 
> URL: http://svn.apache.org/viewvc?rev=1861542=rev
> Log:
> add RedirectRelative directive to allow relative Redirect targets
> 
> 2616 forbade relative redirect URLs, but 7231 allows them
> Early 2.2 maintenance levels did not fix them up, but later 2.2 and all 2.4
> fixed them up with ap_construct_url().
> 
> Allow opt-in to not fixing up relative URLs with RedirectRelative
> 
> 
> 
> Modified:
> httpd/httpd/trunk/docs/manual/mod/mod_alias.xml
> httpd/httpd/trunk/modules/mappers/mod_alias.c
> 

> Modified: httpd/httpd/trunk/modules/mappers/mod_alias.c
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mappers/mod_alias.c?rev=1861542=1861541=1861542=diff
> ==
> --- httpd/httpd/trunk/modules/mappers/mod_alias.c (original)
> +++ httpd/httpd/trunk/modules/mappers/mod_alias.c Mon Jun 17 18:35:24 2019
> @@ -37,6 +37,10 @@
>  #include "ap_expr.h"
>  
>  
> +#define ALIAS_FLAG_DEFAULT -1
> +#define ALIAS_FLAG_OFF 0
> +#define ALIAS_FLAG_ON  1
> +
>  typedef struct {
>  const char *real;
>  const char *fake;
> @@ -58,6 +62,7 @@ typedef struct {
>  char *handler;
>  const ap_expr_info_t *redirect;
>  int redirect_status;/* 301, 302, 303, 410, etc */
> +int allow_relative; /* skip ap_construct_url() */
>  } alias_dir_conf;
>  
>  module AP_MODULE_DECLARE_DATA alias_module;
> @@ -80,6 +85,7 @@ static void *create_alias_dir_config(apr
>  alias_dir_conf *a =
>  (alias_dir_conf *) apr_pcalloc(p, sizeof(alias_dir_conf));
>  a->redirects = apr_array_make(p, 2, sizeof(alias_entry));
> +a->allow_relative = ALIAS_FLAG_DEFAULT;
>  return a;
>  }
>  
> @@ -111,7 +117,9 @@ static void *merge_alias_dir_config(apr_
>  a->redirect = (overrides->redirect_set == 0) ? base->redirect : 
> overrides->redirect;
>  a->redirect_status = (overrides->redirect_set == 0) ? 
> base->redirect_status : overrides->redirect_status;
>  a->redirect_set = overrides->redirect_set || base->redirect_set;
> -
> +a->allow_relative = (overrides->allow_relative != ALIAS_FLAG_DEFAULT)
> +  ? overrides->allow_relative 
> +  : base->allow_relative;
>  return a;
>  }
>  
> @@ -591,31 +599,33 @@ static int translate_alias_redir(request
>  if (ret == PREGSUB_ERROR)
>  return HTTP_INTERNAL_SERVER_ERROR;
>  if (ap_is_HTTP_REDIRECT(status)) {
> -if (ret[0] == '/') {
> -char *orig_target = ret;
> -
> -ret = ap_construct_url(r->pool, ret, r);
> -ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(00673)
> -  "incomplete redirection target of '%s' for "
> -  "URI '%s' modified to '%s'",
> -  orig_target, r->uri, ret);
> -}
> -if (!ap_is_url(ret)) {
> -status = HTTP_INTERNAL_SERVER_ERROR;
> -ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(00674)
> -  "cannot redirect '%s' to '%s'; "
> -  "target is not a valid absoluteURI or 
> abs_path",
> -  r->uri, ret);
> -}
> -else {
> -/* append requested query only, if the config didn't
> - * supply its own.
> - */
> -if (r->args && !ap_strchr(ret, '?')) {
> -ret = apr_pstrcat(r->pool, ret, "?", r->args, NULL);
> +alias_dir_conf *dirconf = (alias_dir_conf *) 
> +ap_get_module_config(r->per_dir_config, _module);
> +if (dirconf->allow_relative != ALIAS_FLAG_ON || ret[0] != '/') {
> +if (ret[0] == '/') {
> +char *orig_target = ret;
> +
> +ret = ap_construct_url(r->pool, ret, r);
> +ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, 
> APLOGNO(00673)
> +  "incomplete redirection target of '%s' for 
> "
> +  "URI '%s' modified to '%s'",
> +  orig_target, r->uri, ret);
>  }
> -apr_table_setn(r->headers_out, "Location", ret);
> +if (!ap_is_url(ret)) {
> +status = HTTP_INTERNAL_SERVER_ERROR;
> +ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(00674)
> +  "cannot redirect '%s' to '%s'; "
> +  "target is not a valid absoluteURI or 
> abs_path",
> +  r->uri, ret);

In the old code path we did not set the Location header and did not append the 
args if