diff options
author | provokateurin <kate@provokateurin.de> | 2025-02-24 12:07:08 +0100 |
---|---|---|
committer | provokateurin <kate@provokateurin.de> | 2025-03-04 08:01:03 +0100 |
commit | dcf716242ad378a0b1089da9604603a9ae71181a (patch) | |
tree | 6a8195df6c83da23ce77730aabc37a016f9b1d54 | |
parent | b51aad472cc8a522310697c62635c19040f0f26c (diff) | |
download | nextcloud-server-backport/51000/stable29.tar.gz nextcloud-server-backport/51000/stable29.zip |
fix(FederatedShareProvider): Delete external shares when groups are deleted or users removed from a groupbackport/51000/stable29
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 340de3a1761..31d0a84136c 100644 --- a/apps/federatedfilesharing/lib/FederatedShareProvider.php +++ b/apps/federatedfilesharing/lib/FederatedShareProvider.php @@ -911,30 +911,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(); } /** |