Skip to content

Commit

Permalink
fix: (CalDav) Delete invitation when deleting Calendars or Events
Browse files Browse the repository at this point in the history
Signed-off-by: SebastianKrupinski <krupinskis05@gmail.com>
  • Loading branch information
SebastianKrupinski committed Sep 8, 2024
1 parent 926bd29 commit dec06cc
Showing 1 changed file with 46 additions and 2 deletions.
48 changes: 46 additions & 2 deletions apps/dav/lib/CalDAV/CalDavBackend.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use DateTime;
use DateTimeImmutable;
use DateTimeInterface;
use OC\DB\QueryBuilder\Literal;
use OCA\DAV\AppInfo\Application;
use OCA\DAV\CalDAV\Sharing\Backend;
use OCA\DAV\Connector\Sabre\Principal;
Expand Down Expand Up @@ -177,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(
Expand Down Expand Up @@ -875,6 +878,8 @@ public function deleteCalendar($calendarId, bool $forceDeletePermanently = false
$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)))
Expand Down Expand Up @@ -1142,7 +1147,7 @@ public function getCalendarObject($calendarId, $objectUri, int $calendarType = s
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)))
Expand All @@ -1164,6 +1169,7 @@ private function rowToCalendarObject(array $row): array {
return [
'id' => $row['id'],
'uri' => $row['uri'],
'uid' => $row['uid'],
'lastmodified' => $row['lastmodified'],
'etag' => '"' . $row['etag'] . '"',
'calendarid' => $row['calendarid'],
Expand Down Expand Up @@ -1484,6 +1490,8 @@ public function deleteCalendarObject($calendarId, $objectUri, $calendarType = se

$this->purgeProperties($calendarId, $data['id']);

$this->purgeObjectInvitations($data['uid']);

if ($calendarType === self::CALENDAR_TYPE_CALENDAR) {
$calendarRow = $this->getCalendarById($calendarId);
$shares = $this->getShares($calendarId);
Expand Down Expand Up @@ -1680,7 +1688,7 @@ public function calendarQuery($calendarId, array $filters, $calendarType = self:
}
}
$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)))
Expand Down Expand Up @@ -3527,4 +3535,40 @@ private function rowToSubscription($row, array $subscription): array {
}
return $subscription;
}

/**
* delete all invitations from a given calendar
*
* @since 31.0.0
*
* @param int $calendarId
*/
protected function purgeCalendarInvitations(int $calendarId) {

Check notice

Code scanning / Psalm

MissingReturnType Note

Method OCA\DAV\CalDAV\CalDavBackend::purgeCalendarInvitations does not have a return type, expecting void
// select all calendar object uid's
$cmd1 = $this->db->getQueryBuilder();
$cmd1->select('uid')
->from($this->dbObjectsTable)
->where('calendarid = :cid');
// delete all links that match object uid's
$cmd2 = $this->db->getQueryBuilder();
$cmd2->delete($this->dbObjectInvitationsTable)
->where($cmd2->expr()->in('uid', new Literal($cmd1->getSQL())))
->setParameter('cid', $calendarId);

$cmd2->executeStatement();
}

/**
* delete all invitations from a given calendar event
*
* @since 31.0.0
*
* @param string $eventId UID of the event
*/
protected function purgeObjectInvitations(string $eventId) {

Check notice

Code scanning / Psalm

MissingReturnType Note

Method OCA\DAV\CalDAV\CalDavBackend::purgeObjectInvitations does not have a return type, expecting void
$query = $this->db->getQueryBuilder();
$query->delete($this->dbObjectInvitationsTable)
->where($query->expr()->eq('uid', $query->createNamedParameter($eventId)));
$query->executeStatement();
}
}

0 comments on commit dec06cc

Please sign in to comment.