1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102:
<?php
function get_href_containers( &$multistatus_response ) {
$propstat_set = $multistatus_response->GetElements('DAV::propstat');
$propstat_200 = null;
foreach( $propstat_set AS $k => $v ) {
$status = $v->GetElements('DAV::status');
if ( preg_match( '{^HTTP/\S+\s+200}', $status[0]->GetContent() ) ) {
$propstat_200 = $v;
break;
}
}
if ( isset($propstat_200) ) {
$props = $propstat_200->GetElements('DAV::prop');
$properties = array();
foreach( $props AS $k => $p ) {
$properties = array_merge($properties,$p->GetElements());
}
$href_containers = array();
foreach( $properties AS $k => $property ) {
if ( !is_object($property) ) continue;
$hrefs = $property->GetElements('DAV::href');
if ( count($hrefs) > 0 ) {
$href_containers[] = $property;
}
}
if ( count($href_containers) > 0 ) {
return $href_containers;
}
}
return null;
}
function expand_properties( $urls, $ptree, &$reply, $recurse_again = true ) {
if ( !is_array($urls) ) $urls = array($urls);
if ( !is_array($ptree) ) $ptree = array($ptree);
$responses = array();
foreach( $urls AS $m => $url ) {
$resource = new DAVResource($url);
$props = array();
$subtrees = array();
foreach( $ptree AS $n => $property ) {
if ( ! is_object($property) ) continue;
$pname = $property->GetAttribute('name');
$pns = $property->GetAttribute('namespace');
if ( empty($pns) ) $pns = $property->GetAttribute('xmlns');
if ( empty($pns) ) $pns = $reply->DefaultNamespace();
$pname = (empty($pns)?'':$pns .':'). $pname;
$props[] = $pname;
$subtrees[$pname] = $property->GetElements();
}
$part_response = $resource->RenderAsXML( $props, $reply );
if ( isset($part_response) ) {
if ( $recurse_again ) {
$href_containers = get_href_containers($part_response);
if ( isset($href_containers) ) {
foreach( $href_containers AS $h => $property ) {
$hrefs = $property->GetElements();
$pname = $property->GetNSTag();
$paths = array();
foreach( $hrefs AS $k => $v ) {
$content = $v->GetContent();
if($content[0]=='/' && $content!='/caldav.php'.str_replace( '%2F', '/', rawurlencode($url)))
$paths[] = $content;
}
$property->SetContent( expand_properties($paths, $subtrees[$pname], $reply, false) );
}
}
}
$responses[] = $part_response;
}
}
return $responses;
}
$property_tree = $xmltree->GetPath('/DAV::expand-property/DAV::property');
$multistatus = new XMLElement( "multistatus", expand_properties( $request->path, $property_tree, $reply), $reply->GetXmlNsArray() );
$request->XMLResponse( 207, $multistatus );