Projects
home:sicherha:branches:Kolab:16
roundcubemail-plugins-kolab
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 6
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_attendees[key($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_attendees[key($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
.