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 | |
---|