From: Graham Leggett Date: Wed, 15 Jul 2020 13:56:55 +0000 (+0000) Subject: mod_dav: Some DAV extensions, like CalDAV, specify both document X-Git-Tag: 2.5.0-alpha2-ci-test-only~1261 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c52f3e8c6c376387a9002a777b98e2ddba64564a;p=thirdparty%2Fapache%2Fhttpd.git mod_dav: Some DAV extensions, like CalDAV, specify both document elements and property elements that need to be taken into account when generating a property. The document element and property element are made available in the dav_liveprop_elem structure under the DAV_PROP_ELEMENT key in the resource pool. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1879889 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 3945a7f9fe8..bbd6d1ec64e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,12 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.1 + *) mod_dav: Some DAV extensions, like CalDAV, specify both document + elements and property elements that need to be taken into account + when generating a property. The document element and property element + are made available in the dav_liveprop_elem structure under the + DAV_PROP_ELEMENT key in the resource pool. [Graham Leggett] + *) mod_dav: Add utility functions dav_validate_root_ns(), dav_find_child_ns(), dav_find_next_ns(), dav_find_attr_ns() and dav_find_attr() so that other modules get to play too. diff --git a/include/ap_mmn.h b/include/ap_mmn.h index a5242d81f3b..9e7b870c1a8 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -657,6 +657,8 @@ * 20200705.1 (2.5.1-dev) Add dav_validate_root_ns(), dav_find_child_ns(), * dav_find_next_ns(), dav_find_attr_ns() and * dav_find_attr(). + * 20200705.2 (2.5.1-dev) Add dav_liveprop_elem structure and + * DAV_PROP_ELEMENT key. */ #define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */ @@ -664,7 +666,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20200705 #endif -#define MODULE_MAGIC_NUMBER_MINOR 1 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 2 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/modules/dav/main/mod_dav.h b/modules/dav/main/mod_dav.h index 05364f3e9dc..b6a6a5f8e44 100644 --- a/modules/dav/main/mod_dav.h +++ b/modules/dav/main/mod_dav.h @@ -913,6 +913,14 @@ struct dav_hooks_liveprop ** property, and does not want it handled as a dead property, it should ** return DAV_PROP_INSERT_NOTSUPP. ** + ** Some DAV extensions, like CalDAV, specify both document elements + ** and property elements that need to be taken into account when + ** generating a property. The document element and property element + ** are made available in the dav_liveprop_elem structure under the + ** DAV_PROP_ELEMENT key in the resource pool, accessible as follows: + ** + ** apr_pool_userdata_get(&elem, DAV_PROP_ELEMENT, resource->pool); + ** ** Returns one of DAV_PROP_INSERT_* based on what happened. ** ** ### we may need more context... ie. the lock database @@ -1060,6 +1068,20 @@ DAV_DECLARE(long) dav_get_liveprop_ns_count(void); DAV_DECLARE(void) dav_add_all_liveprop_xmlns(apr_pool_t *p, apr_text_header *phdr); +/* + ** When calling insert_prop(), the request element is associated with + ** the pool userdata attached to the resource. Access as follows: + ** + ** apr_pool_userdata_get(&elem, DAV_PROP_ELEMENT, resource->pool); + ** + */ +#define DAV_PROP_ELEMENT "mod_dav-element" + +typedef struct { + const apr_xml_doc *doc; + const apr_xml_elem *elem; +} dav_liveprop_elem; + /* ** The following three functions are part of mod_dav's internal handling ** for the core WebDAV properties. They are not part of mod_dav's API. diff --git a/modules/dav/main/props.c b/modules/dav/main/props.c index 8b0e1212d82..37c5666ac1b 100644 --- a/modules/dav/main/props.c +++ b/modules/dav/main/props.c @@ -795,10 +795,18 @@ DAV_DECLARE(dav_get_props_result) dav_get_props(dav_propdb *propdb, apr_text_header hdr_ns = { 0 }; int have_good = 0; dav_get_props_result result = { 0 }; + dav_liveprop_elem *element; char *marks_liveprop; dav_xmlns_info *xi; int xi_filled = 0; + /* we lose both the document and the element when calling (insert_prop), + * make these available in the pool. + */ + element = apr_pcalloc(propdb->resource->pool, sizeof(dav_liveprop_elem)); + element->doc = doc; + apr_pool_userdata_setn(element, DAV_PROP_ELEMENT, NULL, propdb->resource->pool); + /* ### NOTE: we should pass in TWO buffers -- one for keys, one for the marks */ @@ -822,6 +830,8 @@ DAV_DECLARE(dav_get_props_result) dav_get_props(dav_propdb *propdb, dav_prop_insert inserted; dav_prop_name name; + element->elem = elem; + /* ** First try live property providers; if they don't handle ** the property, then try looking it up in the propdb.