aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorprovokateurin <kate@provokateurin.de>2025-02-24 12:07:08 +0100
committerprovokateurin <kate@provokateurin.de>2025-03-04 08:01:03 +0100
commitdcf716242ad378a0b1089da9604603a9ae71181a (patch)
tree6a8195df6c83da23ce77730aabc37a016f9b1d54
parentb51aad472cc8a522310697c62635c19040f0f26c (diff)
downloadnextcloud-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.php60
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();
}
/**