Skip to content

Commit 4ad3f07

Browse files
committed
getCalendarObjectByUID(): prefer objects in shared writable calendars over private objects.
Signed-off-by: Claus-Justus Heine <himself@claus-justus-heine.de>
1 parent 1ab8e3a commit 4ad3f07

1 file changed

Lines changed: 12 additions & 6 deletions

File tree

apps/dav/lib/CalDAV/CalDavBackend.php

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2159,6 +2159,7 @@ public function getCalendarObjectByUID($principalUri, $uid) {
21592159
->selectAlias('c.uri', 'calendaruri')
21602160
->selectAlias('co.uri', 'objecturi')
21612161
->selectAlias('ds.access', 'access')
2162+
->selectAlias('ds.principaluri', 'shareprincipal')
21622163
->from('calendarobjects', 'co')
21632164
->leftJoin('co', 'calendars', 'c', $query->expr()->eq('co.calendarid', 'c.id'))
21642165
->leftJoin('co', 'dav_shares', 'ds', $query->expr()->eq('co.calendarid', 'ds.resourceid'))
@@ -2176,24 +2177,29 @@ public function getCalendarObjectByUID($principalUri, $uid) {
21762177
->setParameter('type', 'calendar')
21772178
->setParameter('shareprincipal', $principals, \Doctrine\DBAL\Connection::PARAM_STR_ARRAY);
21782179
$stmt = $query->executeQuery();
2179-
$row = $stmt->fetch();
2180-
$stmt->closeCursor();
2181-
if ($row) {
2182-
if ($row['principaluri'] != $principalUri) {
2180+
$calendarObjectUri = null;
2181+
while ($row = $stmt->fetch()) {
2182+
if ($row['principaluri'] != $principalUri && !empty($row['shareprincipal']) && $row['access'] == Backend::ACCESS_READ_WRITE) {
21832183
/**
21842184
* This seeems to be a false positive: we have "use Sabre\Uri" and Uri\split() IS defined.
21852185
*
21862186
* @psalm-suppress UndefinedFunction
21872187
*/
21882188
[, $name] = Uri\split($row['principaluri']);
21892189
$calendarUri = $row['calendaruri'] . '_shared_by_' . $name;
2190+
} elseif (!empty($calendarObjectUri)) {
2191+
// There could be multiple entries for the UID if the share
2192+
// permissions have been changed "in between". In this case we
2193+
// prefer the shared calendar object.
2194+
continue;
21902195
} else {
21912196
$calendarUri = $row['calendaruri'];
21922197
}
2193-
return $calendarUri . '/' . $row['objecturi'];
2198+
$calendarObjectUri = $calendarUri . '/' . $row['objecturi'];
21942199
}
2200+
$stmt->closeCursor();
21952201

2196-
return null;
2202+
return $calendarObjectUri;
21972203
}
21982204

21992205
public function getCalendarObjectById(string $principalUri, int $id): ?array {

0 commit comments

Comments
 (0)