mirror of
https://gitlab.com/davical-project/davical.git
synced 2026-05-25 02:34:17 +00:00
Strip redundant code from CalDAVRequest
This commit is contained in:
parent
5055d28c07
commit
38d1d430a5
@ -556,7 +556,7 @@ class CalDAVPrincipal
|
|||||||
$denied = array();
|
$denied = array();
|
||||||
$not_found = array();
|
$not_found = array();
|
||||||
foreach( $properties AS $k => $tag ) {
|
foreach( $properties AS $k => $tag ) {
|
||||||
if ( ! $this->PrincipalProperty( $tag, $prop, $reply, $denied ) && ! $request->ServerProperty( $tag, $prop, $reply ) ) {
|
if ( ! $this->PrincipalProperty( $tag, $prop, $reply, $denied ) ) {
|
||||||
dbg_error_log( 'principal', 'Request for unsupported property "%s" of principal "%s".', $tag, $this->username );
|
dbg_error_log( 'principal', 'Request for unsupported property "%s" of principal "%s".', $tag, $this->username );
|
||||||
$not_found[] = $reply->Tag($tag);
|
$not_found[] = $reply->Tag($tag);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -330,6 +330,7 @@ EOSQL;
|
|||||||
$this->collection_type = 'email';
|
$this->collection_type = 'email';
|
||||||
$this->collection_path = $this->path;
|
$this->collection_path = $this->path;
|
||||||
$this->_is_principal = true;
|
$this->_is_principal = true;
|
||||||
|
// $this->by_email = true;
|
||||||
}
|
}
|
||||||
else if ( preg_match( '#^(/[^/]+)/?$#', $this->path, $matches) || preg_match( '#^(/principals/[^/]+/[^/]+)/?$#', $this->path, $matches) ) {
|
else if ( preg_match( '#^(/[^/]+)/?$#', $this->path, $matches) || preg_match( '#^(/principals/[^/]+/[^/]+)/?$#', $this->path, $matches) ) {
|
||||||
$this->collection_id = -1;
|
$this->collection_id = -1;
|
||||||
@ -361,7 +362,7 @@ EOSQL;
|
|||||||
$this->principal = new CalDAVPrincipal( array( "path" => $this->path, "options" => $this->options ) );
|
$this->principal = new CalDAVPrincipal( array( "path" => $this->path, "options" => $this->options ) );
|
||||||
if ( isset($this->principal->user_no) ) $this->user_no = $this->principal->user_no;
|
if ( isset($this->principal->user_no) ) $this->user_no = $this->principal->user_no;
|
||||||
if ( isset($this->principal->username)) $this->username = $this->principal->username;
|
if ( isset($this->principal->username)) $this->username = $this->principal->username;
|
||||||
if ( isset($this->principal->by_email)) $this->by_email = true;
|
if ( isset($this->principal->by_email) && $this->principal->by_email) $this->by_email = true;
|
||||||
if ( isset($this->principal->principal_id)) $this->principal_id = $this->principal->principal_id;
|
if ( isset($this->principal->principal_id)) $this->principal_id = $this->principal->principal_id;
|
||||||
|
|
||||||
if ( $this->collection_type == 'principal' || $this->collection_type == 'email' ) {
|
if ( $this->collection_type == 'principal' || $this->collection_type == 'email' ) {
|
||||||
@ -414,10 +415,6 @@ EOSQL;
|
|||||||
'ACL' => ''
|
'ACL' => ''
|
||||||
);
|
);
|
||||||
if ( $this->IsCollection() ) {
|
if ( $this->IsCollection() ) {
|
||||||
/* if ( $this->IsPrincipal() ) {
|
|
||||||
$this->supported_methods['MKCALENDAR'] = '';
|
|
||||||
$this->supported_methods['MKCOL'] = '';
|
|
||||||
} */
|
|
||||||
switch ( $this->collection_type ) {
|
switch ( $this->collection_type ) {
|
||||||
case 'root':
|
case 'root':
|
||||||
case 'email':
|
case 'email':
|
||||||
@ -584,14 +581,14 @@ EOSQL;
|
|||||||
/**
|
/**
|
||||||
* In other cases we need to query the database for permissions
|
* In other cases we need to query the database for permissions
|
||||||
*/
|
*/
|
||||||
if ( isset($this->by_email) ) {
|
if ( isset($this->by_email) && $this->by_email ) {
|
||||||
$qry = new PgQuery( "SELECT pprivs( ?::int8, ?::int8, ?::int ) AS perm", $session->principal_id, $this->principal_id, $c->permission_scan_depth );
|
$qry = new PgQuery( "SELECT pprivs( ?::int8, ?::int8, ?::int ) AS perm", $session->principal_id, $this->principal_id, $c->permission_scan_depth );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$qry = new PgQuery( "SELECT path_privs( ?::int8, ?::text, ?::int ) AS perm", $session->principal_id, $this->path, $c->permission_scan_depth );
|
$qry = new PgQuery( "SELECT path_privs( ?::int8, ?::text, ?::int ) AS perm", $session->principal_id, $this->path, $c->permission_scan_depth );
|
||||||
}
|
}
|
||||||
if ( $qry->Exec("caldav") && $permission_result = $qry->Fetch() )
|
if ( $qry->Exec("caldav") && $permission_result = $qry->Fetch() )
|
||||||
$this->privileges &= bindec($permission_result->perm);
|
$this->privileges |= bindec($permission_result->perm);
|
||||||
|
|
||||||
dbg_error_log( "caldav", "Restricted permissions for user accessing someone elses hierarchy: %s", decbin($this->privileges) );
|
dbg_error_log( "caldav", "Restricted permissions for user accessing someone elses hierarchy: %s", decbin($this->privileges) );
|
||||||
}
|
}
|
||||||
@ -864,8 +861,7 @@ EOSQL;
|
|||||||
/**
|
/**
|
||||||
* Returns the array of supported privileges converted into XMLElements
|
* Returns the array of supported privileges converted into XMLElements
|
||||||
*/
|
*/
|
||||||
function BuildSupportedPrivileges( $privs = null ) {
|
function BuildSupportedPrivileges( &$reply, $privs = null ) {
|
||||||
global $reply;
|
|
||||||
$privileges = array();
|
$privileges = array();
|
||||||
if ( $privs === null ) $privs = $this->supported_privileges;
|
if ( $privs === null ) $privs = $this->supported_privileges;
|
||||||
foreach( $privs AS $k => $v ) {
|
foreach( $privs AS $k => $v ) {
|
||||||
@ -875,7 +871,7 @@ EOSQL;
|
|||||||
$privset = array($privilege);
|
$privset = array($privilege);
|
||||||
if ( is_array($v) ) {
|
if ( is_array($v) ) {
|
||||||
dbg_error_log( 'caldav', '"%s" is a container of sub-privileges.', $k );
|
dbg_error_log( 'caldav', '"%s" is a container of sub-privileges.', $k );
|
||||||
$privset = array_merge($privset, $this->BuildSupportedPrivileges($v));
|
$privset = array_merge($privset, $this->BuildSupportedPrivileges($reply,$v));
|
||||||
}
|
}
|
||||||
else if ( $v == 'abstract' ) {
|
else if ( $v == 'abstract' ) {
|
||||||
dbg_error_log( 'caldav', '"%s" is an abstract privilege.', $v );
|
dbg_error_log( 'caldav', '"%s" is an abstract privilege.', $v );
|
||||||
@ -890,118 +886,6 @@ EOSQL;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the array of privilege names converted into XMLElements
|
|
||||||
*/
|
|
||||||
function BuildPrivileges($privilege_names) {
|
|
||||||
global $reply;
|
|
||||||
$privileges = array();
|
|
||||||
foreach( $privilege_names AS $k => $v ) {
|
|
||||||
dbg_error_log( 'caldav', 'Adding privilege "%s" which is "%s".', $k, $v );
|
|
||||||
$privilege = new XMLElement('privilege');
|
|
||||||
$reply->NSElement($privilege,$k);
|
|
||||||
$privileges[] = $privilege;
|
|
||||||
}
|
|
||||||
return $privileges;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the array of supported methods converted into XMLElements
|
|
||||||
*/
|
|
||||||
function BuildSupportedMethods( ) {
|
|
||||||
global $reply;
|
|
||||||
$methods = array();
|
|
||||||
foreach( $this->supported_methods AS $k => $v ) {
|
|
||||||
dbg_error_log( 'caldav', 'Adding method "%s" which is "%s".', $k, $v );
|
|
||||||
$methods[] = new XMLElement( 'supported-method', null, array('name' => $k) );
|
|
||||||
}
|
|
||||||
return $methods;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the array of supported methods converted into XMLElements
|
|
||||||
*/
|
|
||||||
function BuildSupportedReports( ) {
|
|
||||||
global $reply;
|
|
||||||
$reports = array();
|
|
||||||
foreach( $this->supported_reports AS $k => $v ) {
|
|
||||||
dbg_error_log( 'caldav', 'Adding supported report "%s" which is "%s".', $k, $v );
|
|
||||||
$report = new XMLElement('report');
|
|
||||||
$reply->NSElement($report, $k );
|
|
||||||
$reports[] = new XMLElement('supported-report', $report );
|
|
||||||
}
|
|
||||||
return $reports;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return general server-related properties for this URL
|
|
||||||
*/
|
|
||||||
function ServerProperty( $tag, $prop, &$reply = null ) {
|
|
||||||
global $c, $session;
|
|
||||||
|
|
||||||
if ( $reply === null ) $reply = $GLOBALS['reply'];
|
|
||||||
|
|
||||||
dbg_error_log( 'caldav', 'Processing "%s" on "%s".', $tag, $this->path );
|
|
||||||
|
|
||||||
switch( $tag ) {
|
|
||||||
case 'DAV::current-user-principal':
|
|
||||||
$reply->DAVElement( $prop, 'current-user-principal', $this->current_user_principal_xml);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'DAV::getcontentlanguage':
|
|
||||||
$locale = (isset($c->current_locale) ? $c->current_locale : '');
|
|
||||||
if ( isset($session->locale) && $session->locale != '' ) $locale = $session->locale;
|
|
||||||
$prop->NewElement('getcontentlanguage', $locale );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'DAV::supportedlock':
|
|
||||||
$prop->NewElement('supportedlock',
|
|
||||||
new XMLElement( 'lockentry',
|
|
||||||
array(
|
|
||||||
new XMLElement('lockscope', new XMLElement('exclusive')),
|
|
||||||
new XMLElement('locktype', new XMLElement('write')),
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'DAV::acl':
|
|
||||||
/**
|
|
||||||
* @todo This information is semantically valid but presents an incorrect picture.
|
|
||||||
*/
|
|
||||||
$principal = new XMLElement('principal');
|
|
||||||
$principal->NewElement('authenticated');
|
|
||||||
$grant = new XMLElement( 'grant', array($this->BuildPrivileges($this->permissions)) );
|
|
||||||
$prop->NewElement('acl', new XMLElement( 'ace', array( $principal, $grant ) ) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'DAV::current-user-privilege-set':
|
|
||||||
$prop->NewElement('current-user-privilege-set', $this->BuildPrivileges($this->permissions) );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'DAV::supported-privilege-set':
|
|
||||||
$prop->NewElement('supported-privilege-set', $this->BuildSupportedPrivileges() );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'DAV::supported-method-set':
|
|
||||||
$prop->NewElement('supported-method-set', $this->BuildSupportedMethods() );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'DAV::supported-report-set':
|
|
||||||
$prop->NewElement('supported-report-set', $this->BuildSupportedReports() );
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
dbg_error_log( 'caldav', 'Request for unsupported property "%s" of path "%s".', $tag, $this->path );
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Are we allowed to do the requested activity
|
* Are we allowed to do the requested activity
|
||||||
*
|
*
|
||||||
@ -1017,12 +901,13 @@ EOSQL;
|
|||||||
*/
|
*/
|
||||||
function AllowedTo( $activity ) {
|
function AllowedTo( $activity ) {
|
||||||
global $session;
|
global $session;
|
||||||
dbg_error_log('session', 'Checking whether "%s" is allowed to "%s"', $session->username, $activity);
|
dbg_error_log('caldav', 'Checking whether "%s" is allowed to "%s"', $session->username, $activity);
|
||||||
foreach( $this->permissions AS $k => $v ) {
|
|
||||||
dbg_error_log('session', 'Permissions "%s" is "%s"', $k, $v);
|
|
||||||
}
|
|
||||||
if ( isset($this->permissions['all']) ) return true;
|
if ( isset($this->permissions['all']) ) return true;
|
||||||
switch( $activity ) {
|
switch( $activity ) {
|
||||||
|
case 'all':
|
||||||
|
return false; // If they got this far then they don't
|
||||||
|
break;
|
||||||
|
|
||||||
case "CALDAV:schedule-send-freebusy":
|
case "CALDAV:schedule-send-freebusy":
|
||||||
return isset($this->permissions['read']) || isset($this->permissions['urn:ietf:params:xml:ns:caldav:read-free-busy']);
|
return isset($this->permissions['read']) || isset($this->permissions['urn:ietf:params:xml:ns:caldav:read-free-busy']);
|
||||||
break;
|
break;
|
||||||
@ -1062,14 +947,10 @@ EOSQL;
|
|||||||
if ( $this->path == '/' ) return false;
|
if ( $this->path == '/' ) return false;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'read':
|
|
||||||
case 'lock':
|
|
||||||
case 'unlock':
|
|
||||||
default:
|
default:
|
||||||
return isset($this->permissions[$activity]);
|
|
||||||
$test_bits = privilege_to_bits( $activity );
|
$test_bits = privilege_to_bits( $activity );
|
||||||
// dbg_error_log( 'caldav', 'Testing privileges of "%s" (%s) against allowed "%s" => "%s" (%s)',
|
// dbg_error_log( 'caldav', 'request::AllowedTo("%s") (%s) against allowed "%s" => "%s" (%s)',
|
||||||
// (is_array($privileges) ? implode(',',$privileges) : $privileges), decbin($test_bits),
|
// (is_array($activity) ? implode(',',$activity) : $activity), decbin($test_bits),
|
||||||
// decbin($this->privileges), ($this->privileges & $test_bits), decbin($this->privileges & $test_bits) );
|
// decbin($this->privileges), ($this->privileges & $test_bits), decbin($this->privileges & $test_bits) );
|
||||||
return (($this->privileges & $test_bits) > 0 );
|
return (($this->privileges & $test_bits) > 0 );
|
||||||
break;
|
break;
|
||||||
@ -1093,7 +974,7 @@ EOSQL;
|
|||||||
*/
|
*/
|
||||||
function HavePrivilegeTo( $do_what ) {
|
function HavePrivilegeTo( $do_what ) {
|
||||||
$test_bits = privilege_to_bits( $do_what );
|
$test_bits = privilege_to_bits( $do_what );
|
||||||
// dbg_error_log( 'caldav', 'Testing privileges of "%s" (%s) against allowed "%s" => "%s" (%s)',
|
// dbg_error_log( 'caldav', 'request::HavePrivilegeTo("%s") [%s] against allowed "%s" => "%s" (%s)',
|
||||||
// (is_array($do_what) ? implode(',',$do_what) : $do_what), decbin($test_bits),
|
// (is_array($do_what) ? implode(',',$do_what) : $do_what), decbin($test_bits),
|
||||||
// decbin($this->privileges), ($this->privileges & $test_bits), decbin($this->privileges & $test_bits) );
|
// decbin($this->privileges), ($this->privileges & $test_bits), decbin($this->privileges & $test_bits) );
|
||||||
return ($this->privileges & $test_bits) > 0;
|
return ($this->privileges & $test_bits) > 0;
|
||||||
@ -1129,7 +1010,10 @@ EOSQL;
|
|||||||
*/
|
*/
|
||||||
function NeedPrivilege( $privileges, $href=null ) {
|
function NeedPrivilege( $privileges, $href=null ) {
|
||||||
if ( is_string($privileges) ) $privileges = array( $privileges );
|
if ( is_string($privileges) ) $privileges = array( $privileges );
|
||||||
if ( !isset($href) && $this->HavePrivilegeTo($privileges) ) return;
|
if ( !isset($href) ) {
|
||||||
|
if ( $this->HavePrivilegeTo($privileges) ) return;
|
||||||
|
$href = $this->path;
|
||||||
|
}
|
||||||
|
|
||||||
$reply = new XMLDocument( array('DAV:' => '') );
|
$reply = new XMLDocument( array('DAV:' => '') );
|
||||||
$privnodes = array( $reply->href(ConstructURL($href)), new XMLElement( 'privilege' ) );
|
$privnodes = array( $reply->href(ConstructURL($href)), new XMLElement( 'privilege' ) );
|
||||||
|
|||||||
@ -1211,7 +1211,7 @@ EOQRY;
|
|||||||
if ( !isset($this->principal) ) $this->FetchPrincipal();
|
if ( !isset($this->principal) ) $this->FetchPrincipal();
|
||||||
$found = $this->principal->PrincipalProperty( $tag, $prop, $reply, $denied );
|
$found = $this->principal->PrincipalProperty( $tag, $prop, $reply, $denied );
|
||||||
}
|
}
|
||||||
if ( ! $found && ! $request->ServerProperty($tag, $prop, $reply) ) {
|
if ( ! $found ) {
|
||||||
// dbg_error_log( 'DAVResource', 'Request for unsupported property "%s" of resource "%s".', $tag, $this->dav_name );
|
// dbg_error_log( 'DAVResource', 'Request for unsupported property "%s" of resource "%s".', $tag, $this->dav_name );
|
||||||
$not_found[] = $reply->Tag($tag);
|
$not_found[] = $reply->Tag($tag);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user