diff --git a/lib/kolab_sync_data_calendar.php b/lib/kolab_sync_data_calendar.php --- a/lib/kolab_sync_data_calendar.php +++ b/lib/kolab_sync_data_calendar.php @@ -391,8 +391,10 @@ $is_outlook = stripos($this->device->devicetype, 'outlook') !== false; $is_android = stripos($this->device->devicetype, 'android') !== false; - // check data validity - $this->check_event($data); + // check data validity (of a new event) + if (empty($event)) { + $this->check_event($data); + } if (!empty($event['start']) && ($event['start'] instanceof DateTime)) { $old_timezone = $event['start']->getTimezone(); @@ -429,6 +431,11 @@ $value = $data->$key; + // Skip ghosted (unset) properties, (but make sure 'changed' timestamp is reset) + if ($value === null && $name != 'changed') { + continue; + } + switch ($name) { case 'changed': $value = null; @@ -510,12 +517,27 @@ } // Organizer - if (!$is_exception && ($organizer_email = $data->organizerEmail)) { - $attendees[] = array( - 'role' => 'ORGANIZER', - 'name' => $data->organizerName, - 'email' => $organizer_email, - ); + if (!$is_exception) { + // Organizer specified + if ($organizer_email = $data->organizerEmail) { + $attendees[] = array( + 'role' => 'ORGANIZER', + 'name' => $data->organizerName, + 'email' => $organizer_email, + ); + } else if (!empty($event['attendees'])) { + // Organizer not specified, use one from the original event if that's an update + foreach ($event['attendees'] as $idx => $attendee) { + if (!empty($attendee['email']) && !empty($attendee['role']) && $attendee['role'] == 'ORGANIZER') { + $organizer_email = $attendee['email']; + $attendees[] = array( + 'role' => 'ORGANIZER', + 'name' => $attendee['name'] ?? '', + 'email' => $organizer_email, + ); + } + } + } } // Attendees