Skip to content

Commit 44186ca

Browse files
authored
Merge pull request #3473 from nextcloud/fix-addressbook-deletion
Address book data lost when any user receiving a share is deleted
2 parents 8138022 + 7e9411b commit 44186ca

File tree

4 files changed

+30
-3
lines changed

4 files changed

+30
-3
lines changed

apps/dav/lib/CardDAV/CardDavBackend.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,33 @@ function getAddressBooksForUser($principalUri) {
195195
return array_values($addressBooks);
196196
}
197197

198+
public function getUsersOwnAddressBooks($principalUri) {
199+
$principalUriOriginal = $principalUri;
200+
$principalUri = $this->convertPrincipal($principalUri, true);
201+
$query = $this->db->getQueryBuilder();
202+
$query->select(['id', 'uri', 'displayname', 'principaluri', 'description', 'synctoken'])
203+
->from('addressbooks')
204+
->where($query->expr()->eq('principaluri', $query->createNamedParameter($principalUri)));
205+
206+
$addressBooks = [];
207+
208+
$result = $query->execute();
209+
while($row = $result->fetch()) {
210+
$addressBooks[$row['id']] = [
211+
'id' => $row['id'],
212+
'uri' => $row['uri'],
213+
'principaluri' => $this->convertPrincipal($row['principaluri'], false),
214+
'{DAV:}displayname' => $row['displayname'],
215+
'{' . Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
216+
'{http://calendarserver.org/ns/}getctag' => $row['synctoken'],
217+
'{http://sabredav.org/ns}sync-token' => $row['synctoken']?$row['synctoken']:'0',
218+
];
219+
}
220+
$result->closeCursor();
221+
222+
return array_values($addressBooks);
223+
}
224+
198225
private function getUserDisplayName($uid) {
199226
if (!isset($this->userDisplayNames[$uid])) {
200227
$user = $this->userManager->get($uid);

apps/dav/lib/HookManager.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public function preDeleteUser($params) {
9696
$uid = $params['uid'];
9797
$this->usersToDelete[$uid] = $this->userManager->get($uid);
9898
$this->calendarsToDelete = $this->calDav->getUsersOwnCalendars('principals/users/' . $uid);
99-
$this->addressBooksToDelete = $this->cardDav->getAddressBooksForUser('principals/users/' . $uid);
99+
$this->addressBooksToDelete = $this->cardDav->getUsersOwnAddressBooks('principals/users/' . $uid);
100100
}
101101

102102
public function postDeleteUser($params) {

apps/dav/tests/unit/CardDAV/CardDavBackendTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ public function testDeleteWithoutCard() {
273273

274274
// create a new address book
275275
$this->backend->createAddressBook(self::UNIT_TEST_USER, 'Example', []);
276-
$books = $this->backend->getAddressBooksForUser(self::UNIT_TEST_USER);
276+
$books = $this->backend->getUsersOwnAddressBooks(self::UNIT_TEST_USER);
277277
$this->assertEquals(1, count($books));
278278

279279
$bookId = $books[0]['id'];

apps/dav/tests/unit/DAV/HookManagerTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ public function testDeleteCalendar() {
195195
$card = $this->getMockBuilder(CardDavBackend::class)
196196
->disableOriginalConstructor()
197197
->getMock();
198-
$card->expects($this->once())->method('getAddressBooksForUser')->willReturn([
198+
$card->expects($this->once())->method('getUsersOwnAddressBooks')->willReturn([
199199
['id' => 'personal']
200200
]);
201201
$card->expects($this->once())->method('deleteAddressBook');

0 commit comments

Comments
 (0)