From 9295620e18b81e9a9e8a572d975e0d25211597a8 Mon Sep 17 00:00:00 2001 From: Mateusz Kijowski <406403+matikij@users.noreply.github.com> Date: Mon, 8 Apr 2024 04:13:24 +0200 Subject: [PATCH 1/6] INSERT INTO system instead of REPLACE INTO system in mysql.initial.sql files --- drivers/caldav/SQL/mysql.initial.sql | 3 ++- drivers/database/SQL/mysql.initial.sql | 2 +- drivers/kolab/SQL/mysql.initial.sql | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/caldav/SQL/mysql.initial.sql b/drivers/caldav/SQL/mysql.initial.sql index 92004b2..d460ef9 100644 --- a/drivers/caldav/SQL/mysql.initial.sql +++ b/drivers/caldav/SQL/mysql.initial.sql @@ -107,4 +107,5 @@ CREATE TABLE IF NOT EXISTS `caldav_attachments` ( CONSTRAINT `fk_caldav_attachments_event_id` FOREIGN KEY (`event_id`) REFERENCES `caldav_events`(`event_id`) ON DELETE CASCADE ON UPDATE CASCADE ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; -REPLACE INTO `system` (`name`, `value`) VALUES ('calendar-caldav-version', '2021082400'); \ No newline at end of file + +INSERT INTO `system` (`name`, `value`) VALUES ('calendar-caldav-version', '2021082400'); diff --git a/drivers/database/SQL/mysql.initial.sql b/drivers/database/SQL/mysql.initial.sql index 5f6dd60..e2248f2 100644 --- a/drivers/database/SQL/mysql.initial.sql +++ b/drivers/database/SQL/mysql.initial.sql @@ -82,4 +82,4 @@ CREATE TABLE IF NOT EXISTS `itipinvitations` ( REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; -REPLACE INTO system (name, value) VALUES ('calendar-database-version', '2015022700'); +INSERT INTO system (name, value) VALUES ('calendar-database-version', '2015022700'); diff --git a/drivers/kolab/SQL/mysql.initial.sql b/drivers/kolab/SQL/mysql.initial.sql index f672fb7..3fca238 100644 --- a/drivers/kolab/SQL/mysql.initial.sql +++ b/drivers/kolab/SQL/mysql.initial.sql @@ -29,4 +29,4 @@ CREATE TABLE IF NOT EXISTS `itipinvitations` ( REFERENCES `users`(`user_id`) ON DELETE CASCADE ON UPDATE CASCADE ) /*!40000 ENGINE=INNODB */ /*!40101 CHARACTER SET utf8 COLLATE utf8_general_ci */; -REPLACE INTO system (name, value) VALUES ('calendar-kolab-version', '2014041700'); +INSERT INTO system (name, value) VALUES ('calendar-kolab-version', '2014041700'); From aaee300d0d86e1440375c8d7aee4680eca70850a Mon Sep 17 00:00:00 2001 From: Mateusz Kijowski <406403+matikij@users.noreply.github.com> Date: Mon, 8 Apr 2024 04:47:16 +0200 Subject: [PATCH 2/6] Allow configuring new calendar path --- config.inc.php.dist | 6 ++++++ drivers/caldav/caldav_driver.php | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/config.inc.php.dist b/config.inc.php.dist index 08d9611..b9b0a33 100644 --- a/config.inc.php.dist +++ b/config.inc.php.dist @@ -157,6 +157,12 @@ $config['kolab_invitation_calendars'] = false; // ) // ); +// Path used to create new calendars in a CalDav source. +// The following replacement variables are supported: +// %u - Source user name +// %i - Newly generated calendar UUID +// $config['calendar_caldav_new_calendar_path'] = '/calendars/%u/%i' + // Driver to provide a resource directory ('ldap' is the only implementation yet). // Leave empty or commented to disable resources support. // $config['calendar_resources_driver'] = 'ldap'; diff --git a/drivers/caldav/caldav_driver.php b/drivers/caldav/caldav_driver.php index 71a2162..fb21ae0 100644 --- a/drivers/caldav/caldav_driver.php +++ b/drivers/caldav/caldav_driver.php @@ -273,10 +273,10 @@ public function create_calendar($cal) $server_url = self::_encode_url($source['caldav_url']); $server_path = rtrim(parse_url($server_url, PHP_URL_PATH), '/'); - $calId = $this->cal->generate_uid(); - $path = "/calendars/$source[caldav_user]/$calId"; + $path = $this->_get_new_calendar_path($source); self::debug_log("Creating new calendar \"$cal[name]\" with path $path at: " . $server_url); + $client = new caldav_client($server_url, $source['caldav_user'], $source['caldav_pass']); if($client->create_calendar($server_path . $path, $cal['name'], isset($cal['color']) ? $cal['color'] : 'cc0000')) { @@ -2349,4 +2349,12 @@ private function _encrypt_pass($pass) { $p = $e->encrypt($pass); return base64_encode($p); } + + private function _get_new_calendar_path($source) { + $template = $this->rc->config->get('calendar_caldav_new_calendar_path', '/calendars/%u/%i'); + return strtr($template, [ + '%u' => $source['caldav_user'], + '%i' => $this->cal->generate_uid(), + ]); + } } From a247df970b3d001997ed8b4dcaff04d7e64e5a57 Mon Sep 17 00:00:00 2001 From: Mateusz Kijowski <406403+matikij@users.noreply.github.com> Date: Mon, 8 Apr 2024 04:48:02 +0200 Subject: [PATCH 3/6] Do not break if update doesn't have remote_event --- drivers/caldav/caldav_driver.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/caldav/caldav_driver.php b/drivers/caldav/caldav_driver.php index fb21ae0..99dc3b3 100644 --- a/drivers/caldav/caldav_driver.php +++ b/drivers/caldav/caldav_driver.php @@ -2230,6 +2230,12 @@ private function _perform_updates($updates) foreach($updates as $update) { + if(is_null($update['remote_event']) + { + self::debug_log("No remote_event in update: ".print_r($update, true)); + continue; + + } if($update['remote_event']['allday']) { //caldav has exclusive end dates set to midnight of the next day. From ac57589c1c803131e49ab5c9545c0c8d91d4ae18 Mon Sep 17 00:00:00 2001 From: Mateusz Kijowski <406403+matikij@users.noreply.github.com> Date: Mon, 8 Apr 2024 04:53:22 +0200 Subject: [PATCH 4/6] Syntax fixes --- config.inc.php.dist | 2 +- drivers/caldav/caldav_driver.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config.inc.php.dist b/config.inc.php.dist index b9b0a33..8c7f125 100644 --- a/config.inc.php.dist +++ b/config.inc.php.dist @@ -161,7 +161,7 @@ $config['kolab_invitation_calendars'] = false; // The following replacement variables are supported: // %u - Source user name // %i - Newly generated calendar UUID -// $config['calendar_caldav_new_calendar_path'] = '/calendars/%u/%i' +// $config['calendar_caldav_new_calendar_path'] = '/calendars/%u/%i'; // Driver to provide a resource directory ('ldap' is the only implementation yet). // Leave empty or commented to disable resources support. diff --git a/drivers/caldav/caldav_driver.php b/drivers/caldav/caldav_driver.php index 99dc3b3..b379adb 100644 --- a/drivers/caldav/caldav_driver.php +++ b/drivers/caldav/caldav_driver.php @@ -2230,7 +2230,7 @@ private function _perform_updates($updates) foreach($updates as $update) { - if(is_null($update['remote_event']) + if(is_null($update['remote_event'])) { self::debug_log("No remote_event in update: ".print_r($update, true)); continue; From d00cec57a84044e037af39abb62b1e94130cf73c Mon Sep 17 00:00:00 2001 From: Mateusz Kijowski <406403+matikij@users.noreply.github.com> Date: Mon, 8 Apr 2024 05:24:53 +0200 Subject: [PATCH 5/6] Fix adding preinstalled source over and over again --- drivers/caldav/caldav_driver.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/drivers/caldav/caldav_driver.php b/drivers/caldav/caldav_driver.php index b379adb..fbff90f 100644 --- a/drivers/caldav/caldav_driver.php +++ b/drivers/caldav/caldav_driver.php @@ -332,8 +332,6 @@ private function _add_calendars($calendars, $source) { */ public function create_source($source) { - $source['caldav_url'] = self::_encode_url($source['caldav_url']); - // Re-discover all existing calendars systematically try { $calendars = $this->_autodiscover_calendars($source); From f9458fac9729944bb45da4f78cbfb8c330748f16 Mon Sep 17 00:00:00 2001 From: Mateusz Kijowski <406403+matikij@users.noreply.github.com> Date: Mon, 8 Apr 2024 06:49:23 +0200 Subject: [PATCH 6/6] Fix problem when saving events having attendees --- drivers/caldav/caldav_driver.php | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/drivers/caldav/caldav_driver.php b/drivers/caldav/caldav_driver.php index fbff90f..9739e4c 100644 --- a/drivers/caldav/caldav_driver.php +++ b/drivers/caldav/caldav_driver.php @@ -529,14 +529,12 @@ public function new_event($event) if (!$event['calendar'] || !$this->calendars[$event['calendar']]) return false; - if($event = $this->_save_preprocess($event)) { - $sync_client = $this->sync_clients[$event["calendar"]]; + $sync_client = $this->sync_clients[$event["calendar"]]; - // Only push event if caldav_tag is not set to avoid pushing it twice - if (isset($event["caldav_tag"]) || ($event = $sync_client->create_event($event)) !== null) { - if ($event_id = $this->_insert_event($event)) { - $this->_update_recurring($event); - } + // Only push event if caldav_tag is not set to avoid pushing it twice + if (isset($event["caldav_tag"]) || ($event = $sync_client->create_event($event)) !== null) { + if ($event_id = $this->_insert_event($event)) { + $this->_update_recurring($event); } } @@ -551,7 +549,7 @@ public function new_event($event) */ private function _insert_event(&$event) { - //$event = $this->_save_preprocess($event); + $event = $this->_save_preprocess($event); //TODO: proper 4 byte character (eg emoticons) handling //utf8 in mysql only supports 3 byte characters, so this throws an error if there are emoticons in the description.