diff --git a/apps/dav/lib/CardDAV/AddressBookImpl.php b/apps/dav/lib/CardDAV/AddressBookImpl.php index 6ec3fed827..02dc7c5d01 100644 --- a/apps/dav/lib/CardDAV/AddressBookImpl.php +++ b/apps/dav/lib/CardDAV/AddressBookImpl.php @@ -281,12 +281,7 @@ class AddressBookImpl implements IAddressBook { } } - if ( - $this->addressBookInfo['principaluri'] === 'principals/system/system' && ( - $this->addressBookInfo['uri'] === 'system' || - $this->addressBookInfo['{DAV:}displayname'] === $this->urlGenerator->getBaseUrl() - ) - ) { + if ($this->isSystemAddressBook()) { $result['isLocalSystemBook'] = true; } return $result; @@ -309,4 +304,26 @@ class AddressBookImpl implements IAddressBook { return null; } + + /** + * @inheritDoc + */ + public function isShared(): bool { + if (!isset($this->addressBookInfo['{http://owncloud.org/ns}owner-principal'])) { + return false; + } + + return $this->addressBookInfo['principaluri'] + !== $this->addressBookInfo['{http://owncloud.org/ns}owner-principal']; + } + + /** + * @inheritDoc + */ + public function isSystemAddressBook(): bool { + return $this->addressBookInfo['principaluri'] === 'principals/system/system' && ( + $this->addressBookInfo['uri'] === 'system' || + $this->addressBookInfo['{DAV:}displayname'] === $this->urlGenerator->getBaseUrl() + ); + } } diff --git a/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php b/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php index cc7e50e937..242106fbcc 100644 --- a/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php +++ b/apps/dav/tests/unit/CardDAV/AddressBookImplTest.php @@ -447,4 +447,63 @@ class AddressBookImplTest extends TestCase { 'isLocalSystemBook' => true, ], $array); } + + public function testIsSystemAddressBook(): void { + $addressBookInfo = [ + '{http://owncloud.org/ns}owner-principal' => 'principals/system/system', + 'principaluri' => 'principals/system/system', + '{DAV:}displayname' => 'display name', + 'id' => 666, + 'uri' => 'system', + ]; + + $addressBookImpl = new AddressBookImpl( + $this->addressBook, + $addressBookInfo, + $this->backend, + $this->urlGenerator + ); + + $this->assertTrue($addressBookImpl->isSystemAddressBook()); + } + + public function testIsShared(): void { + $addressBookInfo = [ + '{http://owncloud.org/ns}owner-principal' => 'user1', + '{DAV:}displayname' => 'Test address book', + 'principaluri' => 'user2', + 'id' => 666, + 'uri' => 'default', + ]; + + $addressBookImpl = new AddressBookImpl( + $this->addressBook, + $addressBookInfo, + $this->backend, + $this->urlGenerator + ); + + $this->assertFalse($addressBookImpl->isSystemAddressBook()); + $this->assertTrue($addressBookImpl->isShared()); + } + + public function testIsNotShared(): void { + $addressBookInfo = [ + '{http://owncloud.org/ns}owner-principal' => 'user1', + '{DAV:}displayname' => 'Test address book', + 'principaluri' => 'user1', + 'id' => 666, + 'uri' => 'default', + ]; + + $addressBookImpl = new AddressBookImpl( + $this->addressBook, + $addressBookInfo, + $this->backend, + $this->urlGenerator + ); + + $this->assertFalse($addressBookImpl->isSystemAddressBook()); + $this->assertFalse($addressBookImpl->isShared()); + } } diff --git a/lib/public/IAddressBook.php b/lib/public/IAddressBook.php index b2c9a103c2..ed66af4aa1 100644 --- a/lib/public/IAddressBook.php +++ b/lib/public/IAddressBook.php @@ -107,5 +107,20 @@ namespace OCP { * @since 5.0.0 */ public function delete($id); + + /** + * Returns true if this address-book is not owned by the current user, + * but shared with them. + * + * @return bool + * @since 20.0.0 + */ + public function isShared(): bool; + + /** + * @return bool + * @since 20.0.0 + */ + public function isSystemAddressBook(): bool; } }