mirror of
https://gitlab.com/davical-project/davical.git
synced 2026-05-23 02:14:16 +00:00
Allow PROPFIND to find arbitrary properties.
This commit is contained in:
parent
475e1973fe
commit
de3f11b695
@ -20,6 +20,7 @@ require_once("iCalendar.php");
|
|||||||
$href_list = array();
|
$href_list = array();
|
||||||
$attribute_list = array();
|
$attribute_list = array();
|
||||||
$unsupported = array();
|
$unsupported = array();
|
||||||
|
$arbitrary = array();
|
||||||
|
|
||||||
foreach( $request->xml_tags AS $k => $v ) {
|
foreach( $request->xml_tags AS $k => $v ) {
|
||||||
|
|
||||||
@ -71,15 +72,29 @@ foreach( $request->xml_tags AS $k => $v ) {
|
|||||||
case 'DAV::HREF':
|
case 'DAV::HREF':
|
||||||
// dbg_log_array( "PROPFIND", "DAV::HREF", $v, true );
|
// dbg_log_array( "PROPFIND", "DAV::HREF", $v, true );
|
||||||
$href_list[] = $v['value'];
|
$href_list[] = $v['value'];
|
||||||
|
dbg_error_log( "PROPFIND", "Adding attribute '%s'", $attribute );
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
/**
|
||||||
|
* Add the ones that are specifically unsupported here.
|
||||||
|
*/
|
||||||
|
case 'UNSUPPORTED':
|
||||||
if ( preg_match('/^(.*):([^:]+)$/', $tag, $matches) ) {
|
if ( preg_match('/^(.*):([^:]+)$/', $tag, $matches) ) {
|
||||||
$unsupported[$matches[2]] = $matches[1];
|
$unsupported[$matches[2]] = $matches[1];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$unsupported[$tag] = "";
|
$unsupported[$tag] = "";
|
||||||
}
|
}
|
||||||
dbg_error_log( "PROPFIND", "Unhandled tag >>%s<<", $tag);
|
dbg_error_log( "PROPFIND", "Unsupported tag >>%s<<", $tag);
|
||||||
|
break;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the ones that are specifically unsupported here.
|
||||||
|
*/
|
||||||
|
default:
|
||||||
|
$arbitrary[$tag] = $tag;
|
||||||
|
dbg_error_log( "PROPFIND", "Adding arbitrary DAV property '%s'", $attribute );
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,14 +110,42 @@ function privileges($privilege_names, $container="privilege") {
|
|||||||
return $privileges;
|
return $privileges;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches any arbitrary properties that were requested by the PROPFIND into an
|
||||||
|
* array, which we return.
|
||||||
|
* @return array The arbitrary properties.
|
||||||
|
*/
|
||||||
|
function get_arbitrary_properties($dav_name) {
|
||||||
|
global $arbitrary;
|
||||||
|
|
||||||
|
$results = array();
|
||||||
|
|
||||||
|
if ( count($arbitrary) > 0 ) {
|
||||||
|
$sql = "";
|
||||||
|
foreach( $arbitrary AS $k => $v ) {
|
||||||
|
$sql .= ($sql == "" ? "" : ", ") . qpg($k);
|
||||||
|
}
|
||||||
|
$qry = new PgQuery("SELECT property_name, property_value FROM property WHERE dav_name=? AND property_name IN ($sql)", $dav_name );
|
||||||
|
while( $qry->Exec("PROPFIND") && $property = $qry->Fetch() ) {
|
||||||
|
$results[$property->property_name] = $property->property_value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an XML sub-tree for a single collection record from the DB
|
* Returns an XML sub-tree for a single collection record from the DB
|
||||||
*/
|
*/
|
||||||
function collection_to_xml( $collection ) {
|
function collection_to_xml( $collection ) {
|
||||||
global $attribute_list, $session, $c, $request;
|
global $arbitrary, $attribute_list, $session, $c, $request;
|
||||||
|
|
||||||
dbg_error_log("PROPFIND","Building XML Response for collection '%s'", $collection->dav_name );
|
dbg_error_log("PROPFIND","Building XML Response for collection '%s'", $collection->dav_name );
|
||||||
|
|
||||||
|
$collection->properties = get_arbitrary_properties($collection->dav_name);
|
||||||
|
|
||||||
$url = $_SERVER['SCRIPT_NAME'] . $collection->dav_name;
|
$url = $_SERVER['SCRIPT_NAME'] . $collection->dav_name;
|
||||||
$resourcetypes = array( new XMLElement("collection") );
|
$resourcetypes = array( new XMLElement("collection") );
|
||||||
$contentlength = false;
|
$contentlength = false;
|
||||||
@ -142,6 +185,13 @@ function collection_to_xml( $collection ) {
|
|||||||
if ( isset($attribute_list['ALLPROP']) || isset($attribute_list['CURRENT-USER-PRIVILEGE-SET']) ) {
|
if ( isset($attribute_list['ALLPROP']) || isset($attribute_list['CURRENT-USER-PRIVILEGE-SET']) ) {
|
||||||
$prop->NewElement("current-user-privilege-set", privileges($request->permissions) );
|
$prop->NewElement("current-user-privilege-set", privileges($request->permissions) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( count($arbitrary) > 0 ) {
|
||||||
|
foreach( $arbitrary AS $k => $v ) {
|
||||||
|
$prop->NewElement($k, $collection->properties[$k]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if ( isset($attribute_list['ACL']) ) {
|
if ( isset($attribute_list['ACL']) ) {
|
||||||
/**
|
/**
|
||||||
* FIXME: This information is semantically valid but presents an incorrect picture.
|
* FIXME: This information is semantically valid but presents an incorrect picture.
|
||||||
@ -190,6 +240,8 @@ function item_to_xml( $item ) {
|
|||||||
|
|
||||||
dbg_error_log("PROPFIND","Building XML Response for item '%s'", $item->dav_name );
|
dbg_error_log("PROPFIND","Building XML Response for item '%s'", $item->dav_name );
|
||||||
|
|
||||||
|
$item->properties = get_arbitrary_properties($item->dav_name);
|
||||||
|
|
||||||
$url = $_SERVER['SCRIPT_NAME'] . $item->dav_name;
|
$url = $_SERVER['SCRIPT_NAME'] . $item->dav_name;
|
||||||
$prop = new XMLElement("prop");
|
$prop = new XMLElement("prop");
|
||||||
if ( isset($attribute_list['ALLPROP']) || isset($attribute_list['GETLASTMODIFIED']) ) {
|
if ( isset($attribute_list['ALLPROP']) || isset($attribute_list['GETLASTMODIFIED']) ) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user