Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions apps/dav/lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -263,12 +263,11 @@ private function setupContactsProvider(IContactsManager $contactsManager,
$cm->setupContactsProvider($contactsManager, $userID, $urlGenerator);
}

private function setupSystemContactsProvider(IContactsManager $contactsManager,
IAppContainer $container): void {
private function setupSystemContactsProvider(IContactsManager $contactsManager, IAppContainer $container): void {
/** @var ContactsManager $cm */
$cm = $container->query(ContactsManager::class);
$urlGenerator = $container->getServer()->getURLGenerator();
$cm->setupSystemContactsProvider($contactsManager, $urlGenerator);
$cm->setupSystemContactsProvider($contactsManager, null, $urlGenerator);
}

public function registerCalendarManager(ICalendarManager $calendarManager,
Expand Down
28 changes: 26 additions & 2 deletions apps/dav/lib/CardDAV/AddressBookImpl.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,16 @@
*/
namespace OCA\DAV\CardDAV;

use OCA\DAV\Db\PropertyMapper;
use OCP\Constants;
use OCP\IAddressBook;
use OCP\IAddressBookEnabled;
use OCP\IURLGenerator;
use Sabre\VObject\Component\VCard;
use Sabre\VObject\Property;
use Sabre\VObject\Reader;
use Sabre\VObject\UUIDUtil;

class AddressBookImpl implements IAddressBook {
class AddressBookImpl implements IAddressBookEnabled {

/**
* AddressBookImpl constructor.
Expand All @@ -30,6 +31,8 @@ public function __construct(
private array $addressBookInfo,
private CardDavBackend $backend,
private IURLGenerator $urlGenerator,
private PropertyMapper $propertyMapper,
private ?string $userId,
) {
}

Expand Down Expand Up @@ -308,4 +311,25 @@ public function isSystemAddressBook(): bool {
$this->addressBookInfo['{DAV:}displayname'] === $this->urlGenerator->getBaseUrl()
);
}

public function isEnabled(): bool {
if (!$this->userId) {
return true;
}

if ($this->isSystemAddressBook()) {
$user = $this->userId ;
$uri = 'z-server-generated--system';
} else {
$user = str_replace('principals/users/', '', $this->addressBookInfo['principaluri']);
$uri = $this->addressBookInfo['uri'];
}

$path = 'addressbooks/users/' . $user . '/' . $uri;
$properties = $this->propertyMapper->findPropertyByPathAndName($user, $path, '{http://owncloud.org/ns}enabled');
if (count($properties) > 0) {
return (bool)$properties[0]->getPropertyvalue();
}
return true;
}
}
18 changes: 12 additions & 6 deletions apps/dav/lib/CardDAV/ContactsManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
*/
namespace OCA\DAV\CardDAV;

use OCA\DAV\Db\PropertyMapper;
use OCP\Contacts\IManager;
use OCP\IL10N;
use OCP\IURLGenerator;
Expand All @@ -21,6 +22,7 @@ class ContactsManager {
public function __construct(
private CardDavBackend $backend,
private IL10N $l10n,
private PropertyMapper $propertyMapper,
) {
}

Expand All @@ -31,33 +33,37 @@ public function __construct(
*/
public function setupContactsProvider(IManager $cm, $userId, IURLGenerator $urlGenerator) {
$addressBooks = $this->backend->getAddressBooksForUser("principals/users/$userId");
$this->register($cm, $addressBooks, $urlGenerator);
$this->setupSystemContactsProvider($cm, $urlGenerator);
$this->register($cm, $addressBooks, $urlGenerator, $userId);
$this->setupSystemContactsProvider($cm, $userId, $urlGenerator);
}

/**
* @param IManager $cm
* @param ?string $userId
* @param IURLGenerator $urlGenerator
*/
public function setupSystemContactsProvider(IManager $cm, IURLGenerator $urlGenerator) {
public function setupSystemContactsProvider(IManager $cm, ?string $userId, IURLGenerator $urlGenerator) {
$addressBooks = $this->backend->getAddressBooksForUser('principals/system/system');
$this->register($cm, $addressBooks, $urlGenerator);
$this->register($cm, $addressBooks, $urlGenerator, $userId);
}

/**
* @param IManager $cm
* @param $addressBooks
* @param IURLGenerator $urlGenerator
* @param ?string $userId
*/
private function register(IManager $cm, $addressBooks, $urlGenerator) {
private function register(IManager $cm, $addressBooks, $urlGenerator, ?string $userId) {
foreach ($addressBooks as $addressBookInfo) {
$addressBook = new AddressBook($this->backend, $addressBookInfo, $this->l10n);
$cm->registerAddressBook(
new AddressBookImpl(
$addressBook,
$addressBookInfo,
$this->backend,
$urlGenerator
$urlGenerator,
$this->propertyMapper,
$userId,
)
);
}
Expand Down
31 changes: 27 additions & 4 deletions apps/dav/tests/unit/CardDAV/AddressBookImplTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use OCA\DAV\CardDAV\AddressBook;
use OCA\DAV\CardDAV\AddressBookImpl;
use OCA\DAV\CardDAV\CardDavBackend;
use OCA\DAV\Db\PropertyMapper;
use OCP\IURLGenerator;
use Sabre\VObject\Component\VCard;
use Sabre\VObject\Property\Text;
Expand All @@ -32,6 +33,9 @@ class AddressBookImplTest extends TestCase {
/** @var CardDavBackend | \PHPUnit\Framework\MockObject\MockObject */
private $backend;

/** @var PropertyMapper | \PHPUnit\Framework\MockObject\MockObject */
private $propertyMapper;

/** @var VCard | \PHPUnit\Framework\MockObject\MockObject */
private $vCard;

Expand All @@ -50,12 +54,15 @@ protected function setUp(): void {
->disableOriginalConstructor()->getMock();
$this->vCard = $this->createMock(VCard::class);
$this->urlGenerator = $this->createMock(IURLGenerator::class);
$this->propertyMapper = $this->createMock(PropertyMapper::class);

$this->addressBookImpl = new AddressBookImpl(
$this->addressBook,
$this->addressBookInfo,
$this->backend,
$this->urlGenerator
$this->urlGenerator,
$this->propertyMapper,
null
);
}

Expand All @@ -78,6 +85,8 @@ public function testSearch(): void {
$this->addressBookInfo,
$this->backend,
$this->urlGenerator,
$this->propertyMapper,
null
]
)
->setMethods(['vCard2Array', 'readCard'])
Expand Down Expand Up @@ -124,6 +133,8 @@ public function testCreate($properties): void {
$this->addressBookInfo,
$this->backend,
$this->urlGenerator,
$this->propertyMapper,
null
]
)
->setMethods(['vCard2Array', 'createUid', 'createEmptyVCard'])
Expand Down Expand Up @@ -174,6 +185,8 @@ public function testUpdate(): void {
$this->addressBookInfo,
$this->backend,
$this->urlGenerator,
$this->propertyMapper,
null
]
)
->setMethods(['vCard2Array', 'createUid', 'createEmptyVCard', 'readCard'])
Expand Down Expand Up @@ -211,6 +224,8 @@ public function testUpdateWithTypes(): void {
$this->addressBookInfo,
$this->backend,
$this->urlGenerator,
$this->propertyMapper,
null
]
)
->setMethods(['vCard2Array', 'createUid', 'createEmptyVCard', 'readCard'])
Expand Down Expand Up @@ -292,6 +307,8 @@ public function testCreateUid(): void {
$this->addressBookInfo,
$this->backend,
$this->urlGenerator,
$this->propertyMapper,
null
]
)
->setMethods(['getUid'])
Expand Down Expand Up @@ -488,7 +505,9 @@ public function testIsSystemAddressBook(): void {
$this->addressBook,
$addressBookInfo,
$this->backend,
$this->urlGenerator
$this->urlGenerator,
$this->propertyMapper,
null
);

$this->assertTrue($addressBookImpl->isSystemAddressBook());
Expand All @@ -507,7 +526,9 @@ public function testIsShared(): void {
$this->addressBook,
$addressBookInfo,
$this->backend,
$this->urlGenerator
$this->urlGenerator,
$this->propertyMapper,
'user2'
);

$this->assertFalse($addressBookImpl->isSystemAddressBook());
Expand All @@ -527,7 +548,9 @@ public function testIsNotShared(): void {
$this->addressBook,
$addressBookInfo,
$this->backend,
$this->urlGenerator
$this->urlGenerator,
$this->propertyMapper,
'user2'
);

$this->assertFalse($addressBookImpl->isSystemAddressBook());
Expand Down
4 changes: 3 additions & 1 deletion apps/dav/tests/unit/CardDAV/ContactsManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

use OCA\DAV\CardDAV\CardDavBackend;
use OCA\DAV\CardDAV\ContactsManager;
use OCA\DAV\Db\PropertyMapper;
use OCP\Contacts\IManager;
use OCP\IL10N;
use OCP\IURLGenerator;
Expand All @@ -25,9 +26,10 @@ public function test(): void {
$backEnd->method('getAddressBooksForUser')->willReturn([
['{DAV:}displayname' => 'Test address book', 'uri' => 'default'],
]);
$propertyMapper = $this->createMock(PropertyMapper::class);

$l = $this->createMock(IL10N::class);
$app = new ContactsManager($backEnd, $l);
$app = new ContactsManager($backEnd, $l, $propertyMapper);
$app->setupContactsProvider($cm, 'user01', $urlGenerator);
}
}
1 change: 1 addition & 0 deletions lib/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -551,6 +551,7 @@
'OCP\\Http\\WellKnown\\IResponse' => $baseDir . '/lib/public/Http/WellKnown/IResponse.php',
'OCP\\Http\\WellKnown\\JrdResponse' => $baseDir . '/lib/public/Http/WellKnown/JrdResponse.php',
'OCP\\IAddressBook' => $baseDir . '/lib/public/IAddressBook.php',
'OCP\\IAddressBookEnabled' => $baseDir . '/lib/public/IAddressBookEnabled.php',
'OCP\\IAppConfig' => $baseDir . '/lib/public/IAppConfig.php',
'OCP\\IAvatar' => $baseDir . '/lib/public/IAvatar.php',
'OCP\\IAvatarManager' => $baseDir . '/lib/public/IAvatarManager.php',
Expand Down
1 change: 1 addition & 0 deletions lib/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -600,6 +600,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Http\\WellKnown\\IResponse' => __DIR__ . '/../../..' . '/lib/public/Http/WellKnown/IResponse.php',
'OCP\\Http\\WellKnown\\JrdResponse' => __DIR__ . '/../../..' . '/lib/public/Http/WellKnown/JrdResponse.php',
'OCP\\IAddressBook' => __DIR__ . '/../../..' . '/lib/public/IAddressBook.php',
'OCP\\IAddressBookEnabled' => __DIR__ . '/../../..' . '/lib/public/IAddressBookEnabled.php',
'OCP\\IAppConfig' => __DIR__ . '/../../..' . '/lib/public/IAppConfig.php',
'OCP\\IAvatar' => __DIR__ . '/../../..' . '/lib/public/IAvatar.php',
'OCP\\IAvatarManager' => __DIR__ . '/../../..' . '/lib/public/IAvatarManager.php',
Expand Down
4 changes: 4 additions & 0 deletions lib/private/ContactsManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
use OCP\Constants;
use OCP\Contacts\IManager;
use OCP\IAddressBook;
use OCP\IAddressBookEnabled;

class ContactsManager implements IManager {
/**
Expand All @@ -34,6 +35,9 @@ public function search($pattern, $searchProperties = [], $options = []) {
$this->loadAddressBooks();
$result = [];
foreach ($this->addressBooks as $addressBook) {
if ($addressBook instanceof IAddressBookEnabled && !$addressBook->isEnabled()) {
continue;
}
$searchOptions = $options;
$strictSearch = array_key_exists('strict_search', $options) && $options['strict_search'] === true;

Expand Down
26 changes: 26 additions & 0 deletions lib/public/IAddressBookEnabled.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors"
* SPDX-License-Identifier: AGPL-3.0-only
*/
// use OCP namespace for all classes that are considered public.
// This means that they should be used by apps instead of the internal Nextcloud classes

namespace OCP;

/**
* IAddressBook Interface extension for checking if the address book is enabled
*
* @since 32.0.0
*/
interface IAddressBookEnabled extends IAddressBook {
/**
* Check if the address book is enabled
* @return bool
* @since 32.0.0
*/
public function isEnabled(): bool;
}
Loading
Loading