Skip to content

Commit 45d4578

Browse files
authored
Merge pull request #2800 from nextcloud/backport/2728/stable1.0
[stable1.0] apply remove share for users/teams/groups
2 parents dba40c1 + 823b6bf commit 45d4578

4 files changed

Lines changed: 72 additions & 0 deletions

File tree

lib/AppInfo/Application.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
use Exception;
1111
use OCA\Analytics\Datasource\DatasourceEvent;
12+
use OCA\Circles\Events\CircleDestroyedEvent;
1213
use OCA\Tables\Capabilities;
1314
use OCA\Tables\Event\RowDeletedEvent;
1415
use OCA\Tables\Event\TableDeletedEvent;
@@ -18,6 +19,7 @@
1819
use OCA\Tables\Listener\AnalyticsDatasourceListener;
1920
use OCA\Tables\Listener\BeforeTemplateRenderedListener;
2021
use OCA\Tables\Listener\LoadAdditionalListener;
22+
use OCA\Tables\Listener\ReceiverCleanupListener;
2123
use OCA\Tables\Listener\TablesReferenceListener;
2224
use OCA\Tables\Listener\UserDeletedListener;
2325
use OCA\Tables\Listener\WhenRowDeletedAuditLogListener;
@@ -39,7 +41,9 @@
3941
use OCP\Collaboration\Reference\RenderReferenceEvent;
4042
use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent;
4143
use OCP\DB\Events\AddMissingIndicesEvent;
44+
use OCP\Group\Events\GroupDeletedEvent;
4245
use OCP\User\Events\BeforeUserDeletedEvent;
46+
use OCP\User\Events\UserDeletedEvent;
4347

4448
class Application extends App implements IBootstrap {
4549
public const APP_ID = 'tables';
@@ -85,6 +89,9 @@ public function register(IRegistrationContext $context): void {
8589
$context->registerEventListener(RowDeletedEvent::class, WhenRowDeletedAuditLogListener::class);
8690
$context->registerEventListener(TableOwnershipTransferredEvent::class, WhenTableTransferredAuditLogListener::class);
8791
$context->registerEventListener(AddMissingIndicesEvent::class, AddMissingIndicesListener::class);
92+
$context->registerEventListener(UserDeletedEvent::class, ReceiverCleanupListener::class);
93+
$context->registerEventListener(GroupDeletedEvent::class, ReceiverCleanupListener::class);
94+
$context->registerEventListener(CircleDestroyedEvent::class, ReceiverCleanupListener::class);
8895

8996
$context->registerSearchProvider(SearchTablesProvider::class);
9097

lib/Db/ShareMapper.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,4 +195,15 @@ public function changeReceiverForNode(string $nodeType, int $nodeId, string $new
195195
->andWhere($qb->expr()->eq('receiver_type', $qb->createNamedParameter('user', IQueryBuilder::PARAM_STR)))
196196
->executeStatement();
197197
}
198+
199+
/**
200+
* @throws Exception
201+
*/
202+
public function deleteByReceiver(string $receiver, string $receiverType): int {
203+
$qb = $this->db->getQueryBuilder();
204+
return $qb->delete($this->table)
205+
->where($qb->expr()->eq('receiver', $qb->createNamedParameter($receiver, IQueryBuilder::PARAM_STR)))
206+
->andWhere($qb->expr()->eq('receiver_type', $qb->createNamedParameter($receiverType, IQueryBuilder::PARAM_STR)))
207+
->executeStatement();
208+
}
198209
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
/**
4+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
8+
namespace OCA\Tables\Listener;
9+
10+
use OCA\Circles\Events\CircleDestroyedEvent;
11+
use OCA\Tables\Constants\ShareReceiverType;
12+
use OCA\Tables\Db\ShareMapper;
13+
use OCP\EventDispatcher\Event;
14+
use OCP\EventDispatcher\IEventListener;
15+
use OCP\Group\Events\GroupDeletedEvent;
16+
use OCP\User\Events\UserDeletedEvent;
17+
use Psr\Log\LoggerInterface;
18+
19+
/** @template-implements IEventListener<Event|UserDeletedEvent|GroupDeletedEvent|CircleDestroyedEvent> */
20+
class ReceiverCleanupListener implements IEventListener {
21+
public function __construct(
22+
private ShareMapper $shareMapper,
23+
private LoggerInterface $logger,
24+
) {
25+
}
26+
27+
public function handle(Event $event): void {
28+
if ($event instanceof UserDeletedEvent) {
29+
$this->cleanupByParticipant(ShareReceiverType::USER, $event->getUser()->getUID());
30+
} elseif ($event instanceof GroupDeletedEvent) {
31+
$this->cleanupByParticipant(ShareReceiverType::GROUP, $event->getGroup()->getGID());
32+
} elseif ($event instanceof CircleDestroyedEvent) {
33+
$this->cleanupByParticipant(ShareReceiverType::CIRCLE, $event->getCircle()->getSingleId());
34+
}
35+
}
36+
37+
private function cleanupByParticipant(string $type, string $participant): void {
38+
try {
39+
$this->shareMapper->deleteByReceiver($participant, $type);
40+
} catch (\Throwable $e) {
41+
$this->logger->warning('cleanup table shares for deleted receiver has failed: ' . $e->getMessage(), [
42+
'exception' => $e,
43+
'receiver_type' => $type,
44+
'receiver' => $participant,
45+
]);
46+
}
47+
}
48+
}

tests/stub.phpstub

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ namespace OCA\Circles\Model {
2121
}
2222
}
2323

24+
namespace OCA\Circles\Events {
25+
class CircleDestroyedEvent extends \OCP\EventDispatcher\Event {
26+
public function getCircle(): \OCA\Circles\Model\Circle {}
27+
}
28+
}
29+
2430
namespace OC\Collaboration\Reference {
2531
class LinkReferenceProvider implements IReferenceProvider {
2632
abstract public function matchReference(string $referenceText): bool {}

0 commit comments

Comments
 (0)