diff options
author | provokateurin <kate@provokateurin.de> | 2025-02-24 12:07:08 +0100 |
---|---|---|
committer | provokateurin <kate@provokateurin.de> | 2025-03-04 07:58:50 +0100 |
commit | 46cec2580128b5f3616dd9eb59b430fa232e0ca0 (patch) | |
tree | 0143691e8a517c66097cf6af05496d25fa2a9797 | |
parent | 194f5eae1eae6c0d03dee50ee8908a2ac80f9411 (diff) | |
download | nextcloud-server-backport/51000/stable30.tar.gz nextcloud-server-backport/51000/stable30.zip |
fix(FederatedShareProvider): Delete external shares when groups are deleted or users removed from a groupbackport/51000/stable30
Signed-off-by: provokateurin <kate@provokateurin.de>
-rw-r--r-- | apps/federatedfilesharing/lib/FederatedShareProvider.php | 60 |
1 files changed, 45 insertions, 15 deletions
diff --git a/apps/federatedfilesharing/lib/FederatedShareProvider.php b/apps/federatedfilesharing/lib/FederatedShareProvider.php index eee60f06068..723b8b7b7b3 100644 --- a/apps/federatedfilesharing/lib/FederatedShareProvider.php +++ b/apps/federatedfilesharing/lib/FederatedShareProvider.php @@ -880,30 +880,60 @@ class FederatedShareProvider implements IShareProvider { //TODO: probably a good idea to send unshare info to remote servers $qb = $this->dbConnection->getQueryBuilder(); - $qb->delete('share') ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_REMOTE))) ->andWhere($qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid))) - ->execute(); + ->executeStatement(); + + $qb = $this->dbConnection->getQueryBuilder(); + $qb->delete('share_external') + ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP))) + ->andWhere($qb->expr()->eq('user', $qb->createNamedParameter($uid))) + ->executeStatement(); } - /** - * This provider does not handle groups - * - * @param string $gid - */ public function groupDeleted($gid) { - // We don't handle groups here + $qb = $this->dbConnection->getQueryBuilder(); + $qb->select('id') + ->from('share_external') + ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP))) + // This is not a typo, the group ID is really stored in the 'user' column + ->andWhere($qb->expr()->eq('user', $qb->createNamedParameter($gid))); + $cursor = $qb->executeQuery(); + $parentShareIds = $cursor->fetchAll(\PDO::FETCH_COLUMN); + $cursor->closeCursor(); + if ($parentShareIds === []) { + return; + } + + $qb = $this->dbConnection->getQueryBuilder(); + $parentShareIdsParam = $qb->createNamedParameter($parentShareIds, IQueryBuilder::PARAM_INT_ARRAY); + $qb->delete('share_external') + ->where($qb->expr()->in('id', $parentShareIdsParam)) + ->orWhere($qb->expr()->in('parent', $parentShareIdsParam)) + ->executeStatement(); } - /** - * This provider does not handle groups - * - * @param string $uid - * @param string $gid - */ public function userDeletedFromGroup($uid, $gid) { - // We don't handle groups here + $qb = $this->dbConnection->getQueryBuilder(); + $qb->select('id') + ->from('share_external') + ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_GROUP))) + // This is not a typo, the group ID is really stored in the 'user' column + ->andWhere($qb->expr()->eq('user', $qb->createNamedParameter($gid))); + $cursor = $qb->executeQuery(); + $parentShareIds = $cursor->fetchAll(\PDO::FETCH_COLUMN); + $cursor->closeCursor(); + if ($parentShareIds === []) { + return; + } + + $qb = $this->dbConnection->getQueryBuilder(); + $parentShareIdsParam = $qb->createNamedParameter($parentShareIds, IQueryBuilder::PARAM_INT_ARRAY); + $qb->delete('share_external') + ->where($qb->expr()->in('parent', $parentShareIdsParam)) + ->andWhere($qb->expr()->eq('user', $qb->createNamedParameter($uid))) + ->executeStatement(); } /** |