From 5c6a7a2d6f21a55f3b32aca096ff3af5fa9efe79 Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Tue, 11 Oct 2022 15:27:59 +0200 Subject: [PATCH] CalDAV driver --- plugins/calendar/calendar_ui.js | 5 +- plugins/calendar/config.inc.php.dist | 2 +- .../drivers/caldav/caldav_calendar.php | 10 +- .../calendar/drivers/caldav/caldav_driver.php | 5 +- plugins/calendar/lib/calendar_ui.php | 20 +-- .../skins/elastic/templates/calendar.html | 2 + .../kolab_addressbook/kolab_addressbook.php | 5 +- plugins/libkolab/SQL/mysql.initial.sql | 23 ++++ plugins/libkolab/SQL/mysql/2022100500.sql | 39 ++++++ plugins/libkolab/lib/kolab_dav_client.php | 70 +++++++++-- plugins/libkolab/lib/kolab_storage.php | 2 +- plugins/libkolab/lib/kolab_storage_dav.php | 10 +- .../libkolab/lib/kolab_storage_dav_cache.php | 20 ++- .../lib/kolab_storage_dav_cache_contact.php | 116 ++++++++++++++++++ .../lib/kolab_storage_dav_cache_event.php | 82 ++++++++++++- .../libkolab/lib/kolab_storage_dav_folder.php | 18 ++- 16 files changed, 377 insertions(+), 52 deletions(-) create mode 100644 plugins/libkolab/SQL/mysql/2022100500.sql create mode 100644 plugins/libkolab/lib/kolab_storage_dav_cache_contact.php diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 7e2f25c5..04d66b14 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -3658,9 +3658,10 @@ function rcube_calendar_ui(settings) }); // register dbl-click handler to open calendar edit dialog - $(rcmail.gui_objects.calendarslist).on('dblclick', ':not(.virtual) > .calname', function(e){ + $(rcmail.gui_objects.calendarslist).on('dblclick', ':not(.virtual) > .calname', function(e) { var id = $(this).closest('li').attr('id').replace(/^rcmlical/, ''); - me.calendar_edit_dialog(me.calendars[id]); + if (me.calendars[id] && me.calendars[id].driver != 'caldav') + me.calendar_edit_dialog(me.calendars[id]); }); // Make Elastic checkboxes pretty diff --git a/plugins/calendar/config.inc.php.dist b/plugins/calendar/config.inc.php.dist index 5ebb5ec0..14ba761c 100644 --- a/plugins/calendar/config.inc.php.dist +++ b/plugins/calendar/config.inc.php.dist @@ -25,7 +25,7 @@ +-------------------------------------------------------------------------+ */ -// backend type (database, kolab) +// backend type (database, kolab, caldav) $config['calendar_driver'] = "database"; // default calendar view (agendaDay, agendaWeek, month) diff --git a/plugins/calendar/drivers/caldav/caldav_calendar.php b/plugins/calendar/drivers/caldav/caldav_calendar.php index b4e11b2e..89452def 100644 --- a/plugins/calendar/drivers/caldav/caldav_calendar.php +++ b/plugins/calendar/drivers/caldav/caldav_calendar.php @@ -158,7 +158,7 @@ class caldav_calendar extends kolab_storage_dav_folder // directly access storage object if (empty($this->events[$id]) && $master_id == $id && ($record = $this->storage->get_object($id))) { - $this->events[$id] = $this->_to_driver_event($record, true); + $this->events[$id] = $record = $this->_to_driver_event($record, true); } // maybe a recurring instance is requested @@ -166,10 +166,10 @@ class caldav_calendar extends kolab_storage_dav_folder $instance_id = substr($id, strlen($master_id) + 1); if ($record = $this->storage->get_object($master_id)) { - $master = $this->_to_driver_event($record); + $master = $record = $this->_to_driver_event($record); } - if ($master) { + if (!empty($master)) { // check for match in top-level exceptions (aka loose single occurrences) if (!empty($master['_formatobj']) && ($instance = $master['_formatobj']->get_instance($instance_id))) { $this->events[$id] = $this->_to_driver_event($instance, false, true, $master); @@ -695,7 +695,7 @@ class caldav_calendar extends kolab_storage_dav_folder if ($exception) { // copy data from exception - colab_driver::merge_exception_data($rec_event, $exception); + caldav_driver::merge_exception_data($rec_event, $exception); } $rec_event['id'] = $rec_id; @@ -776,7 +776,7 @@ class caldav_calendar extends kolab_storage_dav_folder // TODO: Drop dependency on libkolabxml? $event_xml = new kolab_format_event(); $event_xml->set($record); - $event['_formatobj'] = $event_xml; + $record['_formatobj'] = $event_xml; return $record; } diff --git a/plugins/calendar/drivers/caldav/caldav_driver.php b/plugins/calendar/drivers/caldav/caldav_driver.php index 9e38cc87..6e40c5c9 100644 --- a/plugins/calendar/drivers/caldav/caldav_driver.php +++ b/plugins/calendar/drivers/caldav/caldav_driver.php @@ -184,6 +184,9 @@ class caldav_driver extends kolab_driver 'active' => $cal->is_active(), 'owner' => $cal->get_owner(), 'removable' => !$cal->default, + // extras to hide some elements in the UI + 'subscriptions' => false, + 'driver' => 'caldav', ]; if (!$is_user) { @@ -274,7 +277,7 @@ class caldav_driver extends kolab_driver { $this->_read_calendars(); - // create calendar object if necesary + // create calendar object if necessary if (empty($this->calendars[$id])) { if (in_array($id, [self::INVITATIONS_CALENDAR_PENDING, self::INVITATIONS_CALENDAR_DECLINED])) { return new caldav_invitation_calendar($id, $this->cal); diff --git a/plugins/calendar/lib/calendar_ui.php b/plugins/calendar/lib/calendar_ui.php index 25c4cf65..1d4daef2 100644 --- a/plugins/calendar/lib/calendar_ui.php +++ b/plugins/calendar/lib/calendar_ui.php @@ -381,15 +381,17 @@ class calendar_ui ); } - $content .= html::tag('input', [ - 'type' => 'checkbox', - 'name' => '_cal[]', - 'value' => $id, - 'checked' => !empty($prop['active']), - 'aria-labelledby' => $label_id - ]) - . html::span('actions', $actions) - . html::span(['class' => 'handle', 'style' => "background-color: #$color"], ' '); + if (!isset($prop['subscriptions']) || $prop['subscriptions'] !== false) { + $content .= html::tag('input', [ + 'type' => 'checkbox', + 'name' => '_cal[]', + 'value' => $id, + 'checked' => !empty($prop['active']), + 'aria-labelledby' => $label_id + ]) + . html::span('actions', $actions) + . html::span(['class' => 'handle', 'style' => "background-color: #$color"], ' '); + } } $content = html::div(join(' ', $classes), $content); diff --git a/plugins/calendar/skins/elastic/templates/calendar.html b/plugins/calendar/skins/elastic/templates/calendar.html index 06aad50b..3331a521 100644 --- a/plugins/calendar/skins/elastic/templates/calendar.html +++ b/plugins/calendar/skins/elastic/templates/calendar.html @@ -141,9 +141,11 @@