]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mod_dav: Some DAV extensions, like CalDAV, specify both document
authorGraham Leggett <minfrin@apache.org>
Wed, 15 Jul 2020 13:56:55 +0000 (13:56 +0000)
committerGraham Leggett <minfrin@apache.org>
Wed, 15 Jul 2020 13:56:55 +0000 (13:56 +0000)
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

CHANGES
include/ap_mmn.h
modules/dav/main/mod_dav.h
modules/dav/main/props.c

diff --git a/CHANGES b/CHANGES
index 3945a7f9fe835a05403f427d99e97261a938c93d..bbd6d1ec64ea4627388ef076b9f2f16a3f6e5ed4 100644 (file)
--- 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.
index a5242d81f3b68e4fc033c4abc3d8f686976a930c..9e7b870c1a8f820baa43ee2852d1f31be1ffe1c4 100644 (file)
  * 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" */
 #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
index 05364f3e9dc1c82b3068d8bc3051b1a0144faa12..b6a6a5f8e446f798cc05f5c2bad87078cebd51f5 100644 (file)
@@ -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.
index 8b0e1212d8277a2fc1f822eb3c72a6a11e299244..37c5666ac1b690e8fdf0351dc5e8e44c134d17c6 100644 (file)
@@ -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.