[3733] | 1 | <?php |
---|
| 2 | /** |
---|
| 3 | * CalDAV Server - handle DELETE method |
---|
| 4 | * |
---|
| 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 |
---|
| 10 | */ |
---|
| 11 | dbg_error_log("delete", "DELETE method handler"); |
---|
| 12 | include_once("iCalendar.php"); |
---|
| 13 | require_once('DAVResource.php'); |
---|
| 14 | include_once("drivers_ldap.php"); |
---|
| 15 | $dav_resource = new DAVResource($request->path); |
---|
| 16 | $container = $dav_resource->FetchParentContainer(); |
---|
| 17 | $container->NeedPrivilege('DAV::unbind'); |
---|
| 18 | |
---|
| 19 | $nome = $container->GetProperty('user_no'); |
---|
| 20 | $lock_opener = $request->FailIfLocked(); |
---|
| 21 | $etag = md5($request->raw_post); |
---|
| 22 | $matches = preg_split('/\//', $request->path, -1, PREG_SPLIT_NO_EMPTY); |
---|
| 23 | $CALID = strtok($matches[2], "@"); |
---|
| 24 | |
---|
| 25 | //$filtro = "uid=".$request->username; |
---|
| 26 | //$atributos = array("uidNumber"); |
---|
| 27 | //$uidnumber = ldapDrivers::requestAtributo($filtro, $atributos); |
---|
| 28 | // if ($uidnumber == false) { |
---|
| 29 | // dbg_error_log( "DELETE", "Responding with delete error: usuario não encontrado no diretorio"); |
---|
| 30 | // $request->DoResponse( 501, 'Database error'); |
---|
| 31 | // } |
---|
| 32 | //$nome = $uidnumber['uidNumber']; |
---|
| 33 | |
---|
| 34 | function delete_collection( $nome,$CALID ) { |
---|
| 35 | |
---|
| 36 | $qry = new AwlQuery( "SELECT * FROM phpgw_cal WHERE owner = :owner AND cal_id = :cal_id", array( ':owner' => $nome , ':cal_id' => $CALID)); |
---|
| 37 | if ( $qry->Exec("DELETE") && $qry->rows() == 1 ){ |
---|
| 38 | $delete_row = $qry->Fetch(); |
---|
| 39 | if ($qry->QDo("DELETE FROM phpgw_cal WHERE cal_id = :cal_id AND owner = :nome",array( ':cal_id' => $CALID, ':nome' => $nome))){ |
---|
| 40 | if($qry->QDO("DELETE FROM phpgw_cal_user WHERE cal_login = :nome AND cal_id = :cal_id",array( ':nome' => $nome , ':cal_id' => $CALID))){ |
---|
| 41 | if ( $delete_row->cal_type == 'M' ) |
---|
| 42 | { |
---|
| 43 | if($qry->QDO("DELETE FROM phpgw_cal_repeats WHERE cal_id = :cal_id",array( ':cal_id' => $CALID))) |
---|
| 44 | { |
---|
| 45 | @dbg_error_log( "DELETE", "DELETE (collection): User: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path); |
---|
| 46 | return true; |
---|
| 47 | } |
---|
| 48 | else |
---|
| 49 | { return false; |
---|
| 50 | } |
---|
| 51 | } |
---|
| 52 | @dbg_error_log( "DELETE", "DELETE (collection): User: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path); |
---|
| 53 | return true; |
---|
| 54 | } |
---|
| 55 | else |
---|
| 56 | {return false; |
---|
| 57 | } |
---|
| 58 | } |
---|
| 59 | else { |
---|
| 60 | return false; |
---|
| 61 | //$request->DoResponse( 500, translate("Error querying database.") ); |
---|
| 62 | } |
---|
| 63 | |
---|
| 64 | } |
---|
| 65 | else |
---|
| 66 | { |
---|
| 67 | return false; |
---|
| 68 | } |
---|
| 69 | //$params = array( ':collection_id' => $id ); |
---|
| 70 | //$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 ); |
---|
| 71 | //if ( $qry->Exec('DELETE',__LINE__,__FILE__) && $qry->rows() > 0 ) { |
---|
| 72 | // while( $row = $qry->Fetch() ) { |
---|
| 73 | // delete_collection($row->child_id); |
---|
| 74 | // } |
---|
| 75 | //} |
---|
| 76 | |
---|
| 77 | //if ( $qry->QDo("SELECT write_sync_change(collection_id, 404, caldav_data.dav_name) FROM caldav_data WHERE collection_id = :collection_id", $params ) |
---|
| 78 | // && $qry->QDo("DELETE FROM property WHERE dav_name LIKE (SELECT dav_name FROM collection WHERE collection_id = :collection_id) || '%'", $params ) |
---|
| 79 | // && $qry->QDo("DELETE FROM locks WHERE dav_name LIKE (SELECT dav_name FROM collection WHERE collection_id = :collection_id) || '%'", $params ) |
---|
| 80 | // && $qry->QDo("DELETE FROM caldav_data WHERE collection_id = :collection_id", $params ) |
---|
| 81 | // && $qry->QDo("DELETE FROM collection WHERE collection_id = :collection_id", $params ) ) { |
---|
| 82 | // @dbg_error_log( "DELETE", "DELETE (collection): User: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path); |
---|
| 83 | // return true; |
---|
| 84 | //} |
---|
| 85 | //return false; |
---|
| 86 | } |
---|
| 87 | |
---|
| 88 | function delete_collection_card( $nome,$CALID,$qry ) |
---|
| 89 | { |
---|
| 90 | $qryy = new AwlQuery( "SELECT A.id_contact,B.id_connection,C.id_address FROM phpgw_cc_contact as A left join phpgw_cc_contact_conns as B using(id_contact) left join phpgw_cc_contact_addrs as C using(id_contact) WHERE A.id_owner = :owner AND A.id_contact = :cal_id", array( ':owner' => $nome , ':cal_id' => $CALID)); |
---|
| 91 | if ( $qryy->Exec("DELETE") && $qryy->rows() > 0 ) |
---|
| 92 | { |
---|
| 93 | if ($qry->QDo("DELETE FROM phpgw_cc_contact WHERE id_contact = :cal_id AND id_owner = :nome",array( ':cal_id' => $CALID, ':nome' => $nome))) |
---|
| 94 | { |
---|
| 95 | while($delete_row = $qryy->Fetch()) |
---|
| 96 | { |
---|
| 97 | if ( isset($delete_row->id_connection)) |
---|
| 98 | { |
---|
| 99 | $qry->QDO("DELETE FROM phpgw_cc_contact_conns WHERE id_contact= :id AND id_connection = :id_connection",array( ':id' => $CALID,':id_connection' => $delete_row->id_connection )); |
---|
| 100 | $qry->QDO("DELETE FROM phpgw_cc_connections WHERE id_connection = :id_connection",array( ':id_connection' => $delete_row->id_connection )); |
---|
| 101 | } |
---|
| 102 | if ( isset($delete_row->id_address)) |
---|
| 103 | { |
---|
| 104 | $qry->QDO("DELETE from phpgw_cc_contact_addrs where id_contact= :id AND id_address = :id_connection", array(':id' => $CALID ,':id_connection' => $delete_row->id_address)); |
---|
| 105 | $qry->QDO("DELETE from phpgw_cc_addresses where id_address = :id_connection", array(':id_connection' => $delete_row->id_address)); |
---|
| 106 | } |
---|
| 107 | } |
---|
| 108 | @dbg_error_log( "DELETE", "DELETE (collection): User: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path); |
---|
| 109 | return true; |
---|
| 110 | } |
---|
| 111 | else |
---|
| 112 | { return false; |
---|
| 113 | } |
---|
| 114 | } |
---|
| 115 | else |
---|
| 116 | { |
---|
| 117 | return false; |
---|
| 118 | } |
---|
| 119 | } |
---|
| 120 | |
---|
| 121 | if ( !$container->Exists() )$request->DoResponse( 404 ); |
---|
| 122 | |
---|
| 123 | if ( ! ( $container->resource_id() > 0 ) ) { |
---|
| 124 | $request->DoResponse( 403 ); |
---|
| 125 | } |
---|
| 126 | |
---|
| 127 | $qry = new AwlQuery(); |
---|
| 128 | $qry->Begin(); |
---|
| 129 | if ( $container->IsBinding() ) { |
---|
| 130 | $params = array( ':dav_name' => $container->dav_name() ); |
---|
| 131 | if ( $qry->QDo("DELETE FROM dav_binding WHERE dav_name = :dav_name", $params ) && $qry->Commit() ) |
---|
| 132 | { |
---|
| 133 | @dbg_error_log( "DELETE", "DELETE: Binding: %d, ETag: %s, Path: %s", $session->user_no, $request->etag_if_match, $request->path); |
---|
| 134 | $request->DoResponse( 204 ); |
---|
| 135 | } |
---|
| 136 | } |
---|
| 137 | else if ( $container->IsCollection() ) { |
---|
| 138 | if ( $dav_resource->IsAddressbook()) |
---|
| 139 | { |
---|
| 140 | if ( delete_collection_card( $nome,$CALID,$qry ) && $qry->Commit() ) { |
---|
| 141 | $request->DoResponse( 204 ); |
---|
| 142 | } |
---|
| 143 | |
---|
| 144 | } |
---|
| 145 | else //if ( $dav_resource->IsCalendar()) |
---|
| 146 | { |
---|
| 147 | if ( delete_collection( $nome,$CALID ) && $qry->Commit() ) { |
---|
| 148 | $request->DoResponse( 204 ); |
---|
| 149 | } |
---|
| 150 | } |
---|
| 151 | |
---|
| 152 | } |
---|
| 153 | else { |
---|
| 154 | if ( (isset($request->etag_if_match) && $request->etag_if_match != $dav_resource->unique_tag() ) ) { |
---|
| 155 | $request->DoResponse( 412, translate("Resource has changed on server - not deleted") ); |
---|
| 156 | } |
---|
| 157 | |
---|
| 158 | } |
---|
| 159 | $request->DoResponse( 500 ); |
---|
| 160 | |
---|