diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php index 46c2b94116217..8fc15fd8c0d54 100644 --- a/lib/private/Share20/DefaultShareProvider.php +++ b/lib/private/Share20/DefaultShareProvider.php @@ -860,6 +860,16 @@ private function _getSharedWith( /** @var Share[] $shares */ $shares = []; + $nonChildPath = '/'; + if ($path !== null) { + $path = str_replace('/' . $userId . '/files', '', $path); + $path = rtrim($path, '/'); + + if ($path !== '') { + $nonChildPath = $path; + } + } + if ($shareType === IShare::TYPE_USER) { //Get shares directly with this user $qb = $this->dbConn->getQueryBuilder(); @@ -893,9 +903,14 @@ private function _getSharedWith( if ($path !== null) { if ($forChildren) { - $qb->andWhere($qb->expr()->like('file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%'))); + $qb->andWhere( + $qb->expr()->like( + 'file_target', + $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '/_%', IQueryBuilder::PARAM_STR), + ), + ); } else { - $qb->andWhere($qb->expr()->eq('file_target', $qb->createNamedParameter($path))); + $qb->andWhere($qb->expr()->eq('file_target', $qb->createNamedParameter($nonChildPath, IQueryBuilder::PARAM_STR))); } } @@ -951,14 +966,34 @@ private function _getSharedWith( } if ($path !== null) { - $qb->leftJoin('s', 'share', 'sc', $qb->expr()->eq('sc.parent', 's.id')) - ->andWhere($qb->expr()->eq('sc.share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP))) - ->where($qb->expr()->eq('sc.share_with', $qb->createNamedParameter($userId))); + $onClause = $qb->expr()->andX( + $qb->expr()->eq('sc.parent', 's.id'), + $qb->expr()->eq('sc.share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)), + $qb->expr()->eq('sc.share_with', $qb->createNamedParameter($userId)), + ); + $qb->leftJoin('s', 'share', 'sc', $onClause); if ($forChildren) { - $qb->andWhere($qb->expr()->like('sc.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%'))); + $childPathTemplate = $this->dbConn->escapeLikeParameter($path) . '/_%'; + $qb->andWhere( + $qb->expr()->orX( + $qb->expr()->like('sc.file_target', $qb->createNamedParameter($childPathTemplate)), + $qb->expr()->andX( + $qb->expr()->isNull('sc.file_target'), + $qb->expr()->like('s.file_target', $qb->createNamedParameter($childPathTemplate)) + ), + ), + ); } else { - $qb->andWhere($qb->expr()->eq('sc.file_target', $qb->createNamedParameter($path))); + $qb->andWhere( + $qb->expr()->orX( + $qb->expr()->eq('sc.file_target', $qb->createNamedParameter($nonChildPath, IQueryBuilder::PARAM_STR)), + $qb->expr()->andX( + $qb->expr()->isNull('sc.file_target'), + $qb->expr()->eq('s.file_target', $qb->createNamedParameter($nonChildPath, IQueryBuilder::PARAM_STR)), + ), + ) + ); } } @@ -989,7 +1024,7 @@ private function _getSharedWith( /* * Resolve all group shares to user specific shares */ - $shares = $this->resolveGroupShares($shares2, $userId); + $shares = $this->resolveGroupShares($shares2, $userId, $path, $forChildren); } else { throw new BackendError('Invalid backend'); } @@ -1105,7 +1140,7 @@ private function createShare($data) { * @param $userId * @return Share[] The updates shares if no update is found for a share return the original */ - private function resolveGroupShares($shareMap, $userId) { + private function resolveGroupShares($shareMap, $userId, ?string $path = null, ?bool $forChildren = false) { $qb = $this->dbConn->getQueryBuilder(); $query = $qb->select('*') ->from('share') @@ -1119,6 +1154,14 @@ private function resolveGroupShares($shareMap, $userId) { if (count($shareMap) === 1) { $share = reset($shareMap); $query->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId()))); + } elseif ($path !== null) { + if ($forChildren) { + $query->andWhere($qb->expr()->like('file_target', + $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '/_%'))); + } else { + $nonChildPath = $path !== '' ? $path : '/'; + $query->andWhere($qb->expr()->eq('file_target', $qb->createNamedParameter($nonChildPath))); + } } $stmt = $query->executeQuery();