From 073d9804ffaf342ee5ecec61430aaade57414bd2 Mon Sep 17 00:00:00 2001 From: Louis Chmn Date: Fri, 30 Jan 2026 20:54:28 +0100 Subject: [PATCH 1/4] fix(files_sharing): Move path filtering to group share resolution Previously, this was preventing users without a specific USERGROUP entry to see GROUP shares. Signed-off-by: Louis Chmn Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> --- lib/private/Share20/DefaultShareProvider.php | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php index 46c2b94116217..f55f40f458550 100644 --- a/lib/private/Share20/DefaultShareProvider.php +++ b/lib/private/Share20/DefaultShareProvider.php @@ -951,14 +951,23 @@ 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) . '_%'))); + $qb->orWhere( + $qb->expr()->like('s.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')), + $qb->expr()->like('sc.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')), + ); } else { - $qb->andWhere($qb->expr()->eq('sc.file_target', $qb->createNamedParameter($path))); + $qb->orWhere( + $qb->expr()->eq('s.file_target', $qb->createNamedParameter($path)), + $qb->expr()->eq('sc.file_target', $qb->createNamedParameter($path)), + ); } } From 94849aa1c722608b28248b6a39badb59b4a78d52 Mon Sep 17 00:00:00 2001 From: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> Date: Mon, 2 Feb 2026 17:22:30 +0100 Subject: [PATCH 2/4] fixup! fix(files_sharing): Move path filtering to group share resolution Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> --- lib/private/Share20/DefaultShareProvider.php | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php index f55f40f458550..5531661f62193 100644 --- a/lib/private/Share20/DefaultShareProvider.php +++ b/lib/private/Share20/DefaultShareProvider.php @@ -959,14 +959,18 @@ private function _getSharedWith( $qb->leftJoin('s', 'share', 'sc', $onClause); if ($forChildren) { - $qb->orWhere( - $qb->expr()->like('s.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')), - $qb->expr()->like('sc.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')), + $qb->andWhere( + $qb->expr()->orX( + $qb->expr()->like('s.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')), + $qb->expr()->like('sc.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')), + ) ); } else { - $qb->orWhere( - $qb->expr()->eq('s.file_target', $qb->createNamedParameter($path)), - $qb->expr()->eq('sc.file_target', $qb->createNamedParameter($path)), + $qb->andWhere( + $qb->expr()->orX( + $qb->expr()->eq('s.file_target', $qb->createNamedParameter($path)), + $qb->expr()->eq('sc.file_target', $qb->createNamedParameter($path)), + ) ); } } From 45aa491e9acf3a28d139c1ad6332906caf9597c4 Mon Sep 17 00:00:00 2001 From: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> Date: Mon, 2 Feb 2026 17:22:49 +0100 Subject: [PATCH 3/4] fixup! fix(files_sharing): Move path filtering to group share resolution Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> --- lib/private/Share20/DefaultShareProvider.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php index 5531661f62193..07ac011393811 100644 --- a/lib/private/Share20/DefaultShareProvider.php +++ b/lib/private/Share20/DefaultShareProvider.php @@ -1002,7 +1002,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'); } @@ -1118,7 +1118,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') @@ -1132,6 +1132,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 { + $query->andWhere($qb->expr()->eq('file_target', + $qb->createNamedParameter($path))); + } } $stmt = $query->executeQuery(); From a1e07b4a89600128095310bba772e963f3962fb7 Mon Sep 17 00:00:00 2001 From: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> Date: Tue, 3 Feb 2026 11:40:24 +0100 Subject: [PATCH 4/4] fixup! fix(files_sharing): Move path filtering to group share resolution Signed-off-by: Salvatore Martire <4652631+salmart-dev@users.noreply.github.com> --- lib/private/Share20/DefaultShareProvider.php | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php index 07ac011393811..8f5759a94389e 100644 --- a/lib/private/Share20/DefaultShareProvider.php +++ b/lib/private/Share20/DefaultShareProvider.php @@ -961,15 +961,22 @@ private function _getSharedWith( if ($forChildren) { $qb->andWhere( $qb->expr()->orX( - $qb->expr()->like('s.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')), $qb->expr()->like('sc.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%')), + $qb->expr()->andX( + $qb->expr()->isNull('sc.file_target'), + $qb->expr()->like('s.file_target', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($path) . '_%'), + ), + ), ) ); } else { $qb->andWhere( $qb->expr()->orX( - $qb->expr()->eq('s.file_target', $qb->createNamedParameter($path)), $qb->expr()->eq('sc.file_target', $qb->createNamedParameter($path)), + $qb->expr()->andX( + $qb->expr()->isNull('sc.file_target'), + $qb->expr()->eq('s.file_target', $qb->createNamedParameter($path)), + ), ) ); }