Skip to content

Commit c73ddd4

Browse files
authored
Merge pull request #59507 from nextcloud/fix/noid/sab-clean-wrong-backend
fix: Remove SAB entries if backend does not match
2 parents c574c1b + bfd3e8e commit c73ddd4

2 files changed

Lines changed: 42 additions & 1 deletion

File tree

apps/dav/lib/CardDAV/SyncService.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,10 @@ public function syncInstance(?\Closure $progressCallback = null) {
201201
$vCard = Reader::read($card['carddata']);
202202
$uid = $vCard->UID->getValue();
203203
// load backend and see if user exists
204-
if (!$this->userManager->userExists($uid)) {
204+
$user = $this->userManager->get($uid);
205+
206+
// If the user does not exist
207+
if ($user === null || self::getCardUri($user) !== $card['uri']) {
205208
$this->deleteUser($card['uri']);
206209
}
207210
}

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,44 @@ public function testUpdateAndDeleteUser(bool $activated, int $createCalls, int $
367367
$ss->deleteUser($user);
368368
}
369369

370+
public function testSyncInstance(): void {
371+
/** @var CardDavBackend | MockObject $backend */
372+
$backend = $this->getMockBuilder(CardDavBackend::class)->disableOriginalConstructor()->getMock();
373+
$logger = $this->getMockBuilder(LoggerInterface::class)->disableOriginalConstructor()->getMock();
374+
375+
$backend->expects($this->exactly(1))->method('deleteCard');
376+
377+
$backend->method('getCards')->willReturn([
378+
[
379+
'carddata' => "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.8//EN\r\nUID:test-user\r\nFN:test-user\r\nN:test-user;;;;\r\nEND:VCARD\r\n\r\n",
380+
'uri' => 'Database:test-user.vcf',
381+
],
382+
[
383+
'carddata' => "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.4.8//EN\r\nUID:test-user\r\nFN:test-user\r\nN:test-user;;;;\r\nEND:VCARD\r\n\r\n",
384+
'uri' => 'LDAP:test-user.vcf',
385+
],
386+
]
387+
);
388+
389+
$backend->method('getAddressBooksByUri')
390+
->with('principals/system/system', 'system')
391+
->willReturn(['id' => -1]);
392+
393+
$userManager = $this->createMock(IUserManager::class);
394+
$dbConnection = $this->createMock(IDBConnection::class);
395+
$user = $this->createMock(IUser::class);
396+
$user->method('getBackendClassName')->willReturn('LDAP');
397+
$user->method('getUID')->willReturn('test-user');
398+
$userManager->method('get')->willReturn($user);
399+
400+
$converter = $this->createMock(Converter::class);
401+
$clientService = $this->createMock(IClientService::class);
402+
$config = $this->createMock(IConfig::class);
403+
404+
$ss = new SyncService($clientService, $config, $backend, $userManager, $dbConnection, $logger, $converter);
405+
$ss->syncInstance();
406+
}
407+
370408
public function testDeleteAddressbookWhenAccessRevoked(): void {
371409
$this->expectException(ClientExceptionInterface::class);
372410

0 commit comments

Comments
 (0)