Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulius Härtl <jus@bitgrid.net>2022-11-11 00:59:41 +0300
committerJulius Härtl <jus@bitgrid.net>2022-11-11 12:24:03 +0300
commit2ba8fb9afc79d00842c7a5fa88338372671bb7bc (patch)
treee5522bffe932d0055dfa0d20e3acbd9000f2dd52
parent76fd901062caf6fa365279192442b49da1d60e2d (diff)
Also handle user/group deletion in the listener
Signed-off-by: Julius Härtl <jus@bitgrid.net>
-rw-r--r--lib/AppInfo/Application.php60
-rw-r--r--lib/Listeners/CircleEventListener.php36
-rw-r--r--lib/Listeners/ParticipantCleanupListener.php57
3 files changed, 61 insertions, 92 deletions
diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php
index d53f440c..1f973619 100644
--- a/lib/AppInfo/Application.php
+++ b/lib/AppInfo/Application.php
@@ -33,9 +33,6 @@ use OCA\Deck\Collaboration\Resources\ResourceProvider;
use OCA\Deck\Collaboration\Resources\ResourceProviderCard;
use OCA\Deck\Dashboard\DeckWidget;
use OCA\Deck\Db\Acl;
-use OCA\Deck\Db\AclMapper;
-use OCA\Deck\Db\AssignmentMapper;
-use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\Event\AclCreatedEvent;
use OCA\Deck\Event\AclDeletedEvent;
@@ -44,7 +41,7 @@ use OCA\Deck\Event\CardCreatedEvent;
use OCA\Deck\Event\CardDeletedEvent;
use OCA\Deck\Event\CardUpdatedEvent;
use OCA\Deck\Listeners\BeforeTemplateRenderedListener;
-use OCA\Deck\Listeners\CircleEventListener;
+use OCA\Deck\Listeners\ParticipantCleanupListener;
use OCA\Deck\Listeners\FullTextSearchEventListener;
use OCA\Deck\Listeners\ResourceListener;
use OCA\Deck\Middleware\DefaultBoardMiddleware;
@@ -65,15 +62,12 @@ use OCP\Collaboration\Reference\RenderReferenceEvent;
use OCP\Collaboration\Resources\IProviderManager;
use OCP\Comments\CommentsEntityEvent;
use OCP\Comments\ICommentsManager;
-use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Group\Events\GroupDeletedEvent;
use OCP\IConfig;
use OCP\IDBConnection;
-use OCP\IGroupManager;
use OCP\IRequest;
use OCP\Server;
-use OCP\IUserManager;
use OCP\Notification\IManager as NotificationManager;
use OCP\Share\IManager;
use OCP\User\Events\UserDeletedEvent;
@@ -98,7 +92,6 @@ class Application extends App implements IBootstrap {
}
public function boot(IBootContext $context): void {
- $context->injectFn(Closure::fromCallable([$this, 'registerUserGroupHooks']));
$context->injectFn(Closure::fromCallable([$this, 'registerCommentsEntity']));
$context->injectFn(Closure::fromCallable([$this, 'registerCommentsEventHandler']));
$context->injectFn(Closure::fromCallable([$this, 'registerNotifications']));
@@ -151,60 +144,15 @@ class Application extends App implements IBootstrap {
$context->registerEventListener(AclCreatedEvent::class, ResourceListener::class);
$context->registerEventListener(AclDeletedEvent::class, ResourceListener::class);
- $context->registerEventListener(CircleDestroyedEvent::class, CircleEventListener::class);
+ $context->registerEventListener(UserDeletedEvent::class, ParticipantCleanupListener::class);
+ $context->registerEventListener(GroupDeletedEvent::class, ParticipantCleanupListener::class);
+ $context->registerEventListener(CircleDestroyedEvent::class, ParticipantCleanupListener::class);
}
public function registerNotifications(NotificationManager $notificationManager): void {
$notificationManager->registerNotifierService(Notifier::class);
}
- private function registerUserGroupHooks(IUserManager $userManager, IGroupManager $groupManager): void {
- $container = $this->getContainer();
- /** @var IEventDispatcher $eventDispatcher */
- $eventDispatcher = $container->get(IEventDispatcher::class);
- // Delete user/group acl entries when they get deleted
- $eventDispatcher->addListener(UserDeletedEvent::class, static function (Event $event) use ($container): void {
- if (!($event instanceof UserDeletedEvent)) {
- return;
- }
- $user = $event->getUser();
- // delete existing acl entries for deleted user
- /** @var AclMapper $aclMapper */
- $aclMapper = $container->get(AclMapper::class);
- $acls = $aclMapper->findByParticipant(Acl::PERMISSION_TYPE_USER, $user->getUID());
- foreach ($acls as $acl) {
- $aclMapper->delete($acl);
- }
- // delete existing user assignments
- $assignmentMapper = $container->get(AssignmentMapper::class);
- $assignments = $assignmentMapper->findByParticipant($user->getUID());
- foreach ($assignments as $assignment) {
- $assignmentMapper->delete($assignment);
- }
-
- /** @var BoardMapper $boardMapper */
- $boardMapper = $container->get(BoardMapper::class);
- $boards = $boardMapper->findAllByOwner($user->getUID());
- foreach ($boards as $board) {
- $boardMapper->delete($board);
- }
- });
-
- $eventDispatcher->addListener(GroupDeletedEvent::class, static function (Event $event) use ($container): void {
- if (!($event instanceof GroupDeletedEvent)) {
- return;
- }
- $group = $event->getGroup();
- /** @var AclMapper $aclMapper */
- $aclMapper = $container->get(AclMapper::class);
- $aclMapper->findByParticipant(Acl::PERMISSION_TYPE_GROUP, $group->getGID());
- $acls = $aclMapper->findByParticipant(Acl::PERMISSION_TYPE_GROUP, $group->getGID());
- foreach ($acls as $acl) {
- $aclMapper->delete($acl);
- }
- });
- }
-
public function registerCommentsEntity(IEventDispatcher $eventDispatcher): void {
$eventDispatcher->addListener(CommentsEntityEvent::EVENT_ENTITY, function (CommentsEntityEvent $event) {
$event->addEntityCollection(self::COMMENT_ENTITY_TYPE, function ($name) {
diff --git a/lib/Listeners/CircleEventListener.php b/lib/Listeners/CircleEventListener.php
deleted file mode 100644
index 676c8356..00000000
--- a/lib/Listeners/CircleEventListener.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-namespace OCA\Deck\Listeners;
-
-use OCA\Circles\Events\CircleDestroyedEvent;
-use OCA\Deck\Db\Acl;
-use OCA\Deck\Db\AclMapper;
-use OCA\Deck\Event\AclDeletedEvent;
-use OCP\EventDispatcher\Event;
-use OCP\EventDispatcher\IEventDispatcher;
-use OCP\EventDispatcher\IEventListener;
-
-class CircleEventListener implements IEventListener {
-
- /** @var AclMapper */
- private $aclMapper;
-
- /** @var IEventDispatcher */
- private $eventDispatcher;
-
- public function __construct(AclMapper $aclMapper, IEventDispatcher $eventDispatcher) {
- $this->aclMapper = $aclMapper;
- $this->eventDispatcher = $eventDispatcher;
- }
-
- public function handle(Event $event): void {
- if ($event instanceof CircleDestroyedEvent) {
- $circleId = $event->getCircle()->getSingleId();
- $acls = $this->aclMapper->findByParticipant(Acl::PERMISSION_TYPE_CIRCLE, $circleId);
- foreach ($acls as $acl) {
- $this->aclMapper->delete($acl);
- $this->eventDispatcher->dispatchTyped(new AclDeletedEvent($acl));
- }
- }
- }
-}
diff --git a/lib/Listeners/ParticipantCleanupListener.php b/lib/Listeners/ParticipantCleanupListener.php
new file mode 100644
index 00000000..aa159107
--- /dev/null
+++ b/lib/Listeners/ParticipantCleanupListener.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace OCA\Deck\Listeners;
+
+use OCA\Circles\Events\CircleDestroyedEvent;
+use OCA\Deck\Db\Acl;
+use OCA\Deck\Db\AclMapper;
+use OCA\Deck\Db\AssignmentMapper;
+use OCA\Deck\Db\BoardMapper;
+use OCP\EventDispatcher\Event;
+use OCP\EventDispatcher\IEventListener;
+use OCP\Group\Events\GroupDeletedEvent;
+use OCP\User\Events\UserDeletedEvent;
+
+class ParticipantCleanupListener implements IEventListener {
+ private AclMapper $aclMapper;
+ private AssignmentMapper $assignmentMapper;
+ private BoardMapper $boardMapper;
+
+ public function __construct(AclMapper $aclMapper, AssignmentMapper $assignmentMapper, BoardMapper $boardMapper) {
+ $this->aclMapper = $aclMapper;
+ $this->assignmentMapper = $assignmentMapper;
+ $this->boardMapper = $boardMapper;
+ }
+
+ public function handle(Event $event): void {
+ if ($event instanceof UserDeletedEvent) {
+ $boards = $this->boardMapper->findAllByOwner($event->getUser()->getUID());
+ foreach ($boards as $board) {
+ $this->boardMapper->delete($board);
+ }
+
+ $this->cleanupByParticipant(Acl::PERMISSION_TYPE_USER, $event->getUser()->getUID());
+ }
+
+ if ($event instanceof GroupDeletedEvent) {
+ $this->cleanupByParticipant(Acl::PERMISSION_TYPE_GROUP, $event->getGroup()->getGID());
+ }
+
+ if ($event instanceof CircleDestroyedEvent) {
+ $circleId = $event->getCircle()->getSingleId();
+ $this->cleanupByParticipant(Acl::PERMISSION_TYPE_CIRCLE, $circleId);
+ }
+ }
+
+ private function cleanupByParticipant(int $type, string $participant): void {
+ $acls = $this->aclMapper->findByParticipant($type, $participant);
+ foreach ($acls as $acl) {
+ $this->aclMapper->delete($acl);
+ }
+
+ $assignments = $this->assignmentMapper->findByParticipant($participant, $type);
+ foreach ($assignments as $assignment) {
+ $this->assignmentMapper->delete($assignment);
+ }
+ }
+}