diff --git a/htdocs/caldav.php b/htdocs/caldav.php index 97845e0f..4016d9d1 100644 --- a/htdocs/caldav.php +++ b/htdocs/caldav.php @@ -72,15 +72,9 @@ function send_dav_header() { $dav = $c->override_dav_header; } else { - /** hack to get around bugzilla #463392 - remove sometime after 2011-02-28 */ - if ( isset($_SERVER['HTTP_USER_AGENT']) && preg_match( '{ Gecko/(20[01]\d[01]\d[0123]\d)(\d+)? }', $_SERVER['HTTP_USER_AGENT'], $matches ) && $matches[1] < 20100520 ) { - $dav = '1, 2, 3, access-control, calendar-access, calendar-schedule, extended-mkcol, calendar-proxy, bind, addressbook'; - } - else { - // We don't actually do calendar-auto-schedule yet - when we do we should add it on here. - $dav = '1, 2, 3, access-control, calendar-access, calendar-schedule, extended-mkcol, calendar-proxy, bind, addressbook'; - if ( $c->enable_auto_schedule ) $dav .= ', calendar-auto-schedule'; - } + $dav = '1, 2, 3, access-control, calendar-access, calendar-schedule, extended-mkcol, bind, addressbook'; + if ( $c->enable_auto_schedule ) $dav .= ', calendar-auto-schedule'; + if ( !isset($c->disable_caldav_proxy) || $c->disable_caldav_proxy == false) $dav .= ', calendar-proxy'; } $dav = explode( "\n", wordwrap( $dav ) ); foreach( $dav AS $v ) { @@ -105,15 +99,21 @@ if ( ! ($request->IsPrincipal() || isset($request->collection) || $request->meth @ob_flush(); exit(0); } } +param_to_global('add_member','.*'); +$add_member = isset($add_member); switch ( $request->method ) { case 'OPTIONS': include_once('caldav-OPTIONS.php'); break; case 'REPORT': include_once('caldav-REPORT.php'); break; case 'PROPFIND': include('caldav-PROPFIND.php'); break; case 'GET': include('caldav-GET.php'); break; - case 'POST': include('caldav-POST.php'); break; case 'HEAD': include('caldav-GET.php'); break; case 'PROPPATCH': include('caldav-PROPPATCH.php'); break; + case 'POST': + if ( !$add_member ) { + include('caldav-POST.php'); + break; + } case 'PUT': switch( $request->content_type ) { case 'text/calendar': diff --git a/inc/DAVPrincipal.php b/inc/DAVPrincipal.php index a06025ab..0b64cf8e 100644 --- a/inc/DAVPrincipal.php +++ b/inc/DAVPrincipal.php @@ -199,44 +199,43 @@ class DAVPrincipal extends Principal $this->write_proxy_for = array(); $this->read_proxy_for = array(); - if ( !isset($c->disable_caldav_proxy) || $c->disable_caldav_proxy === false ) { + if ( isset($c->disable_caldav_proxy) && $c->disable_caldav_proxy ) return; - $write_priv = privilege_to_bits(array('write')); - // whom are we a proxy for? who is a proxy for us? - // (as per Caldav Proxy section 5.1 Paragraph 7 and 5) - $sql = 'SELECT principal_id, username, pprivs(:request_principal::int8,principal_id,:scan_depth::int) FROM principal JOIN usr USING(user_no) WHERE principal_id IN (SELECT * from p_has_proxy_access_to(:request_principal,:scan_depth))'; - $params = array( ':request_principal' => $this->principal_id, ':scan_depth' => $c->permission_scan_depth ); - $qry = new AwlQuery($sql, $params); - if ( $qry->Exec('DAVPrincipal') && $qry->rows() > 0 ) { - while( $relationship = $qry->Fetch() ) { - if ( (bindec($relationship->pprivs) & $write_priv) != 0 ) { - $this->write_proxy_for[] = ConstructURL( '/'. $relationship->username . '/', true); - $this->group_membership[] = ConstructURL( '/'. $relationship->username . '/calendar-proxy-write/', true); - } - else { - $this->read_proxy_for[] = ConstructURL( '/'. $relationship->username . '/', true); - $this->group_membership[] = ConstructURL( '/'. $relationship->username . '/calendar-proxy-read/', true); - } + $write_priv = privilege_to_bits(array('write')); + // whom are we a proxy for? who is a proxy for us? + // (as per Caldav Proxy section 5.1 Paragraph 7 and 5) + $sql = 'SELECT principal_id, username, pprivs(:request_principal::int8,principal_id,:scan_depth::int) FROM principal JOIN usr USING(user_no) WHERE principal_id IN (SELECT * from p_has_proxy_access_to(:request_principal,:scan_depth))'; + $params = array( ':request_principal' => $this->principal_id, ':scan_depth' => $c->permission_scan_depth ); + $qry = new AwlQuery($sql, $params); + if ( $qry->Exec('DAVPrincipal') && $qry->rows() > 0 ) { + while( $relationship = $qry->Fetch() ) { + if ( (bindec($relationship->pprivs) & $write_priv) != 0 ) { + $this->write_proxy_for[] = ConstructURL( '/'. $relationship->username . '/', true); + $this->group_membership[] = ConstructURL( '/'. $relationship->username . '/calendar-proxy-write/', true); + } + else { + $this->read_proxy_for[] = ConstructURL( '/'. $relationship->username . '/', true); + $this->group_membership[] = ConstructURL( '/'. $relationship->username . '/calendar-proxy-read/', true); } } + } - $sql = 'SELECT principal_id, username, pprivs(:request_principal::int8,principal_id,:scan_depth::int) FROM principal JOIN usr USING(user_no) WHERE principal_id IN (SELECT * from grants_proxy_access_from_p(:request_principal,:scan_depth))'; - $qry = new AwlQuery($sql, $params ); // reuse $params assigned for earlier query - if ( $qry->Exec('DAVPrincipal') && $qry->rows() > 0 ) { - while( $relationship = $qry->Fetch() ) { - if ( bindec($relationship->pprivs) & $write_priv ) { - $this->write_proxy_group[] = ConstructURL( '/'. $relationship->username . '/', true); - } - else { - $this->read_proxy_group[] = ConstructURL( '/'. $relationship->username . '/', true); - } + $sql = 'SELECT principal_id, username, pprivs(:request_principal::int8,principal_id,:scan_depth::int) FROM principal JOIN usr USING(user_no) WHERE principal_id IN (SELECT * from grants_proxy_access_from_p(:request_principal,:scan_depth))'; + $qry = new AwlQuery($sql, $params ); // reuse $params assigned for earlier query + if ( $qry->Exec('DAVPrincipal') && $qry->rows() > 0 ) { + while( $relationship = $qry->Fetch() ) { + if ( bindec($relationship->pprivs) & $write_priv ) { + $this->write_proxy_group[] = ConstructURL( '/'. $relationship->username . '/', true); + } + else { + $this->read_proxy_group[] = ConstructURL( '/'. $relationship->username . '/', true); } } + } // @dbg_error_log( 'principal', 'Read-proxy-for: %s', implode(',',$this->read_proxy_for) ); // @dbg_error_log( 'principal', 'Write-proxy-for: %s', implode(',',$this->write_proxy_for) ); // @dbg_error_log( 'principal', 'Read-proxy-group: %s', implode(',',$this->read_proxy_group) ); // @dbg_error_log( 'principal', 'Write-proxy-group: %s', implode(',',$this->write_proxy_group) ); - } } diff --git a/inc/DAVResource.php b/inc/DAVResource.php index 246d6521..ea3805b2 100644 --- a/inc/DAVResource.php +++ b/inc/DAVResource.php @@ -1271,6 +1271,7 @@ EOQRY; $qry = new AwlQuery($sql, $params ); if ( !$qry->Exec() || !$row = $qry->Fetch() ) { if ( !$qry->QDo('SELECT new_sync_token( 0, :collection_id) AS sync_token', $params) ) throw new Exception('Problem with database query'); + $row = $qry->Fetch(); } $this->sync_token = 'data:,'.$row->sync_token; } @@ -1641,6 +1642,7 @@ EOQRY; case 'http://calendarserver.org/ns/:calendar-proxy-read-for': $proxy_type = 'read'; case 'http://calendarserver.org/ns/:calendar-proxy-write-for': + if ( isset($c->disable_caldav_proxy) && $c->disable_caldav_proxy ) return false; if ( !isset($proxy_type) ) $proxy_type = 'write'; $reply->CalendarserverElement($prop, 'calendar-proxy-'.$proxy_type.'-for', $reply->href( $this->principal->ProxyFor($proxy_type) ) ); break; diff --git a/inc/caldav-PROPFIND.php b/inc/caldav-PROPFIND.php index 1c7a93ba..d5e053ce 100644 --- a/inc/caldav-PROPFIND.php +++ b/inc/caldav-PROPFIND.php @@ -169,7 +169,7 @@ function get_collection_contents( $depth, $collection, $parent_path = null ) { } } - if ( $collection->IsPrincipal() ) { + if ( (!isset($c->disable_caldav_proxy) || $c->disable_caldav_proxy == false) && $collection->IsPrincipal() ) { // Caldav Proxy: 5.1 par. 2: Add child resources calendar-proxy-(read|write) dbg_error_log('PROPFIND','Adding calendar-proxy-read and write. Path: %s', $bound_from ); $response = add_proxy_response('read', $bound_from );