From 382495e26d165c0c76616aca455ce9ba3e2df0b7 Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Fri, 1 Feb 2019 21:13:06 +0100 Subject: Repair step to remove "photo." files created by photocache Before https://github.com/nextcloud/server/pull/13843 a "photo." file could be created for unsupported image formats by photocache. Because a file is present but not jpg, png or gif no photo could be returned for this vcard. These invalid files are removed by this repair step. Signed-off-by: Daniel Kesselberg --- lib/private/Repair.php | 12 +-- .../Repair/NC16/CleanupCardDAVPhotoCache.php | 99 ++++++++++++++++++++++ 2 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 lib/private/Repair/NC16/CleanupCardDAVPhotoCache.php (limited to 'lib/private') diff --git a/lib/private/Repair.php b/lib/private/Repair.php index 641475cf386..5201c88de7c 100644 --- a/lib/private/Repair.php +++ b/lib/private/Repair.php @@ -30,14 +30,11 @@ namespace OC; -use OCP\AppFramework\QueryException; -use OCP\Migration\IOutput; -use OCP\Migration\IRepairStep; use OC\Avatar\AvatarManager; use OC\Repair\AddCleanupUpdaterBackupsJob; use OC\Repair\CleanTags; -use OC\Repair\ClearGeneratedAvatarCache; use OC\Repair\ClearFrontendCaches; +use OC\Repair\ClearGeneratedAvatarCache; use OC\Repair\Collation; use OC\Repair\MoveUpdaterStepFile; use OC\Repair\NC11\FixMountStorages; @@ -46,6 +43,7 @@ use OC\Repair\NC13\RepairInvalidPaths; use OC\Repair\NC14\AddPreviewBackgroundCleanupJob; use OC\Repair\NC14\RepairPendingCronJobs; use OC\Repair\NC15\SetVcardDatabaseUID; +use OC\Repair\NC16\CleanupCardDAVPhotoCache; use OC\Repair\OldGroupMembershipShares; use OC\Repair\Owncloud\DropAccountTermsTable; use OC\Repair\Owncloud\SaveAccountsTableData; @@ -55,6 +53,9 @@ 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; @@ -147,7 +148,8 @@ 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(), \OC::$server->getLogger()) + new SetVcardDatabaseUID(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig(), \OC::$server->getLogger()), + new CleanupCardDAVPhotoCache(\OC::$server->getConfig(), \OC::$server->getAppDataDir('dav-photocache')), ]; } diff --git a/lib/private/Repair/NC16/CleanupCardDAVPhotoCache.php b/lib/private/Repair/NC16/CleanupCardDAVPhotoCache.php new file mode 100644 index 00000000000..11bb765e9a4 --- /dev/null +++ b/lib/private/Repair/NC16/CleanupCardDAVPhotoCache.php @@ -0,0 +1,99 @@ +. + * + */ + +namespace OC\Repair\NC16; + +use OC\Files\AppData\AppData; +use OCP\Files\IAppData; +use OCP\Files\NotFoundException; +use OCP\Files\SimpleFS\ISimpleFolder; +use OCP\IConfig; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; + +/** + * Class CleanupCardDAVPhotoCache + * + * This repair step removes "photo." files created by photocache + * + * Before https://github.com/nextcloud/server/pull/13843 a "photo." file could be created + * for unsupported image formats by photocache. Because a file is present but not jpg, png or gif no + * photo could be returned for this vcard. These invalid files are removed by this migration step. + */ +class CleanupCardDAVPhotoCache implements IRepairStep { + + /** @var IConfig */ + private $config; + + /** @var AppData */ + private $appData; + + public function __construct(IConfig $config, IAppData $appData) { + $this->config = $config; + $this->appData = $appData; + } + + public function getName(): string { + return 'Cleanup invalid photocache files for carddav'; + } + + private function repair(IOutput $output): void { + try { + $folders = $this->appData->getDirectoryListing(); + } catch (NotFoundException $e) { + return; + } + + $folders = array_filter($folders, function (ISimpleFolder $folder) { + return $folder->fileExists('photo.'); + }); + + if (empty($folders)) { + return; + } + + $output->info('Delete ' . count($folders) . ' "photo." files'); + + foreach ($folders as $folder) { + try { + /** @var ISimpleFolder $folder */ + $folder->getFile('photo.')->delete(); + } catch (\Exception $e) { + $output->warning('Could not delete "photo." file in dav-photocache/' . $folder->getName()); + } + } + } + + private function shouldRun(): bool { + return version_compare( + $this->config->getSystemValue('version', '0.0.0.0'), + '16.0.0.0', + '<=' + ); + } + + public function run(IOutput $output): void { + if ($this->shouldRun()) { + $this->repair($output); + } + } +} -- cgit v1.2.3