Skip to content

Commit

Permalink
Merge pull request #1015 from nextcloud/backport/1000/1000-stable23
Browse files Browse the repository at this point in the history
[stable23] remove child shares
  • Loading branch information
ArtificialOwl authored Apr 14, 2022
2 parents 594fb08 + a4ccbba commit d255537
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 9 deletions.
52 changes: 50 additions & 2 deletions lib/Db/ShareWrapperRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -445,9 +445,57 @@ public function delete(int $shareId): void {
/**
* @param string $circleId
*/
public function deleteFromCircle(string $circleId): void {
public function deleteSharesToCircle(string $circleId, string $initiator = ''): void {
$qb = $this->getShareSelectSql();
$qb->limit('share_with', $circleId);
if ($initiator !== '') {
$qb->limit('uid_initiator', $initiator);
}

$ids = array_map(
function (ShareWrapper $share): string {
return $share->getId();
},
$this->getItemsFromRequest($qb)
);

$this->deleteSharesAndChild($ids);
}


public function removeOrphanShares(): void {
$qb = $this->getShareSelectSql();
$expr = $qb->expr();
$qb->leftJoin(
CoreQueryBuilder::SHARE, CoreRequestBuilder::TABLE_SHARE, 'p',
$expr->andX($expr->eq('p.id', CoreQueryBuilder::SHARE . '.parent'))
);

$qb->filterNull('parent');
$qb->limitNull('id', false, 'p');

$ids = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$ids[] = $data['id'];
}
$cursor->closeCursor();

$this->deleteSharesAndChild($ids);
}


/**
* @param array $ids
*/
private function deleteSharesAndChild(array $ids): void {
$qb = $this->getShareDeleteSql();
$qb->andWhere($qb->exprLimit('share_with', $circleId));
$qb->andWhere(
$qb->expr()->orX(
$qb->exprLimitInArray('id', $ids),
$qb->exprLimitInArray('parent', $ids)
)
);

$qb->execute();
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Listeners/Files/DestroyingCircle.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,6 @@ public function handle(Event $event): void {
}

$circle = $event->getCircle();
$this->shareWrapperService->deleteSharesToCircle($circle->getSingleId());
$this->shareWrapperService->deleteAllSharesToCircle($circle->getSingleId());
}
}
6 changes: 3 additions & 3 deletions lib/Listeners/Files/MembershipsRemoved.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,9 +123,9 @@ public function handle(Event $event): void {
$federatedUser = $this->circlesManager->getFederatedUser($membership->getSingleId());
if ($federatedUser->getUserType() === Member::TYPE_USER
&& $federatedUser->isLocal()) {
$this->shareWrapperRequest->removeByInitiatorAndShareWith(
$federatedUser->getUserId(),
$membership->getCircleId()
$this->shareWrapperService->deleteUserSharesToCircle(
$membership->getCircleId(),
$federatedUser->getUserId()
);
}
}
Expand Down
17 changes: 16 additions & 1 deletion lib/Service/MaintenanceService.php
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,13 @@ private function runMaintenance5(): void {
// $this->refreshDisplayName();
// } catch (Exception $e) {
// }

try {
// Can be removed in NC27.
$this->output('Remove orphan shares');
$this->removeOrphanShares();
} catch (Exception $e) {
}
}


Expand Down Expand Up @@ -314,6 +321,14 @@ private function removeMembersWithNoCircles(): void {
}


private function removeOrphanShares(): void {
$this->shareWrapperRequest->removeOrphanShares();
}


/**
* @throws RequestBuilderException
*/
private function removeDeprecatedShares(): void {
$probe = new CircleProbe();
$probe->includePersonalCircles()
Expand All @@ -336,7 +351,7 @@ function (ShareWrapper $share) {

foreach ($shares as $share) {
if (!in_array($share, $circles)) {
$this->shareWrapperRequest->deleteFromCircle($share);
$this->shareWrapperService->deleteAllSharesToCircle($share);
}
}
}
Expand Down
17 changes: 15 additions & 2 deletions lib/Service/ShareWrapperService.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@

namespace OCA\Circles\Service;

use Exception;
use OCA\Circles\Tools\Traits\TStringTools;
use OCA\Circles\Db\ShareWrapperRequest;
use OCA\Circles\Exceptions\RequestBuilderException;
Expand Down Expand Up @@ -105,8 +106,20 @@ public function delete(ShareWrapper $shareWrapper): void {
/**
* @param string $circleId
*/
public function deleteSharesToCircle(string $circleId) {
$this->shareWrapperRequest->deleteFromCircle($circleId);
public function deleteUserSharesToCircle(string $circleId, string $initiator): void {
if ($initiator === '') {
throw new Exception('$initiator cannot be empty');
}

$this->shareWrapperRequest->deleteSharesToCircle($circleId, $initiator);
}


/**
* @param string $circleId
*/
public function deleteAllSharesToCircle(string $circleId): void {
$this->shareWrapperRequest->deleteSharesToCircle($circleId, '');
}


Expand Down

0 comments on commit d255537

Please sign in to comment.