Browse Source

[mod_webdav] store webdav.opts as bitflags

personal/stbuehler/ci-build
Glenn Strauss 1 year ago
parent
commit
965c47c85a
  1. 44
      src/mod_webdav.c

44
src/mod_webdav.c

@ -315,16 +315,19 @@ typedef struct {
#endif
} sql_config;
enum { /* opts bitflags */
MOD_WEBDAV_UNSAFE_PARTIAL_PUT_COMPAT = 0x1
};
typedef struct {
unsigned short enabled;
unsigned short is_readonly;
unsigned short log_xml;
unsigned short deprecated_unsafe_partial_put_compat;
unsigned short opts;
sql_config *sql;
buffer *tmpb;
buffer *sqlite_db_name; /* not used after worker init */
array *opts;
} plugin_config;
typedef struct {
@ -404,8 +407,7 @@ static void mod_webdav_merge_config_cpv(plugin_config * const pconf, const confi
break;
case 4: /* webdav.opts */
if (cpv->vtype == T_CONFIG_LOCAL)
pconf->deprecated_unsafe_partial_put_compat =
(unsigned short)cpv->v.u;
pconf->opts = (unsigned short)cpv->v.u;
break;
default:/* should not happen */
return;
@ -485,19 +487,24 @@ SETDEFAULTS_FUNC(mod_webdav_set_defaults) {
case 3: /* webdav.log-xml */
break;
case 4: /* webdav.opts */
for (uint32_t j = 0, used = cpv->v.a->used; j < used; ++j) {
data_string *ds = (data_string *)cpv->v.a->data[j];
if (buffer_is_equal_string(&ds->key,
CONST_STR_LEN("deprecated-unsafe-partial-put"))) {
cpv->v.u =
buffer_eq_slen(&ds->value,CONST_STR_LEN("enable"));
cpv->vtype = T_CONFIG_LOCAL;
continue;
if (cpv->v.a->used) {
unsigned short opts = 0;
for (uint32_t j = 0, used = cpv->v.a->used; j < used; ++j) {
data_string *ds = (data_string *)cpv->v.a->data[j];
if (buffer_is_equal_string(&ds->key,
CONST_STR_LEN("deprecated-unsafe-partial-put"))
&& buffer_eq_slen(&ds->value,
CONST_STR_LEN("enable"))) {
opts |= MOD_WEBDAV_UNSAFE_PARTIAL_PUT_COMPAT;
continue;
}
log_error(srv->errh, __FILE__, __LINE__,
"unrecognized webdav.opts: %.*s",
BUFFER_INTLEN_PTR(&ds->key));
return HANDLER_ERROR;
}
log_error(srv->errh, __FILE__, __LINE__,
"unrecognized webdav.opts: %.*s",
BUFFER_INTLEN_PTR(&ds->key));
return HANDLER_ERROR;
cpv->v.u = opts;
cpv->vtype = T_CONFIG_LOCAL;
}
break;
default:/* should not happen */
@ -4239,7 +4246,8 @@ mod_webdav_put_prep (request_st * const r, const plugin_config * const pconf)
{
if (NULL != http_header_request_get(r, HTTP_HEADER_OTHER,
CONST_STR_LEN("Content-Range"))) {
if (pconf->deprecated_unsafe_partial_put_compat) return HANDLER_GO_ON;
if (pconf->opts & MOD_WEBDAV_UNSAFE_PARTIAL_PUT_COMPAT)
return HANDLER_GO_ON;
/* [RFC7231] 4.3.4 PUT
* An origin server that allows PUT on a given target resource MUST
* send a 400 (Bad Request) response to a PUT request that contains a
@ -4476,7 +4484,7 @@ mod_webdav_put (request_st * const r, const plugin_config * const pconf)
return HANDLER_FINISHED;
}
if (pconf->deprecated_unsafe_partial_put_compat) {
if (pconf->opts & MOD_WEBDAV_UNSAFE_PARTIAL_PUT_COMPAT) {
const buffer * const h =
http_header_request_get(r, HTTP_HEADER_OTHER,
CONST_STR_LEN("Content-Range"));

Loading…
Cancel
Save