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) {
$('