Skip to content

Commit

Permalink
Add DAVBasePath directive to allow users to configure the real repos
Browse files Browse the repository at this point in the history
root path if the DAV repos is configured using a regex match.

* modules/dav/main/mod_dav.c
  (dav_get_resource): If available, pass the configured base path
  as the repos root to repos provider.
  On the error path for fetching a resource, detect and warn
  specifically when the location is configured via a regex.
  (dav_cmd_davbasepath): New function.

PR: 35077
  • Loading branch information
notroj committed Aug 14, 2023
1 parent 7bd9e8b commit 974e71a
Showing 1 changed file with 36 additions and 2 deletions.
38 changes: 36 additions & 2 deletions modules/dav/main/mod_dav.c
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ typedef struct {
const char *provider_name;
const dav_provider *provider;
const char *dir;
const char *base;
int locktimeout;
int allow_depthinfinity;
int allow_lockdiscovery;
Expand Down Expand Up @@ -207,6 +208,7 @@ static void *dav_merge_dir_config(apr_pool_t *p, void *base, void *overrides)

newconf->locktimeout = DAV_INHERIT_VALUE(parent, child, locktimeout);
newconf->dir = DAV_INHERIT_VALUE(parent, child, dir);
newconf->base = DAV_INHERIT_VALUE(parent, child, base);
newconf->allow_depthinfinity = DAV_INHERIT_VALUE(parent, child,
allow_depthinfinity);
newconf->allow_lockdiscovery = DAV_INHERIT_VALUE(parent, child,
Expand Down Expand Up @@ -295,6 +297,18 @@ static const char *dav_cmd_dav(cmd_parms *cmd, void *config, const char *arg1)
return NULL;
}

/*
* Command handler for the DAVBasePath directive, which is TAKE1
*/
static const char *dav_cmd_davbasepath(cmd_parms *cmd, void *config, const char *arg1)
{
dav_dir_conf *conf = config;

conf->base = arg1;

return NULL;
}

/*
* Command handler for the DAVDepthInfinity directive, which is FLAG.
*/
Expand Down Expand Up @@ -788,7 +802,7 @@ DAV_DECLARE(dav_error *) dav_get_resource(request_rec *r, int label_allowed,
int use_checked_in, dav_resource **res_p)
{
dav_dir_conf *conf;
const char *label = NULL;
const char *label = NULL, *base;
dav_error *err;

/* if the request target can be overridden, get any target selector */
Expand All @@ -805,11 +819,27 @@ DAV_DECLARE(dav_error *) dav_get_resource(request_rec *r, int label_allowed,
ap_escape_html(r->pool, r->uri)));
}

/* Take the repos root from DAVBasePath if configured, else the
* path of the enclosing section. */
base = conf->base ? conf->base : conf->dir;

/* resolve the resource */
err = (*conf->provider->repos->get_resource)(r, conf->dir,
err = (*conf->provider->repos->get_resource)(r, base,
label, use_checked_in,
res_p);
if (err != NULL) {
/* In the error path, give a hint that DavBasePath needs to be
* used if the location was configured via a regex match. */
if (!conf->base) {
core_dir_config *conf = ap_get_core_module_config(r->per_dir_config);

if (conf->r) {
ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, APLOGNO(10484)
"failed to find repository for location configured "
"via regex match - missing DAVBasePath?");
}
}

err = dav_push_error(r->pool, err->status, 0,
"Could not fetch resource information.", err);
return err;
Expand Down Expand Up @@ -5289,6 +5319,10 @@ static const command_rec dav_cmds[] =
AP_INIT_TAKE1("DAV", dav_cmd_dav, NULL, ACCESS_CONF,
"specify the DAV provider for a directory or location"),

/* per directory/location */
AP_INIT_TAKE1("DAVBasePath", dav_cmd_davbasepath, NULL, ACCESS_CONF,
"specify the DAV repository base URL"),

/* per directory/location, or per server */
AP_INIT_TAKE1("DAVMinTimeout", dav_cmd_davmintimeout, NULL,
ACCESS_CONF|RSRC_CONF,
Expand Down

0 comments on commit 974e71a

Please sign in to comment.