[!!!][TASK] Cleanup and remove old filefunc logic 95/45695/15
authorBenni Mack <benni@typo3.org>
Fri, 8 Jan 2016 11:42:33 +0000 (12:42 +0100)
committerAnja Leichsenring <aleichsenring@ab-softlab.de>
Wed, 3 Aug 2016 18:03:54 +0000 (20:03 +0200)
The BasicFileUtility was used before FAL also for
checking file mounts and paths, and is only used
for legacy files now. A lot of that code can therefore be removed.

First of all, the init() function was replaced by a real
constructor. A possibility to set the file extension
permissions was added.

Removed DefaultConfiguration
- TYPO3_CONF_VARS[BE][fileExtensions][ftpspace]

Removed properties:
- getUniqueNamePrefix
- tempFN
- f_ext
- mounts
- webPath
- isInit

Removed methods:
- checkPathAgainstMounts()
- findFirstWebFolder()
- slashPath()
- is_webpath()
- checkIfFullAccess()
- init()

Methods that are now protected
- is_directory()
- is_allowed()

Resolves: #77182
Releases: master
Change-Id: I2a8f40f0ea143087c23e269ef69ca4e8548b7b8f
Reviewed-on: https://review.typo3.org/45695
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Tested-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
typo3/sysext/backend/Classes/Controller/File/FileController.php
typo3/sysext/core/Classes/DataHandling/DataHandler.php
typo3/sysext/core/Classes/Utility/File/BasicFileUtility.php
typo3/sysext/core/Classes/Utility/File/ExtendedFileUtility.php
typo3/sysext/core/Configuration/DefaultConfiguration.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-77182-RemovedBasicFileUtilityMethodsAndProperties.rst [new file with mode: 0644]
typo3/sysext/impexp/Classes/ImportExport.php

index 1b71671..6006ba8 100644 (file)
@@ -141,7 +141,6 @@ class FileController
     public function main()
     {
         // Initializing:
-        $this->fileProcessor->init(array(), $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']);
         $this->fileProcessor->setActionPermissions();
         $this->fileProcessor->setExistingFilesConflictMode($this->overwriteExistingFiles);
         // Checking referrer / executing:
index 4ddd996..ca99dd5 100644 (file)
@@ -2089,11 +2089,7 @@ class DataHandler
                 $this->fileFunc = GeneralUtility::makeInstance(BasicFileUtility::class);
             }
             // Setting permitted extensions.
-            $all_files = array();
-            $all_files['webspace']['allow'] = $tcaFieldConf['allowed'];
-            $all_files['webspace']['deny'] = $tcaFieldConf['disallowed'] ?: '*';
-            $all_files['ftpspace'] = $all_files['webspace'];
-            $this->fileFunc->init('', $all_files);
+            $this->fileFunc->setFileExtensionPermissions($tcaFieldConf['allowed'], $tcaFieldConf['disallowed'] ?: '*');
         }
         // If there is an upload folder defined:
         if ($tcaFieldConf['uploadfolder'] && $tcaFieldConf['internal_type'] == 'file') {
index 0a6b7ba..35bf632 100644 (file)
@@ -21,12 +21,10 @@ use TYPO3\CMS\Core\Utility\PathUtility;
 /**
  * Contains class with basic file management functions
  *
- * Contains functions for management, validation etc of files in TYPO3,
- * using the concepts of web- and ftp-space. Please see the comment for the
- * init() function
+ * Contains functions for management, validation etc of files in TYPO3.
  *
  * Note: All methods in this class should not be used anymore since TYPO3 6.0.
- * Please use corresponding TYPO3\\CMS\\Core\\Resource\\ResourceStorage
+ * Please use corresponding \TYPO3\CMS\Core\Resource\ResourceStorage
  * (fetched via BE_USERS->getFileStorages()), as all functions should be
  * found there (in a cleaner manner).
  */
@@ -38,13 +36,6 @@ class BasicFileUtility
     const UNSAFE_FILENAME_CHARACTER_EXPRESSION = '\\x00-\\x2C\\/\\x3A-\\x3F\\x5B-\\x60\\x7B-\\xBF';
 
     /**
-     * Prefix which will be prepended the file when using the getUniqueName-function
-     *
-     * @var string
-     */
-    public $getUniqueNamePrefix = '';
-
-    /**
      * This number decides the highest allowed appended number used on a filename before we use naming with unique strings
      *
      * @var int
@@ -59,186 +50,93 @@ class BasicFileUtility
     public $uniquePrecision = 6;
 
     /**
-     * Temp-foldername. A folder in the root of one of the mounts with this name is regarded a TEMP-folder (used for upload from clipboard)
-     *
-     * @var string
-     */
-    public $tempFN = '_temp_';
-
-    /**
-     * @var array
-     */
-    public $f_ext = array();
-
-    /**
-     * See comment in header
-     *
+     * Allowed and denied file extensions
      * @var array
      */
-    public $mounts = array();
-
-    /**
-     * See comment in header
-     *
-     * @var string
-     */
-    public $webPath = '';
-
-    /**
-     * Set to DOCUMENT_ROOT.
-     *
-     * @var bool
-     */
-    public $isInit = 0;
+    protected $fileExtensionPermissions = array();
 
     /**********************************
      *
      * Checking functions
      *
      **********************************/
+
     /**
-     * Constructor
-     * This function should be called to initialise the internal arrays $this->mounts and $this->f_ext
-     *
-     * A typical example of the array $mounts is this:
-     * $mounts[xx][path] = (..a mounted path..)
-     * the 'xx'-keys is just numerical from zero. There are also a [name] and [type] value that just denotes the mountname and type. Not used for athentication here.
-     * $this->mounts is traversed in the function checkPathAgainstMounts($thePath), and it is checked that $thePath is actually below one of the mount-paths
-     * The mountpaths are with a trailing '/'. $thePath must be with a trailing '/' also!
-     * As you can see, $this->mounts is very critical! This is the array that decides where the user will be allowed to copy files!!
-     *
-     * A typical example of the array $f_ext is this:
-     * $f_ext['webspace']['allow']='';
-     * $f_ext['webspace']['deny']= PHP_EXTENSIONS_DEFAULT;
-     * $f_ext['ftpspace']['allow']='*';
-     * $f_ext['ftpspace']['deny']='';
-     * The control of fileextensions goes in two catagories. Webspace and Ftpspace. Webspace is folders accessible from a webbrowser (below TYPO3_DOCUMENT_ROOT) and ftpspace is everything else.
-     * The control is done like this: If an extension matches 'allow' then the check returns TRUE. If not and an extension matches 'deny' then the check return FALSE. If no match at all, returns TRUE.
-     * You list extensions comma-separated. If the value is a '*' every extension is allowed
-     * The list is case-insensitive when used in this class (see init())
-     * Typically TYPO3_CONF_VARS['BE']['fileExtensions'] would be passed along as $f_ext.
-     *
-     * Example:
-     * $basicff->init(array(), $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']);
-     *
-     * @param array Not in use anymore
-     * @param array Array with information about allowed and denied file extensions. Typically passed: $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']
-     * @return void
+     * Constructor,
+     * Initializes the internal array $this->fileExtensionPermissions based on TYPO3_CONF_VARS
      */
-    public function init($mounts, $f_ext)
+    public function __construct()
     {
-        $this->f_ext['webspace']['allow'] = GeneralUtility::uniqueList(strtolower($f_ext['webspace']['allow']));
-        $this->f_ext['webspace']['deny'] = GeneralUtility::uniqueList(strtolower($f_ext['webspace']['deny']));
-        $this->f_ext['ftpspace']['allow'] = GeneralUtility::uniqueList(strtolower($f_ext['ftpspace']['allow']));
-        $this->f_ext['ftpspace']['deny'] = GeneralUtility::uniqueList(strtolower($f_ext['ftpspace']['deny']));
-
-        $this->mounts = (!empty($mounts) ? $mounts : array());
-        $this->webPath = GeneralUtility::getIndpEnv('TYPO3_DOCUMENT_ROOT');
-        $this->isInit = 1;
+        $this->fileExtensionPermissions['allow'] = GeneralUtility::uniqueList(strtolower($GLOBALS['TYPO3_CONF_VARS']['BE']['filePermissions']['webspace']['allow']));
+        $this->fileExtensionPermissions['deny'] = GeneralUtility::uniqueList(strtolower($GLOBALS['TYPO3_CONF_VARS']['BE']['filePermissions']['webspace']['deny']));
     }
 
     /**
-     * Checks if a $iconkey (fileextension) is allowed according to $this->f_ext.
+     * Sets the file permissions, used in DataHandler e.g.
      *
-     * @param string The extension to check, eg. "php" or "html" etc.
-     * @param string Either "webspage" or "ftpspace" - points to a key in $this->f_ext
-     * @return bool TRUE if file extension is allowed.
-     * @todo Deprecate, but still in use by checkIfAllowed()
-     * @deprecated but still in use in the Core. Don't use in your extensions!
+     * @param string $allowedFilePermissions
+     * @param string $deniedFilePermissions
      */
-    public function is_allowed($iconkey, $type)
+    public function setFileExtensionPermissions($allowedFilePermissions, $deniedFilePermissions)
     {
-        if (isset($this->f_ext[$type])) {
-            $ik = strtolower($iconkey);
-            if ($ik) {
-                // If the extension is found amongst the allowed types, we return TRUE immediately
-                if ($this->f_ext[$type]['allow'] == '*' || GeneralUtility::inList($this->f_ext[$type]['allow'], $ik)) {
-                    return true;
-                }
-                // If the extension is found amongst the denied types, we return FALSE immediately
-                if ($this->f_ext[$type]['deny'] == '*' || GeneralUtility::inList($this->f_ext[$type]['deny'], $ik)) {
-                    return false;
-                }
-                // If no match we return TRUE
-                return true;
-            } else {
-                // If no extension:
-                if ($this->f_ext[$type]['allow'] == '*') {
-                    return true;
-                }
-                if ($this->f_ext[$type]['deny'] == '*') {
-                    return false;
-                }
-                return true;
-            }
-        }
-        return false;
+        $this->fileExtensionPermissions['allow'] = GeneralUtility::uniqueList(strtolower($allowedFilePermissions));
+        $this->fileExtensionPermissions['deny'] = GeneralUtility::uniqueList(strtolower($deniedFilePermissions));
     }
 
     /**
-     * Returns TRUE if you can operate of ANY file ('*') in the space $theDest is in ('webspace' / 'ftpspace')
+     * Checks if a $fileExtension is allowed according to $this->fileExtensionPermissions.
      *
-     * @param string Absolute path
-     * @return bool
-     * @todo Deprecate: but still in use by through func_unzip in ExtendedFileUtility
-     * @deprecated but still in use in the Core. Don't use in your extensions!
+     * @param string $fileExtension The extension to check, eg. "php" or "html" etc.
+     * @return bool TRUE if file extension is allowed.
      */
-    public function checkIfFullAccess($theDest)
+    protected function is_allowed($fileExtension)
     {
-        $type = $this->is_webpath($theDest) ? 'webspace' : 'ftpspace';
-        if (isset($this->f_ext[$type])) {
-            if ((string)$this->f_ext[$type]['deny'] == '' || $this->f_ext[$type]['allow'] == '*') {
+        $fileExtension = strtolower($fileExtension);
+        if ($fileExtension) {
+            // If the extension is found amongst the allowed types, we return TRUE immediately
+            if ($this->fileExtensionPermissions['allow'] === '*' || GeneralUtility::inList($this->fileExtensionPermissions['allow'], $fileExtension)) {
                 return true;
             }
-        }
-    }
-
-    /**
-     * Checks if $this->webPath (should be TYPO3_DOCUMENT_ROOT) is in the first part of $path
-     * Returns TRUE also if $this->init is not set or if $path is empty...
-     *
-     * @param string Absolute path to check
-     * @return bool
-     * @todo Deprecate, but still in use by DataHandler
-     * @deprecated but still in use in the Core. Don't use in your extensions!
-     */
-    public function is_webpath($path)
-    {
-        if ($this->isInit) {
-            $testPath = $this->slashPath($path);
-            $testPathWeb = $this->slashPath($this->webPath);
-            if ($testPathWeb && $testPath) {
-                return GeneralUtility::isFirstPartOfStr($testPath, $testPathWeb);
+            // If the extension is found amongst the denied types, we return FALSE immediately
+            if ($this->fileExtensionPermissions['deny'] === '*' || GeneralUtility::inList($this->fileExtensionPermissions['deny'], $fileExtension)) {
+                return false;
+            }
+        } else {
+            // If no extension
+            if ($this->fileExtensionPermissions['allow'] === '*') {
+                return true;
+            }
+            if ($this->fileExtensionPermissions['deny'] === '*') {
+                return false;
             }
         }
+        // If no match we return TRUE
         return true;
     }
 
     /**
      * If the filename is given, check it against the TYPO3_CONF_VARS[BE][fileDenyPattern] +
-     * Checks if the $ext fileextension is allowed in the path $theDest (this is based on whether $theDest is below the $this->webPath)
+     * Checks if the $ext fileextension is allowed
      *
-     * @param string File extension, eg. "php" or "html
-     * @param string Absolute path for which to test
-     * @param string Filename to check against TYPO3_CONF_VARS[BE][fileDenyPattern]
+     * @param string $ext File extension, eg. "php" or "html
+     * @param string $_ not in use anymore
+     * @param string $filename Filename to check against TYPO3_CONF_VARS[BE][fileDenyPattern]
      * @return bool TRUE if extension/filename is allowed
      * @todo Deprecate, but still in use by DataHandler
      * @deprecated but still in use in the Core. Don't use in your extensions!
      */
-    public function checkIfAllowed($ext, $theDest, $filename = '')
+    public function checkIfAllowed($ext, $_, $filename = '')
     {
-        return GeneralUtility::verifyFilenameAgainstDenyPattern($filename) && $this->is_allowed($ext, ($this->is_webpath($theDest) ? 'webspace' : 'ftpspace'));
+        return GeneralUtility::verifyFilenameAgainstDenyPattern($filename) && $this->is_allowed($ext);
     }
 
     /**
      * Cleans $theDir for slashes in the end of the string and returns the new path, if it exists on the server.
      *
-     * @param string Directory path to check
-     * @return string Returns the cleaned up directory name if OK, otherwise FALSE.
-     * @todo Deprecate: but still in use by getUniqueName (used by DataHandler)
-     * @deprecated but still in use in the Core. Don't use in your extensions!
+     * @param string $theDir Directory path to check
+     * @return bool|string Returns the cleaned up directory name if OK, otherwise FALSE.
      */
-    public function is_directory($theDir)
+    protected function is_directory($theDir)
     {
         // @todo: should go into the LocalDriver in a protected way (not important to the outside world)
         if (GeneralUtility::validPathStr($theDir)) {
@@ -255,15 +153,15 @@ class BasicFileUtility
      * If $theFile exists in $theDest (directory) the file have numbers appended up to $this->maxNumber. Hereafter a unique string will be appended.
      * This function is used by fx. TCEmain when files are attached to records and needs to be uniquely named in the uploads/* folders
      *
-     * @param string The input filename to check
-     * @param string The directory for which to return a unique filename for $theFile. $theDest MUST be a valid directory. Should be absolute.
-     * @param bool If set the filename is returned with the path prepended without checking whether it already existed!
+     * @param string $theFile The input filename to check
+     * @param string $theDest The directory for which to return a unique filename for $theFile. $theDest MUST be a valid directory. Should be absolute.
+     * @param bool $dontCheckForUnique If set the filename is returned with the path prepended without checking whether it already existed!
      * @return string The destination absolute filepath (not just the name!) of a unique filename/foldername in that path.
      * @see \TYPO3\CMS\Core\DataHandling\DataHandler::checkValue()
      * @todo Deprecate, but still in use by the Core (DataHandler...)
      * @deprecated but still in use in the Core. Don't use in your extensions!
      */
-    public function getUniqueName($theFile, $theDest, $dontCheckForUnique = 0)
+    public function getUniqueName($theFile, $theDest, $dontCheckForUnique = false)
     {
         // @todo: should go into the LocalDriver in a protected way (not important to the outside world)
         $theDest = $this->is_directory($theDest);
@@ -271,11 +169,6 @@ class BasicFileUtility
         $origFileInfo = GeneralUtility::split_fileref($theFile);
         // Fetches info about path, name, extension of $theFile
         if ($theDest) {
-            if ($this->getUniqueNamePrefix) {
-                // Adds prefix
-                $origFileInfo['file'] = $this->getUniqueNamePrefix . $origFileInfo['file'];
-                $origFileInfo['filebody'] = $this->getUniqueNamePrefix . $origFileInfo['filebody'];
-            }
             // Check if the file exists and if not - return the filename...
             $fileInfo = $origFileInfo;
             $theDestFile = $theDest . '/' . $fileInfo['file'];
@@ -288,7 +181,7 @@ class BasicFileUtility
             $theTempFileBody = preg_replace('/_[0-9][0-9]$/', '', $origFileInfo['filebody']);
             // This removes _xx if appended to the file
             $theOrigExt = $origFileInfo['realFileext'] ? '.' . $origFileInfo['realFileext'] : '';
-            for ($a = 1; $a <= $this->maxNumber + 1; $a++) {
+            for ($a = 1; $a < $this->maxNumber; $a++) {
                 if ($a <= $this->maxNumber) {
                     // First we try to append numbers
                     $insert = '_' . sprintf('%02d', $a);
@@ -307,68 +200,11 @@ class BasicFileUtility
         }
     }
 
-    /**
-     * Checks if $thePath is a path under one of the paths in $this->mounts
-     * See comment in the header of this class.
-     *
-     * @param string $thePath MUST HAVE a trailing '/' in order to match correctly with the mounts
-     * @return string The key to the first mount found, otherwise nothing is returned.
-     * @see init()
-     * @todo: deprecate this function, now done in the Storage object. But still in use by impexp and ExtendedFileUtility
-     * @deprecated but still in use in the Core. Don't use in your extensions!
-     */
-    public function checkPathAgainstMounts($thePath)
-    {
-        if ($thePath && GeneralUtility::validPathStr($thePath) && is_array($this->mounts)) {
-            foreach ($this->mounts as $k => $val) {
-                if (GeneralUtility::isFirstPartOfStr($thePath, $val['path'])) {
-                    return $k;
-                }
-            }
-        }
-    }
-
-    /**
-     * Find first web folder (relative to PATH_site.'fileadmin') in filemounts array
-     *
-     * @return string The key to the first mount inside PATH_site."fileadmin" found, otherwise nothing is returned.
-     * @todo: deprecate this function. But still in use by impexp
-     * @deprecated but still in use in the Core. Don't use in your extensions!
-     */
-    public function findFirstWebFolder()
-    {
-        // @todo: where and when to use this function?
-        if (is_array($this->mounts)) {
-            foreach ($this->mounts as $k => $val) {
-                if (GeneralUtility::isFirstPartOfStr($val['path'], PATH_site . $GLOBALS['TYPO3_CONF_VARS']['BE']['fileadminDir'])) {
-                    return $k;
-                }
-            }
-        }
-    }
-
     /*********************
      *
      * Cleaning functions
      *
      *********************/
-    /**
-     * Returns a string which has a slash '/' appended if it doesn't already have that slash
-     *
-     * @param string Input string
-     * @return string Output string with a slash in the end (if not already there)
-     * @todo Deprecate, but still in use by is_webpath, used by DataHandler
-     * @deprecated but still in use in the Core. Don't use in your extensions!
-     */
-    public function slashPath($path)
-    {
-        // @todo: should go into the LocalDriver in a protected way (not important to the outside world)
-        // @todo: should be done with rtrim($path, '/') . '/';
-        if (substr($path, -1) != '/') {
-            return $path . '/';
-        }
-        return $path;
-    }
 
     /**
      * Returns a string where any character not matching [.a-zA-Z0-9_-] is substituted by '_'
@@ -386,10 +222,7 @@ class BasicFileUtility
             // allow ".", "-", 0-9, a-z, A-Z and everything beyond U+C0 (latin capital letter a with grave)
             $cleanFileName = preg_replace('/[' . self::UNSAFE_FILENAME_CHARACTER_EXPRESSION . ']/u', '_', trim($fileName));
         } else {
-            /** @var CharsetConverter $charsetConverter */
-            $charsetConverter = GeneralUtility::makeInstance(CharsetConverter::class);
-            $fileName = $charsetConverter->specCharsToASCII('utf-8', $fileName);
-
+            $fileName = GeneralUtility::makeInstance(CharsetConverter::class)->specCharsToASCII('utf-8', $fileName);
             // Replace unwanted characters by underscores
             $cleanFileName = preg_replace('/[' . self::UNSAFE_FILENAME_CHARACTER_EXPRESSION . '\\xC0-\\xFF]/', '_', trim($fileName));
         }
index e549fcc..7341db6 100644 (file)
@@ -50,20 +50,10 @@ use TYPO3\CMS\Lang\LanguageService;
  *
  * Important internal variables:
  *
- * $filemounts (see basicFileFunctions)
- * $f_ext (see basicFileFunctions)
+ * $fileExtensionPermissions (see basicFileFunctions)
  *
- * All fileoperations must be within the filemount-paths. Further the fileextension
- * MUST validate TRUE with the f_ext array
- *
- * The unzip-function allows unzip only if the destination path has it's f_ext[]['allow'] set to '*'!!
- * You are allowed to copy/move folders within the same 'space' (web/ftp).
- * You are allowed to copy/move folders between spaces (web/ftp) IF the destination has it's f_ext[]['allow'] set to '*'!
- *
- * Advice:
- * You should always exclude php-files from the webspace. This will keep people from uploading, copy/moving and renaming files to become executable php scripts.
- * You should never mount a ftp_space 'below' the webspace so that it reaches into the webspace. This is because if somebody unzips a zip-file in the ftp-space so that it reaches out into the webspace this will be a violation of the safety
- * For example this is a bad idea: you have an ftp-space that is '/www/' and a web-space that is '/www/htdocs/'
+ * All fileoperations must be within the filemount paths of the user. Further the fileextension
+ * MUST validate TRUE with the fileExtensionPermissions array
  */
 class ExtendedFileUtility extends BasicFileUtility
 {
@@ -103,13 +93,6 @@ class ExtendedFileUtility extends BasicFileUtility
     );
 
     /**
-     * This is regarded to be the recycler folder
-     *
-     * @var string
-     */
-    public $recyclerFN = '_recycler_';
-
-    /**
      * Will contain map between upload ID and the final filename
      *
      * @var array
@@ -117,11 +100,6 @@ class ExtendedFileUtility extends BasicFileUtility
     public $internalUploadMap = array();
 
     /**
-     * @var string
-     */
-    public $lastError = '';
-
-    /**
      * All error messages from the file operations of this script instance
      *
      * @var array
@@ -217,9 +195,6 @@ class ExtendedFileUtility extends BasicFileUtility
     public function processData()
     {
         $result = array();
-        if (!$this->isInit) {
-            return false;
-        }
         if (is_array($this->fileCmdMap)) {
             // Check if there were uploads expected, but no one made
             if ($this->fileCmdMap['upload']) {
@@ -354,8 +329,7 @@ class ExtendedFileUtility extends BasicFileUtility
             $this->getBackendUser()->writelog($type, $action, $error, $details_nr, $details, $data);
         }
         if ($error > 0) {
-            $this->lastError = vsprintf($details, $data);
-            $this->errorMessages[] = $this->lastError;
+            $this->errorMessages[] = vsprintf($details, $data);
         }
     }
 
@@ -399,10 +373,7 @@ class ExtendedFileUtility extends BasicFileUtility
     public function func_delete(array $cmds)
     {
         $result = false;
-        if (!$this->isInit) {
-            return $result;
-        }
-        // Example indentifier for $cmds['data'] => "4:mypath/tomyfolder/myfile.jpg"
+        // Example identifier for $cmds['data'] => "4:mypath/tomyfolder/myfile.jpg"
         // for backwards compatibility: the combined file identifier was the path+filename
         try {
             $fileObject = $this->getFileObject($cmds['data']);
@@ -446,7 +417,7 @@ class ExtendedFileUtility extends BasicFileUtility
                         $shortcutRecord = BackendUtility::getRecord($row['tablename'], $row['recuid']);
 
                         if ($shortcutRecord) {
-                            $shortcutContent[] = '[record:' . $row['tablename'] . ':' .  $row['recuid'] . ']';
+                            $shortcutContent[] = '[record:' . $row['tablename'] . ':' . $row['recuid'] . ']';
                         } else {
                             $brokenReferences[] = $fileReferenceRow['ref_uid'];
                         }
@@ -642,9 +613,6 @@ class ExtendedFileUtility extends BasicFileUtility
      */
     protected function func_copy($cmds)
     {
-        if (!$this->isInit) {
-            return false;
-        }
         $sourceFileObject = $this->getFileObject($cmds['data']);
         /** @var $targetFolderObject \TYPO3\CMS\Core\Resource\Folder */
         $targetFolderObject = $this->getFileObject($cmds['target']);
@@ -735,9 +703,6 @@ class ExtendedFileUtility extends BasicFileUtility
      */
     protected function func_move($cmds)
     {
-        if (!$this->isInit) {
-            return false;
-        }
         $sourceFileObject = $this->getFileObject($cmds['data']);
         $targetFolderObject = $this->getFileObject($cmds['target']);
         // Basic check
@@ -831,9 +796,6 @@ class ExtendedFileUtility extends BasicFileUtility
      */
     public function func_rename($cmds)
     {
-        if (!$this->isInit) {
-            return false;
-        }
         $sourceFileObject = $this->getFileObject($cmds['data']);
         $sourceFile = $sourceFileObject->getName();
         $targetFile = $cmds['target'];
@@ -896,9 +858,6 @@ class ExtendedFileUtility extends BasicFileUtility
      */
     public function func_newfolder($cmds)
     {
-        if (!$this->isInit) {
-            return false;
-        }
         $targetFolderObject = $this->getFileObject($cmds['target']);
         if (!$targetFolderObject instanceof Folder) {
             $this->writeLog(6, 2, 104, 'Destination "%s" was not a directory', array($cmds['target']));
@@ -941,9 +900,6 @@ class ExtendedFileUtility extends BasicFileUtility
      */
     public function func_newfile($cmds)
     {
-        if (!$this->isInit) {
-            return false;
-        }
         $targetFolderObject = $this->getFileObject($cmds['target']);
         if (!$targetFolderObject instanceof Folder) {
             $this->writeLog(8, 2, 104, 'Destination "%s" was not a directory', array($cmds['target']));
@@ -986,9 +942,6 @@ class ExtendedFileUtility extends BasicFileUtility
      */
     public function func_edit($cmds)
     {
-        if (!$this->isInit) {
-            return false;
-        }
         // Example indentifier for $cmds['target'] => "4:mypath/tomyfolder/myfile.jpg"
         // for backwards compatibility: the combined file identifier was the path+filename
         $fileIdentifier = $cmds['target'];
@@ -1059,9 +1012,6 @@ class ExtendedFileUtility extends BasicFileUtility
      */
     public function func_upload($cmds)
     {
-        if (!$this->isInit) {
-            return false;
-        }
         $uploadPosition = $cmds['data'];
         $uploadedFileData = $_FILES['upload_' . $uploadPosition];
         if (empty($uploadedFileData['name']) || is_array($uploadedFileData['name']) && empty($uploadedFileData['name'][0])) {
@@ -1143,10 +1093,6 @@ class ExtendedFileUtility extends BasicFileUtility
      */
     protected function replaceFile(array $cmdArr)
     {
-        if (!$this->isInit) {
-            return false;
-        }
-
         $uploadPosition = $cmdArr['data'];
         $fileInfo = $_FILES['replace_' . $uploadPosition];
         if (empty($fileInfo['name'])) {
index 1b118f3..748fb89 100644 (file)
@@ -1069,8 +1069,7 @@ return array(
         // If no file extension, TRUE is returned if 'allow' is '*', FALSE if 'deny' is '*' and TRUE if none of these matches
         // This configuration below accepts everything in ftpspace and everything in webspace except php3,php4,php5 or php files
         'fileExtensions' => array(
-            'webspace' => array('allow' => '', 'deny' => PHP_EXTENSIONS_DEFAULT),
-            'ftpspace' => array('allow' => '*', 'deny' => '')
+            'webspace' => array('allow' => '', 'deny' => PHP_EXTENSIONS_DEFAULT)
         ),
         'customPermOptions' => array(),                        // Array with sets of custom permission options. Syntax is; 'key' => array('header' => 'header string, language splitted', 'items' => array('key' => array('label, language splitted', 'icon reference', 'Description text, language splitted'))). Keys cannot contain ":|," characters.
         'fileDenyPattern' => FILE_DENY_PATTERN_DEFAULT,        // A perl-compatible regular expression (without delimiters!) that - if it matches a filename - will deny the file upload/rename or whatever in the webspace. For security reasons, files with multiple extensions have to be denied on an Apache environment with mod_alias, if the filename contains a valid php handler in an arbitrary position. Also, ".htaccess" files have to be denied. Matching is done case-insensitive. Default value is stored in constant FILE_DENY_PATTERN_DEFAULT
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-77182-RemovedBasicFileUtilityMethodsAndProperties.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-77182-RemovedBasicFileUtilityMethodsAndProperties.rst
new file mode 100644 (file)
index 0000000..5b0aeb2
--- /dev/null
@@ -0,0 +1,54 @@
+==================================================================
+Breaking: #77182 - Removed BasicFileUtility methods and properties
+==================================================================
+
+Description
+===========
+
+The BasicFileUtility was used before FAL for checking file mounts and paths, and is only used for non-FAL files now,
+old legacy functionality was removed.
+
+The init() method was replaced by a real constructor. A possibility to set the file extension permissions was added via
+the ``setFileExtensionPermissions()``.
+
+The DefaultConfiguration setting ``$TYPO3_CONF_VARS[BE][fileExtensions][ftpspace]`` was removed.
+
+The following public properties within BasicFileUtility have been removed:
+- getUniqueNamePrefix
+- tempFN
+- f_ext
+- mounts
+- webPath
+- isInit
+
+The following public methods within BasicFileUtility have been removed:
+- checkPathAgainstMounts()
+- findFirstWebFolder()
+- slashPath()
+- is_webpath()
+- checkIfFullAccess()
+- init()
+
+The following public properties within BasicFileUtility have been set to have a protected visibility:
+- is_directory()
+- is_allowed()
+
+
+Impact
+======
+
+Calling any of the methods above or using one of the properties above will result in PHP errors and warnings respectively.
+
+Using the TYPO3_CONF_VARS setting has no effect anymore.
+
+
+Affected Installations
+======================
+
+Any installation using pre - 6.0 core functionality within extensions.
+
+
+Migration
+=========
+
+Use the File Abstraction Layer to achieve the same functionality.
index 49b1209..b6d3861 100644 (file)
@@ -1214,7 +1214,6 @@ abstract class ImportExport
     {
         if ($this->fileProcObj === null) {
             $this->fileProcObj = GeneralUtility::makeInstance(ExtendedFileUtility::class);
-            $this->fileProcObj->init(array(), $GLOBALS['TYPO3_CONF_VARS']['BE']['fileExtensions']);
             $this->fileProcObj->setActionPermissions();
         }
         return $this->fileProcObj;