Projects
Kolab:3.4
roundcubemail-plugins-kolab
Log In
Username
Password
We truncated the diff of some files because they were too big. If you want to see the full diff for every file,
click here
.
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 103
View file
roundcubemail-plugins-kolab.spec
Changed
@@ -23,7 +23,7 @@ %global tmpdir %{_var}/lib/roundcubemail Name: roundcubemail-plugins-kolab -Version: 3.2.4 +Version: 3.2.5 Release: 1%{?dist} Summary: Kolab Groupware plugins for Roundcube Webmail @@ -1887,6 +1887,9 @@ %defattr(-,root,root,-) %changelog +* Sat Feb 14 2015 Jeroen van Meeuwen <vanmeeuwen@kolabsys.com> - 3.2.5-1 +- Release of version 3.2.5 + * Wed Feb 4 2015 Jeroen van Meeuwen <vanmeeuwen@kolabsys.com> - 3.2.4-1 - Release of version 3.2.4
View file
debian.changelog
Changed
@@ -1,3 +1,9 @@ +roundcubemail-plugins-kolab (1:3.2.5-0~kolab1) unstable; urgency=low + + * Release of version 3.2.5 + + -- Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Sat, 14 Feb 2015 18:41:13 +0200 + roundcubemail-plugins-kolab (1:3.2.4-0~kolab1) unstable; urgency=low * Release of version 3.2.4
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libkolab/SQL/postgres.initial.sql
Deleted
@@ -1,31 +0,0 @@ -/** - * libkolab database schema - * - * @version @package_version@ - * @author Sidlyarenko Sergey - * @licence GNU AGPL - **/ - -DROP TABLE IF EXISTS kolab_cache; - -CREATE TABLE kolab_cache ( - resource character varying(255) NOT NULL, - type character varying(32) NOT NULL, - msguid NUMERIC(20) NOT NULL, - uid character varying(128) NOT NULL, - created timestamp without time zone DEFAULT NULL, - changed timestamp without time zone DEFAULT NULL, - data text NOT NULL, - xml text NOT NULL, - dtstart timestamp without time zone, - dtend timestamp without time zone, - tags character varying(255) NOT NULL, - words text NOT NULL, - filename character varying(255) DEFAULT NULL, - PRIMARY KEY(resource, type, msguid) -); - -CREATE INDEX kolab_cache_resource_filename_idx ON kolab_cache (resource, filename); - - -INSERT INTO system (name, value) VALUES ('libkolab-version', '2013041900');
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/calendar/calendar.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/calendar/calendar.php
Changed
@@ -970,6 +970,7 @@ $status = rcube_utils::get_input_value('status', rcube_utils::INPUT_GPC); $reply_comment = $event['comment']; + $this->write_preprocess($event, 'edit'); $ev = $this->driver->get_event($event); $ev['attendees'] = $event['attendees']; $ev['free_busy'] = $event['free_busy']; @@ -1835,6 +1836,7 @@ // 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); + $event['allday'] = (bool)$event['allday']; // start/end is all we need for 'move' action (#1480) if ($action == 'move') { @@ -1885,7 +1887,7 @@ $organizer = $i; if ($attendee['email'] == in_array(strtolower($attendee['email']), $emails)) $owner = $i; - else if (!isset($attendee['rsvp'])) + if (!isset($attendee['rsvp'])) $event['attendees'][$i]['rsvp'] = true; else if (is_string($attendee['rsvp'])) $event['attendees'][$i]['rsvp'] = $attendee['rsvp'] == 'true' || $attendee['rsvp'] == '1'; @@ -2210,7 +2212,7 @@ public static function event_diff($a, $b) { $diff = array(); - $ignore = array('changed' => 1, 'attachments' => 1); + $ignore = array('changed' => 1, 'attachments' => 1, 'recurrence' => 1, '_notify' => 1, '_owner' => 1); foreach (array_unique(array_merge(array_keys($a), array_keys($b))) as $key) { if (!$ignore[$key] && $a[$key] != $b[$key]) $diff[] = $key;
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/calendar/calendar_ui.js -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/calendar/calendar_ui.js
Changed
@@ -784,7 +784,7 @@ // select the correct organizer identity var identity_id = 0; $.each(settings.identities, function(i,v){ - if (organizer && v == organizer.email) { + if (organizer && typeof organizer == 'object' && v == organizer.email) { identity_id = i; return false; } @@ -2387,13 +2387,12 @@ data = me.selected_event.attendees[i]; if (settings.identity.emails.indexOf(';'+String(data.email).toLowerCase()) >= 0) { data.status = response.toUpperCase(); + data.rsvp = 0; // unset RSVP flag if (data.status == 'DELEGATED') { data['delegated-to'] = delegate.to; } else { - delete data.rsvp; // unset RSVP flag - if (data['delegated-to']) { delete data['delegated-to']; if (data.role == 'NON-PARTICIPANT' && data.status != 'DECLINED') @@ -4033,7 +4032,7 @@ open: autocomplete_open, change: event_times_changed, select: function(event, ui) { - $(this).val(ui.item[0]); + $(this).val(ui.item[0]).change(); return false; } }) @@ -4048,6 +4047,16 @@ }; }); + // adjust end time when changing start + $('#edit-starttime').change(function(e) { + var dstart = $('#edit-startdate'), + newstart = parse_datetime(this.value, dstart.val()), + newend = new Date(newstart.getTime() + dstart.data('duration') * 1000); + $('#edit-endtime').val($.fullCalendar.formatDate(newend, me.settings['time_format'])); + $('#edit-enddate').val($.fullCalendar.formatDate(newend, me.settings['date_format'])); + event_times_changed(); + }); + // register events on alarms and recurrence fields me.init_alarms_edit('#edit-alarms'); me.init_recurrence_edit('#eventedit');
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/calendar/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/calendar/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Calendar plugin", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.4", + "version": "3.2.5", "authors": [ { "name": "Thomas Bruederli", @@ -26,6 +26,6 @@ "require": { "php": ">=5.3.0", "roundcube/plugin-installer": ">=0.1.3", - "kolab/libcalendaring": ">=3.2.4" + "kolab/libcalendaring": ">=3.2.5" } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/calendar/drivers/kolab/kolab_calendar.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/calendar/drivers/kolab/kolab_calendar.php
Changed
@@ -191,7 +191,7 @@ // event not found, maybe a recurring instance is requested if (!$this->events[$id]) { - $master_id = preg_replace('/-\d+$/', '', $id); + $master_id = preg_replace('/-\d+(T\d{6})?$/', '', $id); if ($master_id != $id && ($record = $this->storage->get_object($master_id))) $this->events[$master_id] = $this->_to_rcube_event($record); @@ -271,27 +271,19 @@ // remember seen categories if ($event['categories']) $this->categories[$event['categories']]++; - + // filter events by search query if (!empty($search)) { - $hit = false; - foreach ($this->search_fields as $col) { - $sval = is_array($event[$col]) ? self::_complex2string($event[$col]) : $event[$col]; - if (empty($sval)) - continue; - - // do a simple substring matching (to be improved) - $val = mb_strtolower($sval); - if (strpos($val, $search) !== false) { - $hit = true; - break; - } + $hits = 0; + $words = rcube_utils::tokenize_string($search, 1); + foreach ($words as $word) { + $hits += $this->_fulltext_match($event, $word); } - - if (!$hit) // skip this event if not match with search term + + if ($hits < count($words)) // skip this event if not match with search term continue; } - + // list events in requested time window if ($event['start'] <= $end && $event['end'] >= $start) { unset($event['_attendees']); @@ -324,6 +316,18 @@ // resolve recurring events if ($record['recurrence'] && $virtual == 1) { $events = array_merge($events, $this->get_recurring_events($record, $start, $end)); + + // when searching, only recurrence exceptions may match the query so post-filter the results again + if (!empty($search) && $record['recurrence']['EXCEPTIONS']) { + $me = $this; + $events = array_filter($events, function($event) use ($words, $me) { + $hits = 0; + foreach ($words as $word) { + $hits += $me->_fulltext_match($event, $word, false); + } + return $hits >= count($words); + }); + } } } @@ -451,7 +455,7 @@ $this->save_links($event['uid'], $links); $updated = true; - $this->events[$event['id']] = $this->_to_rcube_event($object); + $this->events = array($event['id'] => $this->_to_rcube_event($object)); // refresh local cache with recurring instances if ($exception_id) { @@ -560,34 +564,39 @@ $end->add(new DateInterval($intvl)); } - // add recurrence exceptions to output - $i = 0; + // copy the recurrence rule from the master event (to be used in the UI) + $recurrence_rule = $event['recurrence']; + unset($recurrence_rule['EXCEPTIONS'], $recurrence_rule['EXDATE']); + + // read recurrence exceptions first $events = array(); - $exdates = array(); + $exdata = array(); $futuredata = array(); - if (is_array($event['recurrence']['EXCEPTIONS'])) { - // copy the recurrence rule from the master event (to be used in the UI) - $recurrence_rule = $event['recurrence']; - unset($recurrence_rule['EXCEPTIONS'], $recurrence_rule['EXDATE']); + $recurrence_id_format = $event['allday'] ? 'Ymd' : 'Ymd\THis'; + if (is_array($event['recurrence']['EXCEPTIONS'])) { foreach ($event['recurrence']['EXCEPTIONS'] as $exception) { + if (!$exception['_instance'] && is_a($exception['recurrence_date'], 'DateTime')) + $exception['_instance'] = $exception['recurrence_date']->format($recurrence_id_format); + else if (!$exception['_instance'] && is_a($exception['start'], 'DateTime')) + $exception['_instance'] = $exception['start']->format($recurrence_id_format); + $rec_event = $this->_to_rcube_event($exception); - $rec_event['id'] = $event['uid'] . '-' . ++$i; - $rec_event['recurrence_id'] = $event['uid']; - $rec_event['recurrence'] = $recurrence_rule; - $rec_event['_instance'] = $i; + $rec_event['id'] = $event['uid'] . '-' . $exception['_instance']; $rec_event['isexception'] = 1; - $events[] = $rec_event; // found the specifically requested instance, exiting... if ($rec_event['id'] == $event_id) { + $rec_event['recurrence'] = $recurrence_rule; + $rec_event['recurrence_id'] = $event['uid']; + $events[] = $rec_event; $this->events[$rec_event['id']] = $rec_event; return $events; } // remember this exception's date - $exdate = $rec_event['start']->format('Y-m-d'); - $exdates[$exdate] = $rec_event['id']; + $exdate = substr($exception['_instance'], 0, 8); + $exdata[$exdate] = $rec_event; if ($rec_event['thisandfuture']) { $futuredata[$exdate] = $rec_event; } @@ -604,27 +613,27 @@ $recurrence = new calendar_recurrence($this->cal, $event); } + $i = 0; while ($next_event = $recurrence->next_instance()) { - // skip if there's an exception at this date - $datestr = $next_event['start']->format('Y-m-d'); - if ($exdates[$datestr]) { - // use this event data for future recurring instances - if ($futuredata[$datestr]) - $overlay_data = $futuredata[$datestr]; - continue; - } + $datestr = $next_event['start']->format('Ymd'); + $instance_id = $next_event['start']->format($recurrence_id_format); + + // use this event data for future recurring instances + if ($futuredata[$datestr]) + $overlay_data = $futuredata[$datestr]; // add to output if in range - $rec_id = $event['uid'] . '-' . ++$i; + $rec_id = $event['uid'] . '-' . $instance_id; if (($next_event['start'] <= $end && $next_event['end'] >= $start) || ($event_id && $rec_id == $event_id)) { $rec_event = $this->_to_rcube_event($next_event); + $rec_event['_instance'] = $instance_id; - if ($overlay_data) // copy data from a 'this-and-future' exception - $this->_merge_event_data($rec_event, $overlay_data); + if ($overlay_data || $exdata[$datestr]) // copy data from exception + $this->_merge_event_data($rec_event, $exdata[$datestr] ?: $overlay_data); $rec_event['id'] = $rec_id; $rec_event['recurrence_id'] = $event['uid']; - $rec_event['_instance'] = $i; + $rec_event['recurrence'] = $recurrence_rule; unset($rec_event['_attendees']); $events[] = $rec_event; @@ -637,7 +646,7 @@ break; // avoid endless recursion loops - if ($i > 1000) + if (++$i > 1000) break; } @@ -657,8 +666,13 @@ foreach ($overlay as $prop => $value) { // adjust time of the recurring event instance if ($prop == 'start' || $prop == 'end') { - if (is_object($event[$prop]) && is_a($event[$prop], 'DateTime')) + if (is_object($event[$prop]) && is_a($event[$prop], 'DateTime')) { $event[$prop]->setTime($value->format('G'), intval($value->format('i')), intval($value->format('s'))); + // set date value if overlay is an exception of the current instance + if (substr($overlay['_instance'], 0, 8) == substr($event['_instance'], 0, 8)) { + $event[$prop]->setDate(intval($value->format('Y')), intval($value->format('n')), intval($value->format('j'))); + } + } } else if ($prop[0] != '_' && !in_array($prop, $forbidden)) $event[$prop] = $value; @@ -756,6 +770,36 @@ } /** + * Match the given word in the event contents + */ + private function _fulltext_match($event, $word, $recursive = true) + { + $hits = 0;
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/calendar/drivers/kolab/kolab_driver.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/calendar/drivers/kolab/kolab_driver.php
Changed
@@ -692,9 +692,14 @@ // removing an exception instance if ($event['recurrence_id']) { - $i = $event['_instance'] - 1; - if (!empty($master['recurrence']['EXCEPTIONS'][$i])) { - unset($master['recurrence']['EXCEPTIONS'][$i]); + foreach ($master['recurrence']['EXCEPTIONS'] as $i => $exception) { + if ($exception['_instance'] == $event['_instance']) { + unset($master['recurrence']['EXCEPTIONS'][$i]); + // set event date back to the actual occurrence + if ($exception['recurrence_date']) + $event['start'] = $exception['recurrence_date']; + break; + } } } @@ -878,10 +883,15 @@ $savemode = $event['_savemode']; } + // check if update affects scheduling and update attendee status accordingly + $reschedule = $this->check_scheduling($event, $old, true); + // keep saved exceptions (not submitted by the client) - if ($old['recurrence']['EXDATE']) + if ($old['recurrence']['EXDATE'] && !isset($event['recurrence']['EXDATE'])) $event['recurrence']['EXDATE'] = $old['recurrence']['EXDATE']; - if ($old['recurrence']['EXCEPTIONS']) + if (isset($event['recurrence']['EXCEPTIONS'])) + $with_exceptions = true; // exceptions already provided (e.g. from iCal import) + else if ($old['recurrence']['EXCEPTIONS']) $event['recurrence']['EXCEPTIONS'] = $old['recurrence']['EXCEPTIONS']; switch ($savemode) { @@ -907,17 +917,25 @@ $event['recurrence'] = array(); $event['thisandfuture'] = $savemode == 'future'; + // increment sequence of this instance if scheduling is affected + if ($reschedule) { + $event['sequence'] = $old['sequence'] + 1; + } + // remove some internal properties which should not be saved - unset($event['_savemode'], $event['_fromcalendar'], $event['_identity'], $event['_notify']); + unset($event['id'], $event['_savemode'], $event['_fromcalendar'], $event['_identity'], $event['_notify']); // save properties to a recurrence exception instance - if ($old['recurrence_id']) { - $i = $old['_instance'] - 1; - if (!empty($master['recurrence']['EXCEPTIONS'][$i])) { - $master['recurrence']['EXCEPTIONS'][$i] = $event; - $success = $storage->update_event($master, $old['id']); - break; + if ($old['recurrence_id'] && is_array($master['recurrence']['EXCEPTIONS'])) { + foreach ($master['recurrence']['EXCEPTIONS'] as $i => $exception) { + if ($exception['_instance'] == $old['_instance']) { + $event['_instance'] = $old['_instance']; + $event['recurrence_date'] = $old['recurrence_date']; + $master['recurrence']['EXCEPTIONS'][$i] = $event; + $success = $storage->update_event($master, $old['id']); + break 2; } + } } $add_exception = true; @@ -936,6 +954,7 @@ // save as new exception to master event if ($add_exception) { + $event['_instance'] = $old['_instance']; $master['recurrence']['EXCEPTIONS'][] = $event; } $success = $storage->update_event($master); @@ -955,10 +974,11 @@ $new_duration = $event['end']->format('U') - $event['start']->format('U'); $diff = $old_start_date != $new_start_date || $old_start_time != $new_start_time || $old_duration != $new_duration; + $date_shift = $old['start']->diff($event['start']); // shifted or resized if ($diff && ($old_start_date == $new_start_date || $old_duration == $new_duration)) { - $event['start'] = $master['start']->add($old['start']->diff($event['start'])); + $event['start'] = $master['start']->add($date_shift); $event['end'] = clone $event['start']; $event['end']->add(new DateInterval('PT'.$new_duration.'S')); @@ -976,6 +996,21 @@ $event['end'] = $master['end']; } + // adjust recurrence-id when start changed and therefore the entire recurrence chain changes + if (($old_start_date != $new_start_date || $old_start_time != $new_start_time) && + is_array($event['recurrence']) && is_array($event['recurrence']['EXCEPTIONS']) && !$with_exceptions) { + $recurrence_id_format = $event['allday'] ? 'Ymd' : 'Ymd\THis'; + foreach ($event['recurrence']['EXCEPTIONS'] as $i => $exception) { + $recurrence_id = is_a($exception['recurrence_date'], 'DateTime') ? $exception['recurrence_date'] : + rcube_utils::anytodatetime($exception['_instance'], $old['start']->getTimezone()); + if (is_a($recurrence_id, 'DateTime')) { + $recurrence_id->add($date_shift); + $event['recurrence']['EXCEPTIONS'][$i]['recurrence_date'] = $recurrence_id; + $event['recurrence']['EXCEPTIONS'][$i]['_instance'] = $recurrence_id->format($recurrence_id_format); + } + } + } + // unset _dateonly flags in (cached) date objects unset($event['start']->_dateonly, $event['end']->_dateonly); @@ -990,6 +1025,56 @@ } /** + * Determine whether the current change affects scheduling and reset attendee status accordingly + */ + public function check_scheduling(&$event, $old, $update = true) + { + $reschedule = false; + + // skip this check when importing iCal/iTip events + if (isset($event['sequence']) || !empty($event['_method'])) { + return $reschedule; + } + + // iterate through the list of properties considered 'significant' for scheduling + foreach (kolab_format_event::$scheduling_properties as $prop) { + $a = $old[$prop]; + $b = $event[$prop]; + if ($event['allday'] && ($prop == 'start' || $prop == 'end') && $a instanceof DateTime && $b instanceof DateTime) { + $a = $a->format('Y-m-d'); + $b = $b->format('Y-m-d'); + } + if ($a != $b) { + $reschedule = true; + break; + } + } + + // reset all attendee status to needs-action (#4360) + if ($update && $reschedule && is_array($event['attendees'])) { + $is_organizer = false; + $emails = $this->cal->get_user_emails(); + $attendees = $event['attendees']; + foreach ($attendees as $i => $attendee) { + if ($attendee['role'] == 'ORGANIZER' && $attendee['email'] && in_array(strtolower($attendee['email']), $emails)) { + $is_organizer = true; + } + else if ($attendee['role'] != 'ORGANIZER' && $attendee['role'] != 'NON-PARTICIPANT' && $attendee['status'] != 'DELEGATED') { + $attendees[$i]['status'] = 'NEEDS-ACTION'; + $attendees[$i]['rsvp'] = true; + } + } + + // update attendees only if I'm the organizer + if ($is_organizer || ($event['organizer'] && in_array(strtolower($event['organizer']['email']), $emails))) { + $event['attendees'] = $attendees; + } + } + + return $reschedule; + } + + /** * Get events from source. * * @param integer Event's new start (unix timestamp)
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/calendar/lib/calendar_ui.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/calendar/lib/calendar_ui.php
Changed
@@ -176,7 +176,7 @@ { $color = $prop['color']; $class = 'cal-' . asciiwords($id, true); - $css .= "li.$class, #eventshow .$class { color: #$color }\n"; + $css .= "li .$class, #eventshow .$class { color: #$color }\n"; if ($mode != 1) { if ($mode == 3) { @@ -886,7 +886,11 @@ function event_rsvp_buttons($attrib = array()) { - return $this->cal->itip->itip_rsvp_buttons($attrib); + $actions = array('accepted','tentative','declined'); + if ($attrib['delegate'] !== 'false') + $actions[] = 'delegated'; + + return $this->cal->itip->itip_rsvp_buttons($attrib, $actions); } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/calendar/print.js -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/calendar/print.js
Changed
@@ -125,7 +125,7 @@ }, // event rendering eventRender: function(event, element, view) { - if (view.name != 'month') { + if (view.name != 'month' && view.name != 'table') { var cont = element.find('.fc-event-title'); if (event.location) { cont.after('<div class="fc-event-location">@ ' + Q(event.location) + '</div>');
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/calendar/skins/classic/templates/itipattend.html -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/calendar/skins/classic/templates/itipattend.html
Changed
@@ -13,7 +13,7 @@ <div class="centerbox"> <roundcube:object name="plugin.event_inviteform" /> <roundcube:object name="plugin.event_invitebox" class="calendar-invitebox" /> - <roundcube:object name="plugin.event_rsvp_buttons" type="submit" iname="rsvp" id="event-rsvp" /> + <roundcube:object name="plugin.event_rsvp_buttons" type="submit" iname="rsvp" id="event-rsvp" delegate="false" /> </form> </div>
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/calendar/skins/larry/print.css -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/calendar/skins/larry/print.css
Changed
@@ -60,7 +60,6 @@ } #calendarlist li { - float: left; padding-left: 0; padding-right: 3em; margin-left: 0; @@ -72,6 +71,11 @@ display: none; } +#calendarlist li.x-invitations div { + color: #999; + font-style: italic; +} + .calwidth { width: 700px; margin: 0 auto;
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/calendar/skins/larry/templates/itipattend.html -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/calendar/skins/larry/templates/itipattend.html
Changed
@@ -25,7 +25,7 @@ <div class="centerbox uibox"> <roundcube:object name="plugin.event_inviteform" /> <roundcube:object name="plugin.event_invitebox" class="calendar-invitebox" /> - <roundcube:object name="plugin.event_rsvp_buttons" type="submit" iname="rsvp" id="event-rsvp" /> + <roundcube:object name="plugin.event_rsvp_buttons" type="submit" iname="rsvp" id="event-rsvp" delegate="false" /> </form> </div>
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/kolab_activesync/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/kolab_activesync/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "ActiveSync configuration utility for Kolab accounts", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.3", + "version": "3.2.5", "authors": [ { "name": "Thomas Bruederli", @@ -26,6 +26,6 @@ "require": { "php": ">=5.3.0", "roundcube/plugin-installer": ">=0.1.3", - "kolab/libkolab": ">=3.2.4" + "kolab/libkolab": ">=3.2.5" } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/kolab_addressbook/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/kolab_addressbook/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Kolab addressbook", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.3", + "version": "3.2.5", "authors": [ { "name": "Thomas Bruederli", @@ -26,6 +26,6 @@ "require": { "php": ">=5.3.0", "roundcube/plugin-installer": ">=0.1.3", - "kolab/libkolab": ">=3.2.4" + "kolab/libkolab": ">=3.2.5" } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/kolab_config/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/kolab_config/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Kolab configuration storage", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.3", + "version": "3.2.5", "authors": [ { "name": "Aleksander Machniak", @@ -21,6 +21,6 @@ "require": { "php": ">=5.3.0", "roundcube/plugin-installer": ">=0.1.3", - "kolab/libkolab": ">=3.2.4" + "kolab/libkolab": ">=3.2.5" } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/kolab_delegation/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/kolab_delegation/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Kolab delegation feature", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.3", + "version": "3.2.5", "authors": [ { "name": "Aleksander Machniak", @@ -21,7 +21,7 @@ "require": { "php": ">=5.3.0", "roundcube/plugin-installer": ">=0.1.3", - "kolab/libkolab": ">=3.2.4", + "kolab/libkolab": ">=3.2.5", "kolab/kolab_auth": ">=3.2.2" } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/kolab_files/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/kolab_files/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "User interface for Kolab File Manager (Chwala)", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.3", + "version": "3.2.5", "authors": [ { "name": "Aleksander Machniak", @@ -21,6 +21,6 @@ "require": { "php": ">=5.3.0", "roundcube/plugin-installer": ">=0.1.3", - "kolab/libkolab": ">=3.2.4" + "kolab/libkolab": ">=3.2.5" } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/kolab_files/kolab_files.js -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/kolab_files/kolab_files.js
Changed
@@ -46,7 +46,6 @@ rcmail.file_list.addEventListener('select', function(o) { kolab_files_list_select(o); }) .addEventListener('listupdate', function(e) { rcmail.triggerEvent('listupdate', e); }); - rcmail.gui_objects.filelist.parentNode.onmousedown = function(e){ return kolab_files_click_on_list(e); }; rcmail.enable_command('files-sort', 'files-search', 'files-search-reset', true); rcmail.file_list.init();
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/kolab_files/lib/kolab_files_observer.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/kolab_files/lib/kolab_files_observer.php
Changed
@@ -19,9 +19,8 @@ switch ($event['name']) { case 'receivedHeaders': - $target = $this->dir . DIRECTORY_SEPARATOR . $this->file; - if (!($this->fp = @fopen($target, 'wb'))) { - throw new Exception("Cannot open target file '{$target}'"); + if (!$this->file || !($this->fp = @fopen($this->file, 'wb'))) { + throw new Exception("Cannot open target file '{$this->file}'"); } break;
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/kolab_folders/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/kolab_folders/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Type-aware folder management/listing for Kolab", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.3", + "version": "3.2.5", "authors": [ { "name": "Aleksander Machniak", @@ -21,6 +21,6 @@ "require": { "php": ">=5.3.0", "roundcube/plugin-installer": ">=0.1.3", - "kolab/libkolab": ">=3.2.4" + "kolab/libkolab": ">=3.2.5" } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/kolab_notes/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/kolab_notes/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Notes module for Roundcube connecting to a Kolab server for storage", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.3", + "version": "3.2.5", "authors": [ { "name": "Thomas Bruederli", @@ -21,7 +21,7 @@ "require": { "php": ">=5.3.0", "roundcube/plugin-installer": ">=0.1.3", - "kolab/libkolab": ">=3.2.4", + "kolab/libkolab": ">=3.2.5", "roundcube/jqueryui": ">=1.10.4" } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/kolab_tags/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/kolab_tags/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Email tags plugin", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.3", + "version": "3.2.5", "authors": [ { "name": "Aleksander Machniak", @@ -21,6 +21,6 @@ "require": { "php": ">=5.3.0", "roundcube/plugin-installer": ">=0.1.3", - "kolab/libkolab": ">=3.2.4" + "kolab/libkolab": ">=3.2.5" } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libcalendaring/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libcalendaring/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Library providing common functions for calendaring plugins", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.4", + "version": "3.2.5", "authors": [ { "name": "Thomas Bruederli",
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libcalendaring/libcalendaring.js -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libcalendaring/libcalendaring.js
Changed
@@ -1139,6 +1139,7 @@ $('.rsvp-buttons').on('click', 'a.reply-comment-toggle', function(e){ $(this).hide().parent().find('textarea').show().focus(); + return false; }); if (rcmail.env.action == 'get-attachment' && rcmail.gui_objects['attachmentframe']) {
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libcalendaring/libvcalendar.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libcalendaring/libvcalendar.php
Changed
@@ -318,6 +318,7 @@ if (!$seen[$object['uid']]++) { // parse recurrence exceptions if ($object['recurrence']) { + $object['recurrence']['EXCEPTIONS'] = array(); foreach ($vobject->children as $component) { if ($component->name == 'VEVENT' && isset($component->{'RECURRENCE-ID'})) { try { @@ -455,6 +456,9 @@ case 'RECURRENCE-ID': $event['recurrence_date'] = self::convert_datetime($prop); + if ($prop->offsetGet('RANGE') == 'THISANDFUTURE' || $prop->offsetGet('THISANDFUTURE') !== null) { + $event['thisandfuture'] = true; + } break; case 'RELATED-TO': @@ -1151,11 +1155,10 @@ // append recurrence exceptions if (is_array($event['recurrence']) && $event['recurrence']['EXCEPTIONS']) { foreach ($event['recurrence']['EXCEPTIONS'] as $ex) { - $exdate = clone $event['start']; - $exdate->setDate($ex['start']->format('Y'), $ex['start']->format('n'), $ex['start']->format('j')); - $recurrence_id = $this->datetime_prop('RECURRENCE-ID', $exdate, true); - // if ($ex['thisandfuture']) // not supported by any client :-( - // $recurrence_id->add('RANGE', 'THISANDFUTURE'); + $exdate = $ex['recurrence_date'] ?: $ex['start']; + $recurrence_id = $this->datetime_prop('RECURRENCE-ID', $exdate, false, (bool)$event['allday']); + if ($ex['thisandfuture']) + $recurrence_id->add('RANGE', 'THISANDFUTURE'); $this->_to_ical($ex, $vcal, $get_attachment, $recurrence_id); } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libcalendaring/tests/libvcalendar.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libcalendaring/tests/libvcalendar.php
Changed
@@ -164,6 +164,7 @@ $events = $ical->import_from_file(__DIR__ . '/resources/recurrence-id.ics', 'UTF-8'); $this->assertEquals(1, count($events), "Fall back to Component::getComponents() when getBaseComponents() is empty"); $this->assertInstanceOf('DateTime', $events[0]['recurrence_date'], "Recurrence-ID as date"); + $this->assertTrue($events[0]['thisandfuture'], "Range=THISANDFUTURE"); } /**
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libcalendaring/tests/resources/recurrence-id.ics -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libcalendaring/tests/resources/recurrence-id.ics
Changed
@@ -22,7 +22,7 @@ DTEND;TZID="W. Europe":20140230T163000 TRANSP:OPAQUE RDATE;TZID="W. Europe";VALUE=PERIOD:20140227T140000/20140227T153000 -RECURRENCE-ID:20140227T130000Z +RECURRENCE-ID;RANGE=THISANDFUTURE:20140227T130000Z SEQUENCE:0 UID:7e93e8e8eef16f28aa33b78cd73613ebff DTSTAMP:20140120T105609Z
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libkolab/SQL/mysql.initial.sql -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libkolab/SQL/mysql.initial.sql
Changed
@@ -6,6 +6,7 @@ * @licence GNU AGPL **/ +/*!40014 SET FOREIGN_KEY_CHECKS=0 */; DROP TABLE IF EXISTS `kolab_folders`; @@ -15,6 +16,8 @@ `type` VARCHAR(32) NOT NULL, `synclock` INT(10) NOT NULL DEFAULT '0', `ctag` VARCHAR(40) DEFAULT NULL, + `changed` DATETIME DEFAULT NULL, + `objectcount` BIGINT DEFAULT NULL, PRIMARY KEY(`folder_id`), INDEX `resource_type` (`resource`, `type`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; @@ -183,5 +186,6 @@ INDEX `freebusy_uid2msguid` (`folder_id`,`uid`,`msguid`) ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; +/*!40014 SET FOREIGN_KEY_CHECKS=1 */; -INSERT INTO `system` (`name`, `value`) VALUES ('libkolab-version', '2015011600'); +REPLACE INTO `system` (`name`, `value`) VALUES ('libkolab-version', '2015020600');
View file
roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libkolab/SQL/mysql/2015020600.sql
Added
@@ -0,0 +1,4 @@ +-- improve cache synchronization (#3933) +ALTER TABLE `kolab_folders` + ADD `changed` DATETIME DEFAULT NULL, + ADD `objectcount` BIGINT DEFAULT NULL;
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libkolab/SQL/oracle.initial.sql -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libkolab/SQL/oracle.initial.sql
Changed
@@ -12,7 +12,9 @@ "resource" VARCHAR(255) NOT NULL, "type" VARCHAR(32) NOT NULL, "synclock" integer DEFAULT 0 NOT NULL, - "ctag" VARCHAR(40) DEFAULT NULL + "ctag" VARCHAR(40) DEFAULT NULL, + "changed" timestamp DEFAULT NULL, + "objectcount" number DEFAULT NULL ); CREATE INDEX "kolab_folders_resource_idx" ON "kolab_folders" ("resource", "type"); @@ -181,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', '2015011600'); +INSERT INTO "system" ("name", "value") VALUES ('libkolab-version', '2015020600');
View file
roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libkolab/SQL/oracle/2015020600.sql
Added
@@ -0,0 +1,4 @@ +-- improve cache synchronization (#3933) +ALTER TABLE "kolab_folders" + ADD "changed" timestamp DEFAULT NULL, + ADD "objectcount" number DEFAULT NULL;
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libkolab/composer.json -> roundcubemail-plugins-kolab-3.2.5.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": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.4", + "version": "3.2.5", "authors": [ { "name": "Thomas Bruederli", @@ -12,7 +12,7 @@ "role": "Lead" }, { - "name": "Alensader Machniak", + "name": "Aleksander Machniak", "email": "machniak@kolabsys.com", "role": "Developer" }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libkolab/config.inc.php.dist -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libkolab/config.inc.php.dist
Changed
@@ -5,6 +5,10 @@ // Enable caching of Kolab objects in local database $config['kolab_cache'] = true; +// Cache refresh interval (default is 12 hours) +// after this period, cache is forced to synchronize with IMAP +$config['kolab_cache_refresh'] = '12h'; + // Specify format version to write Kolab objects (must be a string value!) $config['kolab_format_version'] = '3.0'; @@ -35,6 +39,14 @@ // 1 - bypass only messages, but use index cache $config['kolab_messages_cache_bypass'] = 0; +// These event properties contribute to a significant revision to the calendar component +// and if changed will increment the sequence number relevant for scheduling according to RFC 5545 +$config['kolab_event_scheduling_properties'] = array('start', 'end', 'allday', 'location', 'status', 'cancelled'); + +// These task properties contribute to a significant revision to the calendar component +// and if changed will increment the sequence number relevant for scheduling according to RFC 5545 +$config['kolab_task_scheduling_properties'] = array('start', 'due', 'summary', 'status'); + // LDAP directory to find avilable users for folder sharing. // Either contains an array with LDAP addressbook configuration or refers to entry in $config['ldap_public']. // If not specified, the configuraton from 'kolab_auth_addressbook' will be used.
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libkolab/lib/kolab_format_event.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libkolab/lib/kolab_format_event.php
Changed
@@ -26,7 +26,7 @@ { public $CTYPEv2 = 'application/x-vnd.kolab.event'; - public $scheduling_properties = array('start', 'end', 'allday', 'location', 'status', 'cancelled'); + public static $scheduling_properties = array('start', 'end', 'allday', 'location', 'status', 'cancelled'); protected $objclass = 'Event'; protected $read_func = 'readEvent'; @@ -94,13 +94,26 @@ $this->obj->setStatus($status); // save recurrence exceptions - if (is_array($object['recurrence']) && $object['recurrence']['EXCEPTIONS']) { + if (is_array($object['recurrence']) && is_array($object['recurrence']['EXCEPTIONS'])) { + $recurrence_id_format = $object['allday'] ? 'Ymd' : 'Ymd\THis'; $vexceptions = new vectorevent; foreach((array)$object['recurrence']['EXCEPTIONS'] as $i => $exception) { $exevent = new kolab_format_event; $exevent->set(($compacted = $this->compact_exception($exception, $object))); // only save differing values - $exevent->obj->setRecurrenceID(self::get_datetime($exception['start'], null, true), (bool)$exception['thisandfuture']); + + // get value for recurrence-id + if (!empty($exception['recurrence_date']) && is_a($exception['recurrence_date'], 'DateTime')) { + $recurrence_id = $exception['recurrence_date']; + $compacted['_instance'] = $recurrence_id->format($recurrence_id_format); + } + else if (!empty($exception['_instance']) && strlen($exception['_instance']) > 4) { + $recurrence_id = rcube_utils::anytodatetime($exception['_instance'], $object['start']->getTimezone()); + $compacted['recurrence_date'] = $recurrence_id; + } + $exevent->obj->setRecurrenceID(self::get_datetime($recurrence_id ?: $exception['start'], null, $object['allday']), (bool)$exception['thisandfuture']); + $vexceptions->push($exevent->obj); + // write cleaned-up exception data back to memory/cache $object['recurrence']['EXCEPTIONS'][$i] = $this->expand_exception($compacted, $object); } @@ -172,15 +185,27 @@ // this is an exception object if ($this->obj->recurrenceID()->isValid()) { $object['thisandfuture'] = $this->obj->thisAndFuture(); + $object['recurrence_date'] = self::php_datetime($this->obj->recurrenceID()); } // read exception event objects else if (($exceptions = $this->obj->exceptions()) && is_object($exceptions) && $exceptions->size()) { $recurrence_exceptions = array(); + $recurrence_id_format = $object['allday'] ? 'Ymd' : 'Ymd\THis'; for ($i=0; $i < $exceptions->size(); $i++) { if (($exobj = $exceptions->get($i))) { $exception = new kolab_format_event($exobj); if ($exception->is_valid()) { - $recurrence_exceptions[] = $this->expand_exception($exception->to_array(), $object); + $exdata = $exception->to_array(); + + // fix date-only recurrence ID saved by old versions + if ($exdata['recurrence_date'] && $exdata['recurrence_date']->_dateonly && !$object['allday']) { + $exdata['recurrence_date']->setTimezone($object['start']->getTimezone()); + $exdata['recurrence_date']->setTime($object['start']->format('G'), intval($object['start']->format('i')), intval($object['start']->format('s'))); + } + + $recurrence_id = $exdata['recurrence_date'] ?: $exdata['start']; + $exdata['_instance'] = $recurrence_id->format($recurrence_id_format); + $recurrence_exceptions[] = $this->expand_exception($exdata, $object); } } } @@ -211,21 +236,24 @@ */ private function compact_exception($exception, $master) { - $forbidden = array('recurrence','organizer','attendees','sequence'); + $forbidden = array('recurrence','organizer','_attachments'); - foreach ($forbidden as $prop) { - if (array_key_exists($prop, $exception)) { - unset($exception[$prop]); + foreach ($forbidden as $prop) { + if (array_key_exists($prop, $exception)) { + unset($exception[$prop]); + } } - } - foreach ($master as $prop => $value) { - if (isset($exception[$prop]) && gettype($exception[$prop]) == gettype($value) && $exception[$prop] == $value) { - unset($exception[$prop]); + foreach ($master as $prop => $value) { + if (isset($exception[$prop]) && gettype($exception[$prop]) == gettype($value) && $exception[$prop] == $value) { + unset($exception[$prop]); + } } - } - return $exception; + // preserve this property for date serialization + $exception['allday'] = $master['allday']; + + return $exception; } /** @@ -233,12 +261,16 @@ */ private function expand_exception($exception, $master) { - foreach ($master as $prop => $value) { - if (empty($exception[$prop]) && !empty($value)) - $exception[$prop] = $value; - } + foreach ($master as $prop => $value) { + if (empty($exception[$prop]) && !empty($value)) { + $exception[$prop] = $value; + if ($prop == 'recurrence') { + unset($exception[$prop]['EXCEPTIONS']); + } + } + } - return $exception; + return $exception; } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libkolab/lib/kolab_format_task.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libkolab/lib/kolab_format_task.php
Changed
@@ -26,7 +26,7 @@ { public $CTYPEv2 = 'application/x-vnd.kolab.task'; - public $scheduling_properties = array('start', 'due', 'summary', 'status'); + public static $scheduling_properties = array('start', 'due', 'summary', 'status'); protected $objclass = 'Todo'; protected $read_func = 'readTodo';
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libkolab/lib/kolab_format_xcal.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libkolab/lib/kolab_format_xcal.php
Changed
@@ -30,7 +30,7 @@ public static $fulltext_cols = array('title', 'description', 'location', 'attendees:name', 'attendees:email', 'categories'); - public $scheduling_properties = array('start', 'end', 'location'); + public static $scheduling_properties = array('start', 'end', 'location'); protected $sensitivity_map = array( 'public' => kolabformat::ClassPublic, @@ -321,8 +321,7 @@ // increment sequence when updating properties relevant for scheduling. // RFC 5545: "It is incremented [...] each time the Organizer makes a significant revision to the calendar component." - // TODO: make the list of properties considered 'significant' for scheduling configurable - foreach ($this->scheduling_properties as $prop) { + foreach (self::$scheduling_properties as $prop) { $a = $old[$prop]; $b = $object[$prop]; if ($object['allday'] && ($prop == 'start' || $prop == 'end') && $a instanceof DateTime && $b instanceof DateTime) { @@ -581,27 +580,38 @@ * * @return array List of words to save in cache */ - public function get_words() + public function get_words($obj = null) { $data = ''; + $object = $obj ?: $this->data; + foreach (self::$fulltext_cols as $colname) { list($col, $field) = explode(':', $colname); if ($field) { $a = array(); - foreach ((array)$this->data[$col] as $attr) + foreach ((array)$object[$col] as $attr) $a[] = $attr[$field]; $val = join(' ', $a); } else { - $val = is_array($this->data[$col]) ? join(' ', $this->data[$col]) : $this->data[$col]; + $val = is_array($object[$col]) ? join(' ', $object[$col]) : $object[$col]; } if (strlen($val)) $data .= $val . ' '; } - return array_unique(rcube_utils::normalize_string($data, true)); + $words = rcube_utils::normalize_string($data, true); + + // collect words from recurrence exceptions + if (is_array($object['recurrence']) && $object['recurrence']['EXCEPTIONS']) { + foreach((array)$object['recurrence']['EXCEPTIONS'] as $exception) { + $words = array_merge($words, $this->get_words($exception)); + } + } + + return array_unique($words); } /**
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libkolab/lib/kolab_storage.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libkolab/lib/kolab_storage.php
Changed
@@ -106,6 +106,15 @@ ), true); } + // adjust some configurable settings + if ($event_scheduling_prop = $rcmail->config->get('kolab_event_scheduling_properties', null)) { + kolab_format_event::$scheduling_properties = (array)$event_scheduling_prop; + } + // adjust some configurable settings + if ($task_scheduling_prop = $rcmail->config->get('kolab_task_scheduling_properties', null)) { + kolab_format_task::$scheduling_properties = (array)$task_scheduling_prop; + } + return self::$ready; }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/libkolab/lib/kolab_storage_cache.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/libkolab/lib/kolab_storage_cache.php
Changed
@@ -41,6 +41,7 @@ protected $synclock = false; protected $ready = false; protected $cache_table; + protected $cache_refresh = 3600; protected $folders_table; protected $max_sql_packet; protected $max_sync_lock_time = 600; @@ -82,6 +83,7 @@ $this->imap = $rcmail->get_storage(); $this->enabled = $rcmail->config->get('kolab_cache', false); $this->folders_table = $this->db->table_name('kolab_folders'); + $this->cache_refresh = get_offset_sec($rcmail->config->get('kolab_cache_refresh', '12h')); if ($this->enabled) { // always read folder cache and lock state from DB master @@ -187,8 +189,14 @@ // read cached folder metadata $this->_read_folder_data(); - // check cache status hash first ($this->metadata is set in _read_folder_data()) - if ($this->metadata['ctag'] != $this->folder->get_ctag()) { + // check cache status ($this->metadata is set in _read_folder_data()) + if ( empty($this->metadata['ctag']) || + empty($this->metadata['changed']) || + $this->metadata['objectcount'] === null || + $this->metadata['changed'] < date(self::DB_DATE_FORMAT, time() - $this->cache_refresh) || + $this->metadata['ctag'] != $this->folder->get_ctag() || + intval($this->metadata['objectcount']) !== $this->count() + ) { // lock synchronization for this folder or wait if locked $this->_sync_lock(); @@ -244,6 +252,9 @@ // update ctag value (will be written to database in _sync_unlock()) if ($this->sync_complete) { $this->metadata['ctag'] = $this->folder->get_ctag(); + $this->metadata['changed'] = date(self::DB_DATE_FORMAT, time()); + // remember the number of cache entries linked to this folder + $this->metadata['objectcount'] = $this->count(); } } @@ -749,7 +760,7 @@ $sql_data = array('changed' => null, 'xml' => '', 'tags' => '', 'words' => ''); if ($object['changed']) { - $sql_data['changed'] = date('Y-m-d H:i:s', is_object($object['changed']) ? $object['changed']->format('U') : $object['changed']); + $sql_data['changed'] = date(self::DB_DATE_FORMAT, is_object($object['changed']) ? $object['changed']->format('U') : $object['changed']); } if ($object['_formatobj']) { @@ -943,7 +954,7 @@ return; $sql_arr = $this->db->fetch_assoc($this->db->query( - "SELECT `folder_id`, `synclock`, `ctag`" + "SELECT `folder_id`, `synclock`, `ctag`, `changed`, `objectcount`" . " FROM `{$this->folders_table}` WHERE `resource` = ?", $this->resource_uri )); @@ -1004,8 +1015,10 @@ return; $this->db->query( - "UPDATE `{$this->folders_table}` SET `synclock` = 0, `ctag` = ? WHERE `folder_id` = ?", + "UPDATE `{$this->folders_table}` SET `synclock` = 0, `ctag` = ?, `changed` = ?, `objectcount` = ? WHERE `folder_id` = ?", $this->metadata['ctag'], + $this->metadata['changed'], + $this->metadata['objectcount'], $this->folder_id );
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/pdfviewer/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/pdfviewer/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Inline PDF viewer plugin", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "1.0.0", + "version": "3.2.5", "authors": [ { "name": "Thomas Bruederli",
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/pdfviewer/pdfviewer.php -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/pdfviewer/pdfviewer.php
Changed
@@ -68,9 +68,12 @@ { // redirect to viewer/viewer.html if (!$args['download'] && $args['mimetype'] && empty($_GET['_load']) && in_array($args['mimetype'], $this->pdf_mimetypes)) { - $file_url = $this->abs_url(rcube::get_instance()->url($_GET + array('_load' => 1))); - header('Location: ' . $this->abs_url($this->urlbase . 'viewer/viewer.html') . '?file=' . urlencode($file_url)); - $args['abort'] = true; + $rcmail = rcube::get_instance(); + $file_url = $_SERVER['REQUEST_URI'] . '&_load=1'; + $location = $rcmail->output->asset_url($this->urlbase . 'viewer/viewer.html'); + + header('Location: ' . $location . '?file=' . urlencode($file_url)); + exit; } return $args; @@ -116,19 +119,4 @@ list($part->ctype_primary, $part->ctype_secondary) = explode('/', $part->mimetype); } - - /** - * Build an absolute URL with the given relative path - */ - private function abs_url($relpath = '') - { - $webroot = '/'; - - if (dirname($_SERVER['SCRIPT_NAME']) != '/') - $webroot = dirname($_SERVER['SCRIPT_NAME']) . '/'; - - return $webroot . preg_replace('!^\./!', '', $relpath); - } - } -
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/tasklist/composer.json -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/tasklist/composer.json
Changed
@@ -4,7 +4,7 @@ "description": "Task management plugin", "homepage": "http://git.kolab.org/roundcubemail-plugins-kolab/", "license": "AGPLv3", - "version": "3.2.3", + "version": "3.2.5", "authors": [ { "name": "Thomas Bruederli", @@ -21,7 +21,7 @@ "require": { "php": ">=5.3.0", "roundcube/plugin-installer": ">=0.1.3", - "kolab/libcalendaring": ">=3.2.4", + "kolab/libcalendaring": ">=3.2.5", "roundcube/jqueryui": ">=1.10.4" } }
View file
roundcubemail-plugins-kolab-3.2.4.tar.gz/plugins/tasklist/tasklist.js -> roundcubemail-plugins-kolab-3.2.5.tar.gz/plugins/tasklist/tasklist.js
Changed
@@ -604,9 +604,6 @@ return false; }); - // handle global document clicks: close popup menus - $(document.body).click(clear_popups); - // extended datepicker settings var extended_datepicker_settings = $.extend({ showButtonPanel: true, @@ -1778,7 +1775,7 @@ return $.grep(oldies, function(cls) { return cls.indexOf('status-') === 0 }).join(' '); }); - if (!(rec = listdata[id]) || clear_popups({})) + if (!(rec = listdata[id]) || (rcmail.menu_stack && rcmail.menu_stack.length > 0)) return; me.selected_task = rec; @@ -2880,25 +2877,6 @@ } /** - * Hide all open popup menus - */ - function clear_popups(e) - { - var count = 0, target = e.target; - if (target && target.className == 'inner') - target = e.target.parentNode; - - $('.popupmenu:visible').each(function(i, elem){ - var menu = $(elem), id = elem.id; - if (id && target.id != id+'link' && (!menu.data('sticky') || !target_overlaps(e.target, elem))) { - menu.hide(); - count++; - } - }); - return count; - } - - /** * Check whether the event target is a descentand of the given element */ function target_overlaps(target, elem)
View file
roundcubemail-plugins-kolab.dsc
Changed
@@ -2,7 +2,7 @@ Source: roundcubemail-plugins-kolab Binary: roundcubemail-plugins-kolab Architecture: all -Version: 1:3.2.4-0~kolab1 +Version: 1:3.2.5-0~kolab1 Maintainer: Christoph Wickert <wickert@kolabsys.com> Uploaders: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com>, Paul Klos <kolab@klos2day.nl> Standards-Version: 3.9.3 @@ -10,5 +10,5 @@ Package-List: roundcubemail-plugins-kolab deb web extra Files: - 00000000000000000000000000000000 0 roundcubemail-plugins-kolab-3.2.4.tar.gz + 00000000000000000000000000000000 0 roundcubemail-plugins-kolab-3.2.5.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
.