]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix: (CalDav) Delete invitation when deleting Calendars or Events fix/issue-12387-delete-invitations 47832/head
authorSebastianKrupinski <krupinskis05@gmail.com>
Sun, 8 Sep 2024 23:33:16 +0000 (19:33 -0400)
committerSebastianKrupinski <krupinskis05@gmail.com>
Thu, 21 Nov 2024 14:08:26 +0000 (09:08 -0500)
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>
apps/dav/lib/CalDAV/CalDavBackend.php

index c9d323d27df3136406fa83758d80b3f57736174d..6251c522f6c20582b8fd74a0f65292d0c6d3a91c 100644 (file)
@@ -178,7 +178,9 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
         */
        protected array $userDisplayNames;
 
+       private string $dbObjectsTable = 'calendarobjects';
        private string $dbObjectPropertiesTable = 'calendarobjects_props';
+       private string $dbObjectInvitationsTable = 'calendar_invitations';
        private array $cachedObjects = [];
 
        public function __construct(
@@ -876,6 +878,8 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
                                $calendarData = $this->getCalendarById($calendarId);
                                $shares = $this->getShares($calendarId);
 
+                               $this->purgeCalendarInvitations($calendarId);
+
                                $qbDeleteCalendarObjectProps = $this->db->getQueryBuilder();
                                $qbDeleteCalendarObjectProps->delete($this->dbObjectPropertiesTable)
                                        ->where($qbDeleteCalendarObjectProps->expr()->eq('calendarid', $qbDeleteCalendarObjectProps->createNamedParameter($calendarId)))
@@ -1143,7 +1147,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
                        return $this->cachedObjects[$key];
                }
                $query = $this->db->getQueryBuilder();
-               $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification', 'deleted_at'])
+               $query->select(['id', 'uri', 'uid', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification', 'deleted_at'])
                        ->from('calendarobjects')
                        ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)))
                        ->andWhere($query->expr()->eq('uri', $query->createNamedParameter($objectUri)))
@@ -1165,6 +1169,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
                return [
                        'id' => $row['id'],
                        'uri' => $row['uri'],
+                       'uid' => $row['uid'],
                        'lastmodified' => $row['lastmodified'],
                        'etag' => '"' . $row['etag'] . '"',
                        'calendarid' => $row['calendarid'],
@@ -1485,6 +1490,8 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
 
                                $this->purgeProperties($calendarId, $data['id']);
 
+                               $this->purgeObjectInvitations($data['uid']);
+
                                if ($calendarType === self::CALENDAR_TYPE_CALENDAR) {
                                        $calendarRow = $this->getCalendarById($calendarId);
                                        $shares = $this->getShares($calendarId);
@@ -1681,7 +1688,7 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
                        }
                }
                $query = $this->db->getQueryBuilder();
-               $query->select(['id', 'uri', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification', 'deleted_at'])
+               $query->select(['id', 'uri', 'uid', 'lastmodified', 'etag', 'calendarid', 'size', 'calendardata', 'componenttype', 'classification', 'deleted_at'])
                        ->from('calendarobjects')
                        ->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)))
                        ->andWhere($query->expr()->eq('calendartype', $query->createNamedParameter($calendarType)))
@@ -3542,4 +3549,46 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
                }
                return $subscription;
        }
+
+       /**
+        * delete all invitations from a given calendar
+        *
+        * @since 31.0.0
+        *
+        * @param int $calendarId
+        *
+        * @return void
+        */
+       protected function purgeCalendarInvitations(int $calendarId): void {
+               // select all calendar object uid's
+               $cmd = $this->db->getQueryBuilder();
+               $cmd->select('uid')
+                       ->from($this->dbObjectsTable)
+                       ->where($cmd->expr()->eq('calendarid', $cmd->createNamedParameter($calendarId)));
+               $allIds = $cmd->executeQuery()->fetchAll(\PDO::FETCH_COLUMN);
+               // delete all links that match object uid's
+               $cmd = $this->db->getQueryBuilder();
+               $cmd->delete($this->dbObjectInvitationsTable)
+                       ->where($cmd->expr()->in('uid', $cmd->createNamedParameter('uids'), IQueryBuilder::PARAM_STR_ARRAY));
+               foreach (array_chunk($allIds, 1000) as $chunckIds) {
+                       $cmd->setParameter('uids', $chunckIds, IQueryBuilder::PARAM_INT_ARRAY);
+                       $cmd->executeStatement();
+               }
+       }
+
+       /**
+        * Delete all invitations from a given calendar event
+        *
+        * @since 31.0.0
+        *
+        * @param string $eventId UID of the event
+        *
+        * @return void
+        */
+       protected function purgeObjectInvitations(string $eventId): void {
+               $cmd = $this->db->getQueryBuilder();
+               $cmd->delete($this->dbObjectInvitationsTable)
+                       ->where($cmd->expr()->eq('uid', $cmd->createNamedParameter($eventId)));
+               $cmd->executeStatement();
+       }
 }