diff --git a/plugins/calendar/drivers/calendar_driver.php b/plugins/calendar/drivers/calendar_driver.php index deb75023..15183e96 100644 --- a/plugins/calendar/drivers/calendar_driver.php +++ b/plugins/calendar/drivers/calendar_driver.php @@ -248,6 +248,25 @@ abstract class calendar_driver */ abstract function dismiss_alarm($event_id, $snooze = 0); + /** + * Check the given event object for validity + * + * @param array Event object as hash array + * @return boolean True if valid, false if not + */ + public function validate($event) + { + $valid = true; + + if (!is_object($event['start']) || !is_a($event['start'], 'DateTime')) + $valid = false; + if (!is_object($event['end']) || !is_a($event['end'], 'DateTime')) + $valid = false; + + return $valid; + } + + /** * Get list of event's attachments. * Drivers can return list of attachments as event property. diff --git a/plugins/calendar/drivers/database/database_driver.php b/plugins/calendar/drivers/database/database_driver.php index 5aac2ddf..1f26446b 100644 --- a/plugins/calendar/drivers/database/database_driver.php +++ b/plugins/calendar/drivers/database/database_driver.php @@ -210,6 +210,9 @@ class database_driver extends calendar_driver */ public function new_event($event) { + if (!$this->validate($event)) + return false; + if (!empty($this->calendars)) { if ($event['calendar'] && !$this->calendars[$event['calendar']]) return false; diff --git a/plugins/calendar/drivers/kolab/kolab_driver.php b/plugins/calendar/drivers/kolab/kolab_driver.php index 65bbbb28..02511070 100644 --- a/plugins/calendar/drivers/kolab/kolab_driver.php +++ b/plugins/calendar/drivers/kolab/kolab_driver.php @@ -286,6 +286,9 @@ class kolab_driver extends calendar_driver */ public function new_event($event) { + if (!$this->validate($event)) + return false; + $cid = $event['calendar'] ? $event['calendar'] : reset(array_keys($this->calendars)); if ($storage = $this->calendars[$cid]) { // handle attachments to add diff --git a/plugins/calendar/lib/calendar_ical.php b/plugins/calendar/lib/calendar_ical.php index 20d5757c..34eeeef4 100644 --- a/plugins/calendar/lib/calendar_ical.php +++ b/plugins/calendar/lib/calendar_ical.php @@ -160,8 +160,15 @@ class calendar_ical $event['end']->sub(new DateInterval('PT23H')); // assign current timezone to event start/end - $event['start']->setTimezone($this->cal->timezone); - $event['end']->setTimezone($this->cal->timezone); + if (is_a($event['start'], 'DateTime')) + $event['start']->setTimezone($this->cal->timezone); + else + unset($event['start']); + + if (is_a($event['end'], 'DateTime')) + $event['end']->setTimezone($this->cal->timezone); + else + unset($event['end']); // map other attributes to internal fields $_attendees = array(); diff --git a/plugins/libcalendaring/libcalendaring.php b/plugins/libcalendaring/libcalendaring.php index fcbce275..24f98cb4 100644 --- a/plugins/libcalendaring/libcalendaring.php +++ b/plugins/libcalendaring/libcalendaring.php @@ -206,6 +206,11 @@ class libcalendaring extends rcube_plugin public function event_date_text($event, $tzinfo = false) { $fromto = ''; + + // abort if no valid event dates are given + if (!is_object($event['start']) || !is_a($event['start'], 'DateTime') || !is_object($event['end']) || !is_a($event['end'], 'DateTime')) + return $fromto; + $duration = $event['start']->diff($event['end'])->format('s'); $this->date_format_defaults();