diff options
-rw-r--r-- | apps/dav/composer/composer/autoload_classmap.php | 1 | ||||
-rw-r--r-- | apps/dav/composer/composer/autoload_static.php | 1 | ||||
-rw-r--r-- | apps/dav/lib/CardDAV/SystemAddressbook.php | 47 | ||||
-rw-r--r-- | apps/dav/lib/CardDAV/UserAddressBooks.php | 13 | ||||
-rw-r--r-- | lib/private/Files/Cache/Propagator.php | 4 | ||||
-rw-r--r-- | lib/private/Repair.php | 2 | ||||
-rw-r--r-- | lib/private/Repair/NC15/SetVcardDatabaseUID.php | 31 | ||||
-rw-r--r-- | tests/lib/Repair/SetVcardDatabaseUIDTest.php | 11 |
8 files changed, 95 insertions, 15 deletions
diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php index e935f24e641..537bd72d4ca 100644 --- a/apps/dav/composer/composer/autoload_classmap.php +++ b/apps/dav/composer/composer/autoload_classmap.php @@ -73,6 +73,7 @@ return array( 'OCA\\DAV\\CardDAV\\PhotoCache' => $baseDir . '/../lib/CardDAV/PhotoCache.php', 'OCA\\DAV\\CardDAV\\Plugin' => $baseDir . '/../lib/CardDAV/Plugin.php', 'OCA\\DAV\\CardDAV\\SyncService' => $baseDir . '/../lib/CardDAV/SyncService.php', + 'OCA\\DAV\\CardDAV\\SystemAddressbook' => $baseDir . '/../lib/CardDAV/SystemAddressbook.php', 'OCA\\DAV\\CardDAV\\UserAddressBooks' => $baseDir . '/../lib/CardDAV/UserAddressBooks.php', 'OCA\\DAV\\CardDAV\\Xml\\Groups' => $baseDir . '/../lib/CardDAV/Xml/Groups.php', 'OCA\\DAV\\Command\\CreateAddressBook' => $baseDir . '/../lib/Command/CreateAddressBook.php', diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php index b0ecb09a642..d6c5628b191 100644 --- a/apps/dav/composer/composer/autoload_static.php +++ b/apps/dav/composer/composer/autoload_static.php @@ -88,6 +88,7 @@ class ComposerStaticInitDAV 'OCA\\DAV\\CardDAV\\PhotoCache' => __DIR__ . '/..' . '/../lib/CardDAV/PhotoCache.php', 'OCA\\DAV\\CardDAV\\Plugin' => __DIR__ . '/..' . '/../lib/CardDAV/Plugin.php', 'OCA\\DAV\\CardDAV\\SyncService' => __DIR__ . '/..' . '/../lib/CardDAV/SyncService.php', + 'OCA\\DAV\\CardDAV\\SystemAddressbook' => __DIR__ . '/..' . '/../lib/CardDAV/SystemAddressbook.php', 'OCA\\DAV\\CardDAV\\UserAddressBooks' => __DIR__ . '/..' . '/../lib/CardDAV/UserAddressBooks.php', 'OCA\\DAV\\CardDAV\\Xml\\Groups' => __DIR__ . '/..' . '/../lib/CardDAV/Xml/Groups.php', 'OCA\\DAV\\Command\\CreateAddressBook' => __DIR__ . '/..' . '/../lib/Command/CreateAddressBook.php', diff --git a/apps/dav/lib/CardDAV/SystemAddressbook.php b/apps/dav/lib/CardDAV/SystemAddressbook.php new file mode 100644 index 00000000000..aaeeda5cae2 --- /dev/null +++ b/apps/dav/lib/CardDAV/SystemAddressbook.php @@ -0,0 +1,47 @@ +<?php +declare(strict_types=1); +/** + * @copyright Copyright (c) 2018, Roeland Jago Douma <roeland@famdouma.nl> + * + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\DAV\CardDAV; + +use OCP\IConfig; +use OCP\IL10N; +use Sabre\CardDAV\Backend\BackendInterface; + +class SystemAddressbook extends AddressBook { + /** @var IConfig */ + private $config; + + public function __construct(BackendInterface $carddavBackend, array $addressBookInfo, IL10N $l10n, IConfig $config) { + parent::__construct($carddavBackend, $addressBookInfo, $l10n); + $this->config = $config; + } + + public function getChildren() { + if ($this->config->getAppValue('core', 'shareapi_allow_share_dialog_user_enumeration', 'yes') !== 'yes') { + return []; + } + + return parent::getChildren(); + } +} diff --git a/apps/dav/lib/CardDAV/UserAddressBooks.php b/apps/dav/lib/CardDAV/UserAddressBooks.php index 6a0394676a1..d1fcbf2ce13 100644 --- a/apps/dav/lib/CardDAV/UserAddressBooks.php +++ b/apps/dav/lib/CardDAV/UserAddressBooks.php @@ -22,6 +22,7 @@ */ namespace OCA\DAV\CardDAV; +use OCP\IConfig; use OCP\IL10N; class UserAddressBooks extends \Sabre\CardDAV\AddressBookHome { @@ -29,6 +30,9 @@ class UserAddressBooks extends \Sabre\CardDAV\AddressBookHome { /** @var IL10N */ protected $l10n; + /** @var IConfig */ + protected $config; + /** * Returns a list of addressbooks * @@ -38,11 +42,18 @@ class UserAddressBooks extends \Sabre\CardDAV\AddressBookHome { if ($this->l10n === null) { $this->l10n = \OC::$server->getL10N('dav'); } + if ($this->config === null) { + $this->config = \OC::$server->getConfig(); + } $addressBooks = $this->carddavBackend->getAddressBooksForUser($this->principalUri); $objects = []; foreach($addressBooks as $addressBook) { - $objects[] = new AddressBook($this->carddavBackend, $addressBook, $this->l10n); + if ($addressBook['principaluri'] === 'principals/system/system') { + $objects[] = new SystemAddressbook($this->carddavBackend, $addressBook, $this->l10n, $this->config); + } else { + $objects[] = new AddressBook($this->carddavBackend, $addressBook, $this->l10n); + } } return $objects; diff --git a/lib/private/Files/Cache/Propagator.php b/lib/private/Files/Cache/Propagator.php index ae51b2e52d8..f0cedb39850 100644 --- a/lib/private/Files/Cache/Propagator.php +++ b/lib/private/Files/Cache/Propagator.php @@ -97,9 +97,9 @@ class Propagator implements IPropagator { ->where($builder->expr()->eq('storage', $builder->createNamedParameter($storageId, IQueryBuilder::PARAM_INT))) ->andWhere($builder->expr()->in('path_hash', $hashParams)) ->andWhere($builder->expr()->gt('size', $builder->expr()->literal(-1, IQueryBuilder::PARAM_INT))); - } - $builder->execute(); + $builder->execute(); + } } protected function getParents($path) { diff --git a/lib/private/Repair.php b/lib/private/Repair.php index da825c9a7ad..8bb3d3327a6 100644 --- a/lib/private/Repair.php +++ b/lib/private/Repair.php @@ -147,7 +147,7 @@ class Repair implements IOutput { new AddPreviewBackgroundCleanupJob(\OC::$server->getJobList()), new AddCleanupUpdaterBackupsJob(\OC::$server->getJobList()), new RepairPendingCronJobs(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig()), - new SetVcardDatabaseUID(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig()) + new SetVcardDatabaseUID(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig(), \OC::$server->getLogger()) ]; } diff --git a/lib/private/Repair/NC15/SetVcardDatabaseUID.php b/lib/private/Repair/NC15/SetVcardDatabaseUID.php index 210fc0a862c..cefb1c18111 100644 --- a/lib/private/Repair/NC15/SetVcardDatabaseUID.php +++ b/lib/private/Repair/NC15/SetVcardDatabaseUID.php @@ -25,9 +25,11 @@ namespace OC\Repair\NC15; use OCP\IConfig; use OCP\IDBConnection; +use OCP\ILogger; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; use Sabre\VObject\Reader; +use Sabre\VObject\ParseException; class SetVcardDatabaseUID implements IRepairStep { const MAX_ROWS = 1000; @@ -38,11 +40,15 @@ class SetVcardDatabaseUID implements IRepairStep { /** @var IConfig */ private $config; + /** @var ILogger */ + private $logger; + private $updateQuery; - public function __construct(IDBConnection $connection, IConfig $config) { + public function __construct(IDBConnection $connection, IConfig $config, ILogger $logger) { $this->connection = $connection; $this->config = $config; + $this->logger = $logger; } public function getName() { @@ -75,13 +81,20 @@ class SetVcardDatabaseUID implements IRepairStep { * Extract UID from vcard * * @param string $cardData the vcard raw data + * @param IOutput $output the output logger * @return string the uid or empty if none */ - private function getUID(string $cardData): string { - $vCard = Reader::read($cardData); - if ($vCard->UID) { - $uid = $vCard->UID->getValue(); - return $uid; + private function getUID(string $cardData, IOutput $output): string { + try { + $vCard = Reader::read($cardData); + if ($vCard->UID) { + $uid = $vCard->UID->getValue(); + + return $uid; + } + } catch (ParseException $e) { + $output->warning('One vCard is broken. We logged the exception and will continue the repair.'); + $this->logger->logException($e); } return ''; @@ -106,7 +119,7 @@ class SetVcardDatabaseUID implements IRepairStep { $this->updateQuery->execute(); } - private function repair(): int { + private function repair(IOutput $output): int { $this->connection->beginTransaction(); $entries = $this->getInvalidEntries(); $count = 0; @@ -116,7 +129,7 @@ class SetVcardDatabaseUID implements IRepairStep { if (is_resource($cardData)) { $cardData = stream_get_contents($cardData); } - $uid = $this->getUID($cardData); + $uid = $this->getUID($cardData, $output); $this->update($entry['id'], $uid); } $this->connection->commit(); @@ -133,7 +146,7 @@ class SetVcardDatabaseUID implements IRepairStep { public function run(IOutput $output) { if ($this->shouldRun()) { - $count = $this->repair(); + $count = $this->repair($output); $output->info('Fixed ' . $count . ' vcards'); } diff --git a/tests/lib/Repair/SetVcardDatabaseUIDTest.php b/tests/lib/Repair/SetVcardDatabaseUIDTest.php index 97da3c6a901..2939528a21a 100644 --- a/tests/lib/Repair/SetVcardDatabaseUIDTest.php +++ b/tests/lib/Repair/SetVcardDatabaseUIDTest.php @@ -24,6 +24,8 @@ namespace Test\Repair; use OCP\IConfig; +use OCP\ILogger; +use OCP\Migration\IOutput; use OC\Repair\NC15\SetVcardDatabaseUID; use Test\TestCase; @@ -38,11 +40,15 @@ class SetVcardDatabaseUIDTest extends TestCase { /** @var IConfig */ private $config; + /** @var Ilogger */ + private $logger; + protected function setUp() { parent::setUp(); $this->config = $this->createMock(IConfig::class); - $this->repair = new SetVcardDatabaseUID(\OC::$server->getDatabaseConnection(), $this->config); + $this->logger = $this->createMock(Ilogger::class); + $this->repair = new SetVcardDatabaseUID(\OC::$server->getDatabaseConnection(), $this->config, $this->logger); } protected function tearDown() { @@ -86,7 +92,8 @@ class SetVcardDatabaseUIDTest extends TestCase { * @param string|boolean $expected */ public function testExtractUIDFromVcard($from, $expected) { - $uid = $this->invokePrivate($this->repair, 'getUid', ['carddata' => $from]); + $output = $this->createMock(IOutput::class); + $uid = $this->invokePrivate($this->repair, 'getUid', ['carddata' => $from, 'output' => $output]); $this->assertEquals($expected, $uid); } |