diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index 5c45518e..e3d152aa 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -265,7 +265,7 @@ class calendar extends rcube_plugin $default_id = $this->rc->config->get('calendar_default_calendar'); $calendars = $this->driver->list_calendars(calendar_driver::FILTER_PERSONAL); $calendar = $calendars[$default_id] ?: null; - if (!$calendar || $confidential || ($writeable && !$calendar['writeable'])) { + if (!$calendar || $confidential || ($writeable && !$calendar['editable'])) { foreach ($calendars as $cal) { if ($confidential && $cal['subtype'] == 'confidential') { $calendar = $cal; @@ -276,7 +276,7 @@ class calendar extends rcube_plugin if (!$confidential) break; } - if (!$writeable || $cal['writeable']) { + if (!$writeable || $cal['editable']) { $first = $cal; } } @@ -2459,7 +2459,7 @@ class calendar extends rcube_plugin $calendar_select->add('--', ''); $numcals = 0; foreach ($calendars as $calendar) { - if ($calendar['writeable']) { + if ($calendar['editable']) { $calendar_select->add($calendar['name'], $calendar['id']); $numcals++; } @@ -2840,7 +2840,7 @@ class calendar extends rcube_plugin } // save to calendar - if ($calendar && $calendar['writeable']) { + if ($calendar && $calendar['editable']) { // check for existing event with the same UID $existing = $this->driver->get_event($event, calendar_driver::FILTER_WRITEABLE | calendar_driver::FILTER_PERSONAL); @@ -3107,7 +3107,7 @@ class calendar extends rcube_plugin foreach ($events as $event) { // save to calendar $calendar = $calendars[$cal_id] ?: $this->get_default_calendar(true, $event['sensitivity'] == 'confidential'); - if ($calendar && $calendar['writeable'] && $event['_type'] == 'event') { + if ($calendar && $calendar['editable'] && $event['_type'] == 'event') { $event['calendar'] = $calendar['id']; if (!$this->driver->get_event($event['uid'], calendar_driver::FILTER_WRITEABLE)) { diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index f3f41ddc..6414f4ff 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -63,7 +63,7 @@ function rcube_calendar_ui(settings) var resources_data = {}; var resources_index = []; var resource_owners = {}; - var resources_events_source = { url:null, editable:false, insertable:false }; + var resources_events_source = { url:null, editable:false }; var freebusy_ui = { workinhoursonly:false, needsupdate:false }; var freebusy_data = {}; var current_view = null; @@ -309,6 +309,26 @@ function rcube_calendar_ui(settings) 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) { var query = { _id: att.id, _event: event.recurrence_id || event.id, _cal:event.calendar, _frame: 1 }; @@ -392,7 +412,7 @@ function rcube_calendar_ui(settings) var event_show_dialog = function(event, ev, temp) { var $dialog = $("#eventshow"); - var calendar = event.calendar && me.calendars[event.calendar] ? me.calendars[event.calendar] : { editable:false, insertable:false }; + var calendar = event.calendar && me.calendars[event.calendar] ? me.calendars[event.calendar] : { editable:false, rights:'lrs' }; if (!temp) me.selected_event = event; @@ -545,7 +565,7 @@ function rcube_calendar_ui(settings) .html(Q(rcmail.gettext('itip' + mystatus, 'libcalendaring'))); } - var show_rsvp = rsvp && !is_organizer(event) && event.status != 'CANCELLED'; + var show_rsvp = rsvp && !is_organizer(event) && event.status != 'CANCELLED' && 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); @@ -572,6 +592,8 @@ function rcube_calendar_ui(settings) event_edit_dialog('edit', event); } }); + } + if (!temp && has_permission(calendar, 'td') && event.editable !== false) { buttons.push({ text: rcmail.gettext('delete', 'calendar'), 'class': 'delete', @@ -581,7 +603,8 @@ function rcube_calendar_ui(settings) } }); } - else { + + if (!buttons.length) { buttons.push({ text: rcmail.gettext('close', 'calendar'), click: function(){ @@ -687,7 +710,7 @@ function rcube_calendar_ui(settings) $("#eventshow:ui-dialog").data('opener', null).dialog('close'); var $dialog = $('
'); - var calendar = event.calendar && me.calendars[event.calendar] ? me.calendars[event.calendar] : { insertable:action=='new' }; + var calendar = event.calendar && me.calendars[event.calendar] ? me.calendars[event.calendar] : { editable:true, rights: action=='new' ? 'lrwitd' : 'lrs' }; me.selected_event = $.extend($.extend({}, event_defaults), event); // clone event object (with defaults) event = me.selected_event; // change reference to clone freebusy_ui.needsupdate = false; @@ -737,7 +760,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' && cal.insertable))) + $(opt).prop('disabled', !(cal.editable || (action == 'new' && has_permission(cal, 'i')))) }); // set alarm(s) @@ -3559,8 +3582,6 @@ function rcube_calendar_ui(settings) me.calendars[id] = $.extend({ url: rcmail.url('calendar/load_events', { source: id }), - editable: cal.writeable || false, - insertable: cal.insert || false, className: 'fc-event-cal-'+id, id: id }, cal); @@ -3590,7 +3611,7 @@ function rcube_calendar_ui(settings) // insert to #calendar-select options if writeable select = $('#edit-calendar'); - if (fc && (cal.writeable || cal.insert) && select.length && !select.find('option[value="'+id+'"]').length) { + if (fc && has_permission(cal, 'i') && select.length && !select.find('option[value="'+id+'"]').length) { $('