[BUGFIX] Move file extension detection to FAL driver 24/55824/14
authorFrans Saris <franssaris@gmail.com>
Tue, 20 Feb 2018 13:36:16 +0000 (14:36 +0100)
committerMarkus Klein <markus.klein@typo3.org>
Mon, 16 Apr 2018 20:40:15 +0000 (22:40 +0200)
The only object that is allowed to handle the physical file in the FAL
is the driver. As that's the only instance that knows how to access the
file.

This patch makes sure the Indexer and FileExtensionFilter asks the
driver of the file extension instead of using the PathUtility itself.

Releases: master, 8.7
Resolves: #83976
Change-Id: I80bec3c3f86d1137747e37dd99973ada8909ad36
Reviewed-on: https://review.typo3.org/55824
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Richard Haeser <richard@maxserv.com>
Reviewed-by: Nicole Cordes <typo3@cordes.co>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
typo3/sysext/core/Classes/Resource/Driver/LocalDriver.php
typo3/sysext/core/Classes/Resource/Filter/FileExtensionFilter.php
typo3/sysext/core/Classes/Resource/Index/Indexer.php
typo3/sysext/core/Documentation/Changelog/master/Deprecation-83976-MovedFileExtensionDetectionToFALDriver.rst [new file with mode: 0644]
typo3/sysext/core/Tests/Unit/Resource/Utility/FileExtensionFilterTest.php

index 1d94e6d..b3eea13 100644 (file)
@@ -638,7 +638,7 @@ class LocalDriver extends AbstractHierarchicalFilesystemDriver
     {
         if (empty($propertiesToExtract)) {
             $propertiesToExtract = [
-                'size', 'atime', 'mtime', 'ctime', 'mimetype', 'name',
+                'size', 'atime', 'mtime', 'ctime', 'mimetype', 'name', 'extension',
                 'identifier', 'identifier_hash', 'storage', 'folder_hash'
             ];
         }
@@ -676,6 +676,8 @@ class LocalDriver extends AbstractHierarchicalFilesystemDriver
                 return $fileInfo->getCTime();
             case 'name':
                 return PathUtility::basename($fileIdentifier);
+            case 'extension':
+                return PathUtility::pathinfo($fileIdentifier, PATHINFO_EXTENSION);
             case 'mimetype':
                 return (string)$fileInfo->getMimeType();
             case 'identifier':
index 8a589d1..a4fa9e3 100644 (file)
@@ -18,6 +18,7 @@ use TYPO3\CMS\Core\DataHandling\DataHandler;
 use TYPO3\CMS\Core\Resource\Driver\DriverInterface;
 use TYPO3\CMS\Core\Resource\ResourceFactory;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Core\Utility\PathUtility;
 
 /**
  * Utility methods for filtering filenames
@@ -64,7 +65,7 @@ class FileExtensionFilter
                 $fileReferenceUid = $parts[count($parts) - 1];
                 $fileReference = ResourceFactory::getInstance()->getFileReferenceObject($fileReferenceUid);
                 $file = $fileReference->getOriginalFile();
-                if ($this->isAllowed($file->getName())) {
+                if ($this->isAllowed($file->getExtension())) {
                     $cleanValues[] = $value;
                 } else {
                     // Remove the erroneously created reference record again
@@ -97,7 +98,16 @@ class FileExtensionFilter
         }
         // Check that this is a file and not a folder
         if ($driver->fileExists($itemIdentifier)) {
-            if (!$this->isAllowed($itemName)) {
+            try {
+                $fileInfo = $driver->getFileInfoByIdentifier($itemIdentifier, ['extension']);
+            } catch (\InvalidArgumentException $e) {
+                $fileInfo = [];
+            }
+            if (!isset($fileInfo['extension'])) {
+                trigger_error('Guessing FAL file extensions has been deprecated in v9.3 and will be removed in v10. The FAL (' . get_class($driver) . ') driver method getFileInfoByIdentifier() should return the file extension', E_USER_DEPRECATED);
+                $fileInfo['extension'] = PathUtility::pathinfo($itemIdentifier, PATHINFO_EXTENSION);
+            }
+            if (!$this->isAllowed($fileInfo['extension'])) {
                 $returnCode = -1;
             }
         }
@@ -107,13 +117,13 @@ class FileExtensionFilter
     /**
      * Checks whether a file is allowed according to the criteria defined in the class variables ($this->allowedFileExtensions etc.)
      *
-     * @param string $fileName
+     * @param string $fileExt
      * @return bool
      */
-    protected function isAllowed($fileName)
+    protected function isAllowed($fileExt)
     {
+        $fileExt = strtolower($fileExt);
         $result = true;
-        $fileExt = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
         // Check allowed file extensions
         if ($this->allowedFileExtensions !== null && !empty($this->allowedFileExtensions) && !in_array($fileExt, $this->allowedFileExtensions)) {
             $result = false;
index 25d69d4..3e9cecf 100644 (file)
@@ -311,7 +311,10 @@ class Indexer
         $fileInfo = $this->transformFromDriverFileInfoArrayToFileObjectFormat($fileInfo);
         $fileInfo['type'] = $this->getFileType($fileInfo['mime_type']);
         $fileInfo['sha1'] = $this->storage->hashFileByIdentifier($identifier, 'sha1');
-        $fileInfo['extension'] = PathUtility::pathinfo($fileInfo['name'], PATHINFO_EXTENSION);
+        if (!isset($fileInfo['extension'])) {
+            trigger_error('Guessing FAL file extensions has been deprecated in v9.3 and will be removed in v10. The FAL (' . $this->storage->getDriverType() . ') driver method getFileInfoByIdentifier() should return the file extension', E_USER_DEPRECATED);
+            $fileInfo['extension'] = PathUtility::pathinfo($fileInfo['name'], PATHINFO_EXTENSION);
+        }
         $fileInfo['missing'] = 0;
 
         return $fileInfo;
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-83976-MovedFileExtensionDetectionToFALDriver.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-83976-MovedFileExtensionDetectionToFALDriver.rst
new file mode 100644 (file)
index 0000000..849dae2
--- /dev/null
@@ -0,0 +1,37 @@
+.. include:: ../../Includes.txt
+
+==================================================================
+Deprecation: #83976 - Moved file extension detection to FAL driver
+==================================================================
+
+See :issue:`83976`
+
+Description
+===========
+
+The only object that is allowed to handle the physical file in the FAL is the driver. As that's the
+only instance that knows how to access the file.
+
+The definition of the FAL driver method `getFileInfoByIdentifier()` is enhanced with the return
+value `extension`.
+
+
+Impact
+======
+
+Installations with a FAL driver `getFileInfoByIdentifier()` method that doesn't return the
+`extension` value will see deprecation messages in the log.
+
+
+Affected Installations
+======================
+
+Installations with 3rd party FAL drivers.
+
+
+Migration
+=========
+
+Adjust the `getFileInfoByIdentifier()` method of your file drivers to return the `extension` value.
+
+.. index:: FAL, NotScanned
\ No newline at end of file
index d0288b6..fa833bb 100644 (file)
@@ -106,7 +106,7 @@ class FileExtensionFilterTest extends UnitTestCase
         $filter = $this->getAccessibleMock(FileExtensionFilter::class, ['dummy']);
         $filter->setAllowedFileExtensions($allowedExtensions);
         $filter->setDisallowedFileExtensions($disallowedExtensions);
-        $result = $filter->_call('isAllowed', 'file.' . $fileExtension);
+        $result = $filter->_call('isAllowed', $fileExtension);
         $this->assertEquals($isAllowed, $result);
     }
 }