Projects
Kolab:Winterfell
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 61
View file
roundcubemail-plugins-kolab.spec
Changed
@@ -48,6 +48,15 @@ Patch1001: roundcubemail-plugins-kolab-3.3-kolab-files-manticore-api.patch +Patch0001: 0001-Move-more-common-methods-used-by-tasklist-and-calend.patch +Patch0002: 0002-T2504-Fix-DTSTAMP-in-iTip-replies.patch +Patch0003: 0003-Add-missing-status-tentative-label.patch +Patch0004: 0004-T2531-Support-SCHEDULE-AGENT-in-iTip.patch +Patch0005: 0005-Don-t-ignore-global-userlogins-sendmail-logging-in-p.patch +Patch0006: 0006-Add-missing-type-link-for-template-buttons-for-compa.patch +Patch0007: 0007-Update-calendar-and-tasklist-styles-sprites-to-new-L.patch +Patch0008: 0008-T2561-Fix-recognizing-event-organizer-on-event-move-.patch + BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildArch: noarch @@ -860,6 +869,15 @@ %patch1001 -p1 +%patch0001 -p1 +%patch0002 -p1 +%patch0003 -p1 +%patch0004 -p1 +%patch0005 -p1 +%patch0006 -p1 +%patch0007 -p1 +%patch0008 -p1 + find -type d -name "helpdocs" -exec rm -rvf {} \; 2>/dev/null || : rm -rf plugins/kolab_zpush
View file
0001-Move-more-common-methods-used-by-tasklist-and-calend.patch
Added
@@ -0,0 +1,489 @@ +From 2ad0d6651dfbcb32c146465ad9539848b285e3f9 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Thu, 29 Jun 2017 11:20:09 +0200 +Subject: [PATCH 1/8] Move more common methods used by tasklist and calendar to + libcalendaring + +--- + plugins/calendar/calendar_ui.js | 74 +++++--------------------- + plugins/libcalendaring/libcalendaring.js | 64 ++++++++++++++++++++++ + plugins/tasklist/tasklist.js | 91 ++++++++------------------------ + 3 files changed, 97 insertions(+), 132 deletions(-) + +diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js +index c8f67477..7da1f594 100644 +--- a/plugins/calendar/calendar_ui.js ++++ b/plugins/calendar/calendar_ui.js +@@ -283,49 +283,6 @@ function rcube_calendar_ui(settings) + else + return date.getHours() >= settings['work_start'] && date.getHours() < settings['work_end']; + }; +- +- // check if the event has 'real' attendees, excluding the current user +- var has_attendees = function(event) +- { +- return (event.attendees && event.attendees.length && (event.attendees.length > 1 || String(event.attendees[0].email).toLowerCase() != settings.identity.email)); +- }; +- +- // check if the current user is an attendee of this event +- var is_attendee = function(event, role, email) +- { +- var emails = email ? ';'+email.toLowerCase() : settings.identity.emails; +- for (var i=0; event.attendees && i < event.attendees.length; i++) { +- if ((!role || event.attendees[i].role == role) && event.attendees[i].email && emails.indexOf(';'+event.attendees[i].email.toLowerCase()) >= 0) +- return event.attendees[i]; +- } +- return false; +- }; +- +- // check if the current user is the organizer +- var is_organizer = function(event, email) +- { +- return is_attendee(event, 'ORGANIZER', email) || !event.id; +- }; +- +- /** +- * Check permissions on the given calendar object +- */ +- var has_permission = function(cal, perm) +- { +- // multiple chars means "either of" +- if (String(perm).length > 1) { +- for (var i=0; i < perm.length; i++) { +- if (has_permission(cal, perm[i])) +- return true; +- } +- } +- +- if (cal.rights && String(cal.rights).indexOf(perm) >= 0) { +- return true; +- } +- +- return (perm == 'i' && cal.editable) || (perm == 'v' && cal.editable); +- } + + var load_attachment = function(event, att) + { +@@ -514,7 +471,7 @@ function rcube_calendar_ui(settings) + }); + + var data, mystatus = null, rsvp, line, morelink, html = '', overflow = '', +- organizer = is_organizer(event); ++ organizer = me.is_organizer(event); + + for (var j=0; j < event.attendees.length; j++) { + data = event.attendees[j]; +@@ -568,7 +525,7 @@ function rcube_calendar_ui(settings) + .text(rcmail.gettext('status' + mystatus, 'libcalendaring')); + } + +- var show_rsvp = rsvp && !organizer && event.status != 'CANCELLED' && has_permission(calendar, 'v'); ++ var show_rsvp = rsvp && !organizer && event.status != 'CANCELLED' && me.has_permission(calendar, 'v'); + $('#event-rsvp')[(show_rsvp ? 'show' : 'hide')](); + $('#event-rsvp .rsvp-buttons input').prop('disabled', false).filter('input[rel='+mystatus+']').prop('disabled', true); + +@@ -596,7 +553,7 @@ function rcube_calendar_ui(settings) + } + }); + } +- if (!temp && has_permission(calendar, 'td') && event.editable !== false) { ++ if (!temp && me.has_permission(calendar, 'td') && event.editable !== false) { + buttons.push({ + text: rcmail.gettext('delete', 'calendar'), + 'class': 'delete', +@@ -737,7 +694,7 @@ function rcube_calendar_ui(settings) + calendars.val($('option:first', calendars).attr('value')); + + invite.checked = settings.itip_notify & 1 > 0; +- notify.checked = has_attendees(event) && invite.checked; ++ notify.checked = me.has_attendees(event) && invite.checked; + + if (event.allDay) { + starttime.val("12:00").hide(); +@@ -751,7 +708,7 @@ function rcube_calendar_ui(settings) + // set calendar selection according to permissions + calendars.find('option').each(function(i, opt) { + var cal = me.calendars[opt.value] || {}; +- $(opt).prop('disabled', !(cal.editable || (action == 'new' && has_permission(cal, 'i')))) ++ $(opt).prop('disabled', !(cal.editable || (action == 'new' && me.has_permission(cal, 'i')))) + }); + + // set alarm(s) +@@ -783,13 +740,13 @@ function rcube_calendar_ui(settings) + $('#edit-recurring-warning').hide(); + + // init attendees tab +- var organizer = !event.attendees || is_organizer(event), ++ var organizer = !event.attendees || me.is_organizer(event), + allow_invitations = organizer || (calendar.owner && calendar.owner == 'anonymous') || settings.invite_shared; + event_attendees = []; + attendees_list = $('#edit-attendees-table > tbody').html(''); + resources_list = $('#edit-resources-table > tbody').html(''); +- $('#edit-attendees-notify')[(action != 'new' && allow_invitations && has_attendees(event) && (settings.itip_notify & 2) ? 'show' : 'hide')](); +- $('#edit-localchanges-warning')[(action != 'new' && has_attendees(event) && !(allow_invitations || (calendar.owner && is_organizer(event, calendar.owner))) ? 'show' : 'hide')](); ++ $('#edit-attendees-notify')[(action != 'new' && allow_invitations && me.has_attendees(event) && (settings.itip_notify & 2) ? 'show' : 'hide')](); ++ $('#edit-localchanges-warning')[(action != 'new' && me.has_attendees(event) && !(allow_invitations || (calendar.owner && me.is_organizer(event, calendar.owner))) ? 'show' : 'hide')](); + + var load_attendees_tab = function() + { +@@ -2554,13 +2511,13 @@ function rcube_calendar_ui(settings) + + if (!data) data = event; + var decline = false, notify = false, html = '', cal = me.calendars[event.calendar], +- _has_attendees = has_attendees(event), _is_organizer = is_organizer(event); ++ _has_attendees = me.has_attendees(event), _is_organizer = me.is_organizer(event); + + // event has attendees, ask whether to notify them + if (_has_attendees) { + var checked = (settings.itip_notify & 1 ? ' checked="checked"' : ''); + +- if (action == 'remove' && cal.group != 'shared' && !_is_organizer && is_attendee(event)) { ++ if (action == 'remove' && cal.group != 'shared' && !_is_organizer && me.is_attendee(event)) { + decline = true; + checked = event.status != 'CANCELLED' ? checked : ''; + html += '<div class="message">' + +@@ -2588,7 +2545,7 @@ function rcube_calendar_ui(settings) + + // disable the 'future' savemode if I'm an attendee + // reason: no calendaring system supports the thisandfuture range parameter in iTip REPLY +- if (action == 'remove' && _has_attendees && !_is_organizer && is_attendee(event)) { ++ if (action == 'remove' && _has_attendees && !_is_organizer && me.is_attendee(event)) { + future_disabled = ' disabled'; + } + +@@ -3529,13 +3486,6 @@ function rcube_calendar_ui(settings) + this.fisheye_view(this.fisheye_date); + }; + +- // resize and reposition (center) the dialog window +- this.dialog_resize = function(id, height, width) +- { +- var win = $(window), w = win.width(), h = win.height(); +- $(id).dialog('option', { height: Math.min(h-20, height+130), width: Math.min(w-20, width+50) }); +- }; +- + // adjust calendar view size + this.view_resize = function() + { +@@ -3593,7 +3543,7 @@ function rcube_calendar_ui(settings) + + // insert to #calendar-select options if writeable + select = $('#edit-calendar'); +- if (fc && has_permission(cal, 'i') && select.length && !select.find('option[value="'+id+'"]').length) { ++ if (fc && me.has_permission(cal, 'i') && select.length && !select.find('option[value="'+id+'"]').length) { + $('<option>').attr('value', id).html(cal.name).appendTo(select); + } + } +diff --git a/plugins/libcalendaring/libcalendaring.js b/plugins/libcalendaring/libcalendaring.js +index c15fa048..c6bee178 100644 +--- a/plugins/libcalendaring/libcalendaring.js ++++ b/plugins/libcalendaring/libcalendaring.js +@@ -94,6 +94,59 @@ function rcube_libcalendaring(settings) + return fromto; + }; + ++ /** ++ * Checks if the event/task has 'real' attendees, excluding the current user ++ */ ++ this.has_attendees = function(event) ++ { ++ return !!(event.attendees && event.attendees.length && (event.attendees.length > 1 || String(event.attendees[0].email).toLowerCase() != settings.identity.email)); ++ }; ++ ++ /** ++ * Check if the current user is an attendee of this event/task ++ */ ++ this.is_attendee = function(event, role, email) ++ { ++ var i, emails = email ? ';' + email.toLowerCase() : settings.identity.emails; ++
View file
0002-T2504-Fix-DTSTAMP-in-iTip-replies.patch
Added
@@ -0,0 +1,26 @@ +From c2e8cc16abf3c016b32fa84eb7e0a9e693b0bb73 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Thu, 29 Jun 2017 13:08:35 +0000 +Subject: [PATCH 2/8] T2504: Fix DTSTAMP in iTip replies + +It should be set to NOW whenever METHOD is specified. +--- + plugins/libcalendaring/libvcalendar.php | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/plugins/libcalendaring/libvcalendar.php b/plugins/libcalendaring/libvcalendar.php +index 78a9e2c1..a84f1a98 100644 +--- a/plugins/libcalendaring/libvcalendar.php ++++ b/plugins/libcalendaring/libvcalendar.php +@@ -1002,7 +1002,7 @@ class libvcalendar implements Iterator + $ve->UID = $event['uid']; + + // set DTSTAMP according to RFC 5545, 3.8.7.2. +- $dtstamp = !empty($event['changed']) && !empty($this->method) ? $event['changed'] : new DateTime('now', new \DateTimeZone('UTC')); ++ $dtstamp = !empty($event['changed']) && empty($this->method) ? $event['changed'] : new DateTime('now', new \DateTimeZone('UTC')); + $ve->DTSTAMP = $this->datetime_prop($cal, 'DTSTAMP', $dtstamp, true); + + // all-day events end the next day +-- +2.13.2 +
View file
0003-Add-missing-status-tentative-label.patch
Added
@@ -0,0 +1,24 @@ +From 94dd9965a7553836851a51902bfc7f064aba27b3 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Mon, 3 Jul 2017 10:13:59 +0200 +Subject: [PATCH 3/8] Add missing status-tentative label + +--- + plugins/calendar/localization/en_US.inc | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/plugins/calendar/localization/en_US.inc b/plugins/calendar/localization/en_US.inc +index 43d07922..2e2952c2 100644 +--- a/plugins/calendar/localization/en_US.inc ++++ b/plugins/calendar/localization/en_US.inc +@@ -82,6 +82,7 @@ $labels['mystatus'] = 'My status'; + $labels['status'] = 'Status'; + $labels['status-confirmed'] = 'Confirmed'; + $labels['status-cancelled'] = 'Cancelled'; ++$labels['status-tentative'] = 'Tentative'; + $labels['priority'] = 'Priority'; + $labels['sensitivity'] = 'Privacy'; + $labels['public'] = 'public'; +-- +2.13.2 +
View file
0004-T2531-Support-SCHEDULE-AGENT-in-iTip.patch
Added
@@ -0,0 +1,105 @@ +From 0c02d0d45c63444588a666e5b9f1671f91bd99a1 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Tue, 4 Jul 2017 14:27:19 +0000 +Subject: [PATCH 4/8] T2531: Support SCHEDULE-AGENT in iTip + +This property is used when scheduling method on the original and updated +event via CalDAV (iRony) using SCHEDULING-AGENT=CLIENT. CANCEL invitations +are supposed to be sent to attendees only if the initial scheduling was not +done with SCHEDULING-AGENT=CLIENT. + +https://tools.ietf.org/html/rfc6638#section-3.2.1.2 +--- + plugins/libcalendaring/libvcalendar.php | 39 +++++++++++++++++++++++++++++---- + 1 file changed, 35 insertions(+), 4 deletions(-) + +diff --git a/plugins/libcalendaring/libvcalendar.php b/plugins/libcalendaring/libvcalendar.php +index a84f1a98..06e660b8 100644 +--- a/plugins/libcalendaring/libvcalendar.php ++++ b/plugins/libcalendaring/libvcalendar.php +@@ -45,11 +45,13 @@ class libvcalendar implements Iterator + 'delegated-from' => 'DELEGATED-FROM', + 'delegated-to' => 'DELEGATED-TO', + 'schedule-status' => 'SCHEDULE-STATUS', ++ 'schedule-agent' => 'SCHEDULE-AGENT', + 'sent-by' => 'SENT-BY', + ); + private $organizer_keymap = array( + 'name' => 'CN', + 'schedule-status' => 'SCHEDULE-STATUS', ++ 'schedule-agent' => 'SCHEDULE-AGENT', + 'sent-by' => 'SENT-BY', + ); + private $iteratorkey = 0; +@@ -549,6 +551,10 @@ class libvcalendar implements Iterator + $attendee['role'] = 'ORGANIZER'; + $attendee['status'] = 'ACCEPTED'; + $event['organizer'] = $attendee; ++ ++ if (array_key_exists('schedule-agent', $attendee)) { ++ $schedule_agent = $attendee['schedule-agent']; ++ } + } + else if ($attendee['email'] != $event['organizer']['email']) { + $event['attendees'][] = $attendee; +@@ -708,6 +714,12 @@ class libvcalendar implements Iterator + $event['end'] = clone $event['start']; + } + ++ // T2531: Remember SCHEDULE-AGENT in custom property to properly ++ // support event updates via CalDAV when SCHEDULE-AGENT=CLIENT is used ++ if (isset($schedule_agent)) { ++ $event['x-custom'][] = array('SCHEDULE-AGENT', $schedule_agent); ++ } ++ + // minimal validation + if (empty($event['uid']) || ($event['_type'] == 'event' && empty($event['start']) != empty($event['end']))) { + throw new VObject\ParseException('Object validation failed: missing mandatory object properties'); +@@ -1164,6 +1176,13 @@ class libvcalendar implements Iterator + $ve->add($va); + } + ++ // Find SCHEDULE-AGENT ++ foreach ((array)$event['x-custom'] as $prop) { ++ if ($prop[0] === 'SCHEDULE-AGENT') { ++ $schedule_agent = $prop[1]; ++ } ++ } ++ + foreach ((array)$event['attendees'] as $attendee) { + if ($attendee['role'] == 'ORGANIZER') { + if (empty($event['organizer'])) +@@ -1172,14 +1191,26 @@ class libvcalendar implements Iterator + else if (!empty($attendee['email'])) { + if (isset($attendee['rsvp'])) + $attendee['rsvp'] = $attendee['rsvp'] ? 'TRUE' : null; +- $ve->add('ATTENDEE', 'mailto:' . $attendee['email'], +- array_filter(self::map_keys($attendee, $this->attendee_keymap))); ++ ++ $mailto = $attendee['email']; ++ $attendee = array_filter(self::map_keys($attendee, $this->attendee_keymap)); ++ ++ if ($schedule_agent !== null && !isset($attendee['SCHEDULE-AGENT'])) { ++ $attendee['SCHEDULE-AGENT'] = $schedule_agent; ++ } ++ ++ $ve->add('ATTENDEE', 'mailto:' . $mailto, $attendee); + } + } + + if ($event['organizer']) { +- $ve->add('ORGANIZER', 'mailto:' . $event['organizer']['email'], +- array_filter(self::map_keys($event['organizer'], $this->organizer_keymap))); ++ $organizer = array_filter(self::map_keys($event['organizer'], $this->organizer_keymap)); ++ ++ if ($schedule_agent !== null && !isset($organizer['SCHEDULE-AGENT'])) { ++ $organizer['SCHEDULE-AGENT'] = $schedule_agent; ++ } ++ ++ $ve->add('ORGANIZER', 'mailto:' . $event['organizer']['email'], $organizer); + } + + foreach ((array)$event['url'] as $url) { +-- +2.13.2 +
View file
0005-Don-t-ignore-global-userlogins-sendmail-logging-in-p.patch
Added
@@ -0,0 +1,28 @@ +From 38e6afc90338def196f2d156825653a377f57c57 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Mon, 10 Jul 2017 16:35:42 +0200 +Subject: [PATCH 5/8] Don't ignore (global) userlogins/sendmail logging in + per_user_logging mode + +--- + plugins/kolab_auth/kolab_auth.php | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/plugins/kolab_auth/kolab_auth.php b/plugins/kolab_auth/kolab_auth.php +index 12e08169..f8628443 100644 +--- a/plugins/kolab_auth/kolab_auth.php ++++ b/plugins/kolab_auth/kolab_auth.php +@@ -298,8 +298,8 @@ class kolab_auth extends rcube_plugin + if (is_writable($user_log_dir)) { + $args['dir'] = $user_log_dir; + } +- else if ($args['name'] != 'errors') { +- $args['abort'] = true; // don't log if unauthenticed ++ else if (!in_array($args['name'], array('errors', 'userlogins', 'sendmail'))) { ++ $args['abort'] = true; // don't log if unauthenticed or no per-user log dir + } + } + +-- +2.13.2 +
View file
0006-Add-missing-type-link-for-template-buttons-for-compa.patch
Added
@@ -0,0 +1,379 @@ +From 8ce594f23aa1c450605b87808f4c4487307d2ab4 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Tue, 11 Jul 2017 14:33:31 +0000 +Subject: [PATCH 6/8] Add missing type="link" for template buttons for compat. + with Roundcube 1.4 + +--- + plugins/calendar/lib/calendar_ui.php | 9 ++++---- + .../calendar/skins/larry/templates/calendar.html | 24 +++++++++++----------- + .../kolab_addressbook/lib/kolab_addressbook_ui.php | 3 ++- + plugins/kolab_files/lib/kolab_files_engine.php | 1 + + .../skins/larry/templates/compose_plugin.html | 6 +++--- + .../kolab_files/skins/larry/templates/files.html | 18 ++++++++-------- + .../skins/larry/templates/message_plugin.html | 2 +- + plugins/kolab_notes/kolab_notes_ui.php | 9 ++++---- + .../kolab_notes/skins/larry/templates/notes.html | 12 +++++------ + plugins/kolab_tags/skins/larry/templates/ui.html | 6 +++--- + .../tasklist/skins/larry/templates/mainview.html | 20 +++++++++--------- + plugins/tasklist/tasklist_ui.php | 1 + + 12 files changed, 58 insertions(+), 53 deletions(-) + +diff --git a/plugins/calendar/lib/calendar_ui.php b/plugins/calendar/lib/calendar_ui.php +index 4276fb48..5152c287 100644 +--- a/plugins/calendar/lib/calendar_ui.php ++++ b/plugins/calendar/lib/calendar_ui.php +@@ -47,11 +47,12 @@ class calendar_ui + + // add taskbar button + $this->cal->add_button(array( +- 'command' => 'calendar', +- 'class' => 'button-calendar', +- 'classsel' => 'button-calendar button-selected', ++ 'command' => 'calendar', ++ 'class' => 'button-calendar', ++ 'classsel' => 'button-calendar button-selected', + 'innerclass' => 'button-inner', +- 'label' => 'calendar.calendar', ++ 'label' => 'calendar.calendar', ++ 'type' => 'link' + ), 'taskbar'); + + // load basic client script +diff --git a/plugins/calendar/skins/larry/templates/calendar.html b/plugins/calendar/skins/larry/templates/calendar.html +index b7f04bd9..895b6cfb 100644 +--- a/plugins/calendar/skins/larry/templates/calendar.html ++++ b/plugins/calendar/skins/larry/templates/calendar.html +@@ -35,7 +35,7 @@ + <label for="calendarlistsearch" class="voice"><roundcube:label name="calendar.searchterms" /></label> + <input type="text" name="q" id="calendarlistsearch" placeholder="<roundcube:label name='calendar.findcalendars' />" /> + <a class="iconbutton searchicon"></a> +- <roundcube:button command="reset-listsearch" id="calendarlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-listsearch" id="calendarlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + </div> + <div class="scroller withfooter"> +@@ -52,7 +52,7 @@ + <label for="quicksearchbox" class="voice"><roundcube:label name="calendar.arialabelquicksearchbox" /></label> + <roundcube:object name="plugin.searchform" id="quicksearchbox" /> + <a id="searchmenulink" class="iconbutton searchoptions" tabindex="-1"> </a> +- <roundcube:button command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + + <h2 id="aria-label-calendarview" class="voice"><roundcube:label name="calendar.arialabelcalendarview" /></h2> +@@ -68,14 +68,14 @@ + <div id="calendaroptionsmenu" class="popupmenu" aria-hidden="true"> + <h3 id="aria-label-calendaroptions" class="voice"><roundcube:label name="calendar.calendaractions" /></h3> + <ul id="calendaroptionsmenu-menu" class="toolbarmenu" role="menu" aria-labelledby="aria-label-calendaroptions"> +- <li role="menuitem"><roundcube:button command="calendar-edit" label="calendar.edit" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="calendar-delete" label="delete" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="calendar-edit" label="calendar.edit" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="calendar-delete" label="delete" classAct="active" /></li> + <roundcube:if condition="env:calendar_driver == 'kolab'" /> +- <li role="menuitem"><roundcube:button command="calendar-remove" label="calendar.removelist" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="calendar-remove" label="calendar.removelist" classAct="active" /></li> + <roundcube:endif /> +- <li role="menuitem"><roundcube:button command="calendar-showurl" label="calendar.showurl" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="calendar-showurl" label="calendar.showurl" classAct="active" /></li> + <roundcube:if condition="env:calendar_driver == 'kolab'" /> +- <li role="menuitem"><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="folders" task="settings" label="managefolders" classAct="active" /></li> + <roundcube:endif /> + </ul> + </div> +@@ -162,11 +162,11 @@ + <div id="eventoptionsmenu" class="popupmenu" aria-hidden="true"> + <h3 id="aria-label-eventoptions" class="voice"><roundcube:label name="calendar.eventoptions" /></h3> + <ul id="eventoptionsmenu-menu" class="toolbarmenu" role="menu" aria-labelledby="aria-label-eventoptions"> +- <li role="menuitem"><roundcube:button command="event-download" label="download" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="event-sendbymail" label="send" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="event-copy" label="copy" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="event-download" label="download" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="event-sendbymail" label="send" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="event-copy" label="copy" classAct="active" /></li> + <roundcube:if condition="env:calendar_driver == 'kolab' && config:kolab_bonnie_api" /> +- <li role="menuitem"><roundcube:button command="event-history" type="link" label="calendar.eventhistory" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="event-history" label="calendar.eventhistory" classAct="active" /></li> + <roundcube:endif /> + </ul> + </div> +@@ -265,7 +265,7 @@ + <label for="resourcesearchbox" class="voice"><roundcube:label name="calendar.searchterms" /></label> + <roundcube:object name="plugin.resources_searchform" id="resourcesearchbox" /> + <a id="resourcesearchmenulink" class="iconbutton searchoptions"> </a> +- <roundcube:button command="reset-resource-search" id="resourcesearchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-resource-search" id="resourcesearchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + </div> + <div class="scroller"> +diff --git a/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php b/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php +index 26455cf1..941c4242 100644 +--- a/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php ++++ b/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php +@@ -86,7 +86,8 @@ class kolab_addressbook_ui + 'label' => 'kolab_addressbook.'.str_replace('-', '', $command), + 'domain' => $this->ID, + 'classact' => 'active', +- 'command' => $command ++ 'command' => $command, ++ 'type' => 'link' + ))); + $this->plugin->api->add_content($content, 'groupoptions'); + $idx++; +diff --git a/plugins/kolab_files/lib/kolab_files_engine.php b/plugins/kolab_files/lib/kolab_files_engine.php +index 4ea58ba1..5d98a146 100644 +--- a/plugins/kolab_files/lib/kolab_files_engine.php ++++ b/plugins/kolab_files/lib/kolab_files_engine.php +@@ -127,6 +127,7 @@ class kolab_files_engine + 'classsel' => 'button-files button-selected', + 'innerclass' => 'button-inner', + 'label' => 'kolab_files.files', ++ 'type' => 'link' + ), 'taskbar'); + } + +diff --git a/plugins/kolab_files/skins/larry/templates/compose_plugin.html b/plugins/kolab_files/skins/larry/templates/compose_plugin.html +index 4e249edd..a823a2a1 100644 +--- a/plugins/kolab_files/skins/larry/templates/compose_plugin.html ++++ b/plugins/kolab_files/skins/larry/templates/compose_plugin.html +@@ -3,9 +3,9 @@ + <div id="quicksearchbar" class="searchbox" role="search" aria-labelledby="aria-label-searchform"> + <h3 id="aria-label-searchform" class="voice"><roundcube:label name="kolab_files.arialabelsearchform" /></h3> + <label for="quicksearchbox" class="voice"><roundcube:label name="arialabelquicksearchbox" /></label> +- <roundcube:button name="filesearchmenulink" id="filesearchmenulink" class="iconbutton searchoptions" onclick="return UI.toggle_popup('filesearchmenu', event)" title="searchmod" label="options" aria-haspopup="true" aria-expanded="false" aria-owns="filesearchmenu-menu" /> ++ <roundcube:button type="link" name="filesearchmenulink" id="filesearchmenulink" class="iconbutton searchoptions" onclick="return UI.toggle_popup('filesearchmenu', event)" title="searchmod" label="options" aria-haspopup="true" aria-expanded="false" aria-owns="filesearchmenu-menu" /> + <roundcube:object name="file-search-form" id="filesearchbox" /> +- <roundcube:button command="files-search-reset" id="searchreset" class="iconbutton reset" title="resetsearch" content=" " /> ++ <roundcube:button type="link" command="files-search-reset" id="searchreset" class="iconbutton reset" title="resetsearch" content=" " /> + </div> + + <div id="folderlistbox" class="uibox listbox" role="navigation" aria-labelledby="aria-label-folderlist"> +@@ -20,7 +20,7 @@ + <label for="foldersearch" class="voice"><roundcube:label name="arialabelsearchterms" /></label> + <input type="text" name="q" id="foldersearch" placeholder="<roundcube:label name='findfolders' />" /> + <a class="iconbutton searchicon"></a> +- <roundcube:button command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + </div> + <div id="files-folder-list" class="scroller"></div> +diff --git a/plugins/kolab_files/skins/larry/templates/files.html b/plugins/kolab_files/skins/larry/templates/files.html +index db5a222c..05772770 100644 +--- a/plugins/kolab_files/skins/larry/templates/files.html ++++ b/plugins/kolab_files/skins/larry/templates/files.html +@@ -29,9 +29,9 @@ + <div id="quicksearchbar" class="quicksearchbox" role="search" aria-labelledby="aria-label-searchform"> + <h2 id="aria-label-searchform" class="voice"><roundcube:label name="kolab_files.arialabelsearchform" /></h2> + <label for="quicksearchbox" class="voice"><roundcube:label name="arialabelquicksearchbox" /></label> +- <roundcube:button name="filesearchmenulink" id="filesearchmenulink" class="iconbutton searchoptions" onclick="UI.toggle_popup('filesearchmenu', event); return false" title="searchmod" label="options" aria-haspopup="true" aria-expanded="false" aria-owns="filesearchmenu-menu" /> ++ <roundcube:button type="link" name="filesearchmenulink" id="filesearchmenulink" class="iconbutton searchoptions" onclick="UI.toggle_popup('filesearchmenu', event); return false" title="searchmod" label="options" aria-haspopup="true" aria-expanded="false" aria-owns="filesearchmenu-menu" /> + <roundcube:object name="file-search-form" id="quicksearchbox" /> +- <roundcube:button command="files-search-reset" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="files-search-reset" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + + <div id="folderlistbox" class="uibox listbox" role="navigation" aria-labelledby="aria-label-folderlist"> +@@ -46,7 +46,7 @@ + <label for="foldersearch" class="voice"><roundcube:label name="arialabelsearchterms" /></label> + <input type="text" name="q" id="foldersearch" placeholder="<roundcube:label name='findfolders' />" /> + <a class="iconbutton searchicon"></a> +- <roundcube:button command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + </div> + <div id="files-folder-list" class="scroller withfooter"></div> +@@ -75,12 +75,12 @@ + <div id="folderoptions" class="popupmenu" data-editable="true" aria-hidden="true"> + <h3 id="aria-label-folderoptions" class="voice"><roundcube:label name="kolab_files.folderoptions" /></h3> + <ul id="folderoptionsmenu" class="toolbarmenu" role="menu" aria-labelledby="aria-label-folderoptions"> +- <li role="menuitem"><roundcube:button command="folder-rename" label="rename" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="files-folder-delete" label="delete" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="folder-rename" label="rename" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="files-folder-delete" label="delete" classAct="active" /></li> + <roundcube:if condition="!empty(env:external_sources)" /> +- <li role="menuitem"><roundcube:button command="folder-mount" label="kolab_files.foldermount" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="folder-mount" label="kolab_files.foldermount" classAct="active" /></li> + <roundcube:endif /> +- <li role="menuitem"><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="folders" task="settings" label="managefolders" classAct="active" /></li>
View file
0007-Update-calendar-and-tasklist-styles-sprites-to-new-L.patch
Added
@@ -0,0 +1,962 @@ +From d91bfd77a71512611b0c7d44d1840348737e518e Mon Sep 17 00:00:00 2001 +From: Thomas Bruederli <thomas@roundcube.net> +Date: Wed, 12 Jul 2017 15:00:24 +0200 +Subject: [PATCH 7/8] Update calendar and tasklist styles/sprites to new Larry + "flat" design + +Summary: With Roundcube version 1.3, the default Larry theme receives a small face-list. This change adapts the styles of the calendar and tasklist plugins to tat. + +Reviewers: machniak + +Differential Revision: https://git.kolab.org/D423 +--- + plugins/calendar/skins/larry/calendar.css | 122 ++++++--------------- + plugins/calendar/skins/larry/images/calendars.png | Bin 2582 -> 2350 bytes + .../calendar/skins/larry/images/sendinvitation.png | Bin 337 -> 204 bytes + plugins/calendar/skins/larry/images/toolbar.png | Bin 3662 -> 1112 bytes + plugins/tasklist/skins/larry/images/buttons.png | Bin 4645 -> 1096 bytes + .../tasklist/skins/larry/images/sendinvitation.png | Bin 337 -> 204 bytes + plugins/tasklist/skins/larry/images/sprites.png | Bin 5961 -> 3799 bytes + plugins/tasklist/skins/larry/tasklist.css | 56 +++------- + 8 files changed, 48 insertions(+), 130 deletions(-) + +diff --git a/plugins/calendar/skins/larry/calendar.css b/plugins/calendar/skins/larry/calendar.css +index c8f36b14..3db114ab 100644 +--- a/plugins/calendar/skins/larry/calendar.css ++++ b/plugins/calendar/skins/larry/calendar.css +@@ -69,31 +69,18 @@ body.calendarmain #mainscreen { + #datepicker .ui-datepicker-activerange a { + color: #185d7a; + background: #d9f1fb; +- background: -moz-linear-gradient(top, #d9f1fb 0%, #c5e3ee 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#d9f1fb), color-stop(100%,#c5e3ee)); +- background: -o-linear-gradient(top, #d9f1fb 0%, #c5e3ee 100%); +- background: -ms-linear-gradient(top, #d9f1fb 0%, #c5e3ee 100%); +- background: linear-gradient(top, #d9f1fb 0%, #c5e3ee 100%); +- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d9f1fb', endColorstr='#c5e3ee', GradientType=0); + } + + #datepicker .ui-datepicker-days-cell-over a.ui-state-default { + color: #fff; + border-color: #2fa0c0; + background: rgba(73,180,210,0.6); +- text-shadow: 0px 1px 1px #666; + filter: none; + } + + #datepicker .ui-datepicker-activerange a.ui-state-active { + color: #fff; + background: #00acd4; +- background: -moz-linear-gradient(top, #00acd4 0%, #008fc7 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#00acd4), color-stop(100%,#008fc7)); +- background: -o-linear-gradient(top, #00acd4 0%, #008fc7 100%); +- background: -ms-linear-gradient(top, #00acd4 0%, #008fc7 100%); +- background: linear-gradient(top, #00acd4 0%, #008fc7 100%); +- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00acd4', endColorstr='#008fc7', GradientType=0); + } + + #datepicker td.ui-datepicker-week-col { +@@ -253,17 +240,14 @@ pre { + #calendars .treelist li span.handle { + display: inline-block; + position: absolute; +- top: 8px; ++ top: 7px; + right: 6px; + padding: 0; +- width: 10px; +- height: 10px; +- border-radius: 7px; ++ width: 11px; ++ height: 11px; ++ border-radius: 8px; + font-size: 0.8em; +- border: 1px solid rgba(0, 0, 0, 0.5); +- -webkit-box-shadow: inset 0px 0 1px 1px rgba(0, 0, 0, 0.3); +- -moz-box-shadow: inset 0px 0 1px 1px rgba(0, 0, 0, 0.3); +- box-shadow: inset 0px 0 1px 1px rgba(0, 0, 0, 0.3); ++ border: 1px solid rgba(0, 0, 0, 0.4); + } + + #calendars .treelist div span.actions { +@@ -281,15 +265,9 @@ pre { + #calendars .treelist div:hover span.actions { + top: 1px; + right: 21px; +- border: 1px solid #c6c6c6; ++ border: 1px solid #ababab; + border-radius: 4px; +- background: #f7f7f7; +- background: -moz-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f9f9f9), color-stop(100%,#e6e6e6)); +- background: -o-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- background: -ms-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- background: linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#e6e6e6', GradientType=0); ++ background: #f1f1f1; + } + + #calendars .treelist li a.subscribed { +@@ -431,13 +409,6 @@ pre { + min-width: 1.3em; + padding: 2px 4px; + background: #005d76; +- background: -moz-linear-gradient(top, #005d76 0%, #004558 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#005d76), color-stop(100%,#004558)); +- background: -o-linear-gradient(top, #005d76 0%, #004558 100%); +- background: -ms-linear-gradient(top, #005d76 0%, #004558 100%); +- background: linear-gradient(to bottom, #005d76 0%, #004558 100%); +- -webkit-box-shadow: inset 0 1px 1px 0 #002635; +- box-shadow: inset 0 1px 1px 0 #002635; + border-radius: 10px; + color: #fff; + text-align: center; +@@ -545,6 +516,10 @@ body.calendarmain #searchmenulink { + display: none; + } + ++#calendarform { ++ overflow: visible; ++} ++ + #user { + position: absolute; + top: 10px; +@@ -627,7 +602,6 @@ a.miniColors-trigger { + color: #333; + font-weight: bold; + padding: 4px 4px 3px 30px; +- text-shadow: 0px 1px 1px #fff; + text-decoration: none; + white-space: nowrap; + line-height: 20px; +@@ -735,11 +709,6 @@ a.miniColors-trigger { + font-size: 11px; + font-weight: bold; + background: #d6eaf3; +- background: -moz-linear-gradient(left, #e3f2f6 0, #d6eaf3 14px, #d6eaf3 100%); +- background: -webkit-gradient(linear, left top, right top, color-stop(0,#e3f2f6), color-stop(8%,#d6eaf3), color-stop(100%,#d6eaf3)); +- background: -o-linear-gradient(left, #e3f2f6 0, #d6eaf3 14px, #d6eaf3 100%); +- background: -ms-linear-gradient(left, #e3f2f6 0, #d6eaf3 14px ,#d6eaf3 100%); +- background: linear-gradient(left, #e3f2f6 0, #d6eaf3 14px, #d6eaf3 100%); + border: 0; + border-bottom: 1px solid #ccc; + height: 18px; +@@ -1568,12 +1537,7 @@ a.dropdown-link:after { + border-top-color: #ddd; + border-bottom-color: #bbb; + border-radius: 0 0 4px 4px; +- background: #ebebeb; +- background: -moz-linear-gradient(top, #ebebeb 0%, #c6c6c6 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ebebeb), color-stop(100%,#c6c6c6)); +- background: -o-linear-gradient(top, #ebebeb 0%, #c6c6c6 100%); +- background: -ms-linear-gradient(top, #ebebeb 0%, #c6c6c6 100%); +- background: linear-gradient(top, #ebebeb 0%, #c6c6c6 100%); ++ background: #eaeaea; + } + + #agendaoptions label { +@@ -1717,10 +1681,6 @@ a.dropdown-link:after { + overflow: hidden; + border: 0; + border-radius: 4px; +- box-shadow: 0 0 2px #999; +- -o-box-shadow: 0 0 2px #999; +- -webkit-box-shadow: 0 0 2px #999; +- -moz-box-shadow: 0 0 2px #999; + } + + .calendarmain .fc-content { +@@ -1752,39 +1712,23 @@ a.dropdown-link:after { + .calendarmain .fc-button.fc-state-default, + .calendarmain .fc-button.fc-state-hover { + background-color: #f5f5f5; +- background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); +- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); +- background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); +- background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); +- background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); +- background-position: 0 0; + } + + .calendarmain #calendar .fc-button, + .calendarmain #calendar .fc-button.fc-state-default, + .calendarmain #calendar .fc-button.fc-state-hover { +- margin: 0 0 0 0; +- height: 20px; +- line-height: 20px; +- color: #505050; +- text-shadow: 0px 1px 1px #fff; +- border: 1px solid #e6e6e6; +- background: #d8d8d8; +- background: -moz-linear-gradient(top, #d8d8d8 0%, #bababa 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#d8d8d8), color-stop(100%,#bababa)); +- background: -o-linear-gradient(top, #d8d8d8 0%, #bababa 100%); +- background: -ms-linear-gradient(top, #d8d8d8 0%, #bababa 100%); +- background: linear-gradient(top, #d8d8d8 0%, #bababa 100%); +- box-shadow: 0 1px 1px 0 #999; +- -o-box-shadow: 0 1px 1px 0 #999; +- -webkit-box-shadow: 0 1px 1px 0 #999;
View file
0008-T2561-Fix-recognizing-event-organizer-on-event-move-.patch
Added
@@ -0,0 +1,59 @@ +From 40e0fa9155b5f971b802f57e32abbac18c9e45aa Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Tue, 18 Jul 2017 14:04:18 +0000 +Subject: [PATCH 8/8] T2561: Fix recognizing event organizer on event + move/delete + +--- + plugins/calendar/calendar_ui.js | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js +index 7da1f594..7aaf98b6 100644 +--- a/plugins/calendar/calendar_ui.js ++++ b/plugins/calendar/calendar_ui.js +@@ -2511,13 +2511,15 @@ function rcube_calendar_ui(settings) + + if (!data) data = event; + var decline = false, notify = false, html = '', cal = me.calendars[event.calendar], +- _has_attendees = me.has_attendees(event), _is_organizer = me.is_organizer(event); ++ _has_attendees = me.has_attendees(event), ++ _is_attendee = _has_attendees && me.is_attendee(event), ++ _is_organizer = me.is_organizer(event); + + // event has attendees, ask whether to notify them + if (_has_attendees) { + var checked = (settings.itip_notify & 1 ? ' checked="checked"' : ''); + +- if (action == 'remove' && cal.group != 'shared' && !_is_organizer && me.is_attendee(event)) { ++ if (action == 'remove' && cal.group != 'shared' && !_is_organizer && _is_attendee) { + decline = true; + checked = event.status != 'CANCELLED' ? checked : ''; + html += '<div class="message">' + +@@ -2525,12 +2527,12 @@ function rcube_calendar_ui(settings) + rcmail.gettext('itipdeclineevent', 'calendar') + + '</label></div>'; + } +- else { ++ else if (_is_organizer) { + notify = true; + if (settings.itip_notify & 2) { + html += '<div class="message">' + + '<label><input class="confirm-attendees-donotify" type="checkbox"' + checked + ' value="1" name="notify" /> ' + +- rcmail.gettext((action == 'remove' ? 'sendcancellation' : 'sendnotifications'), 'calendar') + ++ rcmail.gettext((action == 'remove' ? 'sendcancellation' : 'sendnotifications'), 'calendar') + + '</label></div>'; + } + else { +@@ -2545,7 +2547,7 @@ function rcube_calendar_ui(settings) + + // disable the 'future' savemode if I'm an attendee + // reason: no calendaring system supports the thisandfuture range parameter in iTip REPLY +- if (action == 'remove' && _has_attendees && !_is_organizer && me.is_attendee(event)) { ++ if (action == 'remove' && !_is_organizer && _is_attendee) { + future_disabled = ' disabled'; + } + +-- +2.13.2 +
View file
debian.changelog
Changed
@@ -1,3 +1,9 @@ +roundcubemail-plugins-kolab (1:3.3.2-0~kolab2) unstable; urgency=low + + * Backport calendar fixes + + -- Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Tue, 18 Jul 2017 11:11:11 +0200 + roundcubemail-plugins-kolab (1:3.3.2-0~kolab1) unstable; urgency=low * Release version 3.3.2
View file
debian.series
Changed
@@ -1,1 +1,9 @@ roundcubemail-plugins-kolab-3.3-kolab-files-manticore-api.patch -p1 +0001-Move-more-common-methods-used-by-tasklist-and-calend.patch -p1 +0002-T2504-Fix-DTSTAMP-in-iTip-replies.patch -p1 +0003-Add-missing-status-tentative-label.patch -p1 +0004-T2531-Support-SCHEDULE-AGENT-in-iTip.patch -p1 +0005-Don-t-ignore-global-userlogins-sendmail-logging-in-p.patch -p1 +0006-Add-missing-type-link-for-template-buttons-for-compa.patch -p1 +0007-Update-calendar-and-tasklist-styles-sprites-to-new-L.patch -p1 +0008-T2561-Fix-recognizing-event-organizer-on-event-move-.patch -p1
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.2-0~kolab1 +Version: 1:3.3.2-0~kolab2 Maintainer: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Uploaders: Paul Klos <kolab@klos2day.nl> Standards-Version: 3.9.3
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
.