aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorprovokateurin <kate@provokateurin.de>2025-02-24 12:07:08 +0100
committerprovokateurin <kate@provokateurin.de>2025-03-03 12:49:01 +0100
commitf5b5aec296800e32c426bb9446494e2c0454ef19 (patch)
treec3b2536a754904fb5d6b4e6b471ce5200faeda7f
parent0df4817be1eb04c78fd83380fb97f4c2cea65380 (diff)
downloadnextcloud-server-f5b5aec296800e32c426bb9446494e2c0454ef19.tar.gz
nextcloud-server-f5b5aec296800e32c426bb9446494e2c0454ef19.zip
fix(FederatedShareProvider): Delete external shares when groups are deleted or users removed from a groupfix/federatedfilesharing/group-cleanup
Signed-off-by: provokateurin <kate@provokateurin.de>
-rw-r--r--apps/federatedfilesharing/lib/FederatedShareProvider.php58
1 files changed, 44 insertions, 14 deletions
diff --git a/apps/federatedfilesharing/lib/FederatedShareProvider.php b/apps/federatedfilesharing/lib/FederatedShareProvider.php
index 2c836dfc090..c7ee40a0cbe 100644
--- a/apps/federatedfilesharing/lib/FederatedShareProvider.php
+++ b/apps/federatedfilesharing/lib/FederatedShareProvider.php
@@ -882,30 +882,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)))
->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();
}
/**