From 12a8eaf21d556c53abfd39fc0e6ffc5407f9c695 Mon Sep 17 00:00:00 2001 From: Alexander Stehlik <alexander.stehlik@gmail.com> Date: Wed, 16 May 2018 23:16:22 +0200 Subject: [PATCH] [BUGFIX] Prevent endless loop in recycler folder detection Compare folder identifiers instead of folder objects because objects pointing to the same folder might still be different object instances. Change-Id: I78e21b9e68fbaae245d12ac4efb96312b246a847 Releases: master, 8.7 Resolves: #85019 Reviewed-on: https://review.typo3.org/56985 Tested-by: TYPO3com <no-reply@typo3.com> Reviewed-by: Frans Saris <franssaris@gmail.com> Reviewed-by: Susanne Moog <susanne.moog@typo3.org> Tested-by: Susanne Moog <susanne.moog@typo3.org> Reviewed-by: Markus Klein <markus.klein@typo3.org> Tested-by: Markus Klein <markus.klein@typo3.org> --- .../core/Classes/Resource/ResourceStorage.php | 2 +- .../Resource/ResourceStorageTest.php | 42 ++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/typo3/sysext/core/Classes/Resource/ResourceStorage.php b/typo3/sysext/core/Classes/Resource/ResourceStorage.php index a368b04c1bda..0d34b943f8f1 100644 --- a/typo3/sysext/core/Classes/Resource/ResourceStorage.php +++ b/typo3/sysext/core/Classes/Resource/ResourceStorage.php @@ -3044,7 +3044,7 @@ class ResourceStorage implements ResourceStorageInterface break; } } - } while ($recyclerFolder === null && $folder !== $rootFolder); + } while ($recyclerFolder === null && $folder->getCombinedIdentifier() !== $rootFolder->getCombinedIdentifier()); return $recyclerFolder; } diff --git a/typo3/sysext/core/Tests/Functional/Resource/ResourceStorageTest.php b/typo3/sysext/core/Tests/Functional/Resource/ResourceStorageTest.php index cafef0323928..4506a002bb8e 100644 --- a/typo3/sysext/core/Tests/Functional/Resource/ResourceStorageTest.php +++ b/typo3/sysext/core/Tests/Functional/Resource/ResourceStorageTest.php @@ -90,7 +90,7 @@ class ResourceStorageTest extends \TYPO3\TestingFramework\Core\Functional\Functi $subject = (new StorageRepository())->findByUid(1); $subject->setEvaluatePermissions(true); - // read_only = true -> no write access for user, so checkinf for second argument true should assert false + // read_only = true -> no write access for user, so checking for second argument true should assert false $subject->addFileMount('/' . $fileMountFolder . '/', ['read_only' => $isFileMountReadOnly]); $this->assertSame($expectedResult, $subject->isWithinFileMountBoundaries($file, $checkWriteAccess)); } @@ -209,4 +209,44 @@ class ResourceStorageTest extends \TYPO3\TestingFramework\Core\Functional\Functi $this->expectExceptionCode(1325689164); $subject->createFolder('newFolder', new Folder($subject, '/foo/', 'foo')); } + + /** + * @test + */ + public function deleteFileMovesFileToRecyclerFolderIfAvailable() + { + $this->importDataSet('PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/sys_file_storage.xml'); + $this->setUpBackendUserFromFixture(1); + $subject = (new StorageRepository())->findByUid(1); + + GeneralUtility::mkdir_deep(PATH_site . 'fileadmin/foo'); + GeneralUtility::mkdir_deep(PATH_site . 'fileadmin/_recycler_'); + file_put_contents(PATH_site . 'fileadmin/foo/bar.txt', 'myData'); + clearstatcache(); + + $file = ResourceFactory::getInstance()->getFileObjectFromCombinedIdentifier('1:/foo/bar.txt'); + $subject->deleteFile($file); + + $this->assertTrue(file_exists(PATH_site . 'fileadmin/_recycler_/bar.txt')); + $this->assertFalse(file_exists(PATH_site . 'fileadmin/foo/bar.txt')); + } + + /** + * @test + */ + public function deleteFileUnlinksFileIfNoRecyclerFolderAvailable() + { + $this->importDataSet('PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/sys_file_storage.xml'); + $this->setUpBackendUserFromFixture(1); + $subject = (new StorageRepository())->findByUid(1); + + GeneralUtility::mkdir_deep(PATH_site . 'fileadmin/foo'); + file_put_contents(PATH_site . 'fileadmin/foo/bar.txt', 'myData'); + clearstatcache(); + + $file = ResourceFactory::getInstance()->getFileObjectFromCombinedIdentifier('1:/foo/bar.txt'); + $subject->deleteFile($file); + + $this->assertFalse(file_exists(PATH_site . 'fileadmin/foo/bar.txt')); + } } -- GitLab