PageRenderTime 47ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/WebCalendar-1.2.5/del_entry.php

#
PHP | 275 lines | 232 code | 17 blank | 26 comment | 58 complexity | f3441ebbb07604ec7e5375d17d5767df MD5 | raw file
Possible License(s): LGPL-2.1
  1. <?php
  2. /* $Id: del_entry.php,v 1.75.2.5 2012/02/28 02:07:45 cknudsen Exp $ */
  3. include_once 'includes/init.php';
  4. require ( 'includes/classes/WebCalMailer.class' );
  5. $mail = new WebCalMailer;
  6. require_valide_referring_url ();
  7. $can_edit = $my_event = false;
  8. $other_user = '';
  9. // First, check to see if this user should be able to delete this event.
  10. if ( $id > 0 ) {
  11. // Then see who has access to edit this entry.
  12. $can_edit = ( $is_admin || $readonly != 'Y' );
  13. // If assistant is doing this, then we need to switch login to user in the SQL.
  14. $query_params = array ();
  15. $query_params[] = $id;
  16. $sql = 'SELECT we.cal_id, we.cal_type FROM webcal_entry we,
  17. webcal_entry_user weu WHERE we.cal_id = weu.cal_id AND we.cal_id = ? ';
  18. if ( ! $is_admin ) {
  19. $sql .= ' AND ( we.cal_create_by = ? OR weu.cal_login = ? )';
  20. $sqlparm = ( $is_assistant ? $user : $login );
  21. $query_params[] = $sqlparm;
  22. $query_params[] = $sqlparm;
  23. }
  24. $res = dbi_execute ( $sql, $query_params );
  25. if ( $res ) {
  26. $row = dbi_fetch_row ( $res );
  27. if ( $row && $row[0] > 0 )
  28. $can_edit = true;
  29. $activity_type = $row[1];
  30. dbi_free_result ( $res );
  31. }
  32. }
  33. if ( strpos ( 'EM', $activity_type ) !== false ) {
  34. $log_delete = LOG_DELETE;
  35. $log_reject = LOG_REJECT;
  36. } else {
  37. $log_delete = LOG_DELETE_T;
  38. $log_reject = LOG_REJECT_T;
  39. }
  40. // See who owns the event. Owner should be able to delete.
  41. $res = dbi_execute ( 'SELECT cal_create_by FROM webcal_entry WHERE cal_id = ?',
  42. array ( $id ) );
  43. if ( $res ) {
  44. $row = dbi_fetch_row ( $res );
  45. $owner = $row[0];
  46. dbi_free_result ( $res );
  47. if ( $owner == $login || $is_assistant && $user == $owner || $is_nonuser_admin )
  48. $can_edit = $my_event = true;
  49. // Check UAC.
  50. if ( access_is_enabled () && ! $is_admin )
  51. $can_edit = access_user_calendar ( 'edit', $owner );
  52. }
  53. // If the user is the event creator or their assistant
  54. // allow them to delete the event from another user's calendar.
  55. // It's essentially the same thing as editing the event and removing the
  56. // user from the participants list.
  57. if ( $my_event && ! empty ( $user ) && $user != $login && ! $is_assistant )
  58. $other_user = $user;
  59. if ( $readonly == 'Y' )
  60. $can_edit = false;
  61. // If User Access Control is enabled, check to see if the current
  62. // user is allowed to delete events from the other user's calendar.
  63. if ( ! $can_edit && access_is_enabled () && ! empty ( $user ) &&
  64. access_user_calendar ( 'edit', $user ) )
  65. $can_edit = true;
  66. if ( ! $can_edit )
  67. $error = print_not_auth (6);
  68. // Is this a repeating event?
  69. $event_repeats = false;
  70. $res = dbi_execute ( 'SELECT COUNT( cal_id ) FROM webcal_entry_repeats
  71. WHERE cal_id = ?', array ( $id ) );
  72. if ( $res ) {
  73. $row = dbi_fetch_row ( $res );
  74. if ( $row[0] > 0 )
  75. $event_repeats = true;
  76. dbi_free_result ( $res );
  77. }
  78. $override_repeat = false;
  79. if ( ! empty ( $date ) && $event_repeats && ! empty ( $override ) )
  80. $override_repeat = true;
  81. if ( $id > 0 && empty ( $error ) ) {
  82. if ( ! empty ( $date ) )
  83. $thisdate = $date;
  84. else {
  85. $res = dbi_execute ( 'SELECT cal_date FROM webcal_entry WHERE cal_id = ?',
  86. array ( $id ) );
  87. if ( $res ) {
  88. // date format is 19991231
  89. $row = dbi_fetch_row ( $res );
  90. $thisdate = $row[0];
  91. }
  92. }
  93. // Only allow delete of webcal_entry & webcal_entry_repeats
  94. // if owner or admin, not participant.
  95. // If a user was specified, then only delete that user (not here) even if we
  96. // are the owner or an admin.
  97. if ( ( $is_admin || $my_event ) && ! $other_user ) {
  98. // Email participants that the event was deleted.
  99. // First, get list of participants (with status Approved or Waiting on approval).
  100. $res = dbi_execute ( 'SELECT cal_login FROM webcal_entry_user
  101. WHERE cal_id = ? AND cal_status IN ( \'A\', \'W\' )', array ( $id ) );
  102. $partlogin = array ();
  103. if ( $res ) {
  104. while ( $row = dbi_fetch_row ( $res ) ) {
  105. $partlogin[] = $row[0];
  106. }
  107. dbi_free_result ( $res );
  108. }
  109. // Get event name.
  110. $res = dbi_execute ( 'SELECT cal_name, cal_date, cal_time FROM webcal_entry
  111. WHERE cal_id = ?', array ( $id ) );
  112. if ( $res ) {
  113. $row = dbi_fetch_row ( $res );
  114. $name = $row[0];
  115. $fmtdate = $row[1];
  116. $time = sprintf ( "%06d", $row[2] );
  117. dbi_free_result ( $res );
  118. }
  119. $eventstart = date_to_epoch ( $fmtdate . $time );
  120. $TIME_FORMAT = 24;
  121. for ( $i = 0, $cnt = count ( $partlogin ); $i < $cnt; $i++ ) {
  122. // Log the deletion.
  123. activity_log ( $id, $login, $partlogin[$i], $log_delete, '' );
  124. // Check UAC.
  125. $can_email = ( access_is_enabled ()
  126. ? access_user_calendar ( 'email', $partlogin[$i], $login ) : false );
  127. // Don't email the logged in user.
  128. if ( $can_email && $partlogin[$i] != $login ) {
  129. set_env ( 'TZ', get_pref_setting ( $partlogin[$i], 'TIMEZONE' ) );
  130. $user_language = get_pref_setting ( $partlogin[$i], 'LANGUAGE' );
  131. user_load_variables ( $partlogin[$i], 'temp' );
  132. if ( ! $is_nonuser_admin && $partlogin[$i] != $login &&
  133. get_pref_setting ( $partlogin[$i], 'EMAIL_EVENT_DELETED' ) == 'Y' &&
  134. boss_must_be_notified ( $login, $partlogin[$i] ) && !
  135. empty ( $tempemail ) && $SEND_EMAIL != 'N' ) {
  136. reset_language ( empty ( $user_language ) || $user_language == 'none'
  137. ? $LANGUAGE : $user_language );
  138. // Use WebCalMailer class.
  139. $mail->WC_Send ( $login_fullname, $tempemail, $tempfullname, $name,
  140. str_replace ( 'XXX', $tempfullname, translate ( 'Hello, XXX.' ) )
  141. . ".\n\n" . str_replace ( 'XXX', $login_fullname,
  142. // translate ( 'An appointment has been canceled for you by' )
  143. translate ( 'XXX has canceled an appointment.' ) ) . "\n"
  144. . str_replace ( 'XXX', $name, translate ( 'Subject XXX' ) ) . "\"\n"
  145. . str_replace ( 'XXX', date_to_str ( $thisdate ),
  146. translate ( 'Date XXX' ) ) . "\n"
  147. . ( ! empty ( $eventtime ) && $eventtime != '-1'
  148. ? str_replace ( 'XXX', display_time ( '', 2, $eventstart,
  149. get_pref_setting ( $partlogin[$i], 'TIME_FORMAT' ) ),
  150. translate ( 'Time XXX' ) ) : '' ) . "\n\n",
  151. // Apply user's GMT offset and display their TZID.
  152. get_pref_setting ( $partlogin[$i], 'EMAIL_HTML' ), $login_email );
  153. }
  154. }
  155. }
  156. // Instead of deleting from the database...
  157. // mark it as deleted by setting the status for each participant to "D"
  158. // (instead of "A"/Accepted, "W"/Waiting-on-approval or "R"/Rejected).
  159. if ( $override_repeat ) {
  160. dbi_execute ( 'INSERT INTO webcal_entry_repeats_not
  161. ( cal_id, cal_date, cal_exdate ) VALUES ( ?, ?, ? )',
  162. array ( $id, $date, 1 ) );
  163. // Should we log this to the activity log???
  164. } else {
  165. // If it's a repeating event, delete any event exceptions that were entered.
  166. if ( $event_repeats ) {
  167. $res = dbi_execute ( 'SELECT cal_id FROM webcal_entry WHERE cal_group_id = ?',
  168. array ( $id ) );
  169. if ( $res ) {
  170. $ex_events = array ();
  171. while ( $row = dbi_fetch_row ( $res ) ) {
  172. $ex_events[] = $row[0];
  173. }
  174. dbi_free_result ( $res );
  175. for ( $i = 0, $cnt = count ( $ex_events ); $i < $cnt; $i++ ) {
  176. $res = dbi_execute ( 'SELECT cal_login FROM
  177. webcal_entry_user WHERE cal_id = ?', array ( $ex_events[$i] ) );
  178. if ( $res ) {
  179. $delusers = array ();
  180. while ( $row = dbi_fetch_row ( $res ) ) {
  181. $delusers[] = $row[0];
  182. }
  183. dbi_free_result ( $res );
  184. for ( $j = 0, $cnt = count ( $delusers ); $j < $cnt; $j++ ) {
  185. // Log the deletion.
  186. activity_log ( $ex_events[$i], $login, $delusers[$j],
  187. $log_delete, '' );
  188. dbi_execute ( 'UPDATE webcal_entry_user SET cal_status = ?
  189. WHERE cal_id = ? AND cal_login = ?',
  190. array ( 'D', $ex_events[$i], $delusers[$j] ) );
  191. }
  192. }
  193. }
  194. }
  195. }
  196. // Now, mark event as deleted for all users.
  197. dbi_execute ( 'UPDATE webcal_entry_user SET cal_status = \'D\' WHERE cal_id = ?',
  198. array ( $id ) );
  199. // Delete External users for this event
  200. dbi_execute ( 'DELETE FROM webcal_entry_ext_user WHERE cal_id = ?',
  201. array ( $id ) );
  202. }
  203. } else {
  204. // Not the owner of the event, but participant or noncal_admin.
  205. // Just set the status to 'D' instead of deleting.
  206. $del_user = ( ! empty ( $other_user ) ? $other_user : $login );
  207. if ( ! empty ( $user ) && $user != $login ) {
  208. if ( $is_admin || $my_event || ( $can_edit && $is_assistant ) ||
  209. ( access_is_enabled () &&
  210. access_user_calendar ( 'edit', $user ) ) ) {
  211. $del_user = $user;
  212. } else
  213. // Error: user cannot delete from other user's calendar.
  214. $error = print_not_auth (6);
  215. }
  216. if ( empty ( $error ) ) {
  217. if ( $override_repeat ) {
  218. dbi_execute ( 'INSERT INTO webcal_entry_repeats_not
  219. ( cal_id, cal_date, cal_exdate ) VALUES ( ?, ?, ? )',
  220. array ( $id, $date, 1 ) );
  221. // Should we log this to the activity log???
  222. } else {
  223. dbi_execute ( 'UPDATE webcal_entry_user SET cal_status = ?
  224. WHERE cal_id = ? AND cal_login = ?', array ( 'D', $id, $del_user ) );
  225. activity_log ( $id, $login, $login, $log_reject, '' );
  226. }
  227. }
  228. }
  229. }
  230. $ret = getValue ( 'ret' );
  231. $return_view = get_last_view ();
  232. if ( ! empty ( $ret ) ) {
  233. if ( $ret == 'listall' )
  234. $url = 'list_unapproved.php';
  235. else
  236. if ( $ret == 'list' )
  237. $url = 'list_unapproved.php' . ( empty ( $user ) ? '' : '?user=' . $user );
  238. } else
  239. if ( ! empty ( $return_view ) )
  240. do_redirect ( $return_view );
  241. else
  242. $url = get_preferred_view ( '', empty ( $user ) ? '' : 'user=' . $user );
  243. // Return to login TIMEZONE.
  244. set_env ( 'TZ', $TIMEZONE );
  245. if ( empty ( $error ) && empty ( $mailerError ) ) {
  246. do_redirect ( $url );
  247. exit;
  248. }
  249. // Process errors.
  250. $mail->MailError ( $mailerError, $error );
  251. ?>