diff -urN ../xcalendar.orig/program/Calendar.php ./program/Calendar.php --- ../xcalendar.orig/program/Calendar.php 2021-01-11 09:50:29.000000000 +0200 +++ ./program/Calendar.php 2021-03-24 18:28:49.408657000 +0200 @@ -66,7 +66,7 @@ $array = $this->db->all($query, $param); - if (empty($array)) { + if (empty($array) and !$includeShared) { return array(); } @@ -104,6 +104,7 @@ */ public function getAddedSharedCalendars($enabledOnly = false, $editEventsOnly = false) { +/* $shared = $this->db->all( "SELECT {xcalendar_calendars}.id, {xcalendar_calendars_shared}.name, {xcalendar_calendars_shared}.enabled, {xcalendar_calendars_shared}.bg_color, {xcalendar_calendars_shared}.tx_color, permissions, user_id, type, @@ -114,6 +115,17 @@ ($enabledOnly ? " AND {xcalendar_calendars_shared}.enabled = 1" : ""), $this->userEmail ); +*/ + $shared = $this->db->all( + "SELECT DISTINCT {xcalendar_calendars}.id, {xcalendar_calendars_shared}.name, {xcalendar_calendars_shared}.enabled, + {xcalendar_calendars_shared}.bg_color, {xcalendar_calendars_shared}.tx_color, permissions, user_id, type, + default_event_visibility + FROM {xcalendar_calendars_shared} + LEFT JOIN {xcalendar_calendars} ON id = calendar_id + WHERE ({xcalendar_calendars_shared}.email = ? OR {xcalendar_calendars_shared}.email = ?) AND {xcalendar_calendars_shared}.added = 1". + ($enabledOnly ? " AND {xcalendar_calendars_shared}.enabled = 1" : ""), + array($this->userEmail, preg_replace('/^[^\@]+/', '*', $this->userEmail)) + ); if (is_array($shared)) { foreach ($shared as $key => $val) { @@ -207,12 +219,23 @@ // if shared calendar, include share-specific data: permissions, name and colors that are specific to this user if ($data['user_id'] != $this->userId) { +/* if (!($shared = $this->db->row( "xcalendar_calendars_shared", array("email" => $this->userEmail, "calendar_id" => $calendarId) ))) { return false; } +*/ + if ((!($shared = $this->db->row( + "xcalendar_calendars_shared", + array("email" => $this->userEmail, "calendar_id" => $calendarId) + ))) and (!($shared = $this->db->row( + "xcalendar_calendars_shared", + array("email" => preg_replace('/^[^\@]+/', '*', $this->userEmail), "calendar_id" => $calendarId) + )))) { + return false; + } $data['owner'] = false; $data['permissions'] = $this->permission->decodeCalendarPermissions($shared['permissions']); @@ -491,6 +514,7 @@ "email" => $share['email'], "calendar_id" => $calendarId, "permissions" => $savePermissions, + "added" => (preg_match('/^\s*\*\@/', $share['email']) ? 1 : 0), "add_code" => $share['add_code'] ? $share['add_code'] : "", "name" => $data['name'] . " " . $this->rcmail->gettext("xcalendar.shared_marker"), "description" => $data['description'] ? $data['description'] : "", @@ -510,6 +534,7 @@ if (!empty($newShares)) { foreach ($shares as $share) { if (!empty($share['notify'])) { + if (!preg_match('/^\*\@/', $share['email'])) $this->sendSharedEmailNotification($share, $data['name']); } } @@ -657,6 +682,7 @@ */ public function getSharedCalendarList() { +/* $data = $this->db->all( "SELECT calendar_id, {xcalendar_calendars}.name AS calendar_name, username, {xcalendar_calendars_shared}.created_at, added ". "FROM {xcalendar_calendars_shared} " . @@ -665,6 +691,15 @@ "WHERE {xcalendar_calendars_shared}.email = ?", $this->userEmail ); +*/ + $data = $this->db->all( + "SELECT calendar_id, {xcalendar_calendars}.name AS calendar_name, username, {xcalendar_calendars_shared}.created_at, added ". + "FROM {xcalendar_calendars_shared} " . + "LEFT JOIN {xcalendar_calendars} ON calendar_id = id ". + "LEFT JOIN {users} ON {xcalendar_calendars}.user_id = {users}.user_id ". + "WHERE {xcalendar_calendars_shared}.email = ? OR {xcalendar_calendars_shared}.email = ?", + array($this->userEmail, preg_replace('/^[^\@]+/', '*', $this->userEmail)) + ); if (empty($data)) { $data = array(); @@ -690,6 +725,17 @@ array("added" => 1), array("email" => $this->userEmail, "calendar_id" => $calendarId) ); +/* + return ($this->db->update( + "xcalendar_calendars_shared", + array("added" => 1), + array("email" => $this->userEmail, "calendar_id" => $calendarId) + ) or $this->db->update( + "xcalendar_calendars_shared", + array("added" => 1), + array("email" => preg_replace('/^[^\@]+/', '*', $this->userEmail), "calendar_id" => $calendarId) + )); +*/ } public function addSharedCalendarByCode($code) diff -urN ../xcalendar.orig/program/Event.php ./program/Event.php --- ../xcalendar.orig/program/Event.php 2020-11-16 14:00:40.000000000 +0200 +++ ./program/Event.php 2021-03-21 22:51:04.183270000 +0200 @@ -307,10 +307,28 @@ array($eventId, $this->userId) )) { $data['calendar'] = false; +/* } else if ($shared = $this->db->row( // if shared calendar, update data and display it, don't return "xcalendar_calendars_shared", array("email" => $this->userEmail, "calendar_id" => $data['calendar_id']) )) { + // set the customized calendar name + $data['calendar'] = $shared['name']; + + $permissions = json_decode($shared['permissions']); + + if (empty($permissions) || (isset($permissions->see_details) && !$permissions->see_details)) { + $data['title'] = "[" . $this->rcmail->gettext("xcalendar." . ($data['busy'] ? "busy" : "available")) . "]"; + unset($data['location'], $data['description'], $data['url']); + } +*/ + } else if (($shared = $this->db->row( // if shared calendar, update data and display it, don't return + "xcalendar_calendars_shared", + array("email" => $this->userEmail, "calendar_id" => $data['calendar_id']) + )) or ($shared = $this->db->row( // if shared calendar, update data and display it, don't return + "xcalendar_calendars_shared", + array("email" => preg_replace('/^[^\@]+/', '*', $this->userEmail), "calendar_id" => $data['calendar_id']) + ))) { // set the customized calendar name $data['calendar'] = $shared['name']; diff -urN ../xcalendar.orig/program/Permission.php ./program/Permission.php --- ../xcalendar.orig/program/Permission.php 2018-07-25 11:57:55.000000000 +0300 +++ ./program/Permission.php 2021-03-21 22:50:51.768489000 +0200 @@ -78,6 +78,13 @@ array("email" => $userEmail, "calendar_id" => $calendarId) ); + if (!$permissions) + $permissions = $this->db->value( + "permissions", + "xcalendar_calendars_shared", + array("email" => preg_replace('/^[^\@]+/', '*', $userEmail), "calendar_id" => $calendarId) + ); + return $permissions ? $this->decodeCalendarPermissions($permissions) : $this->getDefaultCalendarPermissions(); }