From 8e1a070bd5ac5c39854145fce23262e5cd5ad5cc Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Thu, 14 Aug 2025 15:28:13 +0200 Subject: [PATCH] fix(dav): clean up user's addressbook shares on deletion Signed-off-by: Christoph Wurst --- apps/dav/lib/CardDAV/CardDavBackend.php | 7 +++++++ apps/dav/lib/Listener/UserEventsListener.php | 1 + .../dav/tests/unit/DAV/Listener/UserEventsListenerTest.php | 3 ++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index a78686eb61d..1bba81182bd 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -1091,6 +1091,13 @@ class CardDavBackend implements BackendInterface, SyncSupport { }, $this->db); } + /** + * Delete all of a user's shares + */ + public function deleteAllSharesByUser(string $principaluri): void { + $this->sharingBackend->deleteAllSharesByUser($principaluri); + } + /** * Search contacts in a specific address-book * diff --git a/apps/dav/lib/Listener/UserEventsListener.php b/apps/dav/lib/Listener/UserEventsListener.php index a6b09b70fa0..b4bf4cb9689 100644 --- a/apps/dav/lib/Listener/UserEventsListener.php +++ b/apps/dav/lib/Listener/UserEventsListener.php @@ -122,6 +122,7 @@ class UserEventsListener implements IEventListener { ); } $this->calDav->deleteAllSharesByUser('principals/users/' . $uid); + $this->cardDav->deleteAllSharesByUser('principals/users/' . $uid); foreach ($this->addressBooksToDelete[$uid] as $addressBook) { $this->cardDav->deleteAddressBook($addressBook['id']); diff --git a/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php b/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php index 8e410eb0a78..aa5e419011c 100644 --- a/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php +++ b/apps/dav/tests/unit/DAV/Listener/UserEventsListenerTest.php @@ -132,7 +132,7 @@ class UserEventsListenerTest extends TestCase { $this->userEventsListener->firstLogin($user); } - public function testDeleteCalendar(): void { + public function testDeleteUser(): void { $user = $this->createMock(IUser::class); $user->expects($this->once())->method('getUID')->willReturn('newUser'); @@ -148,6 +148,7 @@ class UserEventsListenerTest extends TestCase { $this->calDavBackend->expects($this->once())->method('deleteCalendar')->with('personal'); $this->calDavBackend->expects($this->once())->method('deleteSubscription')->with('some-subscription'); $this->calDavBackend->expects($this->once())->method('deleteAllSharesByUser'); + $this->cardDavBackend->expects($this->once())->method('deleteAllSharesByUser'); $this->cardDavBackend->expects($this->once())->method('getUsersOwnAddressBooks')->willReturn([ ['id' => 'personal']