Projects
Kolab:16:Testing:Candidate
kolab-syncroton
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 30
View file
kolab-syncroton.spec
Changed
@@ -37,7 +37,7 @@ %global upstream_version 2.4.2 Name: kolab-syncroton -Version: 2.4.2.6 +Version: 2.4.2.7 Release: 1%{?dist} Summary: ActiveSync for Kolab Groupware
View file
debian.changelog
Changed
@@ -1,4 +1,4 @@ -kolab-syncroton (2.4.2.6-0~kolab1) unstable; urgency=low +kolab-syncroton (2.4.2.7-0~kolab1) unstable; urgency=low * Release version 2.4.2
View file
kolab-syncroton-2.4.2.tar.gz/lib/ext/Syncroton/Model/EmailMeetingRequest.php
Changed
@@ -78,7 +78,7 @@ 'dtStamp' => array('type' => 'datetime'), 'endTime' => array('type' => 'datetime'), 'globalObjId' => array('type' => 'string'), - 'instanceType' => array('type' => 'datetime'), + 'instanceType' => array('type' => 'number'), 'location' => array('type' => 'string'), 'organizer' => array('type' => 'string'), //e-mail address 'recurrenceId' => array('type' => 'datetime'),
View file
kolab-syncroton-2.4.2.tar.gz/lib/kolab_sync_data.php
Changed
@@ -1265,10 +1265,12 @@ if ($count == 2 && $name_items0 == 'x-custom') { $value = null; - foreach ((array) $data'x-custom' as $val) { - if (is_array($val) && $val0 == $name_items1) { - $value = $val1; - break; + if (!empty($data'x-custom') && is_array($data'x-custom')) { + foreach ($data'x-custom' as $val) { + if (is_array($val) && $val0 == $name_items1) { + $value = $val1; + break; + } } }
View file
kolab-syncroton-2.4.2.tar.gz/lib/kolab_sync_data_calendar.php
Changed
@@ -116,7 +116,8 @@ const SENSITIVITY_PRIVATE = 2; const SENSITIVITY_CONFIDENTIAL = 3; - const KEY_DTSTAMP = 'x-custom.X-ACTIVESYNC-DTSTAMP'; + const KEY_DTSTAMP = 'x-custom.X-ACTIVESYNC-DTSTAMP'; + const KEY_REPLYTIME = 'x-custom.X-ACTIVESYNC-REPLYTIME'; /** * Mapping of attendee status @@ -231,7 +232,7 @@ break; case 'free_busy': - if (!$is_outlook && !empty($value)) { + if (!empty($value)) { $value = $this->busyStatusMap$value; } break; @@ -287,17 +288,17 @@ $user_emails = $this->user_emails(); foreach ($event'attendees' as $idx => $attendee) { - $att = array(); - - if ($email = $attendee'email') { - $att'email' = $email; - } - else { + if (empty($attendee'email')) { // In Activesync email is required continue; } - $att'name' = $attendee'name' ?: $email; + $email = $attendee'email'; + + $att = + 'email' => $email, + 'name' => !empty($attendee'name') ? $attendee'name' : $email, + ; $type = isset($attendee'role') ? $this->attendeeTypeMap$attendee'role' : null; $status = isset($attendee'status') ? $this->attendeeStatusMap$attendee'status' : null; @@ -306,7 +307,7 @@ if (isset($attendee'cutype') && strtolower($attendee'cutype') == 'resource') { $att'attendeeType' = self::ATTENDEE_TYPE_RESOURCE; } else { - $att'attendeeType' = $type ?: self::ATTENDEE_TYPE_REQUIRED; + $att'attendeeType' = $type ?: self::ATTENDEE_TYPE_REQUIRED; } $att'attendeeStatus' = $status ?: self::ATTENDEE_STATUS_UNKNOWN; } @@ -316,7 +317,7 @@ $resp_type = $status ?: self::ATTENDEE_STATUS_UNKNOWN; // Synchronize the attendee status to the event status to get the same behaviour as outlook. - if ($is_outlook) { + if ($is_outlook && isset($attendee'status')) { if ($attendee'status' == 'ACCEPTED') { $result'busyStatus' = self::BUSY_STATUS_BUSY; } @@ -324,7 +325,6 @@ $result'busyStatus' = self::BUSY_STATUS_TENTATIVE; } } - } $result'attendees' = new Syncroton_Model_EventAttendee($att); @@ -341,6 +341,17 @@ $result'responseRequested' = $result'meetingStatus' == 3 && $user_rsvp ? 1 : 0; $result'responseType' = $result'meetingStatus' == 3 ? $resp_type : null; + // Appointment Reply Time (without it Outlook displays e.g. "Accepted on None") + if ($resp_type != self::ATTENDEE_STATUS_UNKNOWN) { + if ($reply_time = $this->getKolabDataItem($event, self::KEY_REPLYTIME)) { + $result'appointmentReplyTime' = new DateTime($reply_time, new DateTimeZone('UTC')); + } elseif (!empty($event'changed')) { + $reply_time = clone $event'changed'; + $reply_time->setTimezone(new DateTimeZone('UTC')); + $result'appointmentReplyTime' = $reply_time; + } + } + return $as_array ? $result : new Syncroton_Model_Event($result); } @@ -654,11 +665,9 @@ case 'DECLINED': $event'free_busy' = 'free'; break; } */ - // Store Outlook response timestamp for further use - if (stripos($this->device->devicetype, 'outlook') !== false) { - $dtstamp = new DateTime('now', new DateTimeZone('UTC')); - $dtstamp = $dtstamp->format(DateTime::ATOM); - } + // Store response timestamp for further use + $reply_time = new DateTime('now', new DateTimeZone('UTC')); + $this->setKolabDataItem($event, self::KEY_REPLYTIME, $reply_time->format('Ymd\THis\Z')); // Update/Save the event if (empty($existing)) { @@ -778,6 +787,13 @@ // to an iTip request with bumped SEQUENCE $old'sequence' += 1; + // Copy new custom properties + if (!empty($event'x-custom')) { + foreach ($event'x-custom' as $key => $val) { + $old'x-custom'$key = $val; + } + } + // Update the event return $this->save_event($old, $status); }
View file
kolab-syncroton-2.4.2.tar.gz/lib/kolab_sync_data_email.php
Changed
@@ -408,23 +408,21 @@ $meeting'dtStamp' = self::date_from_kolab($event'dtstamp' ?? null); $meeting'endTime' = self::date_from_kolab($event'end' ?? null); $meeting'location' = $event'location' ?? null; - - //TODO implement recurrences. We can't detect exceptions like this (don't know how), and the recurrences structure is different from event, - //so that also doesn't work like this. - // if (isset($event'recurrence''EXCEPTIONS')) { - // $meeting'instanceType' = Syncroton_Model_EmailMeetingRequest::TYPE_RECURRING_EXCEPTION; - // $this->recurrence_from_kolab($collection, $event, $meeting); - // // } else if (isset($event'recurrence')) { - // // $meeting'instanceType' = Syncroton_Model_EmailMeetingRequest::TYPE_RECURRING_SINGLE; - // // $meeting'recurrenceId' = set the date; - // } else if (isset($event'recurrence')) { - // $meeting'instanceType' = Syncroton_Model_EmailMeetingRequest::TYPE_RECURRING_MASTER; - // $this->recurrence_from_kolab($collection, $event, $meeting); - // } else { - // $meeting'instanceType' = Syncroton_Model_EmailMeetingRequest::TYPE_NORMAL; - // } $meeting'instanceType' = Syncroton_Model_EmailMeetingRequest::TYPE_NORMAL; + if (!empty($event'recurrence_date')) { + $meeting'recurrenceId' = self::date_from_kolab($event'recurrence_date'); + if (!empty($event'status') && $event'status' == 'CANCELLED') { + $meeting'instanceType' = Syncroton_Model_EmailMeetingRequest::TYPE_RECURRING_EXCEPTION; + } else { + $meeting'instanceType' = Syncroton_Model_EmailMeetingRequest::TYPE_RECURRING_SINGLE; + } + } else if (!empty($event'recurrence')) { + $meeting'instanceType' = Syncroton_Model_EmailMeetingRequest::TYPE_RECURRING_MASTER; + // TODO: MeetingRequest recurrence is different that the one in Calendar + // $this->recurrence_from_kolab($collection, $event, $meeting); + } + // Organizer if (!empty($event'attendees')) { foreach ($event'attendees' as $idx => $attendee) { @@ -455,6 +453,10 @@ $meeting'meetingMessageType' = Syncroton_Model_EmailMeetingRequest::MESSAGE_TYPE_NORMAL; } + // New time proposals aren't supported by Kolab. + // This disables the UI elements related to this on the client side + $meeting'disallowNewTimeProposal' = 1; + $result'meetingRequest' = new Syncroton_Model_EmailMeetingRequest($meeting); } @@ -464,6 +466,8 @@ $result'categories' = $this->getKolabTags($message); } + $is_ios = preg_match('/(iphone|ipad)/i', $this->device->devicetype); + // attachments $attachments = array_merge($message->attachments, $message->inline_parts); if (!empty($attachments)) { @@ -472,6 +476,10 @@ foreach ($attachments as $attachment) { $att = array(); + if ($is_ios && !empty($event) && $attachment->mime_id == $event'_mime_id') { + continue; + } + $filename = rcube_charset::clean($attachment->filename); if (empty($filename) && $attachment->mimetype == 'text/html') { $filename = 'HTML Part'; @@ -1799,9 +1807,12 @@ foreach ($ical_objects as $mime_id => $event) { if ($event'_type' == 'event') { $event'_method' = $ical_objects->method; + $event'_mime_id' = $ical_objects->mime_id; + return $event; } } + return null; }
View file
kolab-syncroton.dsc
Changed
@@ -2,7 +2,7 @@ Source: kolab-syncroton Binary: kolab-syncroton Architecture: all -Version: 1:2.4.2.6-1~kolab1 +Version: 1:2.4.2.7-1~kolab1 Maintainer: Jeroen van Meeuwen <vanmeeuwen@kolabsys.com> Uploaders: Jeroen van Meeuwen <vanmeeuwen@kolabsys.com> Homepage: http://www.kolab.org/
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.