diff --git a/apps/dav/lib/CardDAV/SyncService.php b/apps/dav/lib/CardDAV/SyncService.php index 1b5e85fb83c83..0e755778df0e1 100644 --- a/apps/dav/lib/CardDAV/SyncService.php +++ b/apps/dav/lib/CardDAV/SyncService.php @@ -201,7 +201,10 @@ public function syncInstance(?\Closure $progressCallback = null) { $vCard = Reader::read($card['carddata']); $uid = $vCard->UID->getValue(); // load backend and see if user exists - if (!$this->userManager->userExists($uid)) { + $user = $this->userManager->get($uid); + + // If the user does not exist + if ($user === null || self::getCardUri($user) !== $card['uri']) { $this->deleteUser($card['uri']); } } diff --git a/apps/dav/tests/unit/CardDAV/SyncServiceTest.php b/apps/dav/tests/unit/CardDAV/SyncServiceTest.php index 9411bb20e4ae2..5c8c30effbebe 100644 --- a/apps/dav/tests/unit/CardDAV/SyncServiceTest.php +++ b/apps/dav/tests/unit/CardDAV/SyncServiceTest.php @@ -367,6 +367,44 @@ public function testUpdateAndDeleteUser(bool $activated, int $createCalls, int $ $ss->deleteUser($user); } + public function testSyncInstance(): void { + /** @var CardDavBackend | MockObject $backend */ + $backend = $this->getMockBuilder(CardDavBackend::class)->disableOriginalConstructor()->getMock(); + $logger = $this->getMockBuilder(LoggerInterface::class)->disableOriginalConstructor()->getMock(); + + $backend->expects($this->exactly(1))->method('deleteCard'); + + $backend->method('getCards')->willReturn([ + [ + '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", + 'uri' => 'Database:test-user.vcf', + ], + [ + '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", + 'uri' => 'LDAP:test-user.vcf', + ], + ] + ); + + $backend->method('getAddressBooksByUri') + ->with('principals/system/system', 'system') + ->willReturn(['id' => -1]); + + $userManager = $this->createMock(IUserManager::class); + $dbConnection = $this->createMock(IDBConnection::class); + $user = $this->createMock(IUser::class); + $user->method('getBackendClassName')->willReturn('LDAP'); + $user->method('getUID')->willReturn('test-user'); + $userManager->method('get')->willReturn($user); + + $converter = $this->createMock(Converter::class); + $clientService = $this->createMock(IClientService::class); + $config = $this->createMock(IConfig::class); + + $ss = new SyncService($clientService, $config, $backend, $userManager, $dbConnection, $logger, $converter); + $ss->syncInstance(); + } + public function testDeleteAddressbookWhenAccessRevoked(): void { $this->expectException(ClientExceptionInterface::class);