From fcdb60f1d8f9af63a3d8f58b64556f6c950b4e14 Mon Sep 17 00:00:00 2001 From: Maximilian Martin Date: Sun, 8 Feb 2026 19:12:13 +0100 Subject: [PATCH] fix: delete CalDav and CardDav shares upon group deletion Signed-off-by: Maximilian Martin --- apps/dav/lib/AppInfo/Application.php | 2 ++ apps/dav/lib/Listener/UserEventsListener.php | 12 +++++++++++- .../unit/DAV/Listener/UserEventsListenerTest.php | 11 +++++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/apps/dav/lib/AppInfo/Application.php b/apps/dav/lib/AppInfo/Application.php index 6d1eeeeba532c..ebc5f110a6732 100644 --- a/apps/dav/lib/AppInfo/Application.php +++ b/apps/dav/lib/AppInfo/Application.php @@ -87,6 +87,7 @@ use OCP\DB\Events\AddMissingIndicesEvent; use OCP\Federation\Events\TrustedServerRemovedEvent; use OCP\Federation\ICloudFederationProviderManager; +use OCP\Group\Events\GroupDeletedEvent; use OCP\IUserSession; use OCP\Server; use OCP\Settings\Events\DeclarativeSettingsGetValueEvent; @@ -202,6 +203,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 aa5e419011c55..f5c6631b26135 100644 --- a/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php +++ b/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php @@ -181,4 +181,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'); + } }