From 052701137804a6d885f5d7674f3f6b52b7a6df9a Mon Sep 17 00:00:00 2001 From: Tom Needham Date: Wed, 15 Feb 2017 21:57:32 +0000 Subject: [PATCH] Fix delete user dav hook to only delete users addressbooks --- apps/dav/lib/CardDAV/CardDavBackend.php | 33 +++++++++++++++---- apps/dav/lib/HookManager.php | 2 +- .../tests/unit/CardDAV/CardDavBackendTest.php | 2 +- apps/dav/tests/unit/DAV/HookManagerTest.php | 5 +-- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/apps/dav/lib/CardDAV/CardDavBackend.php b/apps/dav/lib/CardDAV/CardDavBackend.php index 66d645f40da0..fdf82ca74dd7 100644 --- a/apps/dav/lib/CardDAV/CardDavBackend.php +++ b/apps/dav/lib/CardDAV/CardDavBackend.php @@ -100,8 +100,7 @@ public function __construct(IDBConnection $db, * @param string $principalUri * @return array */ - function getAddressBooksForUser($principalUri) { - $principalUriOriginal = $principalUri; + function getUsersOwnAddressBooks($principalUri) { $principalUri = $this->convertPrincipal($principalUri, true); $query = $this->db->getQueryBuilder(); $query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken']) @@ -111,21 +110,43 @@ function getAddressBooksForUser($principalUri) { $addressBooks = []; $result = $query->execute(); - while($row = $result->fetch()) { + while ($row = $result->fetch()) { $addressBooks[$row['id']] = [ - 'id' => $row['id'], + 'id' => $row['id'], 'uri' => $row['uri'], 'principaluri' => $this->convertPrincipal($row['principaluri'], false), '{DAV:}displayname' => $row['displayname'], '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'], '{http://calendarserver.org/ns/}getctag' => $row['synctoken'], - '{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0', + '{http://sabredav.org/ns}sync-token' => $row['synctoken'] ? $row['synctoken'] : '0', ]; } $result->closeCursor(); + return array_values($addressBooks); + } + + /** + * Returns the list of address books for a specific user, including shared by other users. + * + * Every addressbook should have the following properties: + * id - an arbitrary unique id + * uri - the 'basename' part of the url + * principaluri - Same as the passed parameter + * + * Any additional clark-notation property may be passed besides this. Some + * common ones are : + * {DAV:}displayname + * {urn:ietf:params:xml:ns:carddav}addressbook-description + * {http://calendarserver.org/ns/}getctag + * + * @param string $principalUri + * @return array + */ + function getAddressBooksForUser($principalUri) { + $addressBooks = $this->getUsersOwnAddressBooks($principalUri); // query for shared calendars - $principals = $this->principalBackend->getGroupMembership($principalUriOriginal, true); + $principals = $this->principalBackend->getGroupMembership($principalUri, true); $principals[]= $principalUri; $query = $this->db->getQueryBuilder(); diff --git a/apps/dav/lib/HookManager.php b/apps/dav/lib/HookManager.php index 3de1392afe67..d48d8cccb8de 100644 --- a/apps/dav/lib/HookManager.php +++ b/apps/dav/lib/HookManager.php @@ -96,7 +96,7 @@ public function preDeleteUser($params) { $uid = $params['uid']; $this->usersToDelete[$uid] = $this->userManager->get($uid); $this->calendarsToDelete = $this->calDav->getUsersOwnCalendars('principals/users/' . $uid); - $this->addressBooksToDelete = $this->cardDav->getAddressBooksForUser('principals/users/' . $uid); + $this->addressBooksToDelete = $this->cardDav->getUsersOwnAddressBooks('principals/users/' . $uid); } public function postDeleteUser($params) { diff --git a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php index 8c321f77e3b6..892134b66315 100644 --- a/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php +++ b/apps/dav/tests/unit/CardDAV/CardDavBackendTest.php @@ -263,7 +263,7 @@ public function testDeleteWithoutCard() { // create a new address book $this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []); - $books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER); + $books = $this->backend->getUsersOwnAddressBooks(self::UNIT_TEST_USER); $this->assertEquals(1, count($books)); $bookId = $books[0]['id']; diff --git a/apps/dav/tests/unit/DAV/HookManagerTest.php b/apps/dav/tests/unit/DAV/HookManagerTest.php index f16cfe48df39..2887b8cae62e 100644 --- a/apps/dav/tests/unit/DAV/HookManagerTest.php +++ b/apps/dav/tests/unit/DAV/HookManagerTest.php @@ -207,13 +207,14 @@ public function testDeleteCalendar() { $card = $this->getMockBuilder(CardDavBackend::class) ->disableOriginalConstructor() ->getMock(); - $card->expects($this->once())->method('getAddressBooksForUser')->willReturn([ + $card->expects($this->once())->method('getUsersOwnAddressBooks')->willReturn([ ['id' => 'personal'] ]); - $card->expects($this->once())->method('deleteAddressBook'); + $card->expects($this->once())->method('deleteAddressBook')->with('personal'); $hm = new HookManager($userManager, $syncService, $cal, $card, $this->l10n); $hm->preDeleteUser(['uid' => 'newUser']); $hm->postDeleteUser(['uid' => 'newUser']); } + }