Merge pull request #12313 from nextcloud/generated-avatar-major-cleanup

Clear avatar cache with frontend repair
This commit is contained in:
Roeland Jago Douma 2018-11-08 10:28:09 +01:00 committed by GitHub
commit 25fe324f41
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 206 additions and 25 deletions

View File

@ -960,6 +960,7 @@ return array(
'OC\\Repair\\AddCleanupUpdaterBackupsJob' => $baseDir . '/lib/private/Repair/AddCleanupUpdaterBackupsJob.php',
'OC\\Repair\\CleanTags' => $baseDir . '/lib/private/Repair/CleanTags.php',
'OC\\Repair\\ClearFrontendCaches' => $baseDir . '/lib/private/Repair/ClearFrontendCaches.php',
'OC\\Repair\\ClearGeneratedAvatarCache' => $baseDir . '/lib/private/Repair/ClearGeneratedAvatarCache.php',
'OC\\Repair\\Collation' => $baseDir . '/lib/private/Repair/Collation.php',
'OC\\Repair\\MoveUpdaterStepFile' => $baseDir . '/lib/private/Repair/MoveUpdaterStepFile.php',
'OC\\Repair\\NC11\\FixMountStorages' => $baseDir . '/lib/private/Repair/NC11/FixMountStorages.php',

View File

@ -990,6 +990,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Repair\\AddCleanupUpdaterBackupsJob' => __DIR__ . '/../../..' . '/lib/private/Repair/AddCleanupUpdaterBackupsJob.php',
'OC\\Repair\\CleanTags' => __DIR__ . '/../../..' . '/lib/private/Repair/CleanTags.php',
'OC\\Repair\\ClearFrontendCaches' => __DIR__ . '/../../..' . '/lib/private/Repair/ClearFrontendCaches.php',
'OC\\Repair\\ClearGeneratedAvatarCache' => __DIR__ . '/../../..' . '/lib/private/Repair/ClearGeneratedAvatarCache.php',
'OC\\Repair\\Collation' => __DIR__ . '/../../..' . '/lib/private/Repair/Collation.php',
'OC\\Repair\\MoveUpdaterStepFile' => __DIR__ . '/../../..' . '/lib/private/Repair/MoveUpdaterStepFile.php',
'OC\\Repair\\NC11\\FixMountStorages' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/FixMountStorages.php',

View File

@ -86,10 +86,10 @@ class Avatar implements IAvatar {
* @param IConfig $config
*/
public function __construct(ISimpleFolder $folder,
IL10N $l,
$user,
ILogger $logger,
IConfig $config) {
IL10N $l,
$user,
ILogger $logger,
IConfig $config) {
$this->folder = $folder;
$this->l = $l;
$this->user = $user;

View File

@ -104,4 +104,20 @@ class AvatarManager implements IAvatarManager {
return new Avatar($folder, $this->l, $user, $this->logger, $this->config);
}
/**
* Clear generated avatars
*/
public function clearCachedAvatars() {
$users = $this->config->getUsersForUserValue('avatar', 'generated', 'true');
foreach($users as $userId) {
try {
$folder = $this->appData->getFolder($userId);
$folder->delete();
} catch (NotFoundException $e) {
$this->logger->debug("No cache for the user $userId. Ignoring...");
}
$this->config->setUserValue($userId, 'avatar', 'generated', 'false');
}
}
}

View File

@ -30,13 +30,19 @@
namespace OC;
use OCP\AppFramework\QueryException;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
use OC\AvatarManager;
use OC\Repair\AddCleanupUpdaterBackupsJob;
use OC\Repair\CleanTags;
use OC\Repair\ClearGeneratedAvatarCache;
use OC\Repair\ClearFrontendCaches;
use OC\Repair\Collation;
use OC\Repair\MoveUpdaterStepFile;
use OC\Repair\NC11\FixMountStorages;
use OC\Repair\NC13\AddLogRotateJob;
use OC\Repair\NC13\RepairInvalidPaths;
use OC\Repair\NC14\AddPreviewBackgroundCleanupJob;
use OC\Repair\NC14\RepairPendingCronJobs;
use OC\Repair\NC15\SetVcardDatabaseUID;
@ -44,23 +50,22 @@ use OC\Repair\OldGroupMembershipShares;
use OC\Repair\Owncloud\DropAccountTermsTable;
use OC\Repair\Owncloud\SaveAccountsTableData;
use OC\Repair\RemoveRootShares;
use OC\Repair\NC13\RepairInvalidPaths;
use OC\Repair\SqliteAutoincrement;
use OC\Repair\RepairMimeTypes;
use OC\Repair\RepairInvalidShares;
use OC\Repair\RepairMimeTypes;
use OC\Repair\SqliteAutoincrement;
use OC\Template\JSCombiner;
use OC\Template\SCSSCacher;
use OCP\AppFramework\QueryException;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\GenericEvent;
class Repair implements IOutput{
/* @var IRepairStep[] */
class Repair implements IOutput {
/** @var IRepairStep[] */
private $repairSteps;
/** @var EventDispatcher */
private $dispatcher;
/** @var string */
private $currentStep;
@ -72,7 +77,7 @@ class Repair implements IOutput{
*/
public function __construct($repairSteps = [], EventDispatcher $dispatcher = null) {
$this->repairSteps = $repairSteps;
$this->dispatcher = $dispatcher;
$this->dispatcher = $dispatcher;
}
/**
@ -81,6 +86,7 @@ class Repair implements IOutput{
public function run() {
if (count($this->repairSteps) === 0) {
$this->emit('\OC\Repair', 'info', array('No repair steps available'));
return;
}
// run each repair step
@ -137,10 +143,11 @@ class Repair implements IOutput{
new RepairInvalidPaths(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig()),
new AddLogRotateJob(\OC::$server->getJobList()),
new ClearFrontendCaches(\OC::$server->getMemCacheFactory(), \OC::$server->query(SCSSCacher::class), \OC::$server->query(JSCombiner::class)),
new ClearGeneratedAvatarCache(\OC::$server->getConfig(), \OC::$server->query(AvatarManager::class)),
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())
];
}
@ -152,7 +159,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())
];
}
@ -164,12 +171,12 @@ class Repair implements IOutput{
*/
public static function getBeforeUpgradeRepairSteps() {
$connection = \OC::$server->getDatabaseConnection();
$config = \OC::$server->getConfig();
$steps = [
$config = \OC::$server->getConfig();
$steps = [
new Collation(\OC::$server->getConfig(), \OC::$server->getLogger(), $connection, true),
new SqliteAutoincrement($connection),
new SaveAccountsTableData($connection, $config),
new DropAccountTermsTable($connection),
new DropAccountTermsTable($connection)
];
return $steps;

View File

@ -23,11 +23,11 @@
namespace OC\Repair;
use OC\Template\JSCombiner;
use OC\Template\SCSSCacher;
use OCP\ICacheFactory;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
use OC\Template\JSCombiner;
use OC\Template\SCSSCacher;
class ClearFrontendCaches implements IRepairStep {
@ -44,8 +44,8 @@ class ClearFrontendCaches implements IRepairStep {
SCSSCacher $SCSSCacher,
JSCombiner $JSCombiner) {
$this->cacheFactory = $cacheFactory;
$this->scssCacher = $SCSSCacher;
$this->jsCombiner = $JSCombiner;
$this->scssCacher = $SCSSCacher;
$this->jsCombiner = $JSCombiner;
}
public function getName() {

View File

@ -0,0 +1,72 @@
<?php
/**
* @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>
*
* @author John Molakvoæ <skjnldsv@protonmail.com>
*
* @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;
use OC\AvatarManager;
use OCP\IConfig;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
use OCP\Util;
class ClearGeneratedAvatarCache implements IRepairStep {
/** @var AvatarManager */
protected $avatarManager;
/** @var IConfig */
private $config;
public function __construct(IConfig $config, AvatarManager $avatarManager) {
$this->config = $config;
$this->avatarManager = $avatarManager;
}
public function getName() {
return 'Clear every generated avatar on major updates';
}
/**
* Check if this repair step should run
*
* @return boolean
*/
private function shouldRun() {
$versionFromBeforeUpdate = $this->config->getSystemValue('version', '0.0.0.0');
// was added to 15.0.0.4
return version_compare($versionFromBeforeUpdate, '15.0.0.4', '<=');
}
public function run(IOutput $output) {
if ($this->shouldRun()) {
try {
$this->avatarManager->clearCachedAvatars();
$output->info('Avatar cache cleared');
} catch (\Exception $e) {
$output->warning('Unable to clear the avatar cache');
}
}
}
}

View File

@ -539,7 +539,7 @@ class Server extends ServerContainer implements IServerContainer {
});
$this->registerAlias(IValidator::class, Validator::class);
$this->registerService(\OCP\IAvatarManager::class, function (Server $c) {
$this->registerService(AvatarManager::class, function(Server $c) {
return new AvatarManager(
$c->query(\OC\User\Manager::class),
$c->getAppDataDir('avatar'),
@ -548,7 +548,8 @@ class Server extends ServerContainer implements IServerContainer {
$c->getConfig()
);
});
$this->registerAlias('AvatarManager', \OCP\IAvatarManager::class);
$this->registerAlias(\OCP\IAvatarManager::class, AvatarManager::class);
$this->registerAlias('AvatarManager', AvatarManager::class);
$this->registerAlias(\OCP\Support\CrashReport\IRegistry::class, \OC\Support\CrashReport\Registry::class);

View File

@ -44,4 +44,5 @@ interface IAvatarManager {
* @since 6.0.0
*/
public function getAvatar(string $user) : IAvatar;
}

View File

@ -0,0 +1,82 @@
<?php
/**
* @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
*
* @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;
use OCP\IConfig;
use OCP\Migration\IOutput;
use OC\AvatarManager;
use OC\Repair\ClearGeneratedAvatarCache;
class ClearGeneratedAvatarCacheTest extends \Test\TestCase {
/** @var AvatarManager */
private $avatarManager;
/** @var IOutput */
private $outputMock;
/** @var IConfig */
private $config;
/** @var ClearGeneratedAvatarCache */
protected $repair;
protected function setUp() {
parent::setUp();
$this->outputMock = $this->createMock(IOutput::class);
$this->avatarManager = $this->createMock(AvatarManager::class);
$this->config = $this->createMock(IConfig::class);
$this->repair = new ClearGeneratedAvatarCache($this->config, $this->avatarManager);
}
public function shouldRunDataProvider() {
return [
['11.0.0.0', true],
['15.0.0.3', true],
['13.0.5.2', true],
['12.0.0.0', true],
['16.0.0.1', false],
['15.0.0.2', true],
['13.0.0.0', true],
['15.0.0.5', false]
];
}
/**
* @dataProvider shouldRunDataProvider
*
* @param string $from
* @param boolean $expected
*/
public function testShouldRun($from, $expected) {
$this->config->expects($this->any())
->method('getSystemValue')
->with('version', '0.0.0.0')
->willReturn($from);
$this->assertEquals($expected, $this->invokePrivate($this->repair, 'shouldRun'));
}
}

View File

@ -29,7 +29,7 @@
// between betas, final and RCs. This is _not_ the public version number. Reset minor/patchlevel
// when updating major/minor version number.
$OC_Version = array(15, 0, 0, 3);
$OC_Version = array(15, 0, 0, 4);
// The human readable string
$OC_VersionString = '15.0.0 alpha';