Merge pull request #7988 from nextcloud/cleanup-old-repair-steps

Remove old repair steps that aren't executed anymore
This commit is contained in:
Roeland Jago Douma 2018-01-22 19:54:46 +01:00 committed by GitHub
commit eb3fd4bce6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 0 additions and 1444 deletions

View File

@ -803,14 +803,7 @@ return array(
'OC\\Repair\\CleanTags' => $baseDir . '/lib/private/Repair/CleanTags.php', 'OC\\Repair\\CleanTags' => $baseDir . '/lib/private/Repair/CleanTags.php',
'OC\\Repair\\Collation' => $baseDir . '/lib/private/Repair/Collation.php', 'OC\\Repair\\Collation' => $baseDir . '/lib/private/Repair/Collation.php',
'OC\\Repair\\MoveUpdaterStepFile' => $baseDir . '/lib/private/Repair/MoveUpdaterStepFile.php', 'OC\\Repair\\MoveUpdaterStepFile' => $baseDir . '/lib/private/Repair/MoveUpdaterStepFile.php',
'OC\\Repair\\NC11\\CleanPreviews' => $baseDir . '/lib/private/Repair/NC11/CleanPreviews.php',
'OC\\Repair\\NC11\\CleanPreviewsBackgroundJob' => $baseDir . '/lib/private/Repair/NC11/CleanPreviewsBackgroundJob.php',
'OC\\Repair\\NC11\\FixMountStorages' => $baseDir . '/lib/private/Repair/NC11/FixMountStorages.php', 'OC\\Repair\\NC11\\FixMountStorages' => $baseDir . '/lib/private/Repair/NC11/FixMountStorages.php',
'OC\\Repair\\NC11\\MoveAvatars' => $baseDir . '/lib/private/Repair/NC11/MoveAvatars.php',
'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => $baseDir . '/lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php',
'OC\\Repair\\NC12\\InstallCoreBundle' => $baseDir . '/lib/private/Repair/NC12/InstallCoreBundle.php',
'OC\\Repair\\NC12\\RepairIdentityProofKeyFolders' => $baseDir . '/lib/private/Repair/NC12/RepairIdentityProofKeyFolders.php',
'OC\\Repair\\NC12\\UpdateLanguageCodes' => $baseDir . '/lib/private/Repair/NC12/UpdateLanguageCodes.php',
'OC\\Repair\\NC13\\AddLogRotateJob' => $baseDir . '/lib/private/Repair/NC13/AddLogRotateJob.php', 'OC\\Repair\\NC13\\AddLogRotateJob' => $baseDir . '/lib/private/Repair/NC13/AddLogRotateJob.php',
'OC\\Repair\\NC13\\RepairInvalidPaths' => $baseDir . '/lib/private/Repair/NC13/RepairInvalidPaths.php', 'OC\\Repair\\NC13\\RepairInvalidPaths' => $baseDir . '/lib/private/Repair/NC13/RepairInvalidPaths.php',
'OC\\Repair\\OldGroupMembershipShares' => $baseDir . '/lib/private/Repair/OldGroupMembershipShares.php', 'OC\\Repair\\OldGroupMembershipShares' => $baseDir . '/lib/private/Repair/OldGroupMembershipShares.php',

View File

@ -833,14 +833,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Repair\\CleanTags' => __DIR__ . '/../../..' . '/lib/private/Repair/CleanTags.php', 'OC\\Repair\\CleanTags' => __DIR__ . '/../../..' . '/lib/private/Repair/CleanTags.php',
'OC\\Repair\\Collation' => __DIR__ . '/../../..' . '/lib/private/Repair/Collation.php', 'OC\\Repair\\Collation' => __DIR__ . '/../../..' . '/lib/private/Repair/Collation.php',
'OC\\Repair\\MoveUpdaterStepFile' => __DIR__ . '/../../..' . '/lib/private/Repair/MoveUpdaterStepFile.php', 'OC\\Repair\\MoveUpdaterStepFile' => __DIR__ . '/../../..' . '/lib/private/Repair/MoveUpdaterStepFile.php',
'OC\\Repair\\NC11\\CleanPreviews' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/CleanPreviews.php',
'OC\\Repair\\NC11\\CleanPreviewsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/CleanPreviewsBackgroundJob.php',
'OC\\Repair\\NC11\\FixMountStorages' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/FixMountStorages.php', 'OC\\Repair\\NC11\\FixMountStorages' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/FixMountStorages.php',
'OC\\Repair\\NC11\\MoveAvatars' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/MoveAvatars.php',
'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php',
'OC\\Repair\\NC12\\InstallCoreBundle' => __DIR__ . '/../../..' . '/lib/private/Repair/NC12/InstallCoreBundle.php',
'OC\\Repair\\NC12\\RepairIdentityProofKeyFolders' => __DIR__ . '/../../..' . '/lib/private/Repair/NC12/RepairIdentityProofKeyFolders.php',
'OC\\Repair\\NC12\\UpdateLanguageCodes' => __DIR__ . '/../../..' . '/lib/private/Repair/NC12/UpdateLanguageCodes.php',
'OC\\Repair\\NC13\\AddLogRotateJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC13/AddLogRotateJob.php', 'OC\\Repair\\NC13\\AddLogRotateJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC13/AddLogRotateJob.php',
'OC\\Repair\\NC13\\RepairInvalidPaths' => __DIR__ . '/../../..' . '/lib/private/Repair/NC13/RepairInvalidPaths.php', 'OC\\Repair\\NC13\\RepairInvalidPaths' => __DIR__ . '/../../..' . '/lib/private/Repair/NC13/RepairInvalidPaths.php',
'OC\\Repair\\OldGroupMembershipShares' => __DIR__ . '/../../..' . '/lib/private/Repair/OldGroupMembershipShares.php', 'OC\\Repair\\OldGroupMembershipShares' => __DIR__ . '/../../..' . '/lib/private/Repair/OldGroupMembershipShares.php',

View File

@ -35,12 +35,7 @@ use OC\Files\AppData\Factory;
use OC\Repair\CleanTags; use OC\Repair\CleanTags;
use OC\Repair\Collation; use OC\Repair\Collation;
use OC\Repair\MoveUpdaterStepFile; use OC\Repair\MoveUpdaterStepFile;
use OC\Repair\NC11\CleanPreviews;
use OC\Repair\NC11\FixMountStorages; use OC\Repair\NC11\FixMountStorages;
use OC\Repair\NC11\MoveAvatars;
use OC\Repair\NC12\InstallCoreBundle;
use OC\Repair\NC12\UpdateLanguageCodes;
use OC\Repair\NC12\RepairIdentityProofKeyFolders;
use OC\Repair\NC13\AddLogRotateJob; use OC\Repair\NC13\AddLogRotateJob;
use OC\Repair\OldGroupMembershipShares; use OC\Repair\OldGroupMembershipShares;
use OC\Repair\Owncloud\DropAccountTermsTable; use OC\Repair\Owncloud\DropAccountTermsTable;
@ -133,24 +128,8 @@ class Repair implements IOutput{
new RepairInvalidShares(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()), new RepairInvalidShares(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()),
new RemoveRootShares(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager(), \OC::$server->getLazyRootFolder()), new RemoveRootShares(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager(), \OC::$server->getLazyRootFolder()),
new MoveUpdaterStepFile(\OC::$server->getConfig()), new MoveUpdaterStepFile(\OC::$server->getConfig()),
new MoveAvatars(
\OC::$server->getJobList(),
\OC::$server->getConfig()
),
new CleanPreviews(
\OC::$server->getJobList(),
\OC::$server->getUserManager(),
\OC::$server->getConfig()
),
new FixMountStorages(\OC::$server->getDatabaseConnection()), new FixMountStorages(\OC::$server->getDatabaseConnection()),
new UpdateLanguageCodes(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig()),
new InstallCoreBundle(
\OC::$server->query(BundleFetcher::class),
\OC::$server->getConfig(),
\OC::$server->query(Installer::class)
),
new RepairInvalidPaths(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig()), new RepairInvalidPaths(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig()),
new RepairIdentityProofKeyFolders(\OC::$server->getConfig(), \OC::$server->query(Factory::class), \OC::$server->getRootFolder()),
new AddLogRotateJob(\OC::$server->getJobList()), new AddLogRotateJob(\OC::$server->getJobList()),
]; ];
} }

View File

@ -1,73 +0,0 @@
<?php
/**
* @copyright 2016 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 OC\Repair\NC11;
use OCP\BackgroundJob\IJobList;
use OCP\IConfig;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
class CleanPreviews implements IRepairStep {
/** @var IJobList */
private $jobList;
/** @var IUserManager */
private $userManager;
/** @var IConfig */
private $config;
/**
* MoveAvatars constructor.
*
* @param IJobList $jobList
* @param IUserManager $userManager
* @param IConfig $config
*/
public function __construct(IJobList $jobList,
IUserManager $userManager,
IConfig $config) {
$this->jobList = $jobList;
$this->userManager = $userManager;
$this->config = $config;
}
/**
* @return string
*/
public function getName() {
return 'Add preview cleanup background jobs';
}
public function run(IOutput $output) {
if (!$this->config->getAppValue('core', 'previewsCleanedUp', false)) {
$this->userManager->callForSeenUsers(function (IUser $user) {
$this->jobList->add(CleanPreviewsBackgroundJob::class, ['uid' => $user->getUID()]);
});
$this->config->setAppValue('core', 'previewsCleanedUp', 1);
}
}
}

View File

@ -1,132 +0,0 @@
<?php
/**
* @copyright 2016 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 OC\Repair\NC11;
use OC\BackgroundJob\QueuedJob;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\IJobList;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\ILogger;
use OCP\IUserManager;
class CleanPreviewsBackgroundJob extends QueuedJob {
/** @var IRootFolder */
private $rootFolder;
/** @var ILogger */
private $logger;
/** @var IJobList */
private $jobList;
/** @var ITimeFactory */
private $timeFactory;
/** @var IUserManager */
private $userManager;
/**
* CleanPreviewsBackgroundJob constructor.
*
* @param IRootFolder $rootFolder
* @param ILogger $logger
* @param IJobList $jobList
* @param ITimeFactory $timeFactory
* @param IUserManager $userManager
*/
public function __construct(IRootFolder $rootFolder,
ILogger $logger,
IJobList $jobList,
ITimeFactory $timeFactory,
IUserManager $userManager) {
$this->rootFolder = $rootFolder;
$this->logger = $logger;
$this->jobList = $jobList;
$this->timeFactory = $timeFactory;
$this->userManager = $userManager;
}
public function run($arguments) {
$uid = $arguments['uid'];
if (!$this->userManager->userExists($uid)) {
$this->logger->info('User no longer exists, skip user ' . $uid);
return;
}
$this->logger->info('Started preview cleanup for ' . $uid);
$empty = $this->cleanupPreviews($uid);
if (!$empty) {
$this->jobList->add(self::class, ['uid' => $uid]);
$this->logger->info('New preview cleanup scheduled for ' . $uid);
} else {
$this->logger->info('Preview cleanup done for ' . $uid);
}
}
/**
* @param $uid
* @return bool
*/
private function cleanupPreviews($uid) {
try {
$userFolder = $this->rootFolder->getUserFolder($uid);
} catch (NotFoundException $e) {
return true;
}
$userRoot = $userFolder->getParent();
try {
/** @var Folder $thumbnailFolder */
$thumbnailFolder = $userRoot->get('thumbnails');
} catch (NotFoundException $e) {
return true;
}
$thumbnails = $thumbnailFolder->getDirectoryListing();
$start = $this->timeFactory->getTime();
foreach ($thumbnails as $thumbnail) {
try {
$thumbnail->delete();
} catch (NotPermittedException $e) {
// Ignore
}
if (($this->timeFactory->getTime() - $start) > 15) {
return false;
}
}
try {
$thumbnailFolder->delete();
} catch (NotPermittedException $e) {
// Ignore
}
return true;
}
}

View File

@ -1,73 +0,0 @@
<?php
/**
* @copyright 2016 Roeland Jago Douma <roeland@famdouma.nl>
*
* @author Morris Jobke <hey@morrisjobke.de>
* @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 OC\Repair\NC11;
use OCP\BackgroundJob\IJobList;
use OCP\IConfig;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
class MoveAvatars implements IRepairStep {
/** @var IJobList */
private $jobList;
/** @var IConfig */
private $config;
/**
* MoveAvatars constructor.
*
* @param IJobList $jobList
* @param IConfig $config
*/
public function __construct(IJobList $jobList,
IConfig $config) {
$this->jobList = $jobList;
$this->config = $config;
}
/**
* @return string
*/
public function getName() {
return 'Add move avatar background job';
}
public function run(IOutput $output) {
// only run once
if ($this->config->getAppValue('core', 'moveavatarsdone') === 'yes') {
$output->info('Repair step already executed');
return;
}
if ($this->config->getSystemValue('enable_avatars', true) === false) {
$output->info('Avatars are disabled');
} else {
$output->info('Add background job');
$this->jobList->add(MoveAvatarsBackgroundJob::class);
// if all were done, no need to redo the repair during next upgrade
$this->config->setAppValue('core', 'moveavatarsdone', 'yes');
}
}
}

View File

@ -1,146 +0,0 @@
<?php
/**
* @copyright 2016 Roeland Jago Douma <roeland@famdouma.nl>
*
* @author Joas Schilling <coding@schilljs.com>
* @author Morris Jobke <hey@morrisjobke.de>
* @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 OC\Repair\NC11;
use OC\BackgroundJob\QueuedJob;
use OCP\Files\File;
use OCP\Files\Folder;
use OCP\Files\IAppData;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\Files\SimpleFS\ISimpleFolder;
use OCP\ILogger;
use OCP\IUser;
use OCP\IUserManager;
class MoveAvatarsBackgroundJob extends QueuedJob {
/** @var IUserManager */
private $userManager;
/** @var IRootFolder */
private $rootFolder;
/** @var IAppData */
private $appData;
/** @var ILogger */
private $logger;
/**
* MoveAvatars constructor.
*/
public function __construct() {
$this->userManager = \OC::$server->getUserManager();
$this->rootFolder = \OC::$server->getRootFolder();
$this->logger = \OC::$server->getLogger();
$this->appData = \OC::$server->getAppDataDir('avatar');
}
public function run($arguments) {
$this->logger->info('Started migrating avatars to AppData folder');
$this->moveAvatars();
$this->logger->info('All avatars migrated to AppData folder');
}
private function moveAvatars() {
try {
$ownCloudAvatars = $this->rootFolder->get('avatars');
} catch (NotFoundException $e) {
$ownCloudAvatars = null;
}
$counter = 0;
$this->userManager->callForSeenUsers(function (IUser $user) use ($counter, $ownCloudAvatars) {
$uid = $user->getUID();
\OC\Files\Filesystem::initMountPoints($uid);
/** @var Folder $userFolder */
$userFolder = $this->rootFolder->get($uid);
try {
$userData = $this->appData->getFolder($uid);
} catch (NotFoundException $e) {
$userData = $this->appData->newFolder($uid);
}
$foundAvatars = $this->copyAvatarsFromFolder($userFolder, $userData);
// ownCloud migration?
if ($foundAvatars === 0 && $ownCloudAvatars instanceof Folder) {
$parts = $this->buildOwnCloudAvatarPath($uid);
$userOwnCloudAvatar = $ownCloudAvatars;
foreach ($parts as $part) {
try {
$userOwnCloudAvatar = $userOwnCloudAvatar->get($part);
} catch (NotFoundException $e) {
return;
}
}
$this->copyAvatarsFromFolder($userOwnCloudAvatar, $userData);
}
$counter++;
if ($counter % 100 === 0) {
$this->logger->info('{amount} avatars migrated', ['amount' => $counter]);
}
});
}
/**
* @param Folder $source
* @param ISimpleFolder $target
* @return int
* @throws \OCP\Files\NotPermittedException
* @throws NotFoundException
*/
protected function copyAvatarsFromFolder(Folder $source, ISimpleFolder $target) {
$foundAvatars = 0;
$avatars = $source->getDirectoryListing();
$regex = '/^avatar\.([0-9]+\.)?(jpg|png)$/';
foreach ($avatars as $avatar) {
/** @var File $avatar */
if (preg_match($regex, $avatar->getName())) {
/*
* This is not the most effective but it is the most abstract way
* to handle this. Avatars should be small anyways.
*/
$newAvatar = $target->newFile($avatar->getName());
$newAvatar->putContent($avatar->getContent());
$avatar->delete();
$foundAvatars++;
}
}
return $foundAvatars;
}
protected function buildOwnCloudAvatarPath($userId) {
$avatar = substr_replace(substr_replace(md5($userId), '/', 4, 0), '/', 2, 0);
return explode('/', $avatar);
}
}

View File

@ -1,80 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
*
* @author Lukas Reschke <lukas@statuscode.ch>
*
* @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 OC\Repair\NC12;
use OC\App\AppStore\Bundles\BundleFetcher;
use OC\Installer;
use OCP\IConfig;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
class InstallCoreBundle implements IRepairStep {
/** @var BundleFetcher */
private $bundleFetcher;
/** @var IConfig */
private $config;
/** @var Installer */
private $installer;
/**
* @param BundleFetcher $bundleFetcher
* @param IConfig $config
* @param Installer $installer
*/
public function __construct(BundleFetcher $bundleFetcher,
IConfig $config,
Installer $installer) {
$this->bundleFetcher = $bundleFetcher;
$this->config = $config;
$this->installer = $installer;
}
/**
* {@inheritdoc}
*/
public function getName() {
return 'Install new core bundle components';
}
/**
* {@inheritdoc}
*/
public function run(IOutput $output) {
$versionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
if (version_compare($versionFromBeforeUpdate, '12.0.0.14', '>')) {
return;
}
$defaultBundle = $this->bundleFetcher->getDefaultInstallationBundle();
foreach($defaultBundle as $bundle) {
try {
$this->installer->installAppBundle($bundle);
$output->info('Successfully installed core app bundle.');
} catch (\Exception $e) {
$output->warning('Could not install core app bundle: ' . $e->getMessage());
}
}
}
}

View File

@ -1,112 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2017 Bjoern Schiessle <bjoern@schiessle.org>
*
* @author Bjoern Schiessle <bjoern@schiessle.org>
*
* @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 OC\Repair\NC12;
use OC\Files\AppData\Factory;
use OCP\Files\IRootFolder;
use OCP\Files\SimpleFS\ISimpleFolder;
use OCP\IConfig;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
class RepairIdentityProofKeyFolders implements IRepairStep {
/** @var IConfig */
private $config;
/** @var \OC\Files\AppData\AppData */
private $appDataIdentityProof;
/** @var IRootFolder */
private $rootFolder;
/** @var string */
private $identityProofDir;
/**
* RepairIdentityProofKeyFolders constructor.
*
* @param IConfig $config
* @param Factory $appDataFactory
* @param IRootFolder $rootFolder
*/
public function __construct(IConfig $config, Factory $appDataFactory, IRootFolder $rootFolder) {
$this->config = $config;
$this->appDataIdentityProof = $appDataFactory->get('identityproof');
$this->rootFolder = $rootFolder;
$instanceId = $this->config->getSystemValue('instanceid', null);
if ($instanceId === null) {
throw new \RuntimeException('no instance id!');
}
$this->identityProofDir = 'appdata_' . $instanceId . '/identityproof/';
}
/**
* Returns the step's name
*
* @return string
* @since 9.1.0
*/
public function getName() {
return "Rename folder with user specific keys";
}
/**
* 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) {
$versionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
if (version_compare($versionFromBeforeUpdate, '12.0.1.5', '<=')) {
$count = $this->repair();
$output->info('Repaired ' . $count . ' folders');
}
}
/**
* rename all dirs with user specific keys to 'user-uid'
*
* @return int
*/
private function repair() {
$count = 0;
$dirListing = $this->appDataIdentityProof->getDirectoryListing();
/** @var ISimpleFolder $folder */
foreach ($dirListing as $folder) {
$name = $folder->getName();
$node = $this->rootFolder->get($this->identityProofDir . $name);
$node->move($this->identityProofDir . 'user-' . $name);
$count++;
}
return $count;
}
}

View File

@ -1,91 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016 Morris Jobke <hey@morrisjobke.de>
*
* @author Joas Schilling <coding@schilljs.com>
* @author Morris Jobke <hey@morrisjobke.de>
*
* @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 OC\Repair\NC12;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
class UpdateLanguageCodes implements IRepairStep {
/** @var IDBConnection */
private $connection;
/** @var IConfig */
private $config;
/**
* @param IDBConnection $connection
* @param IConfig $config
*/
public function __construct(IDBConnection $connection,
IConfig $config) {
$this->connection = $connection;
$this->config = $config;
}
/**
* {@inheritdoc}
*/
public function getName() {
return 'Repair language codes';
}
/**
* {@inheritdoc}
*/
public function run(IOutput $output) {
$versionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0');
if (version_compare($versionFromBeforeUpdate, '12.0.0.13', '>')) {
return;
}
$languages = [
'bg_BG' => 'bg',
'cs_CZ' => 'cs',
'fi_FI' => 'fi',
'hu_HU' => 'hu',
'nb_NO' => 'nb',
'sk_SK' => 'sk',
'th_TH' => 'th',
];
foreach ($languages as $oldCode => $newCode) {
$qb = $this->connection->getQueryBuilder();
$affectedRows = $qb->update('preferences')
->set('configvalue', $qb->createNamedParameter($newCode))
->where($qb->expr()->eq('appid', $qb->createNamedParameter('core')))
->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang')))
->andWhere($qb->expr()->eq('configvalue', $qb->createNamedParameter($oldCode), IQueryBuilder::PARAM_STR))
->execute();
$output->info('Changed ' . $affectedRows . ' setting(s) from "' . $oldCode . '" to "' . $newCode . '" in preferences table.');
}
}
}

View File

@ -92,7 +92,6 @@ use OC\Notification\Manager;
use OC\OCS\DiscoveryService; use OC\OCS\DiscoveryService;
use OC\Remote\Api\ApiFactory; use OC\Remote\Api\ApiFactory;
use OC\Remote\InstanceFactory; use OC\Remote\InstanceFactory;
use OC\Repair\NC11\CleanPreviewsBackgroundJob;
use OC\RichObjectStrings\Validator; use OC\RichObjectStrings\Validator;
use OC\Security\Bruteforce\Throttler; use OC\Security\Bruteforce\Throttler;
use OC\Security\CertificateManager; use OC\Security\CertificateManager;

View File

@ -1,245 +0,0 @@
<?php
/**
* @copyright 2016, 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 Test\Repair\NC11;
use OC\Repair\NC11\CleanPreviewsBackgroundJob;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\IJobList;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\ILogger;
use OCP\IUserManager;
use Test\TestCase;
class CleanPreviewsBackgroundJobTest extends TestCase {
/** @var IRootFolder|\PHPUnit_Framework_MockObject_MockObject */
private $rootFolder;
/** @var ILogger|\PHPUnit_Framework_MockObject_MockObject */
private $logger;
/** @var IJobList|\PHPUnit_Framework_MockObject_MockObject */
private $jobList;
/** @var ITimeFactory|\PHPUnit_Framework_MockObject_MockObject */
private $timeFactory;
/** @var CleanPreviewsBackgroundJob */
private $job;
/** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */
private $userManager;
public function setUp() {
parent::setUp();
$this->rootFolder = $this->createMock(IRootFolder::class);
$this->logger = $this->createMock(ILogger::class);
$this->jobList = $this->createMock(IJobList::class);
$this->timeFactory = $this->createMock(ITimeFactory::class);
$this->userManager = $this->createMock(IUserManager::class);
$this->userManager->expects($this->any())->method('userExists')->willReturn(true);
$this->job = new CleanPreviewsBackgroundJob(
$this->rootFolder,
$this->logger,
$this->jobList,
$this->timeFactory,
$this->userManager
);
}
public function testCleanupPreviewsUnfinished() {
$userFolder = $this->createMock(Folder::class);
$userRoot = $this->createMock(Folder::class);
$thumbnailFolder = $this->createMock(Folder::class);
$this->rootFolder->method('getUserFolder')
->with($this->equalTo('myuid'))
->willReturn($userFolder);
$userFolder->method('getParent')->willReturn($userRoot);
$userRoot->method('get')
->with($this->equalTo('thumbnails'))
->willReturn($thumbnailFolder);
$previewFolder1 = $this->createMock(Folder::class);
$previewFolder1->expects($this->once())
->method('delete');
$thumbnailFolder->method('getDirectoryListing')
->willReturn([$previewFolder1]);
$thumbnailFolder->expects($this->never())
->method('delete');
$this->timeFactory->method('getTime')
->will($this->onConsecutiveCalls(100, 200));
$this->jobList->expects($this->once())
->method('add')
->with(
$this->equalTo(CleanPreviewsBackgroundJob::class),
$this->equalTo(['uid' => 'myuid'])
);
$this->logger->expects($this->at(0))
->method('info')
->with($this->equalTo('Started preview cleanup for myuid'));
$this->logger->expects($this->at(1))
->method('info')
->with($this->equalTo('New preview cleanup scheduled for myuid'));
$this->job->run(['uid' => 'myuid']);
}
public function testCleanupPreviewsFinished() {
$userFolder = $this->createMock(Folder::class);
$userRoot = $this->createMock(Folder::class);
$thumbnailFolder = $this->createMock(Folder::class);
$this->rootFolder->method('getUserFolder')
->with($this->equalTo('myuid'))
->willReturn($userFolder);
$userFolder->method('getParent')->willReturn($userRoot);
$userRoot->method('get')
->with($this->equalTo('thumbnails'))
->willReturn($thumbnailFolder);
$previewFolder1 = $this->createMock(Folder::class);
$previewFolder1->expects($this->once())
->method('delete');
$thumbnailFolder->method('getDirectoryListing')
->willReturn([$previewFolder1]);
$this->timeFactory->method('getTime')
->will($this->onConsecutiveCalls(100, 101));
$this->jobList->expects($this->never())
->method('add');
$this->logger->expects($this->at(0))
->method('info')
->with($this->equalTo('Started preview cleanup for myuid'));
$this->logger->expects($this->at(1))
->method('info')
->with($this->equalTo('Preview cleanup done for myuid'));
$thumbnailFolder->expects($this->once())
->method('delete');
$this->job->run(['uid' => 'myuid']);
}
public function testNoUserFolder() {
$this->rootFolder->method('getUserFolder')
->with($this->equalTo('myuid'))
->willThrowException(new NotFoundException());
$this->logger->expects($this->at(0))
->method('info')
->with($this->equalTo('Started preview cleanup for myuid'));
$this->logger->expects($this->at(1))
->method('info')
->with($this->equalTo('Preview cleanup done for myuid'));
$this->job->run(['uid' => 'myuid']);
}
public function testNoThumbnailFolder() {
$userFolder = $this->createMock(Folder::class);
$userRoot = $this->createMock(Folder::class);
$this->rootFolder->method('getUserFolder')
->with($this->equalTo('myuid'))
->willReturn($userFolder);
$userFolder->method('getParent')->willReturn($userRoot);
$userRoot->method('get')
->with($this->equalTo('thumbnails'))
->willThrowException(new NotFoundException());
$this->logger->expects($this->at(0))
->method('info')
->with($this->equalTo('Started preview cleanup for myuid'));
$this->logger->expects($this->at(1))
->method('info')
->with($this->equalTo('Preview cleanup done for myuid'));
$this->job->run(['uid' => 'myuid']);
}
public function testNotPermittedToDelete() {
$userFolder = $this->createMock(Folder::class);
$userRoot = $this->createMock(Folder::class);
$thumbnailFolder = $this->createMock(Folder::class);
$this->rootFolder->method('getUserFolder')
->with($this->equalTo('myuid'))
->willReturn($userFolder);
$userFolder->method('getParent')->willReturn($userRoot);
$userRoot->method('get')
->with($this->equalTo('thumbnails'))
->willReturn($thumbnailFolder);
$previewFolder1 = $this->createMock(Folder::class);
$previewFolder1->expects($this->once())
->method('delete')
->willThrowException(new NotPermittedException());
$thumbnailFolder->method('getDirectoryListing')
->willReturn([$previewFolder1]);
$this->timeFactory->method('getTime')
->will($this->onConsecutiveCalls(100, 101));
$this->jobList->expects($this->never())
->method('add');
$this->logger->expects($this->at(0))
->method('info')
->with($this->equalTo('Started preview cleanup for myuid'));
$this->logger->expects($this->at(1))
->method('info')
->with($this->equalTo('Preview cleanup done for myuid'));
$thumbnailFolder->expects($this->once())
->method('delete')
->willThrowException(new NotPermittedException());
$this->job->run(['uid' => 'myuid']);
}
}

View File

@ -1,135 +0,0 @@
<?php
/**
* @copyright 2016, 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 Test\Repair\NC11;
use OC\Repair\NC11\CleanPreviews;
use OC\Repair\NC11\CleanPreviewsBackgroundJob;
use OCP\BackgroundJob\IJobList;
use OCP\IConfig;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Migration\IOutput;
use Test\TestCase;
class CleanPreviewsTest extends TestCase {
/** @var IJobList|\PHPUnit_Framework_MockObject_MockObject */
private $jobList;
/** @var IUserManager|\PHPUnit_Framework_MockObject_MockObject */
private $userManager;
/** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
private $config;
/** @var CleanPreviews */
private $repair;
public function setUp() {
parent::setUp();
$this->jobList = $this->createMock(IJobList::class);
$this->userManager = $this->createMock(IUserManager::class);
$this->config = $this->createMock(IConfig::class);
$this->repair = new CleanPreviews(
$this->jobList,
$this->userManager,
$this->config
);
}
public function testGetName() {
$this->assertSame('Add preview cleanup background jobs', $this->repair->getName());
}
public function testRun() {
$user1 = $this->createMock(IUser::class);
$user1->method('getUID')
->willReturn('user1');
$user2 = $this->createMock(IUser::class);
$user2->method('getUID')
->willReturn('user2');
$this->userManager->expects($this->once())
->method('callForSeenUsers')
->will($this->returnCallback(function (\Closure $function) use ($user1, $user2) {
$function($user1);
$function($user2);
}));
$this->jobList->expects($this->at(0))
->method('add')
->with(
$this->equalTo(CleanPreviewsBackgroundJob::class),
$this->equalTo(['uid' => 'user1'])
);
$this->jobList->expects($this->at(1))
->method('add')
->with(
$this->equalTo(CleanPreviewsBackgroundJob::class),
$this->equalTo(['uid' => 'user2'])
);
$this->config->expects($this->once())
->method('getAppValue')
->with(
$this->equalTo('core'),
$this->equalTo('previewsCleanedUp'),
$this->equalTo(false)
)->willReturn(false);
$this->config->expects($this->once())
->method('setAppValue')
->with(
$this->equalTo('core'),
$this->equalTo('previewsCleanedUp'),
$this->equalTo(1)
);
$this->repair->run($this->createMock(IOutput::class));
}
public function testRunAlreadyDoone() {
$this->userManager->expects($this->never())
->method($this->anything());
$this->jobList->expects($this->never())
->method($this->anything());
$this->config->expects($this->once())
->method('getAppValue')
->with(
$this->equalTo('core'),
$this->equalTo('previewsCleanedUp'),
$this->equalTo(false)
)->willReturn('1');
$this->config->expects($this->never())
->method('setAppValue');
$this->repair->run($this->createMock(IOutput::class));
}
}

View File

@ -1,144 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2017 Lukas Reschke <lukas@statuscode.ch>
*
* @author Lukas Reschke <lukas@statuscode.ch>
*
* @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 Test\Repair\NC12;
use OC\App\AppStore\Bundles\Bundle;
use OC\App\AppStore\Bundles\BundleFetcher;
use OC\Installer;
use OC\Repair\NC12\InstallCoreBundle;
use OCP\IConfig;
use OCP\Migration\IOutput;
use Test\TestCase;
class InstallCoreBundleTest extends TestCase {
/** @var BundleFetcher|\PHPUnit_Framework_MockObject_MockObject */
private $bundleFetcher;
/** @var IConfig|\PHPUnit_Framework_MockObject_MockObject */
private $config;
/** @var Installer|\PHPUnit_Framework_MockObject_MockObject */
private $installer;
/** @var InstallCoreBundle */
private $installCoreBundle;
public function setUp() {
parent::setUp();
$this->bundleFetcher = $this->createMock(BundleFetcher::class);
$this->config = $this->createMock(IConfig::class);
$this->installer = $this->createMock(Installer::class);
$this->installCoreBundle = new InstallCoreBundle(
$this->bundleFetcher,
$this->config,
$this->installer
);
}
public function testGetName() {
$this->assertSame('Install new core bundle components', $this->installCoreBundle->getName());
}
public function testRunOlder() {
$this->config
->expects($this->once())
->method('getSystemValue')
->with('version', '0.0.0')
->willReturn('12.0.0.15');
$this->bundleFetcher
->expects($this->never())
->method('getDefaultInstallationBundle');
/** @var IOutput|\PHPUnit_Framework_MockObject_MockObject $output */
$output = $this->createMock(IOutput::class);
$output
->expects($this->never())
->method('info');
$output
->expects($this->never())
->method('warning');
$this->installCoreBundle->run($output);
}
public function testRunWithException() {
$this->config
->expects($this->once())
->method('getSystemValue')
->with('version', '0.0.0')
->willReturn('12.0.0.14');
$bundle = $this->createMock(Bundle::class);
$this->bundleFetcher
->expects($this->once())
->method('getDefaultInstallationBundle')
->willReturn([
$bundle,
]);
$this->installer
->expects($this->once())
->method('installAppBundle')
->with($bundle)
->willThrowException(new \Exception('ExceptionText'));
/** @var IOutput|\PHPUnit_Framework_MockObject_MockObject $output */
$output = $this->createMock(IOutput::class);
$output
->expects($this->never())
->method('info');
$output
->expects($this->once())
->method('warning')
->with('Could not install core app bundle: ExceptionText');
$this->installCoreBundle->run($output);
}
public function testRun() {
$this->config
->expects($this->once())
->method('getSystemValue')
->with('version', '0.0.0')
->willReturn('12.0.0.14');
$bundle = $this->createMock(Bundle::class);
$this->bundleFetcher
->expects($this->once())
->method('getDefaultInstallationBundle')
->willReturn([
$bundle,
]);
$this->installer
->expects($this->once())
->method('installAppBundle')
->with($bundle);
/** @var IOutput|\PHPUnit_Framework_MockObject_MockObject $output */
$output = $this->createMock(IOutput::class);
$output
->expects($this->once())
->method('info')
->with('Successfully installed core app bundle.');
$output
->expects($this->never())
->method('warning');
$this->installCoreBundle->run($output);
}
}

View File

@ -1,177 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016 Morris Jobke <hey@morrisjobke.de>
*
* @author Morris Jobke <hey@morrisjobke.de>
*
* @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 Test\Repair\NC12;
use OC\Repair\NC12\UpdateLanguageCodes;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IConfig;
use OCP\Migration\IOutput;
use Test\TestCase;
/**
* Class UpdateLanguageCodesTest
*
* @group DB
*
* @package Test\Repair
*/
class UpdateLanguageCodesTest extends TestCase {
/** @var \OCP\IDBConnection */
protected $connection;
/** @var IConfig | \PHPUnit_Framework_MockObject_MockObject */
private $config;
protected function setUp() {
parent::setUp();
$this->connection = \OC::$server->getDatabaseConnection();
$this->config = $this->createMock(IConfig::class);
}
public function testRun() {
$users = [
['userid' => 'user1', 'configvalue' => 'fi_FI'],
['userid' => 'user2', 'configvalue' => 'de'],
['userid' => 'user3', 'configvalue' => 'fi'],
['userid' => 'user4', 'configvalue' => 'ja'],
['userid' => 'user5', 'configvalue' => 'bg_BG'],
['userid' => 'user6', 'configvalue' => 'ja'],
['userid' => 'user7', 'configvalue' => 'th_TH'],
['userid' => 'user8', 'configvalue' => 'th_TH'],
];
// insert test data
$qb = $this->connection->getQueryBuilder();
$qb->insert('preferences')
->values([
'userid' => $qb->createParameter('userid'),
'appid' => $qb->createParameter('appid'),
'configkey' => $qb->createParameter('configkey'),
'configvalue' => $qb->createParameter('configvalue'),
]);
foreach ($users as $user) {
$qb->setParameters([
'userid' => $user['userid'],
'appid' => 'core',
'configkey' => 'lang',
'configvalue' => $user['configvalue'],
])->execute();
}
// check if test data is written to DB
$qb = $this->connection->getQueryBuilder();
$result = $qb->select(['userid', 'configvalue'])
->from('preferences')
->where($qb->expr()->eq('appid', $qb->createNamedParameter('core')))
->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang')))
->execute();
$rows = $result->fetchAll();
$result->closeCursor();
$this->assertSame($users, $rows, 'Asserts that the entries are the ones from the test data set');
/** @var IOutput|\PHPUnit_Framework_MockObject_MockObject $outputMock */
$outputMock = $this->createMock(IOutput::class);
$outputMock->expects($this->at(0))
->method('info')
->with('Changed 1 setting(s) from "bg_BG" to "bg" in preferences table.');
$outputMock->expects($this->at(1))
->method('info')
->with('Changed 0 setting(s) from "cs_CZ" to "cs" in preferences table.');
$outputMock->expects($this->at(2))
->method('info')
->with('Changed 1 setting(s) from "fi_FI" to "fi" in preferences table.');
$outputMock->expects($this->at(3))
->method('info')
->with('Changed 0 setting(s) from "hu_HU" to "hu" in preferences table.');
$outputMock->expects($this->at(4))
->method('info')
->with('Changed 0 setting(s) from "nb_NO" to "nb" in preferences table.');
$outputMock->expects($this->at(5))
->method('info')
->with('Changed 0 setting(s) from "sk_SK" to "sk" in preferences table.');
$outputMock->expects($this->at(6))
->method('info')
->with('Changed 2 setting(s) from "th_TH" to "th" in preferences table.');
$this->config->expects($this->once())
->method('getSystemValue')
->with('version', '0.0.0')
->willReturn('12.0.0.13');
// run repair step
$repair = new UpdateLanguageCodes($this->connection, $this->config);
$repair->run($outputMock);
// check if test data is correctly modified in DB
$qb = $this->connection->getQueryBuilder();
$result = $qb->select(['userid', 'configvalue'])
->from('preferences')
->where($qb->expr()->eq('appid', $qb->createNamedParameter('core')))
->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang')))
->orderBy('userid')
->execute();
$rows = $result->fetchAll();
$result->closeCursor();
// value has changed for one user
$users[0]['configvalue'] = 'fi';
$users[4]['configvalue'] = 'bg';
$users[6]['configvalue'] = 'th';
$users[7]['configvalue'] = 'th';
$this->assertSame($users, $rows, 'Asserts that the entries are updated correctly.');
// remove test data
foreach ($users as $user) {
$qb = $this->connection->getQueryBuilder();
$qb->delete('preferences')
->where($qb->expr()->eq('userid', $qb->createNamedParameter($user['userid'])))
->andWhere($qb->expr()->eq('appid', $qb->createNamedParameter('core')))
->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter('lang')))
->andWhere($qb->expr()->eq('configvalue', $qb->createNamedParameter($user['configvalue']), IQueryBuilder::PARAM_STR))
->execute();
}
}
public function testSecondRun() {
/** @var IOutput|\PHPUnit_Framework_MockObject_MockObject $outputMock */
$outputMock = $this->createMock(IOutput::class);
$outputMock->expects($this->never())
->method('info');
$this->config->expects($this->once())
->method('getSystemValue')
->with('version', '0.0.0')
->willReturn('12.0.0.14');
// run repair step
$repair = new UpdateLanguageCodes($this->connection, $this->config);
$repair->run($outputMock);
}
}