fix: delete CalDav and CardDav shares upon group deletion

Signed-off-by: Maximilian Martin <maximilian_martin@gmx.de>
This commit is contained in:
Maximilian Martin 2026-02-08 19:12:13 +01:00 committed by SebastianKrupinski
parent f5ccd08a8f
commit fcdb60f1d8
3 changed files with 24 additions and 1 deletions

View file

@ -87,6 +87,7 @@ use OCP\Contacts\IManager as IContactsManager;
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 @@ class Application extends App implements IBootstrap {
$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);

View file

@ -20,6 +20,8 @@ use OCP\BackgroundJob\IJobList;
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\UserIdAssignedEvent;
use OCP\User\Events\UserIdUnassignedEvent;
use Psr\Log\LoggerInterface;
/** @template-implements IEventListener<UserFirstTimeLoggedInEvent|UserIdAssignedEvent|BeforeUserIdUnassignedEvent|UserIdUnassignedEvent|BeforeUserDeletedEvent|UserDeletedEvent|UserCreatedEvent|UserChangedEvent|UserUpdatedEvent> */
/** @template-implements IEventListener<UserFirstTimeLoggedInEvent|UserIdAssignedEvent|BeforeUserIdUnassignedEvent|UserIdUnassignedEvent|BeforeUserDeletedEvent|UserDeletedEvent|UserCreatedEvent|UserChangedEvent|UserUpdatedEvent|BeforeGroupDeletedEvent|GroupDeletedEvent> */
class UserEventsListener implements IEventListener {
/** @var IUser[] */
@ -77,6 +79,8 @@ class UserEventsListener implements IEventListener {
$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 @@ class UserEventsListener implements IEventListener {
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

View file

@ -181,4 +181,15 @@ class UserEventsListenerTest extends TestCase {
$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');
}
}