From c2b91fae00676c89f16c435c033a48fabb58bb7a Mon Sep 17 00:00:00 2001 From: Jan Schneider Date: Mon, 9 Aug 2010 20:43:41 +0200 Subject: [PATCH] Implement CalDAV DELETE. --- kronolith/delete.php | 15 ++++++++++----- kronolith/lib/Driver/Ical.php | 35 +++++++++++++++++++++++++++++++++++ kronolith/templates/delete/delete.inc | 1 + kronolith/templates/delete/one.inc | 1 + 4 files changed, 47 insertions(+), 5 deletions(-) diff --git a/kronolith/delete.php b/kronolith/delete.php index fd7178e65..5e0c9b9ff 100644 --- a/kronolith/delete.php +++ b/kronolith/delete.php @@ -19,7 +19,7 @@ if (Kronolith::showAjaxView()) { if (Kronolith_Resource::isResourceCalendar($c = Horde_Util::getFormData('calendar'))) { $driver = 'Resource'; } else { - $driver = null; + $driver = Horde_Util::getFormData('type'); } $kronolith_driver = Kronolith::getDriver($driver, $c); @@ -35,11 +35,16 @@ if ($eventID = Horde_Util::getFormData('eventID')) { $url->redirect(); } if ($driver != 'Resource') { - $share = $kronolith_shares->getShare($event->calendar); - if (!$share->hasPermission($GLOBALS['registry']->getAuth(), Horde_Perms::DELETE, $event->creator)) { - $notification->push(_("You do not have permission to delete this event."), 'horde.warning'); - } else { + if ($driver == 'remote') { + /* The remote server is doing the permission checks for us. */ $have_perms = true; + } else { + $share = $kronolith_shares->getShare($event->calendar); + if (!$share->hasPermission($GLOBALS['registry']->getAuth(), Horde_Perms::DELETE, $event->creator)) { + $notification->push(_("You do not have permission to delete this event."), 'horde.warning'); + } else { + $have_perms = true; + } } } else { if (!$registry->isAdmin()) { diff --git a/kronolith/lib/Driver/Ical.php b/kronolith/lib/Driver/Ical.php index bf227a301..a73cfef1b 100644 --- a/kronolith/lib/Driver/Ical.php +++ b/kronolith/lib/Driver/Ical.php @@ -381,6 +381,41 @@ class Kronolith_Driver_Ical extends Kronolith_Driver } /** + * Deletes an event. + * + * @param string $eventId The ID of the event to delete. + * @param boolean $silent Don't send notifications, used when deleting + * events in bulk from maintenance tasks. + * + * @throws Kronolith_Exception + * @throws Horde_Exception_NotFound + * @throws Horde_Mime_Exception + */ + public function deleteEvent($eventId, $silent = false) + { + if (!$this->isCalDAV()) { + throw new Kronolith_Exception(_("Deleting events is not supported with this remote calendar.")); + } + + if (preg_match('/(.*)-(\d+)$/', $eventId, $matches)) { + throw new Kronolith_Exception(_("Cannot delete exceptions (yet).")); + } + + $url = trim($this->_getUrl(), '/') . '/' . $eventId; + try { + $response = $this->_getClient()->delete($url); + } catch (Horde_Http_Exception $e) { + Horde::logMessage($e, 'INFO'); + throw new Kronolith_Exception($e); + } + if (!in_array($response->code, array(200, 202, 204))) { + Horde::logMessage(sprintf('Failed to delete event from remote calendar: url = "%s", status = %s', + $url, $response->code), 'INFO'); + throw new Kronolith_Exception(_("The event could not be deleted from the remote server.")); + } + } + + /** * Fetches a remote calendar into the session and return the data. * * @param boolean $cache Whether to return data from the session cache. diff --git a/kronolith/templates/delete/delete.inc b/kronolith/templates/delete/delete.inc index 9d5a85a39..c402e37c8 100644 --- a/kronolith/templates/delete/delete.inc +++ b/kronolith/templates/delete/delete.inc @@ -12,6 +12,7 @@ if (empty($url)) { + diff --git a/kronolith/templates/delete/one.inc b/kronolith/templates/delete/one.inc index 4da64a672..85900dd6a 100644 --- a/kronolith/templates/delete/one.inc +++ b/kronolith/templates/delete/one.inc @@ -12,6 +12,7 @@ if (empty($url)) { +
event->attendees)): ?> -- 2.11.0
occurrence and all future occurences, or all occurences?") ?>