Rather than fixing in drivers_ldap, fix properly in Principal class.
[davical.git] / inc / caldav-DELETE.php
blobfddb3b24d38e1905062d691734bf22b98bf18f0b
1 <?php
2 /**
3 * CalDAV Server - handle DELETE method
5 * @package davical
6 * @subpackage caldav
7 * @author Andrew McMillan <andrew@mcmillan.net.nz>
8 * @copyright Catalyst .Net Ltd, Morphoss Ltd <http://www.morphoss.com/>
9 * @license http://gnu.org/copyleft/gpl.html GNU GPL v2 or later
11 dbg_error_log("delete", "DELETE method handler");
13 require_once('DAVResource.php');
14 $dav_resource = new DAVResource($request->path);
15 $container = $dav_resource->GetParentContainer();
16 $container->NeedPrivilege('DAV::unbind');
18 $lock_opener = $request->FailIfLocked();
21 function delete_collection( $id ) {
22 $params = array( ':collection_id' => $id );
23 $qry = new AwlQuery('SELECT child.collection_id AS child_id FROM collection child JOIN collection parent ON (parent.dav_name = child.parent_container) WHERE parent.collection_id = :collection_id', $params );
24 if ( $qry->Exec('DELETE',__LINE__,__FILE__) && $qry->rows() > 0 ) {
25 while( $row = $qry->Fetch() ) {
26 delete_collection($row->child_id);
30 if ( $qry->QDo("SELECT write_sync_change(collection_id, 404, caldav_data.dav_name) FROM caldav_data WHERE collection_id = :collection_id", $params )
31 && $qry->QDo("DELETE FROM property WHERE dav_name LIKE (SELECT dav_name FROM collection WHERE collection_id = :collection_id) || '%'", $params )
32 && $qry->QDo("DELETE FROM locks WHERE dav_name LIKE (SELECT dav_name FROM collection WHERE collection_id = :collection_id) || '%'", $params )
33 && $qry->QDo("DELETE FROM caldav_data WHERE collection_id = :collection_id", $params )
34 && $qry->QDo("DELETE FROM collection WHERE collection_id = :collection_id", $params ) ) {
35 @dbg_error_log( "DELETE", "DELETE (collection): User: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path);
36 return true;
38 return false;
42 if ( !$dav_resource->Exists() )$request->DoResponse( 404 );
44 if ( ! ( $dav_resource->resource_id() > 0 ) ) {
45 $request->DoResponse( 403 );
48 $qry = new AwlQuery();
49 $qry->Begin();
51 if ( $dav_resource->IsCollection() ) {
52 if ( $dav_resource->IsBinding() ) {
53 $params = array( ':dav_name' => $dav_resource->dav_name() );
55 if ( $qry->QDo("DELETE FROM dav_binding WHERE dav_name = :dav_name", $params )
56 && $qry->Commit() ) {
57 @dbg_error_log( "DELETE", "DELETE: Binding: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path);
58 $request->DoResponse( 204 );
61 else {
62 if ( delete_collection( $dav_resource->resource_id() ) && $qry->Commit() ) {
63 // Uncache anything to do with the collection
64 $cache = getCacheInstance();
65 $cache->delete( 'collection-'.$dav_resource->dav_name(), null );
66 $request->DoResponse( 204 );
70 else {
71 if ( (isset($request->etag_if_match) && $request->etag_if_match != $dav_resource->unique_tag() ) ) {
72 $request->DoResponse( 412, translate("Resource has changed on server - not deleted") );
75 $params = array( ':dav_id' => $dav_resource->resource_id() );
77 // We need to serialise access to this process just for this collection
78 $cache = getCacheInstance();
79 $myLock = $cache->acquireLock('collection-'.$dav_resource->parent_path());
81 if ( $qry->QDo("SELECT write_sync_change(collection_id, 404, caldav_data.dav_name) FROM caldav_data WHERE dav_id = :dav_id", $params )
82 && $qry->QDo("DELETE FROM property WHERE dav_name = (SELECT dav_name FROM caldav_data WHERE dav_id = :dav_id)", $params )
83 && $qry->QDo("DELETE FROM locks WHERE dav_name = (SELECT dav_name FROM caldav_data WHERE dav_id = :dav_id)", $params )
84 && $qry->QDo("DELETE FROM caldav_data WHERE dav_id = :dav_id", $params )
85 && $qry->Commit() ) {
86 @dbg_error_log( "DELETE", "DELETE: User: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path);
87 if ( function_exists('log_caldav_action') ) {
88 log_caldav_action( 'DELETE', $dav_resource->GetProperty('uid'), $dav_resource->GetProperty('user_no'), $dav_resource->GetProperty('collection_id'), $request->path );
90 $cache->delete( 'collection-'.$dav_resource->parent_path(), null );
91 $cache->releaseLock($myLock);
92 $request->DoResponse( 204 );
94 $cache->releaseLock($myLock);
98 $request->DoResponse( 500 );