diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index f9511f5e2cb65..f4b590a92808c 100644 --- a/apps/dav/lib/AppInfo/Application.php +++ b/apps/dav/lib/AppInfo/Application.php @@ -89,6 +89,7 @@ use OCP\DB\Events\AddMissingIndicesEvent; use OCP\Federation\Events\TrustedServerRemovedEvent; use OCP\Federation\ICloudFederationProviderManager; +use OCP\Group\Events\GroupDeletedEvent; use OCP\IURLGenerator; use OCP\IUserSession; use OCP\Server; @@ -205,6 +206,7 @@ public function register(IRegistrationContext $context): void { $context->registerEventListener(UserCreatedEvent::class, UserEventsListener::class); $context->registerEventListener(UserChangedEvent::class, UserEventsListener::class); $context->registerEventListener(UserUpdatedEvent::class, UserEventsListener::class); + $context->registerEventListener(GroupDeletedEvent::class, UserEventsListener::class); $context->registerEventListener(SabrePluginAuthInitEvent::class, SabrePluginAuthInitListener::class); diff --git a/apps/dav/lib/Listener/UserEventsListener.php b/apps/dav/lib/Listener/UserEventsListener.php index b4bf4cb9689fe..abf1c56ad4b57 100644 --- a/apps/dav/lib/Listener/UserEventsListener.php +++ b/apps/dav/lib/Listener/UserEventsListener.php @@ -20,6 +20,8 @@ use OCP\Defaults; use OCP\EventDispatcher\Event; use OCP\EventDispatcher\IEventListener; +use OCP\Group\Events\BeforeGroupDeletedEvent; +use OCP\Group\Events\GroupDeletedEvent; use OCP\IUser; use OCP\IUserManager; use OCP\User\Events\BeforeUserDeletedEvent; @@ -32,7 +34,7 @@ use OCP\User\Events\UserIdUnassignedEvent; use Psr\Log\LoggerInterface; -/** @template-implements IEventListener */ +/** @template-implements IEventListener */ class UserEventsListener implements IEventListener { /** @var IUser[] */ @@ -77,6 +79,8 @@ public function handle(Event $event): void { $this->firstLogin($event->getUser()); } elseif ($event instanceof UserUpdatedEvent) { $this->updateUser($event->getUser()); + } elseif ($event instanceof GroupDeletedEvent) { + $this->postDeleteGroup($event->getGroup()->getGID()); } } @@ -135,6 +139,12 @@ public function postDeleteUser(string $uid): void { unset($this->addressBooksToDelete[$uid]); } + public function postDeleteGroup(string $gid): void { + $encodedGid = urlencode($gid); + $this->calDav->deleteAllSharesByUser('principals/groups/' . $encodedGid); + $this->cardDav->deleteAllSharesByUser('principals/groups/' . $encodedGid); + } + public function changeUser(IUser $user, string $feature): void { // This case is already covered by the account manager firing up a signal // later on diff --git a/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php b/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php index b25340af067e6..615354e0f258b 100644 --- a/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php +++ b/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php @@ -182,4 +182,15 @@ public function testDeleteUserAutomationEvent(): void { $this->userEventsListener->preDeleteUser($user); $this->userEventsListener->postDeleteUser('newUser'); } + + public function testDeleteGroup(): void { + $this->calDavBackend->expects($this->once()) + ->method('deleteAllSharesByUser') + ->with('principals/groups/testGroup'); + $this->cardDavBackend->expects($this->once()) + ->method('deleteAllSharesByUser') + ->with('principals/groups/testGroup'); + + $this->userEventsListener->postDeleteGroup('testGroup'); + } }