[BUGFIX] Do not check file extension on local file 17/32817/2
authorAlexander Opitz <opitz.alexander@googlemail.com>
Wed, 17 Sep 2014 07:56:17 +0000 (09:56 +0200)
committerStefan Neufeind <typo3.neufeind@speedpartner.de>
Sun, 21 Sep 2014 16:47:02 +0000 (18:47 +0200)
If a file is uploaded and file extension deny pattern is set,
we should not test this temporary file for extension permissions.
Also on adding a file into a storage do not need to test the
extension of the local file, the extension of the target file is
enough.

Resolves: #58367
Releases: master, 6.2
Change-Id: I95b1685746150e2b03c56a5680785ae0b2388cd9
Reviewed-on: http://review.typo3.org/32817
Reviewed-by: Helmut Hummel <helmut.hummel@typo3.org>
Reviewed-by: Frans Saris <franssaris@gmail.com>
Tested-by: Frans Saris <franssaris@gmail.com>
Reviewed-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
Tested-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
typo3/sysext/core/Classes/Resource/ResourceStorage.php

index 7e406e8..6d67430 100644 (file)
@@ -831,23 +831,20 @@ class ResourceStorage implements ResourceStorageInterface {
        }
 
        /**
-        * Checks if a file has the permission to be uploaded to a Folder/Storage.
+        * Checks if a file/user has the permission to be written to a Folder/Storage.
         * If not, throws an exception.
         *
-        * @param string $localFilePath the temporary file name from $_FILES['file1']['tmp_name']
-        * @param Folder $targetFolder
-        * @param string $targetFileName the destination file name $_FILES['file1']['name']
+        * @param Folder $targetFolder The target folder where the file should be written
+        * @param string $targetFileName The file name which should be written into the storage
         * @return void
         *
         * @throws Exception\InsufficientFolderWritePermissionsException
-        * @throws Exception\UploadException
         * @throws Exception\IllegalFileExtensionException
-        * @throws Exception\UploadSizeException
         * @throws Exception\InsufficientUserPermissionsException
         */
-       protected function assureFileAddPermissions($localFilePath, $targetFolder, $targetFileName) {
+       protected function assureFileAddPermissions($targetFolder, $targetFileName) {
                // Check for a valid file extension
-               if (!$this->checkFileExtensionPermission($targetFileName) || ($localFilePath && !$this->checkFileExtensionPermission($localFilePath))) {
+               if (!$this->checkFileExtensionPermission($targetFileName)) {
                        throw new Exception\IllegalFileExtensionException('Extension of file name is not allowed in "' . $targetFileName . '"!', 1322120271);
                }
                // Makes sure the user is allowed to upload
@@ -865,7 +862,7 @@ class ResourceStorage implements ResourceStorageInterface {
         * If not, throws an exception.
         *
         * @param string $localFilePath the temporary file name from $_FILES['file1']['tmp_name']
-        * @param Folder $targetFolder
+        * @param Folder $targetFolder The target folder where the file should be uploaded
         * @param string $targetFileName the destination file name $_FILES['file1']['name']
         * @param int $uploadedFileSize
         * @return void
@@ -887,7 +884,7 @@ class ResourceStorage implements ResourceStorageInterface {
                        unlink($localFilePath);
                        throw new Exception\UploadSizeException('The uploaded file exceeds the size-limit of ' . $maxUploadFileSize . ' bytes', 1322110041);
                }
-               $this->assureFileAddPermissions($localFilePath, $targetFolder, $targetFileName);
+               $this->assureFileAddPermissions($targetFolder, $targetFileName);
        }
 
        /**
@@ -1064,9 +1061,9 @@ class ResourceStorage implements ResourceStorageInterface {
        /**
         * Moves a file from the local filesystem to this storage.
         *
-        * @param string $localFilePath The file on the server's hard disk to add.
-        * @param Folder $targetFolder The target path, without the fileName
-        * @param string $targetFileName The fileName. If not set, the local file name is used.
+        * @param string $localFilePath The file on the server's hard disk to add
+        * @param Folder $targetFolder The target folder where the file should be added
+        * @param string $targetFileName The name of the file to be add, If not set, the local file name is used
         * @param string $conflictMode possible value are 'cancel', 'replace', 'changeName'
         *
         * @throws \InvalidArgumentException
@@ -1078,10 +1075,11 @@ class ResourceStorage implements ResourceStorageInterface {
                if (!file_exists($localFilePath)) {
                        throw new \InvalidArgumentException('File "' . $localFilePath . '" does not exist.', 1319552745);
                }
-               $this->assureFileAddPermissions($localFilePath, $targetFolder, $targetFileName);
                $targetFolder = $targetFolder ?: $this->getDefaultFolder();
                $targetFileName = $this->driver->sanitizeFileName($targetFileName ?: PathUtility::basename($localFilePath));
 
+               $this->assureFileAddPermissions($targetFolder, $targetFileName);
+
                // We do not care whether the file exists yet because $targetFileName may be changed by an
                // external slot and only then we should check how to proceed according to $conflictMode
                $targetFileName = $this->emitPreFileAddSignal($targetFileName, $targetFolder, $localFilePath);
@@ -1503,15 +1501,15 @@ class ResourceStorage implements ResourceStorageInterface {
         *
         * previously in \TYPO3\CMS\Core\Utility\File\ExtendedFileUtility::func_newfile()
         *
-        * @param string $fileName
-        * @param Folder $targetFolderObject
+        * @param string $fileName The name of the file to be created
+        * @param Folder $targetFolderObject The target folder where the file should be created
         *
         * @throws Exception\IllegalFileExtensionException
         * @throws Exception\InsufficientFolderWritePermissionsException
         * @return FileInterface The file object
         */
        public function createFile($fileName, Folder $targetFolderObject) {
-               $this->assureFileAddPermissions('', $targetFolderObject, $fileName);
+               $this->assureFileAddPermissions($targetFolderObject, $fileName);
                $newFileIdentifier = $this->driver->createFile($fileName, $targetFolderObject->getIdentifier());
                $this->emitPostFileCreateSignal($newFileIdentifier, $targetFolderObject);
                return ResourceFactory::getInstance()->getFileObjectByStorageAndIdentifier($this->getUid(), $newFileIdentifier);