Projects
Kolab:16:TestingLinked
roundcubemail-plugins-kolab
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 21
View file
roundcubemail-plugins-kolab.spec
Changed
@@ -29,7 +29,7 @@ %global tmpdir %{_var}/lib/roundcubemail Name: roundcubemail-plugins-kolab -Version: 3.3.5 +Version: 3.3.6 Release: 1%{?dist} Summary: Kolab Groupware plugins for Roundcube Webmail @@ -2018,6 +2018,9 @@ %defattr(-,root,root,-) %changelog +* Tue Apr 17 2018 Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> - 3.3.6-1 +- Release of 3.3.6 + * Fri Jan 5 2018 Jeroen van Meeuwen <vanmeeuwen@kolabsys.com> - 3.3.5-2 - Repack of 3.3.5
View file
debian.changelog
Changed
@@ -1,3 +1,9 @@ +roundcubemail-plugins-kolab (1:3.3.6-0~kolab1) unstable; urgency=low + + * Release 3.3.6 + + -- Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Tue, 17 Apr 2018 11:11:11 +0200 + roundcubemail-plugins-kolab (1:3.3.5-0~kolab2) unstable; urgency=low * Release 3.3.5
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/calendar/calendar.php -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/calendar/calendar.php
Changed
@@ -1994,6 +1994,10 @@ */ private function write_preprocess(&$event, $action) { + // Remove double timezone specification (T2313) + $event'start' = preg_replace('/\s*\(.*\)/', '', $event'start'); + $event'end' = preg_replace('/\s*\(.*\)/', '', $event'end'); + // convert dates into DateTime objects in user's current timezone $event'start' = new DateTime($event'start', $this->timezone); $event'end' = new DateTime($event'end', $this->timezone); @@ -2996,13 +3000,13 @@ $calendar = $this->get_default_calendar($event'sensitivity', $calendars); $metadata = array( - 'uid' => $event'uid', + 'uid' => $event'uid', '_instance' => $event'_instance', - 'changed' => is_object($event'changed') ? $event'changed'->format('U') : 0, - 'sequence' => intval($event'sequence'), - 'fallback' => strtoupper($status), - 'method' => $event'_method', - 'task' => 'calendar', + 'changed' => is_object($event'changed') ? $event'changed'->format('U') : 0, + 'sequence' => intval($event'sequence'), + 'fallback' => strtoupper($status), + 'method' => $event'_method', + 'task' => 'calendar', ); // update my attendee status according to submitted method @@ -3029,9 +3033,9 @@ if (!$reply_sender) { $sender_identity = $this->rc->user->list_emails(true); $event'attendees' = array( - 'name' => $sender_identity'name', - 'email' => $sender_identity'email', - 'role' => 'OPT-PARTICIPANT', + 'name' => $sender_identity'name', + 'email' => $sender_identity'email', + 'role' => 'OPT-PARTICIPANT', 'status' => strtoupper($status), ); $metadata'attendee' = $sender_identity'email'; @@ -3057,23 +3061,27 @@ // only update attendee status if ($event'_method' == 'REPLY') { // try to identify the attendee using the email sender address - $existing_attendee = -1; + $existing_attendee = -1; $existing_attendee_emails = array(); + foreach ($existing'attendees' as $i => $attendee) { $existing_attendee_emails = $attendee'email'; if ($this->itip->compare_email($attendee'email', $event'_sender', $event'_sender_utf')) { $existing_attendee = $i; } } - $event_attendee = null; + + $event_attendee = null; $update_attendees = array(); + foreach ($event'attendees' as $attendee) { if ($this->itip->compare_email($attendee'email', $event'_sender', $event'_sender_utf')) { - $event_attendee = $attendee; - $update_attendees = $attendee; + $event_attendee = $attendee; + $update_attendees = $attendee; $metadata'fallback' = $attendee'status'; $metadata'attendee' = $attendee'email'; - $metadata'rsvp' = $attendee'rsvp' || $attendee'role' != 'NON-PARTICIPANT'; + $metadata'rsvp' = $attendee'rsvp' || $attendee'role' != 'NON-PARTICIPANT'; + if ($attendee'status' != 'DELEGATED') { break; } @@ -3099,6 +3107,23 @@ } } + // Accept sender as a new participant (different email in From: and the iTip) + // Use ATTENDEE entry from the iTip with replaced email address + if (!$event_attendee) { + // remove the organizer + $itip_attendees = array_filter($event'attendees', function($item) { return $item'role' != 'ORGANIZER'; }); + + // there must be only one attendee + if (is_array($itip_attendees) && count($itip_attendees) == 1) { + $event_attendee = $itip_attendeeskey($itip_attendees); + $event_attendee'email' = $event'_sender'; + $update_attendees = $event_attendee; + $metadata'fallback' = $event_attendee'status'; + $metadata'attendee' = $event_attendee'email'; + $metadata'rsvp' = $event_attendee'rsvp' || $event_attendee'role' != 'NON-PARTICIPANT'; + } + } + // found matching attendee entry in both existing and new events if ($existing_attendee >= 0 && $event_attendee) { $existing'attendees'$existing_attendee = $event_attendee; @@ -3109,6 +3134,9 @@ $existing'attendees' = $event_attendee; $success = $this->driver->update_attendees($existing, $update_attendees); } + else if (!$event_attendee) { + $error_msg = $this->gettext('errorunknownattendee'); + } else { $error_msg = $this->gettext('newerversionexists'); }
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/calendar/calendar_ui.js -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/calendar/calendar_ui.js
Changed
@@ -2407,7 +2407,7 @@ } else { me.saving_lock = rcmail.set_busy(true, 'calendar.savingdata'); - rcmail.http_post('event', { action:'rsvp', e:submit_data, status:response, attendees:attendees, noreply:noreply }); + rcmail.http_post('calendar/event', { action:'rsvp', e:submit_data, status:response, attendees:attendees, noreply:noreply }); } event_show_dialog(me.selected_event); @@ -3106,7 +3106,7 @@ else if (range > 0) start = 'today -' + range + ' months'; - rcmail.goto_url('export_events', { source:source, start:start, attachments:attachmt?1:0 }); + rcmail.goto_url('export_events', { source:source, start:start, attachments:attachmt?1:0 }, false); } $dialog.dialog("close"); }; @@ -3137,7 +3137,7 @@ this.event_download = function(event) { if (event && event.id) { - rcmail.goto_url('export_events', { source:event.calendar, id:event.id, attachments:1 }); + rcmail.goto_url('export_events', { source:event.calendar, id:event.id, attachments:1 }, false); } };
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/calendar/composer.json -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/calendar/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Calendar plugin", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.3.5", + "version": "3.3.6", "authors": { "name": "Thomas Bruederli",
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/calendar/localization/en_US.inc -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/calendar/localization/en_US.inc
Changed
@@ -249,6 +249,7 @@ $labels'importedsuccessfully' = 'The event was successfully added to \'$calendar\''; $labels'updatedsuccessfully' = 'The event was successfully updated in \'$calendar\''; $labels'attendeupdateesuccess' = 'Successfully updated the participant\'s status'; +$labels'errorunknownattendee' = 'Failed to find the participant information.'; $labels'itipsendsuccess' = 'Invitation sent to participants.'; $labels'itipresponseerror' = 'Failed to send the response to this event invitation'; $labels'itipinvalidrequest' = 'This invitation is no longer valid';
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/kolab_addressbook/composer.json -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/kolab_addressbook/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Kolab addressbook", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.3.5", + "version": "3.3.6", "authors": { "name": "Thomas Bruederli",
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/kolab_addressbook/lib/rcube_kolab_contacts.php -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/kolab_addressbook/lib/rcube_kolab_contacts.php
Changed
@@ -355,7 +355,7 @@ // get members by UID if (!empty($uids)) { - $this->_fetch_contacts($query = array(array('uid', '=', $uids)), !$fetch_all); + $this->_fetch_contacts($query = array(array('uid', '=', $uids)), $fetch_all ? false : count($uids)); $this->sortindex = array_merge($this->sortindex, $local_sortindex); } } @@ -363,7 +363,7 @@ $ids = $this->filter'ids'; if (count($ids)) { $uids = array_map(array($this, 'id2uid'), $this->filter'ids'); - $this->_fetch_contacts($query = array(array('uid', '=', $uids)), true); + $this->_fetch_contacts($query = array(array('uid', '=', $uids)), count($ids)); } } else { @@ -1066,10 +1066,13 @@ { if (!isset($this->dataset) || !empty($query)) { if ($limit) { - $this->storagefolder->set_order_and_limit($this->_sort_columns(), $this->page_size, ($this->list_page-1) * $this->page_size); + $size = is_int($limit) && $limit < $this->page_size ? $limit : $this->page_size; + $this->storagefolder->set_order_and_limit($this->_sort_columns(), $size, ($this->list_page-1) * $this->page_size); } + $this->sortindex = array(); - $this->dataset = $this->storagefolder->select($query); + $this->dataset = $this->storagefolder->select($query); + foreach ($this->dataset as $idx => $record) { $contact = $this->_to_rcube_contact($record); $this->sortindex$idx = $this->_sort_string($contact);
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/kolab_delegation/composer.json -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/kolab_delegation/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Kolab delegation feature", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.3.4", + "version": "3.3.6", "authors": { "name": "Aleksander Machniak",
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/kolab_delegation/kolab_delegation.php -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/kolab_delegation/kolab_delegation.php
Changed
@@ -59,6 +59,9 @@ // delegation support in kolab_auth plugin $this->add_hook('kolab_auth_emails', array($this, 'kolab_auth_emails')); + // delegation support in Enigma plugin + $this->add_hook('enigma_user_identities', array($this, 'user_identities')); + if ($this->rc->task == 'settings') { // delegation management interface $this->register_action('plugin.delegation', array($this, 'controller_ui')); @@ -315,6 +318,28 @@ } /** + * Delegation support in Enigma plugin + */ + public function user_identities($args) + { + // Remove delegators' identities from the key generation form + + if (!empty($_SESSION'delegators')) { + $args'identities' = array_filter($args'identities', function($ident) { + foreach ($_SESSION'delegators' as $emails) { + if (in_array($ident'email', $emails)) { + return false; + } + } + + return true; + }); + } + + return $args; + } + + /** * Delegation UI handler */ public function controller_ui()
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/libcalendaring/composer.json -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libcalendaring/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Library providing common functions for calendaring plugins", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.3.5", + "version": "3.3.6", "authors": { "name": "Thomas Bruederli",
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/libcalendaring/lib/libcalendaring_itip.php -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libcalendaring/lib/libcalendaring_itip.php
Changed
@@ -192,7 +192,7 @@ } } - return $p; + return $p; } /** @@ -365,128 +365,153 @@ */ public function get_itip_status($event, $existing = null) { - $action = $event'rsvp' ? 'rsvp' : ''; - $status = $event'fallback'; - $latest = $rescheduled = false; - $html = ''; + $action = $event'rsvp' ? 'rsvp' : ''; + $status = $event'fallback'; + $latest = $rescheduled = false; + $html = ''; - if (is_numeric($event'changed')) - $event'changed' = new DateTime('@'.$event'changed'); + if (is_numeric($event'changed')) { + $event'changed' = new DateTime('@'.$event'changed'); + } - // check if the given itip object matches the last state - if ($existing) { - $latest = (isset($event'sequence') && intval($existing'sequence') == intval($event'sequence')) || + // check if the given itip object matches the last state + if ($existing) { + $latest = (isset($event'sequence') && intval($existing'sequence') == intval($event'sequence')) || (!isset($event'sequence') && $existing'changed' && $existing'changed' >= $event'changed'); - } + } - // determine action for REQUEST - if ($event'method' == 'REQUEST') { - $html = html::div('rsvp-status', $this->gettext('acceptinvitation')); + // determine action for REQUEST + if ($event'method' == 'REQUEST') { + $html = html::div('rsvp-status', $this->gettext('acceptinvitation')); - if ($existing) { - $rsvp = $event'rsvp'; - $emails = $this->lib->get_user_emails(); - foreach ($existing'attendees' as $attendee) { - if ($attendee'email' && in_array(strtolower($attendee'email'), $emails)) { - $status = strtoupper($attendee'status'); - break; - } - } + if ($existing) { + $rsvp = $event'rsvp'; + $emails = $this->lib->get_user_emails(); - // Detect re-sheduling - if (!$latest) { - // FIXME: This is probably to simplistic, or maybe we should just check - // attendee's RSVP flag in the new event? - $rescheduled = $existing'start' != $event'start' || $existing'end' > $event'end'; - } - } - else { - $rsvp = $event'rsvp' && $this->rc->config->get('calendar_allow_itip_uninvited', true); - } + foreach ($existing'attendees' as $attendee) { + if ($attendee'email' && in_array(strtolower($attendee'email'), $emails)) { + $status = strtoupper($attendee'status'); + break; + } + } - $status_lc = strtolower($status); + // Detect re-sheduling + if (!$latest) { + // FIXME: This is probably to simplistic, or maybe we should just check + // attendee's RSVP flag in the new event? + $rescheduled = $existing'start' != $event'start' || $existing'end' > $event'end'; + } + } + else { + $rsvp = $event'rsvp' && $this->rc->config->get('calendar_allow_itip_uninvited', true); + } - if ($status_lc == 'unknown' && !$this->rc->config->get('calendar_allow_itip_uninvited', true)) { - $html = html::div('rsvp-status', $this->gettext('notanattendee')); - $action = 'import'; - } - else if (in_array($status_lc, $this->rsvp_status)) { - $status_text = $this->gettext(($latest ? 'youhave' : 'youhavepreviously') . $status_lc); + $status_lc = strtolower($status); - if ($existing && ($existing'sequence' > $event'sequence' || (!isset($event'sequence') && $existing'changed' && $existing'changed' > $event'changed'))) { - $action = ''; // nothing to do here, outdated invitation - if ($status_lc == 'needs-action') - $status_text = $this->gettext('outdatedinvitation'); - } - else if (!$existing && !$rsvp) { - $action = 'import'; - } - else if ($rescheduled) { - $action = 'rsvp'; - } - else if ($status_lc != 'needs-action') { - // check if there are any changes - if ($latest) { - $diff = $this->get_itip_diff($event, $existing); - $latest = empty($diff); + if ($status_lc == 'unknown' && !$this->rc->config->get('calendar_allow_itip_uninvited', true)) { + $html = html::div('rsvp-status', $this->gettext('notanattendee')); + $action = 'import'; } + else if (in_array($status_lc, $this->rsvp_status)) { + $status_text = $this->gettext(($latest ? 'youhave' : 'youhavepreviously') . $status_lc); - $action = !$latest ? 'update' : ''; - } + if ($existing && ($existing'sequence' > $event'sequence' + || (!isset($event'sequence') && $existing'changed' && $existing'changed' > $event'changed')) + ) { + $action = ''; // nothing to do here, outdated invitation + if ($status_lc == 'needs-action') { + $status_text = $this->gettext('outdatedinvitation'); + } + } + else if (!$existing && !$rsvp) { + $action = 'import'; + } + else if ($rescheduled) { + $action = 'rsvp'; + } + else if ($status_lc != 'needs-action') { + // check if there are any changes + if ($latest) { + $diff = $this->get_itip_diff($event, $existing); + $latest = empty($diff); + } - $html = html::div('rsvp-status ' . $status_lc, $status_text); - } - } - // determine action for REPLY - else if ($event'method' == 'REPLY') { - // check whether the sender already is an attendee - if ($existing) { - $action = $this->rc->config->get('calendar_allow_itip_uninvited', true) ? 'accept' : ''; - $listed = false; - foreach ($existing'attendees' as $attendee) { - if ($attendee'role' != 'ORGANIZER' && strcasecmp($attendee'email', $event'attendee') == 0) { - $status_lc = strtolower($status); - if (in_array($status_lc, $this->rsvp_status)) { - $html = html::div('rsvp-status ' . $status_lc, $this->gettext(array( - 'name' => 'attendee' . $status_lc, - 'vars' => array( - 'delegatedto' => rcube::Q($event'delegated-to' ?: ($attendee'delegated-to' ?: '?')), - ) - ))); - } - $action = $attendee'status' == $status || !$latest ? '' : 'update'; - $listed = true; - break; - } - } + $action = !$latest ? 'update' : ''; + } - if (!$listed) { - $html = html::div('rsvp-status', $this->gettext('itipnewattendee')); - } + $html = html::div('rsvp-status ' . $status_lc, $status_text); + } } - else { - $html = html::div('rsvp-status hint', $this->gettext('itipobjectnotfound')); - $action = ''; + // determine action for REPLY + else if ($event'method' == 'REPLY') { + // check whether the sender already is an attendee + if ($existing) { + // Relax checking if that is a reply to the latest version of the event + // We accept versions with older SEQUENCE but no significant changes (Bifrost#T78144) + if (!$latest) { + $num = $got = 0; + foreach (array('start', 'end', 'due', 'allday', 'recurrence', 'location') as $key) { + if (isset($existing$key)) { + if ($key == 'allday') { + $event$key = $event$key == 'true'; + } + $value = $existing$key instanceof DateTime ? $existing$key->format('c') : $existing$key; + $num++; + $got += intval($value == $event$key); + } + } + + $latest = $num === $got; + } + + $action = $this->rc->config->get('calendar_allow_itip_uninvited', true) ? 'accept' : ''; + $listed = false; + + foreach ($existing'attendees' as $attendee) { + if ($attendee'role' != 'ORGANIZER' && strcasecmp($attendee'email', $event'attendee') == 0) { + $status_lc = strtolower($status); + if (in_array($status_lc, $this->rsvp_status)) { + $html = html::div('rsvp-status ' . $status_lc, $this->gettext(array( + 'name' => 'attendee' . $status_lc, + 'vars' => array( + 'delegatedto' => rcube::Q($event'delegated-to' ?: ($attendee'delegated-to' ?: '?')), + ) + ))); + } + + $action = $attendee'status' == $status || !$latest ? '' : 'update'; + $listed = true; + break; + } + } + + if (!$listed) { + $html = html::div('rsvp-status', $this->gettext('itipnewattendee')); + } + } + else { + $html = html::div('rsvp-status hint', $this->gettext('itipobjectnotfound')); + $action = ''; + } } - } - else if ($event'method' == 'CANCEL') { - if (!$existing) { - $html = html::div('rsvp-status hint', $this->gettext('itipobjectnotfound')); - $action = ''; + else if ($event'method' == 'CANCEL') { + if (!$existing) { + $html = html::div('rsvp-status hint', $this->gettext('itipobjectnotfound')); + $action = ''; + } } - } - return array( - 'uid' => $event'uid', - 'id' => asciiwords($event'uid', true), - 'existing' => $existing ? true : false, - 'saved' => $existing ? true : false, - 'latest' => $latest, - 'status' => $status, - 'action' => $action, - 'rescheduled' => $rescheduled, - 'html' => $html, - ); + return array( + 'uid' => $event'uid', + 'id' => asciiwords($event'uid', true), + 'existing' => $existing ? true : false, + 'saved' => $existing ? true : false, + 'latest' => $latest, + 'status' => $status, + 'action' => $action, + 'rescheduled' => $rescheduled, + 'html' => $html, + ); } protected function get_itip_diff($event, $existing) @@ -588,6 +613,20 @@ } } + // It may happen that sender's address is different in From: and the attached iTip + // In such case use the ATTENDEE entry with the address from From: header + if (empty($metadata'attendee') && !empty($event'_sender')) { + // remove the organizer + $itip_attendees = array_filter($event'attendees', function($item) { return $item'role' != 'ORGANIZER'; }); + + // there must be only one attendee + if (is_array($itip_attendees) && count($itip_attendees) == 1) { + $event_attendee = $itip_attendeeskey($itip_attendees); + $metadata'attendee' = $event'_sender'; + $rsvp_status = strtoupper($event_attendee'status'); + } + } + // 1. update the attendee status on our copy $update_button = html::tag('input', array( 'type' => 'button', @@ -612,6 +651,13 @@ $buttons = html::div(array('id' => 'update-'.$dom_id, 'style' => 'display:none'), $update_button); $buttons = html::div(array('id' => 'accept-'.$dom_id, 'style' => 'display:none'), $accept_buttons); + + // For replies we need more metadata + foreach (array('start', 'end', 'due', 'allday', 'recurrence', 'location') as $key) { + if (isset($event$key)) { + $metadata$key = $event$key instanceof DateTime ? $event$key->format('c') : $event$key; + } + } } // when receiving iTip REQUEST messages: else if ($method == 'REQUEST') {
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/libcalendaring/libcalendaring.js -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libcalendaring/libcalendaring.js
Changed
@@ -397,7 +397,9 @@ }); $(prefix+' .edit-alarm-date').removeClass('hasDatepicker').removeAttr('id').datepicker(datepicker_settings); - this.init_time_autocomplete($(prefix+' .edit-alarm-time')0, {}); + + if (rcmail.env.action != 'print') + this.init_time_autocomplete($(prefix+' .edit-alarm-time')0, {}); $(prefix).on('click', 'a.delete-alarm', function(e){ if ($(this).closest('.edit-alarm-item').siblings().length > 0) {
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/libkolab/SQL/mysql.initial.sql -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libkolab/SQL/mysql.initial.sql
Changed
@@ -29,7 +29,7 @@ CREATE TABLE `kolab_cache_contact` ( `folder_id` BIGINT UNSIGNED NOT NULL, `msguid` BIGINT UNSIGNED NOT NULL, - `uid` VARCHAR(512) CHARACTER SET ascii NOT NULL, + `uid` VARCHAR(512) NOT NULL, `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` LONGTEXT NOT NULL, @@ -53,7 +53,7 @@ CREATE TABLE `kolab_cache_event` ( `folder_id` BIGINT UNSIGNED NOT NULL, `msguid` BIGINT UNSIGNED NOT NULL, - `uid` VARCHAR(512) CHARACTER SET ascii NOT NULL, + `uid` VARCHAR(512) NOT NULL, `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` LONGTEXT NOT NULL, @@ -73,7 +73,7 @@ CREATE TABLE `kolab_cache_task` ( `folder_id` BIGINT UNSIGNED NOT NULL, `msguid` BIGINT UNSIGNED NOT NULL, - `uid` VARCHAR(512) CHARACTER SET ascii NOT NULL, + `uid` VARCHAR(512) NOT NULL, `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` LONGTEXT NOT NULL, @@ -93,7 +93,7 @@ CREATE TABLE `kolab_cache_journal` ( `folder_id` BIGINT UNSIGNED NOT NULL, `msguid` BIGINT UNSIGNED NOT NULL, - `uid` VARCHAR(512) CHARACTER SET ascii NOT NULL, + `uid` VARCHAR(512) NOT NULL, `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` LONGTEXT NOT NULL, @@ -113,7 +113,7 @@ CREATE TABLE `kolab_cache_note` ( `folder_id` BIGINT UNSIGNED NOT NULL, `msguid` BIGINT UNSIGNED NOT NULL, - `uid` VARCHAR(512) CHARACTER SET ascii NOT NULL, + `uid` VARCHAR(512) NOT NULL, `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` LONGTEXT NOT NULL, @@ -131,7 +131,7 @@ CREATE TABLE `kolab_cache_file` ( `folder_id` BIGINT UNSIGNED NOT NULL, `msguid` BIGINT UNSIGNED NOT NULL, - `uid` VARCHAR(512) CHARACTER SET ascii NOT NULL, + `uid` VARCHAR(512) NOT NULL, `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` LONGTEXT NOT NULL, @@ -151,7 +151,7 @@ CREATE TABLE `kolab_cache_configuration` ( `folder_id` BIGINT UNSIGNED NOT NULL, `msguid` BIGINT UNSIGNED NOT NULL, - `uid` VARCHAR(512) CHARACTER SET ascii NOT NULL, + `uid` VARCHAR(512) NOT NULL, `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` LONGTEXT NOT NULL, @@ -171,7 +171,7 @@ CREATE TABLE `kolab_cache_freebusy` ( `folder_id` BIGINT UNSIGNED NOT NULL, `msguid` BIGINT UNSIGNED NOT NULL, - `uid` VARCHAR(512) CHARACTER SET ascii NOT NULL, + `uid` VARCHAR(512) NOT NULL, `created` DATETIME DEFAULT NULL, `changed` DATETIME DEFAULT NULL, `data` LONGTEXT NOT NULL, @@ -188,4 +188,4 @@ /*!40014 SET FOREIGN_KEY_CHECKS=1 */; -REPLACE INTO `system` (`name`, `value`) VALUES ('libkolab-version', '2017071900'); +REPLACE INTO `system` (`name`, `value`) VALUES ('libkolab-version', '2018021300');
View file
roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libkolab/SQL/mysql/2018021300.sql
Added
@@ -0,0 +1,9 @@ +-- accept utf8 in UID column +ALTER TABLE `kolab_cache_contact` MODIFY `uid` VARCHAR(512) CHARACTER SET utf8 NOT NULL; +ALTER TABLE `kolab_cache_event` MODIFY `uid` VARCHAR(512) CHARACTER SET utf8 NOT NULL; +ALTER TABLE `kolab_cache_task` MODIFY `uid` VARCHAR(512) CHARACTER SET utf8 NOT NULL; +ALTER TABLE `kolab_cache_journal` MODIFY `uid` VARCHAR(512) CHARACTER SET utf8 NOT NULL; +ALTER TABLE `kolab_cache_note` MODIFY `uid` VARCHAR(512) CHARACTER SET utf8 NOT NULL; +ALTER TABLE `kolab_cache_file` MODIFY `uid` VARCHAR(512) CHARACTER SET utf8 NOT NULL; +ALTER TABLE `kolab_cache_configuration` MODIFY `uid` VARCHAR(512) CHARACTER SET utf8 NOT NULL; +ALTER TABLE `kolab_cache_freebusy` MODIFY `uid` VARCHAR(512) CHARACTER SET utf8 NOT NULL;
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/libkolab/SQL/oracle.initial.sql -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libkolab/SQL/oracle.initial.sql
Changed
@@ -183,4 +183,4 @@ CREATE INDEX "kolab_cache_fb_uid2msguid" ON "kolab_cache_freebusy" ("folder_id", "uid", "msguid"); -INSERT INTO "system" ("name", "value") VALUES ('libkolab-version', '2017071900'); +INSERT INTO "system" ("name", "value") VALUES ('libkolab-version', '2018021300');
View file
roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libkolab/SQL/oracle/2018021300.sql
Added
@@ -0,0 +1,1 @@ +-- empty \ No newline at end of file
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/libkolab/SQL/sqlite.initial.sql -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libkolab/SQL/sqlite.initial.sql
Changed
@@ -156,4 +156,4 @@ CREATE INDEX ix_freebusy_uid2msguid ON kolab_cache_freebusy(folder_id,uid,msguid); -INSERT INTO system (name, value) VALUES ('libkolab-version', '2017071900'); +INSERT INTO system (name, value) VALUES ('libkolab-version', '2018021300');
View file
roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libkolab/SQL/sqlite/2018021300.sql
Added
@@ -0,0 +1,1 @@ +-- empty \ No newline at end of file
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/libkolab/composer.json -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libkolab/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Plugin to setup a basic environment for the interaction with a Kolab server.", "homepage": "https://git.kolab.org/diffusion/RPK/", "license": "AGPLv3", - "version": "3.3.5", + "version": "3.3.6", "authors": { "name": "Thomas Bruederli",
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/libkolab/lib/kolab_date_recurrence.php -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libkolab/lib/kolab_date_recurrence.php
Changed
@@ -140,7 +140,7 @@ } /** - * Find date/time of the first occurrence (excluding start date) + * Find date/time of the first occurrence */ public function first_occurrence() { @@ -196,11 +196,17 @@ $object->set($event); $recurrence = new self($object); + $orig_date = $orig_start->format('Y-m-d'); + $found = false; + // find the first occurrence - $found = false; while ($next = $recurrence->next_start()) { $start = $next; - if ($next >= $orig_start) { + if ($next->format('Y-m-d') >= $orig_date) { + if ($event'allday') { + $next->setTime($orig_start->format('G'), $orig_start->format('i'), $orig_start->format('s')); + } + $found = true; break; } @@ -217,7 +223,7 @@ return null; } - if ($orig_start->_dateonly) { + if ($event'allday') { $start->_dateonly = true; }
View file
roundcubemail-plugins-kolab-3.3.5.tar.gz/plugins/libkolab/tests/kolab_date_recurrence.php -> roundcubemail-plugins-kolab-3.3.6.tar.gz/plugins/libkolab/tests/kolab_date_recurrence.php
Changed
@@ -157,13 +157,13 @@ // yearly array( array('FREQ' => 'YEARLY', 'INTERVAL' => '1'), - '2017-08-16 11:00:00', - '2017-08-16 11:00:00', + '2017-08-16 12:00:00', + '2017-08-16 12:00:00', ), array( array('FREQ' => 'YEARLY', 'INTERVAL' => '1', 'BYMONTH' => '8'), - '2017-08-16 11:00:00', - '2017-08-16 11:00:00', + '2017-08-16 12:00:00', + '2017-08-16 12:00:00', ), array( array('FREQ' => 'YEARLY', 'INTERVAL' => '1', 'BYDAY' => '-1MO'), @@ -209,5 +209,26 @@ ); } + /** + * kolab_date_recurrence::first_occurrence() for all-day events + * + * @dataProvider data_first_occurrence + */ + function test_first_occurrence_allday($recurrence_data, $start, $expected) + { + $start = new DateTime($start); + if (!empty($recurrence_data'UNTIL')) { + $recurrence_data'UNTIL' = new DateTime($recurrence_data'UNTIL'); + } + + $event = array('start' => $start, 'recurrence' => $recurrence_data, 'allday' => true); + $object = kolab_format::factory('event', 3.0); + $object->set($event); + + $recurrence = new kolab_date_recurrence($object); + $first = $recurrence->first_occurrence(); + + $this->assertEquals($expected, $first ? $first->format('Y-m-d H:i:s') : ''); + } }
View file
roundcubemail-plugins-kolab.dsc
Changed
@@ -2,7 +2,7 @@ Source: roundcubemail-plugins-kolab Binary: roundcubemail-plugins-kolab Architecture: all -Version: 1:3.3.5-0~kolab2 +Version: 1:3.3.6-0~kolab1 Maintainer: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Uploaders: Paul Klos <kolab@klos2day.nl> Standards-Version: 3.9.3 @@ -34,5 +34,5 @@ roundcubemail-plugin-tinymce-config deb web extra roundcubemail-plugin-wap-client deb web extra Files: - 00000000000000000000000000000000 0 roundcubemail-plugins-kolab-3.3.5.tar.gz + 00000000000000000000000000000000 0 roundcubemail-plugins-kolab-3.3.6.tar.gz 00000000000000000000000000000000 0 debian.tar.gz
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
.