@@ -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