diff options
-rw-r--r-- | lib/private/repair.php | 6 | ||||
-rw-r--r-- | lib/repair/updateoutdatedocsids.php | 108 | ||||
-rw-r--r-- | tests/lib/repair/updateoutdatedocsids.php | 80 |
3 files changed, 192 insertions, 2 deletions
diff --git a/lib/private/repair.php b/lib/private/repair.php index bf385af2c2b..533bf05b54c 100644 --- a/lib/private/repair.php +++ b/lib/private/repair.php @@ -43,6 +43,7 @@ use OC\Repair\RepairConfig; use OC\Repair\RepairLegacyStorages; use OC\Repair\RepairMimeTypes; use OC\Repair\SearchLuceneTables; +use OC\Repair\UpdateOutdatedOcsIds; class Repair extends BasicEmitter { /** @@ -101,7 +102,7 @@ class Repair extends BasicEmitter { * @return array of RepairStep instances */ public static function getRepairSteps() { - return array( + return [ new RepairMimeTypes(), new RepairLegacyStorages(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()), new RepairConfig(), @@ -111,7 +112,8 @@ class Repair extends BasicEmitter { new DropOldTables(\OC::$server->getDatabaseConnection()), new DropOldJobs(\OC::$server->getJobList()), new RemoveGetETagEntries(\OC::$server->getDatabaseConnection()), - ); + new UpdateOutdatedOcsIds(\OC::$server->getConfig()), + ]; } /** diff --git a/lib/repair/updateoutdatedocsids.php b/lib/repair/updateoutdatedocsids.php new file mode 100644 index 00000000000..afc9e968cad --- /dev/null +++ b/lib/repair/updateoutdatedocsids.php @@ -0,0 +1,108 @@ +<?php +/** + * @author Lukas Reschke <l8kas@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 <http://www.gnu.org/licenses/> + * + */ + +namespace OC\Repair; + +use OC\Hooks\BasicEmitter; +use OC\RepairStep; +use OCP\IConfig; + +/** + * Class UpdateOutdatedOcsIds is used to update invalid outdated OCS IDs, this is + * for example the case when an application has had another OCS ID in the past such + * as for contacts and calendar when apps.owncloud.com migrated to a unified identifier + * for multiple versions. + * + * @package OC\Repair + */ +class UpdateOutdatedOcsIds extends BasicEmitter implements RepairStep { + /** @var IConfig */ + private $config; + + /** + * @param IConfig $config + */ + public function __construct(IConfig $config) { + $this->config = $config; + } + + /** + * {@inheritdoc} + */ + public function getName() { + return 'Repair outdated OCS IDs'; + } + + /** + * @param string $appName + * @param string $oldId + * @param string $newId + * @return bool True if updated, false otherwise + */ + public function fixOcsId($appName, $oldId, $newId) { + $existingId = $this->config->getAppValue($appName, 'ocsid'); + + if($existingId === $oldId) { + $this->config->setAppValue($appName, 'ocsid', $newId); + return true; + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function run() { + $appsToUpdate = [ + 'contacts' => [ + 'old' => '166044', + 'new' => '168708', + ], + 'calendar' => [ + 'old' => '166043', + 'new' => '168707', + ], + 'bookmarks' => [ + 'old' => '166042', + 'new' => '168710', + ], + 'search_lucene' => [ + 'old' => '166057', + 'new' => '168709', + ], + 'documents' => [ + 'old' => '166045', + 'new' => '168711', + ] + ]; + + foreach($appsToUpdate as $appName => $ids) { + if ($this->fixOcsId($appName, $ids['old'], $ids['new'])) { + $this->emit( + '\OC\Repair', + 'info', + [sprintf('Fixed invalid %s OCS id', $appName)] + ); + } + } + } +} diff --git a/tests/lib/repair/updateoutdatedocsids.php b/tests/lib/repair/updateoutdatedocsids.php new file mode 100644 index 00000000000..3669a64371f --- /dev/null +++ b/tests/lib/repair/updateoutdatedocsids.php @@ -0,0 +1,80 @@ +<?php +/** + * @author Lukas Reschke <l8kas@owncloud.com> + * + * @copyright Copyright (c) 2015, ownCloud, Inc. + * @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 <http://www.gnu.org/licenses/> + * + */ + +namespace Test\Repair; + +use OCP\IConfig; +use Test\TestCase; + +/** + * Class UpdateOutdatedOcsIds + * + * @package Test\Repair + */ +class UpdateOutdatedOcsIds extends TestCase { + /** @var IConfig */ + private $config; + /** @var \OC\Repair\UpdateOutdatedOcsIds */ + private $updateOutdatedOcsIds; + + public function setUp() { + parent::setUp(); + $this->config = $this->getMockBuilder('\\OCP\\IConfig')->getMock(); + $this->updateOutdatedOcsIds = new \OC\Repair\UpdateOutdatedOcsIds($this->config); + } + + public function testGetName() { + $this->assertSame('Repair outdated OCS IDs', $this->updateOutdatedOcsIds->getName()); + } + + public function testFixOcsIdNoOcsId() { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('MyNotInstalledApp', 'ocsid') + ->will($this->returnValue('')); + $this->assertFalse($this->updateOutdatedOcsIds->fixOcsId('MyNotInstalledApp', '1337', '0815')); + } + + public function testFixOcsIdUpdateOcsId() { + $this->config + ->expects($this->at(0)) + ->method('getAppValue') + ->with('MyInstalledApp', 'ocsid') + ->will($this->returnValue('1337')); + $this->config + ->expects($this->at(1)) + ->method('setAppValue') + ->with('MyInstalledApp', 'ocsid', '0815'); + + $this->assertTrue($this->updateOutdatedOcsIds->fixOcsId('MyInstalledApp', '1337', '0815')); + } + + public function testFixOcsIdAlreadyFixed() { + $this->config + ->expects($this->once()) + ->method('getAppValue') + ->with('MyAlreadyFixedAppId', 'ocsid') + ->will($this->returnValue('0815')); + + $this->assertFalse($this->updateOutdatedOcsIds->fixOcsId('MyAlreadyFixedAppId', '1337', '0815')); + } +} |