From 26c1e33d115cad3029c0663b7a388be0aff6417b Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Thu, 24 May 2018 09:27:40 +0200 Subject: Move repairstep to a custom command People that have issues can run it manually Signed-off-by: Roeland Jago Douma --- apps/dav/appinfo/info.xml | 2 +- apps/dav/composer/composer/autoload_classmap.php | 2 +- apps/dav/composer/composer/autoload_static.php | 2 +- apps/dav/lib/Command/RemoveInvalidShares.php | 82 +++++++++++++++++ apps/dav/lib/Repair/RemoveInvalidShares.php | 100 --------------------- .../tests/unit/Command/RemoveInvalidSharesTest.php | 71 +++++++++++++++ .../tests/unit/Repair/RemoveInvalidSharesTest.php | 70 --------------- lib/private/Repair.php | 4 +- 8 files changed, 159 insertions(+), 174 deletions(-) create mode 100644 apps/dav/lib/Command/RemoveInvalidShares.php delete mode 100644 apps/dav/lib/Repair/RemoveInvalidShares.php create mode 100644 apps/dav/tests/unit/Command/RemoveInvalidSharesTest.php delete mode 100644 apps/dav/tests/unit/Repair/RemoveInvalidSharesTest.php diff --git a/apps/dav/appinfo/info.xml b/apps/dav/appinfo/info.xml index 5e0847ff5d1..2dcb986c841 100644 --- a/apps/dav/appinfo/info.xml +++ b/apps/dav/appinfo/info.xml @@ -28,7 +28,6 @@ OCA\DAV\Migration\FixBirthdayCalendarComponent OCA\DAV\Migration\CalDAVRemoveEmptyValue OCA\DAV\Migration\BuildCalendarSearchIndex - OCA\DAV\Repair\RemoveInvalidShares @@ -37,6 +36,7 @@ OCA\DAV\Command\CreateCalendar OCA\DAV\Command\SyncBirthdayCalendar OCA\DAV\Command\SyncSystemAddressBook + OCA\DAV\Command\RemoveInvalidShares diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php index d4ef0a5337a..075ee593ad7 100644 --- a/apps/dav/composer/composer/autoload_classmap.php +++ b/apps/dav/composer/composer/autoload_classmap.php @@ -65,6 +65,7 @@ return array( 'OCA\\DAV\\CardDAV\\Xml\\Groups' => $baseDir . '/../lib/CardDAV/Xml/Groups.php', 'OCA\\DAV\\Command\\CreateAddressBook' => $baseDir . '/../lib/Command/CreateAddressBook.php', 'OCA\\DAV\\Command\\CreateCalendar' => $baseDir . '/../lib/Command/CreateCalendar.php', + 'OCA\\DAV\\Command\\RemoveInvalidShares' => $baseDir . '/../lib/Command/RemoveInvalidShares.php', 'OCA\\DAV\\Command\\SyncBirthdayCalendar' => $baseDir . '/../lib/Command/SyncBirthdayCalendar.php', 'OCA\\DAV\\Command\\SyncSystemAddressBook' => $baseDir . '/../lib/Command/SyncSystemAddressBook.php', 'OCA\\DAV\\Comments\\CommentNode' => $baseDir . '/../lib/Comments/CommentNode.php', @@ -142,7 +143,6 @@ return array( 'OCA\\DAV\\Migration\\Version1004Date20170924124212' => $baseDir . '/../lib/Migration/Version1004Date20170924124212.php', 'OCA\\DAV\\Migration\\Version1004Date20170926103422' => $baseDir . '/../lib/Migration/Version1004Date20170926103422.php', 'OCA\\DAV\\Migration\\Version1005Date20180413093149' => $baseDir . '/../lib/Migration/Version1005Date20180413093149.php', - 'OCA\\DAV\\Repair\\RemoveInvalidShares' => $baseDir . '/../lib/Repair/RemoveInvalidShares.php', 'OCA\\DAV\\RootCollection' => $baseDir . '/../lib/RootCollection.php', 'OCA\\DAV\\Server' => $baseDir . '/../lib/Server.php', 'OCA\\DAV\\Settings\\CalDAVSettings' => $baseDir . '/../lib/Settings/CalDAVSettings.php', diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php index afaecd28e8e..e4938350aa4 100644 --- a/apps/dav/composer/composer/autoload_static.php +++ b/apps/dav/composer/composer/autoload_static.php @@ -80,6 +80,7 @@ class ComposerStaticInitDAV 'OCA\\DAV\\CardDAV\\Xml\\Groups' => __DIR__ . '/..' . '/../lib/CardDAV/Xml/Groups.php', 'OCA\\DAV\\Command\\CreateAddressBook' => __DIR__ . '/..' . '/../lib/Command/CreateAddressBook.php', 'OCA\\DAV\\Command\\CreateCalendar' => __DIR__ . '/..' . '/../lib/Command/CreateCalendar.php', + 'OCA\\DAV\\Command\\RemoveInvalidShares' => __DIR__ . '/..' . '/../lib/Command/RemoveInvalidShares.php', 'OCA\\DAV\\Command\\SyncBirthdayCalendar' => __DIR__ . '/..' . '/../lib/Command/SyncBirthdayCalendar.php', 'OCA\\DAV\\Command\\SyncSystemAddressBook' => __DIR__ . '/..' . '/../lib/Command/SyncSystemAddressBook.php', 'OCA\\DAV\\Comments\\CommentNode' => __DIR__ . '/..' . '/../lib/Comments/CommentNode.php', @@ -157,7 +158,6 @@ class ComposerStaticInitDAV 'OCA\\DAV\\Migration\\Version1004Date20170924124212' => __DIR__ . '/..' . '/../lib/Migration/Version1004Date20170924124212.php', 'OCA\\DAV\\Migration\\Version1004Date20170926103422' => __DIR__ . '/..' . '/../lib/Migration/Version1004Date20170926103422.php', 'OCA\\DAV\\Migration\\Version1005Date20180413093149' => __DIR__ . '/..' . '/../lib/Migration/Version1005Date20180413093149.php', - 'OCA\\DAV\\Repair\\RemoveInvalidShares' => __DIR__ . '/..' . '/../lib/Repair/RemoveInvalidShares.php', 'OCA\\DAV\\RootCollection' => __DIR__ . '/..' . '/../lib/RootCollection.php', 'OCA\\DAV\\Server' => __DIR__ . '/..' . '/../lib/Server.php', 'OCA\\DAV\\Settings\\CalDAVSettings' => __DIR__ . '/..' . '/../lib/Settings/CalDAVSettings.php', diff --git a/apps/dav/lib/Command/RemoveInvalidShares.php b/apps/dav/lib/Command/RemoveInvalidShares.php new file mode 100644 index 00000000000..12a5ee43d47 --- /dev/null +++ b/apps/dav/lib/Command/RemoveInvalidShares.php @@ -0,0 +1,82 @@ + + * + * @copyright Copyright (c) 2018, ownCloud GmbH + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + +namespace OCA\DAV\Command; + +use OCA\DAV\Connector\Sabre\Principal; +use OCP\IDBConnection; +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +/** + * Class RemoveInvalidShares - removes shared calendars and addressbook which + * have no matching principal. Happened because of a bug in the calendar app. + */ +class RemoveInvalidShares extends Command { + + /** @var IDBConnection */ + private $connection; + /** @var Principal */ + private $principalBackend; + + public function __construct(IDBConnection $connection, + Principal $principalBackend) { + parent::__construct(); + + $this->connection = $connection; + $this->principalBackend = $principalBackend; + } + + protected function configure() { + $this + ->setName('dav:remove-invalid-shares') + ->setDescription('Remove invalid dav shares'); + } + + protected function execute(InputInterface $input, OutputInterface $output) { + $query = $this->connection->getQueryBuilder(); + $result = $query->selectDistinct('principaluri') + ->from('dav_shares') + ->execute(); + + while($row = $result->fetch()) { + $principaluri = $row['principaluri']; + $p = $this->principalBackend->getPrincipalByPath($principaluri); + if ($p === null) { + $this->deleteSharesForPrincipal($principaluri); + } + } + + $result->closeCursor(); + } + + /** + * @param string $principaluri + */ + private function deleteSharesForPrincipal($principaluri) { + $delete = $this->connection->getQueryBuilder(); + $delete->delete('dav_shares') + ->where($delete->expr()->eq('principaluri', $delete->createNamedParameter($principaluri))); + $delete->execute(); + } +} diff --git a/apps/dav/lib/Repair/RemoveInvalidShares.php b/apps/dav/lib/Repair/RemoveInvalidShares.php deleted file mode 100644 index b69f918a576..00000000000 --- a/apps/dav/lib/Repair/RemoveInvalidShares.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * @copyright Copyright (c) 2018, ownCloud GmbH - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * 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, version 3, - * along with this program. If not, see - * - */ - -namespace OCA\DAV\Repair; - -use OCA\DAV\Connector\Sabre\Principal; -use OCP\IDBConnection; -use OCP\ILogger; -use OCP\Migration\IOutput; -use OCP\Migration\IRepairStep; - -/** - * Class RemoveInvalidShares - removes shared calendars and addressbook which - * have no matching principal. Happened because of a bug in the calendar app. - * - * @package OCA\DAV\Repair - */ -class RemoveInvalidShares implements IRepairStep { - - /** @var IDBConnection */ - private $connection; - /** @var Principal */ - private $principalBackend; - - /** - * RemoveInvalidShares constructor. - * - * @param IDBConnection $connection - * @param Principal $principalBackend - */ - public function __construct(IDBConnection $connection, - Principal $principalBackend) { - $this->connection = $connection; - $this->principalBackend = $principalBackend; - } - - /** - * Returns the step's name - * - * @return string - * @since 9.1.0 - */ - public function getName() { - return 'Remove invalid calendar and addressbook shares'; - } - - /** - * Run repair step. - * Must throw exception on error. - * - * @param IOutput $output - * @throws \Exception in case of failure - * @since 9.1.0 - */ - public function run(IOutput $output) { - $query = $this->connection->getQueryBuilder(); - $result = $query->selectDistinct('principaluri') - ->from('dav_shares') - ->execute(); - - while($row = $result->fetch()) { - $principaluri = $row['principaluri']; - $p = $this->principalBackend->getPrincipalByPath($principaluri); - if ($p === null) { - $output->info(" ... for principal '$principaluri'"); - $this->deleteSharesForPrincipal($principaluri); - } - } - - $result->closeCursor(); - } - - /** - * @param string $principaluri - */ - private function deleteSharesForPrincipal($principaluri) { - $delete = $this->connection->getQueryBuilder(); - $delete->delete('dav_shares') - ->where($delete->expr()->eq('principaluri', $delete->createNamedParameter($principaluri))); - $delete->execute(); - } -} diff --git a/apps/dav/tests/unit/Command/RemoveInvalidSharesTest.php b/apps/dav/tests/unit/Command/RemoveInvalidSharesTest.php new file mode 100644 index 00000000000..2574e4d0aec --- /dev/null +++ b/apps/dav/tests/unit/Command/RemoveInvalidSharesTest.php @@ -0,0 +1,71 @@ + + * + * @copyright Copyright (c) 2018, ownCloud GmbH + * @license AGPL-3.0 + * + * This code is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * 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, version 3, + * along with this program. If not, see + * + */ + + +namespace OCA\DAV\Tests\Unit\Command; + + +use OCA\DAV\Connector\Sabre\Principal; +use OCA\DAV\Command\RemoveInvalidShares; +use OCP\Migration\IOutput; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; +use Test\TestCase; + +/** + * Class RemoveInvalidSharesTest + * + * @package OCA\DAV\Tests\Unit\Repair + * @group DB + */ +class RemoveInvalidSharesTest extends TestCase { + + public function setUp() { + parent::setUp(); + $db = \OC::$server->getDatabaseConnection(); + + $db->insertIfNotExist('*PREFIX*dav_shares', [ + 'principaluri' => 'principal:unknown', + 'type' => 'calendar', + 'access' => 2, + 'resourceid' => 666, + ]); + } + + public function test() { + $db = \OC::$server->getDatabaseConnection(); + /** @var Principal | \PHPUnit_Framework_MockObject_MockObject $principal */ + $principal = $this->createMock(Principal::class); + + /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $output */ + $output = $this->createMock(IOutput::class); + + $repair = new RemoveInvalidShares($db, $principal); + $this->invokePrivate($repair, 'run', [$this->createMock(InputInterface::class), $this->createMock(OutputInterface::class)]); + + $query = $db->getQueryBuilder(); + $result = $query->select('*')->from('dav_shares') + ->where($query->expr()->eq('principaluri', $query->createNamedParameter('principal:unknown')))->execute(); + $data = $result->fetchAll(); + $result->closeCursor(); + $this->assertEquals(0, count($data)); + } +} diff --git a/apps/dav/tests/unit/Repair/RemoveInvalidSharesTest.php b/apps/dav/tests/unit/Repair/RemoveInvalidSharesTest.php deleted file mode 100644 index 14553740f38..00000000000 --- a/apps/dav/tests/unit/Repair/RemoveInvalidSharesTest.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * @copyright Copyright (c) 2018, ownCloud GmbH - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * 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, version 3, - * along with this program. If not, see - * - */ - - -namespace OCA\DAV\Tests\Unit\Repair; - - -use OCA\DAV\Connector\Sabre\Principal; -use OCA\DAV\Repair\RemoveInvalidShares; -use OCP\Migration\IOutput; -use Test\TestCase; - -/** - * Class RemoveInvalidSharesTest - * - * @package OCA\DAV\Tests\Unit\Repair - * @group DB - */ -class RemoveInvalidSharesTest extends TestCase { - - public function setUp() { - parent::setUp(); - $db = \OC::$server->getDatabaseConnection(); - - $db->insertIfNotExist('*PREFIX*dav_shares', [ - 'principaluri' => 'principal:unknown', - 'type' => 'calendar', - 'access' => 2, - 'resourceid' => 666, - ]); - } - - public function test() { - $db = \OC::$server->getDatabaseConnection(); - /** @var Principal | \PHPUnit_Framework_MockObject_MockObject $principal */ - $principal = $this->createMock(Principal::class); - - /** @var IOutput | \PHPUnit_Framework_MockObject_MockObject $output */ - $output = $this->createMock(IOutput::class); - - $repair = new RemoveInvalidShares($db, $principal); - $this->assertEquals("Remove invalid calendar and addressbook shares", $repair->getName()); - $repair->run($output); - - $query = $db->getQueryBuilder(); - $result = $query->select('*')->from('dav_shares') - ->where($query->expr()->eq('principaluri', $query->createNamedParameter('principal:unknown')))->execute(); - $data = $result->fetchAll(); - $result->closeCursor(); - $this->assertEquals(0, count($data)); - } -} diff --git a/lib/private/Repair.php b/lib/private/Repair.php index 8746f1e6f27..27746993443 100644 --- a/lib/private/Repair.php +++ b/lib/private/Repair.php @@ -47,6 +47,8 @@ use OC\Repair\RepairMimeTypes; use OC\Repair\RepairInvalidShares; use OC\Template\JSCombiner; use OC\Template\SCSSCacher; +use OCA\DAV\Connector\Sabre\Principal; +use OCA\DAV\Repair\RemoveInvalidShares; use OCP\AppFramework\QueryException; use OCP\Migration\IOutput; use OCP\Migration\IRepairStep; @@ -146,7 +148,7 @@ class Repair implements IOutput{ */ public static function getExpensiveRepairSteps() { return [ - new OldGroupMembershipShares(\OC::$server->getDatabaseConnection(), \OC::$server->getGroupManager()) + new OldGroupMembershipShares(\OC::$server->getDatabaseConnection(), \OC::$server->getGroupManager()), ]; } -- cgit v1.2.3