mirror of
https://gitlab.com/davical-project/davical.git
synced 2026-08-29 18:26:05 +00:00
Restructure and add support for DELETE on a Bind.
This commit is contained in:
parent
33c1f877af
commit
4d9dd91988
@ -10,73 +10,75 @@
|
||||
*/
|
||||
dbg_error_log("delete", "DELETE method handler");
|
||||
|
||||
$request->NeedPrivilege('DAV::unbind');
|
||||
require_once('DAVResource.php');
|
||||
$dav_resource = new DAVResource($request->path);
|
||||
$dav_resource->NeedPrivilege('DAV::unbind');
|
||||
|
||||
$lock_opener = $request->FailIfLocked();
|
||||
|
||||
if ( $request->IsCollection() ) {
|
||||
/**
|
||||
* We read the collection first, so we can check if it matches (or does not match)
|
||||
*/
|
||||
$qry = new AwlQuery( 'SELECT * FROM collection WHERE user_no = :user_no AND dav_name = :dav_name',
|
||||
array( ':user_no' => $request->user_no, ':dav_name' => $request->path ) );
|
||||
if ( $qry->Exec('DELETE',__LINE__,__FILE__) && $qry->rows() == 1 ) {
|
||||
$delete_row = $qry->Fetch();
|
||||
if ( (isset($request->etag_if_match) && $request->etag_if_match != $delete_row->dav_etag) ) {
|
||||
$request->DoResponse( 412, translate("Resource does not match 'If-Match' header - not deleted") );
|
||||
}
|
||||
|
||||
$path_like = array( ':path_like' => $request->path.'%' );
|
||||
if ( $qry->Begin()
|
||||
&& $qry->QDo("SELECT write_sync_change(collection_id, 404, caldav_data.dav_name) FROM caldav_data WHERE dav_name LIKE :path_like", $path_like )
|
||||
&& $qry->QDo("DELETE FROM collection WHERE dav_name = :request_path", array(':request_path' => $request->path) )
|
||||
&& $qry->QDo("DELETE FROM caldav_data WHERE dav_name LIKE :path_like", $path_like )
|
||||
&& $qry->QDo("DELETE FROM property WHERE dav_name LIKE :path_like", $path_like )
|
||||
&& $qry->QDo("DELETE FROM locks WHERE dav_name LIKE :path_like", $path_like )
|
||||
&& $qry->Commit() ) {
|
||||
@dbg_error_log( "DELETE", "DELETE (collection): User: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path);
|
||||
$request->DoResponse( 204 );
|
||||
function delete_collection( $id ) {
|
||||
$params = array( ':collection_id' => $id );
|
||||
$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 );
|
||||
if ( $qry->Exec('DELETE',__LINE__,__FILE__) && $qry->rows() > 0 ) {
|
||||
while( $row = $qry->Fetch() ) {
|
||||
delete_collection($row->child_id);
|
||||
}
|
||||
else {
|
||||
$request->DoResponse( 500, translate("Error querying database.") );
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
$request->DoResponse( 404 );
|
||||
|
||||
if ( $qry->QDo("SELECT write_sync_change(collection_id, 404, caldav_data.dav_name) FROM caldav_data WHERE collection_id = :collection_id", $params )
|
||||
&& $qry->QDo("DELETE FROM property WHERE dav_name LIKE (SELECT dav_name FROM collection WHERE collection_id = :collection_id) || '%'", $params )
|
||||
&& $qry->QDo("DELETE FROM locks WHERE dav_name LIKE (SELECT dav_name FROM collection WHERE collection_id = :collection_id) || '%'", $params )
|
||||
&& $qry->QDo("DELETE FROM caldav_data WHERE collection_id = :collection_id", $params )
|
||||
&& $qry->QDo("DELETE FROM collection WHERE collection_id = :collection_id", $params ) ) {
|
||||
@dbg_error_log( "DELETE", "DELETE (collection): User: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if ( !$dav_resource->Exists() )$request->DoResponse( 404 );
|
||||
|
||||
if ( ! ( $dav_resource->resource_id() > 0 ) ) {
|
||||
$request->DoResponse( 403 );
|
||||
}
|
||||
|
||||
$qry = new AwlQuery();
|
||||
$qry->Begin();
|
||||
|
||||
if ( $dav_resource->IsBinding() ) {
|
||||
$params = array( ':dav_name' => $dav_resource->dav_name() );
|
||||
|
||||
if ( $qry->QDo("DELETE FROM dav_binding WHERE dav_name = :dav_name", $params )
|
||||
&& $qry->Commit() ) {
|
||||
@dbg_error_log( "DELETE", "DELETE: Binding: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path);
|
||||
$request->DoResponse( 204 );
|
||||
}
|
||||
}
|
||||
else if ( $dav_resource->IsCollection() ) {
|
||||
if ( delete_collection( $dav_resource->resource_id() ) && $qry->Commit() ) {
|
||||
$request->DoResponse( 204 );
|
||||
}
|
||||
}
|
||||
else {
|
||||
/**
|
||||
* We read the resource first, so we can check if it matches (or does not match)
|
||||
*/
|
||||
$params = array( ':dav_name' => $request->path );
|
||||
$qry = new AwlQuery( 'SELECT cd.dav_etag, ci.uid, cd.collection_id FROM caldav_data cd JOIN calendar_item ci USING (dav_id) WHERE cd.dav_name = :dav_name', $params );
|
||||
if ( $qry->Exec('DELETE',__LINE__,__FILE__) && $qry->rows() == 1 ) {
|
||||
$delete_row = $qry->Fetch();
|
||||
if ( (isset($request->etag_if_match) && $request->etag_if_match != $delete_row->dav_etag) ) {
|
||||
$request->DoResponse( 412, translate("Resource has changed on server - not deleted") );
|
||||
}
|
||||
|
||||
$collection_id = $delete_row->collection_id;
|
||||
|
||||
if ( $qry->Begin()
|
||||
&& $qry->QDo("DELETE FROM caldav_data WHERE collection_id = $collection_id AND dav_name = :dav_name", $params )
|
||||
&& $qry->QDo("SELECT write_sync_change( $collection_id, 404, :dav_name)", $params )
|
||||
&& $qry->QDo("DELETE FROM property WHERE dav_name = :dav_name", $params )
|
||||
&& $qry->Commit() ) {
|
||||
@dbg_error_log( "DELETE", "DELETE: User: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path);
|
||||
if ( function_exists('log_caldav_action') ) {
|
||||
log_caldav_action( 'DELETE', $delete_row->uid, $request->user_no, $request->collection_id, $request->path );
|
||||
}
|
||||
$request->DoResponse( 204 );
|
||||
}
|
||||
else {
|
||||
$request->DoResponse( 500, translate("Error querying database.") );
|
||||
}
|
||||
if ( (isset($request->etag_if_match) && $request->etag_if_match != $dav_resource->unique_tag() ) ) {
|
||||
$request->DoResponse( 412, translate("Resource has changed on server - not deleted") );
|
||||
}
|
||||
else {
|
||||
$request->DoResponse( 404 );
|
||||
|
||||
$params = array( ':dav_id' => $dav_resource->resource_id() );
|
||||
|
||||
if ( $qry->QDo("SELECT write_sync_change(collection_id, 404, caldav_data.dav_name) FROM caldav_data WHERE dav_id = :dav_id", $params )
|
||||
&& $qry->QDo("DELETE FROM property WHERE dav_name = (SELECT dav_name FROM caldav_data WHERE dav_id = :dav_id)", $params )
|
||||
&& $qry->QDo("DELETE FROM locks WHERE dav_name = (SELECT dav_name FROM caldav_data WHERE dav_id = :dav_id)", $params )
|
||||
&& $qry->QDo("DELETE FROM caldav_data WHERE dav_id = :dav_id", $params )
|
||||
&& $qry->Commit() ) {
|
||||
@dbg_error_log( "DELETE", "DELETE: User: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path);
|
||||
if ( function_exists('log_caldav_action') ) {
|
||||
log_caldav_action( 'DELETE', $dav_resource->GetProperty('uid'), $dav_resource->GetProperty('user_no'), $dav_resource->GetProperty('collection_id'), $request->path );
|
||||
}
|
||||
$request->DoResponse( 204 );
|
||||
}
|
||||
}
|
||||
|
||||
$request->DoResponse( 500 );
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user