mirror of
https://github.com/nextcloud/server.git
synced 2026-06-08 16:26:59 -04:00
fix(preview): Filter for folders in cleanup old preview job
Fixes #35936. When running `OC\Preview\BackgroundCleanupJob`, the main iteration loop in `run()` expects a folder, however, `getOldPreviewLocations()` currently does not filter by mimetype and therefore can yield a non-folder entry which causes an Exception when constructing the Folder impl. Filtering for `httpd/unix-directory`, as `getNewPreviewLocations()` already does, fixes this issue. Signed-off-by: Dario Mehlich <d.mehlich@gmail.com>
This commit is contained in:
parent
458856b2f8
commit
654034638e
2 changed files with 38 additions and 7 deletions
|
|
@ -77,13 +77,13 @@ class BackgroundCleanupJob extends TimedJob {
|
|||
$qb->expr()->castColumn('a.name', IQueryBuilder::PARAM_INT), 'b.fileid'
|
||||
))
|
||||
->where(
|
||||
$qb->expr()->isNull('b.fileid')
|
||||
)->andWhere(
|
||||
$qb->expr()->eq('a.storage', $qb->createNamedParameter($this->previewFolder->getStorageId()))
|
||||
)->andWhere(
|
||||
$qb->expr()->eq('a.parent', $qb->createNamedParameter($this->previewFolder->getId()))
|
||||
)->andWhere(
|
||||
$qb->expr()->like('a.name', $qb->createNamedParameter('__%'))
|
||||
$qb->expr()->andX(
|
||||
$qb->expr()->isNull('b.fileid'),
|
||||
$qb->expr()->eq('a.storage', $qb->createNamedParameter($this->previewFolder->getStorageId())),
|
||||
$qb->expr()->eq('a.parent', $qb->createNamedParameter($this->previewFolder->getId())),
|
||||
$qb->expr()->like('a.name', $qb->createNamedParameter('__%')),
|
||||
$qb->expr()->eq('a.mimetype', $qb->createNamedParameter($this->mimeTypeLoader->getId('httpd/unix-directory')))
|
||||
)
|
||||
);
|
||||
|
||||
if (!$this->isCLI) {
|
||||
|
|
|
|||
|
|
@ -191,13 +191,44 @@ class BackgroundCleanupJobTest extends \Test\TestCase {
|
|||
$f2 = $appdata->newFolder((string)PHP_INT_MAX - 1);
|
||||
$f2->newFile('foo.jpg', 'foo');
|
||||
|
||||
/*
|
||||
* Cleanup of OldPreviewLocations should only remove numeric folders on AppData level,
|
||||
* therefore these files should stay untouched.
|
||||
*/
|
||||
$appdata->getFolder('/')->newFile('not-a-directory', 'foo');
|
||||
$appdata->getFolder('/')->newFile('133742', 'bar');
|
||||
|
||||
$appdata = \OC::$server->getAppDataDir('preview');
|
||||
// AppData::getDirectoryListing filters all non-folders
|
||||
$this->assertSame(3, count($appdata->getDirectoryListing()));
|
||||
try {
|
||||
$appdata->getFolder('/')->getFile('not-a-directory');
|
||||
} catch (NotFoundException) {
|
||||
$this->fail('Could not find file \'not-a-directory\'');
|
||||
}
|
||||
try {
|
||||
$appdata->getFolder('/')->getFile('133742');
|
||||
} catch (NotFoundException) {
|
||||
$this->fail('Could not find file \'133742\'');
|
||||
}
|
||||
|
||||
$job = new BackgroundCleanupJob($this->timeFactory, $this->connection, $this->getRoot(), $this->mimeTypeLoader, true);
|
||||
$job->run([]);
|
||||
|
||||
$appdata = \OC::$server->getAppDataDir('preview');
|
||||
|
||||
// Check if the files created above are still present
|
||||
// Remember: AppData::getDirectoryListing filters all non-folders
|
||||
$this->assertSame(0, count($appdata->getDirectoryListing()));
|
||||
try {
|
||||
$appdata->getFolder('/')->getFile('not-a-directory');
|
||||
} catch (NotFoundException) {
|
||||
$this->fail('Could not find file \'not-a-directory\'');
|
||||
}
|
||||
try {
|
||||
$appdata->getFolder('/')->getFile('133742');
|
||||
} catch (NotFoundException) {
|
||||
$this->fail('Could not find file \'133742\'');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue