Simple changes for new XML processing.

This commit is contained in:
Andrew McMillan 2012-04-30 08:42:34 +12:00
parent 169b78efa6
commit acc6c719f7
12 changed files with 62 additions and 61 deletions

View File

@ -104,32 +104,32 @@ $cache_delete_list = array();
$qry = new AwlQuery('BEGIN');
$qry->Exec('ACL',__LINE__,__FILE__);
function process_ace( $grantor, $by_principal, $by_collection, XMLElement $ace ) {
function process_ace( $grantor, $by_principal, $by_collection, $ace ) {
global $cache_delete_list, $request;
$elements = $ace->GetContent();
$principal_node = $elements[0];
$grant = $elements[1];
if ( $principal_node->GetTag() != 'DAV::principal' ) $request->MalformedRequest('ACL request must contain a principal, not '.$principal->GetTag());
$grant_tag = $grant->GetTag();
if ( $principal_node->GetNSTag() != 'DAV::principal' ) $request->MalformedRequest('ACL request must contain a principal, not '.$principal->GetNSTag());
$grant_tag = $grant->GetNSTag();
if ( $grant_tag == 'DAV::deny' ) $request->PreconditionFailed(403,'grant-only');
if ( $grant_tag == 'DAV::invert' ) $request->PreconditionFailed(403,'no-invert');
if ( $grant->GetTag() != 'DAV::grant' ) $request->MalformedRequest('ACL request must contain a principal for each ACE');
if ( $grant->GetNSTag() != 'DAV::grant' ) $request->MalformedRequest('ACL request must contain a principal for each ACE');
$privilege_names = array();
$xml_privs = $grant->GetPath("/DAV::grant/DAV::privilege/*");
foreach( $xml_privs AS $k => $priv ) {
$privilege_names[] = $priv->GetTag();
$privilege_names[] = $priv->GetNSTag();
}
$privileges = privilege_to_bits($privilege_names);
$principal_content = $principal_node->GetContent();
if ( count($principal_content) != 1 ) $request->MalformedRequest('ACL request must contain exactly one principal per ACE');
$principal_content = $principal_content[0];
switch( $principal_content->GetTag() ) {
switch( $principal_content->GetNSTag() ) {
case 'DAV::property':
$principal_property = $principal_content->GetContent();
if ( $principal_property[0]->GetTag() != 'DAV::owner' ) $request->PreconditionFailed(403, 'recognized-principal' );
if ( $principal_property[0]->GetNSTag() != 'DAV::owner' ) $request->PreconditionFailed(403, 'recognized-principal' );
if ( privilege_to_bits('all') != $privileges ) {
$request->PreconditionFailed(403, 'no-protected-ace-conflict', 'Owner must always have all permissions' );
}

View File

@ -54,17 +54,17 @@ if ( isset($request->xml_tags) ) {
*/
$position = 0;
$xmltree = BuildXMLTree( $request->xml_tags, $position);
if ( $xmltree->GetTag() == 'DAV::mkcol' ) $request_type = 'extended-mkcol';
if ( $xmltree->GetNSTag() == 'DAV::mkcol' ) $request_type = 'extended-mkcol';
if ( $xmltree->GetTag() != 'urn:ietf:params:xml:ns:caldav:mkcalendar' && $request_type != 'extended-mkcol' ) {
$request->DoResponse( 406, sprintf('The XML is not a "DAV::mkcol" or "urn:ietf:params:xml:ns:caldav:mkcalendar" document (%s)', $xmltree->GetTag()) );
if ( $xmltree->GetNSTag() != 'urn:ietf:params:xml:ns:caldav:mkcalendar' && $request_type != 'extended-mkcol' ) {
$request->DoResponse( 406, sprintf('The XML is not a "DAV::mkcol" or "urn:ietf:params:xml:ns:caldav:mkcalendar" document (%s)', $xmltree->GetNSTag()) );
}
$setprops = $xmltree->GetContent(); // <set>
$setprops = $setprops[0]->GetContent(); // <prop>
$setprops = $setprops[0]->GetContent(); // the array of properties.
foreach( $setprops AS $k => $setting ) {
$tag = $setting->GetTag();
$tag = $setting->GetNSTag();
$content = $setting->RenderContent();
dbg_error_log( 'MKCOL', 'Processing tag "%s"', $tag);
@ -85,7 +85,11 @@ if ( isset($request->xml_tags) ) {
}
else {
$resourcetypes = $setting->GetPath('DAV::resourcetype/*');
$resourcetypes = str_replace( "\n", "", implode('',$resourcetypes));
$types = '';
foreach( $resourcetypes AS $k => $v ) {
$types .= '<'.$v->GetNSTag().'/>';
}
$resourcetypes = $types;
$success[$tag] = 1;
}
break;

View File

@ -35,8 +35,8 @@ if ( ! isset($request->xml_tags) ) {
}
$xmltree = BuildXMLTree( $request->xml_tags, $position);
if ( $xmltree->GetTag() != 'http://www.xythos.com/namespaces/StorageServer:ticketinfo' &&
$xmltree->GetTag() != 'DAV::ticketinfo' ) {
if ( $xmltree->GetNSTag() != 'http://www.xythos.com/namespaces/StorageServer:ticketinfo' &&
$xmltree->GetNSTag() != 'DAV::ticketinfo' ) {
$request->XMLResponse( 400, new XMLElement( 'error', new XMLElement('invalid-xml-for-request'), $reply->GetXmlNsArray() ) );
}
@ -44,7 +44,7 @@ $ticket_timeout = 'Seconds-3600';
$ticket_privs_array = array('read-free-busy');
foreach( $xmltree->GetContent() AS $k => $v ) {
// <!ELEMENT ticketinfo (id?, owner?, timeout, visits, privilege)>
switch( $v->GetTag() ) {
switch( $v->GetNSTag() ) {
case 'DAV::timeout':
case 'http://www.xythos.com/namespaces/StorageServer:timeout':
$ticket_timeout = $v->GetContent();
@ -55,7 +55,7 @@ foreach( $xmltree->GetContent() AS $k => $v ) {
$ticket_privs_array = $v->GetElements(); // Ensure we always get an array back
$ticket_privileges = 0;
foreach( $ticket_privs_array AS $k1 => $v1 ) {
$ticket_privileges |= privilege_to_bits( $v1->GetTag() );
$ticket_privileges |= privilege_to_bits( $v1->GetNSTag() );
}
if ( $ticket_privileges & privilege_to_bits('write') ) $ticket_privileges |= privilege_to_bits( 'read' );
if ( $ticket_privileges & privilege_to_bits('read') ) $ticket_privileges |= privilege_to_bits( array('read-free-busy', 'read-current-user-privilege-set') );

View File

@ -31,7 +31,7 @@ else {
$allprop = $xmltree->GetPath('/DAV::propfind/*');
$property_list = array();
foreach( $allprop AS $k1 => $propwrap ) {
switch ( $propwrap->GetTag() ) {
switch ( $propwrap->GetNSTag() ) {
case 'DAV::allprop':
$property_list[] = 'DAV::allprop';
break;
@ -41,7 +41,7 @@ else {
default: // prop, include
$subprop = $propwrap->GetElements();
foreach( $subprop AS $k => $v ) {
if ( is_object($v) && method_exists($v,'GetTag') ) $property_list[] = $v->GetTag();
if ( is_object($v) && method_exists($v,'GetTag') ) $property_list[] = $v->GetNSTag();
}
}
}

View File

@ -31,23 +31,23 @@ $qry_content = $xmltree->GetContent('urn:ietf:params:xml:ns:caldav:calendar-quer
$properties = array();
while (list($idx, $qqq) = each($qry_content))
{
$proptype = $qry_content[$idx]->GetTag();
$proptype = $qry_content[$idx]->GetNSTag();
switch( $proptype ) {
case 'DAV::prop':
$qry_props = $xmltree->GetPath('/urn:ietf:params:xml:ns:caldav:calendar-query/'.$proptype.'/*');
foreach( $qry_content[$idx]->GetElements() AS $k => $v ) {
$propertyname = preg_replace( '/^.*:/', '', $v->GetTag() );
$propertyname = $v->GetTag();
$properties[$propertyname] = 1;
if ( $v->GetTag() == 'urn:ietf:params:xml:ns:caldav:calendar-data' ) check_for_expansion($v);
if ( $v->GetNSTag() == 'urn:ietf:params:xml:ns:caldav:calendar-data' ) check_for_expansion($v);
}
break;
case 'DAV::allprop':
$properties['allprop'] = 1;
if ( $qry_content[$idx]->GetTag() == 'DAV::include' ) {
if ( $qry_content[$idx]->GetNSTag() == 'DAV::include' ) {
foreach( $qry_content[$idx]->GetElements() AS $k => $v ) {
$include_properties[] = $v->GetTag(); /** $include_properties is referenced in DAVResource where allprop is expanded */
if ( $v->GetTag() == 'urn:ietf:params:xml:ns:caldav:calendar-data' ) check_for_expansion($v);
$include_properties[] = $v->GetNSTag(); /** $include_properties is referenced in DAVResource where allprop is expanded */
if ( $v->GetNSTag() == 'urn:ietf:params:xml:ns:caldav:calendar-data' ) check_for_expansion($v);
}
}
break;
@ -97,7 +97,7 @@ function SqlFilterFragment( $filter, $components, $property = null, $parameter =
}
foreach( $filter AS $k => $v ) {
$tag = $v->GetTag();
$tag = $v->GetNSTag();
dbg_error_log("calquery", "Processing $tag into SQL - %d, '%s', %d\n", count($components), $property, isset($parameter) );
$not_defined = "";
@ -274,10 +274,10 @@ function SqlFilterFragment( $filter, $components, $property = null, $parameter =
*/
function BuildSqlFilter( $filter ) {
$components = array();
if ( $filter->GetTag() == "urn:ietf:params:xml:ns:caldav:comp-filter" && $filter->GetAttribute("name") == "VCALENDAR" )
if ( $filter->GetNSTag() == "urn:ietf:params:xml:ns:caldav:comp-filter" && $filter->GetAttribute("name") == "VCALENDAR" )
$filter = $filter->GetContent(); // Everything is inside a VCALENDAR AFAICS
else {
dbg_error_log("calquery", "Got bizarre CALDAV:FILTER[%s=%s]] which does not contain comp-filter = VCALENDAR!!", $filter->GetTag(), $filter->GetAttribute("name") );
dbg_error_log("calquery", "Got bizarre CALDAV:FILTER[%s=%s]] which does not contain comp-filter = VCALENDAR!!", $filter->GetNSTag(), $filter->GetAttribute("name") );
}
return SqlFilterFragment( $filter, $components );
}

View File

@ -17,24 +17,24 @@ function get_address_properties( $address_data_xml ) {
* Build the array of properties to include in the report output
*/
$qry_content = $xmltree->GetContent('urn:ietf:params:xml:ns:carddav:addressbook-query');
$proptype = $qry_content[0]->GetTag();
$proptype = $qry_content[0]->GetNSTag();
$properties = array();
switch( $proptype ) {
case 'DAV::prop':
$qry_props = $xmltree->GetPath('/urn:ietf:params:xml:ns:carddav:addressbook-query/'.$proptype.'/*');
foreach( $qry_content[0]->GetElements() AS $k => $v ) {
$propertyname = preg_replace( '/^.*:/', '', $v->GetTag() );
$propertyname = preg_replace( '/^.*:/', '', $v->GetNSTag() );
$properties[$propertyname] = 1;
if ( $v->GetTag() == 'urn:ietf:params:xml:ns:carddav:address-data' ) get_address_properties($v);
if ( $v->GetNSTag() == 'urn:ietf:params:xml:ns:carddav:address-data' ) get_address_properties($v);
}
break;
case 'DAV::allprop':
$properties['allprop'] = 1;
if ( $qry_content[1]->GetTag() == 'DAV::include' ) {
if ( $qry_content[1]->GetNSTag() == 'DAV::include' ) {
foreach( $qry_content[1]->GetElements() AS $k => $v ) {
$include_properties[] = $v->GetTag(); /** $include_properties is referenced in DAVResource where allprop is expanded */
if ( $v->GetTag() == 'urn:ietf:params:xml:ns:carddav:address-data' ) get_address_properties($v);
$include_properties[] = $v->GetNSTag(); /** $include_properties is referenced in DAVResource where allprop is expanded */
if ( $v->GetNSTag() == 'urn:ietf:params:xml:ns:carddav:address-data' ) get_address_properties($v);
}
}
break;
@ -90,7 +90,7 @@ function SqlFilterCardDAV( $filter, $components, $property = null, $parameter =
}
foreach( $filter AS $k => $v ) {
$tag = $v->GetTag();
$tag = $v->GetNSTag();
dbg_error_log("cardquery", "Processing $tag into SQL - %d, '%s', %d\n", count($components), $property, isset($parameter) );
$not_defined = "";

View File

@ -53,8 +53,8 @@ function expand_properties( $urls, $ptree, &$reply, $recurse_again = true ) {
foreach( $ptree AS $n => $property ) {
if ( ! is_object($property) ) continue;
$pname = $property->GetAttribute('name');
$pns = $property->GetAttribute('namespace');
if ( !isset($pns) || $pns == '' ) $pns = 'DAV:'; // Not sure if this is the correct way to default this.
$pns = $property->GetNamespace('namespace');
if ( !isset($pns) || $pns == '' ) $pns = $property->GetNameSpace();
$pname = $pns .':'. $pname;
$props[] = $pname;
$subtrees[$pname] = $property->GetElements();
@ -66,10 +66,7 @@ function expand_properties( $urls, $ptree, &$reply, $recurse_again = true ) {
if ( isset($href_containers) ) {
foreach( $href_containers AS $h => $property ) {
$hrefs = $property->GetElements();
$pname = $property->GetTag();
$pns = $property->GetAttribute('xmlns');
if ( !isset($pns) || $pns == '' ) $pns = 'DAV:'; // Not sure if this is the correct way to default this.
$pname = $pns .':'. $pname;
$pname = $property->GetNSTag();
$paths = array();
foreach( $hrefs AS $k => $v ) {
$content = $v->GetContent();

View File

@ -26,24 +26,24 @@ function check_for_expansion( $calendar_data_node ) {
* Build the array of properties to include in the report output
*/
$proptype = $qry_content[0]->GetTag();
$proptype = $qry_content[0]->GetNSTag();
$properties = array();
switch( $proptype ) {
case 'DAV::prop':
$qry_props = $xmltree->GetPath('/*/'.$proptype.'/*');
foreach( $qry_content[0]->GetElements() AS $k => $v ) {
$propertyname = preg_replace( '/^.*:/', '', $v->GetTag() );
$propertyname = preg_replace( '/^.*:/', '', $v->GetNSTag() );
$properties[$propertyname] = 1;
if ( $v->GetTag() == 'urn:ietf:params:xml:ns:caldav:calendar-data' ) check_for_expansion($v);
if ( $v->GetNSTag() == 'urn:ietf:params:xml:ns:caldav:calendar-data' ) check_for_expansion($v);
}
break;
case 'DAV::allprop':
$properties['allprop'] = 1;
if ( $qry_content[1]->GetTag() == 'DAV::include' ) {
if ( $qry_content[1]->GetNSTag() == 'DAV::include' ) {
foreach( $qry_content[1]->GetElements() AS $k => $v ) {
$include_properties[] = $v->GetTag(); /** $include_properties is referenced in DAVResource where allprop is expanded */
if ( $v->GetTag() == 'urn:ietf:params:xml:ns:caldav:calendar-data' ) check_for_expansion($v);
$include_properties[] = $v->GetNSTag(); /** $include_properties is referenced in DAVResource where allprop is expanded */
if ( $v->GetNSTag() == 'urn:ietf:params:xml:ns:caldav:calendar-data' ) check_for_expansion($v);
}
}
break;

View File

@ -42,7 +42,7 @@ $qry = new AwlQuery($sql, $params);
$get_props = $xmltree->GetPath('/DAV::principal-match/DAV::prop/*');
$properties = array();
foreach( $get_props AS $k1 => $v1 ) {
$properties[] = $v1->GetTag();
$properties[] = $v1->GetNSTag();
}
if ( $qry->Exec("REPORT",__LINE__,__FILE__) && $qry->rows() > 0 ) {

View File

@ -25,7 +25,7 @@ foreach( $searches AS $k => $search ) {
$subwhere = "";
foreach( $qry_props AS $k1 => $v1 ) {
if ( $subwhere != "" ) $subwhere .= " OR ";
switch( $v1->GetTag() ) {
switch( $v1->GetNSTag() ) {
case 'DAV::displayname':
$subwhere .= ' displayname ILIKE :displayname_match ';
$params[':displayname_match'] = '%'.$match.'%';
@ -49,7 +49,7 @@ foreach( $searches AS $k => $search ) {
* @todo We should handle a lot more properties here. principal-URL seems a likely one to be used.
* @todo We should catch the unsupported properties in the query and fire back an error indicating so.
*/
dbg_error_log("principal", "Unhandled tag '%s' to match '%s'\n", $v1->GetTag(), $match );
dbg_error_log("principal", "Unhandled tag '%s' to match '%s'\n", $v1->GetNSTag(), $match );
}
}
if ( $subwhere != "" ) {
@ -64,7 +64,7 @@ $qry = new AwlQuery($sql, $params);
$get_props = $xmltree->GetPath('/DAV::principal-property-search/DAV::prop/*');
$properties = array();
foreach( $get_props AS $k1 => $v1 ) {
$properties[] = $v1->GetTag();
$properties[] = $v1->GetNSTag();
}
if ( $qry->Exec("REPORT",__LINE__,__FILE__) && $qry->rows() > 0 ) {

View File

@ -42,7 +42,7 @@ $v = $props[0];
$props = $v->GetContent();
$proplist = array();
foreach( $props AS $k => $v ) {
$proplist[] = $v->GetTag();
$proplist[] = $v->GetNSTag();
}
function display_status( $status_code ) {

View File

@ -34,8 +34,8 @@ if ( !is_object($xmltree) ) {
$target = new DAVResource($request->path);
if ( $xmltree->GetTag() != 'DAV::principal-property-search'
&& $xmltree->GetTag() != 'DAV::principal-property-search-set' ) {
if ( $xmltree->GetNSTag() != 'DAV::principal-property-search'
&& $xmltree->GetNSTag() != 'DAV::principal-property-search-set' ) {
$target->NeedPrivilege( array('DAV::read', 'urn:ietf:params:xml:ns:caldav:read-free-busy'), true ); // They may have either
}
@ -47,13 +47,13 @@ $denied = array();
$unsupported = array();
if ( isset($prop_filter) ) unset($prop_filter);
if ( $xmltree->GetTag() == 'urn:ietf:params:xml:ns:caldav:free-busy-query' ) {
if ( $xmltree->GetNSTag() == 'urn:ietf:params:xml:ns:caldav:free-busy-query' ) {
include("caldav-REPORT-freebusy.php");
exit; // Not that the above include should return anyway
}
$reply = new XMLDocument( array( "DAV:" => "" ) );
switch( $xmltree->GetTag() ) {
switch( $xmltree->GetNSTag() ) {
case 'DAV::principal-property-search':
include("caldav-REPORT-principal.php");
exit; // Not that it should return anyway.
@ -219,26 +219,26 @@ if ( $target->IsExternal() ) {
update_external ( $target );
}
if ( $xmltree->GetTag() == "urn:ietf:params:xml:ns:caldav:calendar-query" ) {
if ( $xmltree->GetNSTag() == "urn:ietf:params:xml:ns:caldav:calendar-query" ) {
$calquery = $xmltree->GetPath("/urn:ietf:params:xml:ns:caldav:calendar-query/*");
include("caldav-REPORT-calquery.php");
}
elseif ( $xmltree->GetTag() == "urn:ietf:params:xml:ns:caldav:calendar-multiget" ) {
elseif ( $xmltree->GetNSTag() == "urn:ietf:params:xml:ns:caldav:calendar-multiget" ) {
$mode = 'caldav';
$qry_content = $xmltree->GetContent('urn:ietf:params:xml:ns:caldav:calendar-multiget');
include("caldav-REPORT-multiget.php");
}
elseif ( $xmltree->GetTag() == "urn:ietf:params:xml:ns:carddav:addressbook-multiget" ) {
elseif ( $xmltree->GetNSTag() == "urn:ietf:params:xml:ns:carddav:addressbook-multiget" ) {
$mode = 'carddav';
$qry_content = $xmltree->GetContent('urn:ietf:params:xml:ns:carddav:addressbook-multiget');
include("caldav-REPORT-multiget.php");
}
elseif ( $xmltree->GetTag() == "urn:ietf:params:xml:ns:carddav:addressbook-query" ) {
elseif ( $xmltree->GetNSTag() == "urn:ietf:params:xml:ns:carddav:addressbook-query" ) {
$cardquery = $xmltree->GetPath("/urn:ietf:params:xml:ns:carddav:addressbook-query/*");
include("caldav-REPORT-cardquery.php");
}
else {
dbg_error_log( 'ERROR', "Request for unsupported report type '%s'.", $xmltree->GetTag() );
$request->PreconditionFailed( 403, 'DAV::supported-report', sprintf( '"%s" is not a supported report type', $xmltree->GetTag()) );
dbg_error_log( 'ERROR', "Request for unsupported report type '%s'.", $xmltree->GetNSTag() );
$request->PreconditionFailed( 403, 'DAV::supported-report', sprintf( '"%s" is not a supported report type', $xmltree->GetNSTag()) );
}