[!!!][TASK] Drop image support in RTE handling 86/60886/5
authorBenni Mack <benni@typo3.org>
Thu, 6 Jun 2019 05:02:34 +0000 (07:02 +0200)
committerBenni Mack <benni@typo3.org>
Wed, 12 Jun 2019 04:46:05 +0000 (06:46 +0200)
With the introduction of CKEditor in TYPO3 v8, the support
for images in RTEs is dropped, however functionality was kept
for compatibility with RTEHtmlArea, which was still available in TYPO3 v8
as separate extension.

The functionality to handle images in CKEditor is possible to
be applied again, however, as this cannot be managed properly
via FAL in its current state, the previous functionality is remvoed
from Core. Separate CKEditor extensions as already published,
are able to manage the image handling in CKEditor directly already.

Dropped
* setting TYPO3_CONF_VARS[BE][RTE_imageStorageDir]
* transformation setting "ts_images".
* softref "images" logic
* ImportExport->getRTEoriginalFilename()
* RteHtmlParser->TS_images_rte()
* CLI Command: cleanup:rteimages and Class RteImagesCommand

Resolves: #88500
Releases: master
Change-Id: Ie564b19a7d0f9b7d46398094c8d7ecd845e31a65
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/60886
Tested-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Daniel Gorges <daniel.gorges@b13.de>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Andreas Fernandez <a.fernandez@scripting-base.de>
Reviewed-by: Daniel Gorges <daniel.gorges@b13.de>
Reviewed-by: Benni Mack <benni@typo3.org>
17 files changed:
typo3/sysext/core/Classes/Database/SoftReferenceIndex.php
typo3/sysext/core/Classes/Html/RteHtmlParser.php
typo3/sysext/core/Configuration/DefaultConfiguration.php
typo3/sysext/core/Configuration/DefaultConfigurationDescription.yaml
typo3/sysext/core/Documentation/Changelog/master/Breaking-88500-RTEImageHandlingFunctionalityDropped.rst [new file with mode: 0644]
typo3/sysext/frontend/Configuration/TCA/tt_content.php
typo3/sysext/impexp/Classes/Export.php
typo3/sysext/impexp/Classes/Import.php
typo3/sysext/impexp/Classes/ImportExport.php
typo3/sysext/install/Classes/Service/SilentConfigurationUpgradeService.php
typo3/sysext/install/Configuration/ExtensionScanner/Php/ClassNameMatcher.php
typo3/sysext/install/Configuration/ExtensionScanner/Php/MethodCallMatcher.php
typo3/sysext/lowlevel/Classes/Command/LostFilesCommand.php
typo3/sysext/lowlevel/Classes/Command/RteImagesCommand.php [deleted file]
typo3/sysext/lowlevel/Configuration/Commands.php
typo3/sysext/lowlevel/README.rst
typo3/sysext/workspaces/Classes/Controller/Remote/RemoteServer.php

index 4f74ae9..033fc3b 100644 (file)
@@ -119,9 +119,6 @@ class SoftReferenceIndex
                 ];
                 $retVal = $resultArray;
                 break;
-            case 'images':
-                $retVal = $this->findRef_images($content);
-                break;
             case 'typolink':
                 $retVal = $this->findRef_typolink($content, $spParams);
                 break;
@@ -144,47 +141,6 @@ class SoftReferenceIndex
     }
 
     /**
-     * Finding image tags in the content.
-     * All images that are not from external URLs will be returned with an info text
-     * Will only return files in uploads/ folders which are prefixed with "RTEmagic[C|P]_" for substitution
-     * Any "clear.gif" images are ignored.
-     *
-     * @param string $content The input content to analyze
-     * @return array Result array on positive matches, see description above. Otherwise FALSE
-     */
-    public function findRef_images($content)
-    {
-        // Start HTML parser and split content by image tag:
-        $htmlParser = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Html\HtmlParser::class);
-        $splitContent = $htmlParser->splitTags('img', $content);
-        $elements = [];
-        // Traverse splitted parts:
-        foreach ($splitContent as $k => $v) {
-            if ($k % 2) {
-                // Get file reference:
-                $attribs = $htmlParser->get_tag_attributes($v);
-                $srcRef = htmlspecialchars_decode($attribs[0]['src']);
-                $pI = pathinfo($srcRef);
-                // If it looks like a local image, continue. Otherwise ignore it.
-                $absPath = GeneralUtility::getFileAbsFileName(Environment::getPublicPath() . '/' . $srcRef);
-                if (!$pI['scheme'] && !$pI['query'] && $absPath) {
-                    // Initialize the element entry with info text here:
-                    $elements[$k] = [];
-                    $elements[$k]['matchString'] = $v;
-                }
-            }
-        }
-        // Return result:
-        if (!empty($elements)) {
-            $resultArray = [
-                'content' => implode('', $splitContent),
-                'elements' => $elements
-            ];
-            return $resultArray;
-        }
-    }
-
-    /**
      * TypoLink value processing.
      * Will process input value as a TypoLink value.
      *
index a8e6c68..7be1b40 100644 (file)
@@ -19,8 +19,6 @@ use Psr\Log\LoggerAwareTrait;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\LinkHandling\Exception\UnknownLinkHandlerException;
 use TYPO3\CMS\Core\LinkHandling\LinkService;
-use TYPO3\CMS\Core\Resource;
-use TYPO3\CMS\Core\Type\File\ImageInfo;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 
 /**
@@ -218,9 +216,6 @@ class RteHtmlParser extends HtmlParser implements LoggerAwareInterface
                         case 'detectbrokenlinks':
                             $value = $this->removeBrokenLinkMarkers($value);
                             break;
-                        case 'ts_images':
-                            $value = $this->TS_images_db($value);
-                            break;
                         case 'ts_links':
                             $value = $this->TS_links_db($value);
                             break;
@@ -247,9 +242,6 @@ class RteHtmlParser extends HtmlParser implements LoggerAwareInterface
                         case 'detectbrokenlinks':
                             $value = $this->markBrokenLinks($value);
                             break;
-                        case 'ts_images':
-                            $value = $this->TS_images_rte($value);
-                            break;
                         case 'css_transform':
                             $value = $this->TS_transform_rte($value);
                             break;
@@ -281,7 +273,7 @@ class RteHtmlParser extends HtmlParser implements LoggerAwareInterface
         $modeList = implode(',', $modes);
 
         // Replace the shortcut "default" with all custom modes
-        $modeList = str_replace('default', 'detectbrokenlinks,css_transform,ts_images,ts_links', $modeList);
+        $modeList = str_replace('default', 'detectbrokenlinks,css_transform,ts_links', $modeList);
 
         // Make list unique
         $modes = array_unique(GeneralUtility::trimExplode(',', $modeList, true));
@@ -318,212 +310,6 @@ class RteHtmlParser extends HtmlParser implements LoggerAwareInterface
      * Specific RTE TRANSFORMATION functions
      *
      *************************************/
-    /**
-     * Transformation handler: 'ts_images' / direction: "db"
-     * Processing images inserted in the RTE.
-     * This is used when content goes from the RTE to the database.
-     * Images inserted in the RTE has an absolute URL applied to the src attribute. This URL is converted to a relative URL
-     * If it turns out that the URL is from another website than the current the image is read from that external URL and moved to the local server.
-     * Also "magic" images are processed here.
-     *
-     * @param string $value The content from RTE going to Database
-     * @return string Processed content
-     */
-    protected function TS_images_db($value)
-    {
-        // Split content by <img> tags and traverse the resulting array for processing:
-        $imgSplit = $this->splitTags('img', $value);
-        if (count($imgSplit) > 1) {
-            $siteUrl = GeneralUtility::getIndpEnv('TYPO3_SITE_URL');
-            $sitePath = str_replace(GeneralUtility::getIndpEnv('TYPO3_REQUEST_HOST'), '', $siteUrl);
-            /** @var Resource\ResourceFactory $resourceFactory */
-            $resourceFactory = Resource\ResourceFactory::getInstance();
-            /** @var Resource\Service\MagicImageService $magicImageService */
-            $magicImageService = GeneralUtility::makeInstance(Resource\Service\MagicImageService::class);
-            $magicImageService->setMagicImageMaximumDimensions($this->tsConfig);
-            foreach ($imgSplit as $k => $v) {
-                // Image found, do processing:
-                if ($k % 2) {
-                    // Get attributes
-                    list($attribArray) = $this->get_tag_attributes($v, true);
-                    // It's always an absolute URL coming from the RTE into the Database.
-                    $absoluteUrl = trim($attribArray['src']);
-                    // Make path absolute if it is relative and we have a site path which is not '/'
-                    $pI = pathinfo($absoluteUrl);
-                    if ($sitePath && !$pI['scheme'] && GeneralUtility::isFirstPartOfStr($absoluteUrl, $sitePath)) {
-                        // If site is in a subpath (eg. /~user_jim/) this path needs to be removed because it will be added with $siteUrl
-                        $absoluteUrl = substr($absoluteUrl, strlen($sitePath));
-                        $absoluteUrl = $siteUrl . $absoluteUrl;
-                    }
-                    // Image dimensions set in the img tag, if any
-                    $imgTagDimensions = $this->getWHFromAttribs($attribArray);
-                    if ($imgTagDimensions[0]) {
-                        $attribArray['width'] = $imgTagDimensions[0];
-                    }
-                    if ($imgTagDimensions[1]) {
-                        $attribArray['height'] = $imgTagDimensions[1];
-                    }
-                    $originalImageFile = null;
-                    if ($attribArray['data-htmlarea-file-uid']) {
-                        // An original image file uid is available
-                        try {
-                            /** @var Resource\File $originalImageFile */
-                            $originalImageFile = $resourceFactory->getFileObject((int)$attribArray['data-htmlarea-file-uid']);
-                        } catch (Resource\Exception\FileDoesNotExistException $fileDoesNotExistException) {
-                            // Log the fact the file could not be retrieved.
-                            $message = sprintf('Could not find file with uid "%s"', $attribArray['data-htmlarea-file-uid']);
-                            $this->logger->error($message);
-                        }
-                    }
-                    if ($originalImageFile instanceof Resource\File) {
-                        // Public url of local file is relative to the site url, absolute otherwise
-                        if ($absoluteUrl == $originalImageFile->getPublicUrl() || $absoluteUrl == $siteUrl . $originalImageFile->getPublicUrl()) {
-                            // This is a plain image, i.e. reference to the original image
-                            if ($this->procOptions['plainImageMode']) {
-                                // "plain image mode" is configured
-                                // Find the dimensions of the original image
-                                $imageInfo = [
-                                    $originalImageFile->getProperty('width'),
-                                    $originalImageFile->getProperty('height')
-                                ];
-                                if (!$imageInfo[0] || !$imageInfo[1]) {
-                                    $filePath = $originalImageFile->getForLocalProcessing(false);
-                                    $imageInfoObject = GeneralUtility::makeInstance(ImageInfo::class, $filePath);
-                                    $imageInfo = [
-                                        $imageInfoObject->getWidth(),
-                                        $imageInfoObject->getHeight()
-                                    ];
-                                }
-                                $attribArray = $this->applyPlainImageModeSettings($imageInfo, $attribArray);
-                            }
-                        } else {
-                            // Magic image case: get a processed file with the requested configuration
-                            $imageConfiguration = [
-                                'width' => $imgTagDimensions[0],
-                                'height' => $imgTagDimensions[1]
-                            ];
-                            $magicImage = $magicImageService->createMagicImage($originalImageFile, $imageConfiguration);
-                            $attribArray['width'] = $magicImage->getProperty('width');
-                            $attribArray['height'] = $magicImage->getProperty('height');
-                            $attribArray['src'] = $magicImage->getPublicUrl();
-                        }
-                    } elseif (!GeneralUtility::isFirstPartOfStr($absoluteUrl, $siteUrl) && !$this->procOptions['dontFetchExtPictures'] && TYPO3_MODE === 'BE') {
-                        // External image from another URL: in that case, fetch image, unless the feature is disabled or we are not in backend mode
-                        // Fetch the external image
-                        $externalFile = GeneralUtility::getUrl($absoluteUrl);
-                        if ($externalFile) {
-                            $pU = parse_url($absoluteUrl);
-                            $pI = pathinfo($pU['path']);
-                            $extension = strtolower($pI['extension']);
-                            if ($extension === 'jpg' || $extension === 'jpeg' || $extension === 'gif' || $extension === 'png') {
-                                $fileName = GeneralUtility::shortMD5($absoluteUrl) . '.' . $pI['extension'];
-                                // We insert this image into the user default upload folder
-                                list($table, $field) = explode(':', $this->elRef);
-                                /** @var Resource\Folder $folder */
-                                $folder = $GLOBALS['BE_USER']->getDefaultUploadFolder($this->recPid, $table, $field);
-                                /** @var Resource\File $fileObject */
-                                $fileObject = $folder->createFile($fileName)->setContents($externalFile);
-                                $imageConfiguration = [
-                                    'width' => $attribArray['width'],
-                                    'height' => $attribArray['height']
-                                ];
-                                $magicImage = $magicImageService->createMagicImage($fileObject, $imageConfiguration);
-                                $attribArray['width'] = $magicImage->getProperty('width');
-                                $attribArray['height'] = $magicImage->getProperty('height');
-                                $attribArray['data-htmlarea-file-uid'] = $fileObject->getUid();
-                                $attribArray['src'] = $magicImage->getPublicUrl();
-                            }
-                        }
-                    } elseif (GeneralUtility::isFirstPartOfStr($absoluteUrl, $siteUrl)) {
-                        // Finally, check image as local file (siteURL equals the one of the image)
-                        // Image has no data-htmlarea-file-uid attribute
-                        // Relative path, rawurldecoded for special characters.
-                        $path = rawurldecode(substr($absoluteUrl, strlen($siteUrl)));
-                        // Absolute filepath, locked to relative path of this project
-                        $filepath = GeneralUtility::getFileAbsFileName($path);
-                        // Check file existence (in relative directory to this installation!)
-                        if ($filepath && @is_file($filepath)) {
-                            // Treat it as a plain image
-                            if ($this->procOptions['plainImageMode']) {
-                                // If "plain image mode" has been configured
-                                // Find the original dimensions of the image
-                                $imageInfoObject = GeneralUtility::makeInstance(ImageInfo::class, $filepath);
-                                $imageInfo = [
-                                    $imageInfoObject->getWidth(),
-                                    $imageInfoObject->getHeight()
-                                ];
-                                $attribArray = $this->applyPlainImageModeSettings($imageInfo, $attribArray);
-                            }
-                            // Let's try to find a file uid for this image
-                            try {
-                                $fileOrFolderObject = $resourceFactory->retrieveFileOrFolderObject($path);
-                                if ($fileOrFolderObject instanceof Resource\FileInterface) {
-                                    $fileIdentifier = $fileOrFolderObject->getIdentifier();
-                                    /** @var Resource\AbstractFile $fileObject */
-                                    $fileObject = $fileOrFolderObject->getStorage()->getFile($fileIdentifier);
-                                    // @todo if the retrieved file is a processed file, get the original file...
-                                    $attribArray['data-htmlarea-file-uid'] = $fileObject->getUid();
-                                }
-                            } catch (Resource\Exception\ResourceDoesNotExistException $resourceDoesNotExistException) {
-                                // Nothing to be done if file/folder not found
-                            }
-                        }
-                    }
-                    // Remove width and height from style attribute
-                    $attribArray['style'] = preg_replace('/(?:^|[^-])(\\s*(?:width|height)\\s*:[^;]*(?:$|;))/si', '', $attribArray['style']);
-                    // Must have alt attribute
-                    if (!isset($attribArray['alt'])) {
-                        $attribArray['alt'] = '';
-                    }
-                    // Convert absolute to relative url
-                    if (GeneralUtility::isFirstPartOfStr($attribArray['src'], $siteUrl)) {
-                        $attribArray['src'] = substr($attribArray['src'], strlen($siteUrl));
-                    }
-                    $imgSplit[$k] = '<img ' . GeneralUtility::implodeAttributes($attribArray, true, true) . ' />';
-                }
-            }
-        }
-        return implode('', $imgSplit);
-    }
-
-    /**
-     * Transformation handler: 'ts_images' / direction: "rte"
-     * Processing images from database content going into the RTE.
-     * Processing includes converting the src attribute to an absolute URL.
-     *
-     * @param string $value Content input
-     * @return string Content output
-     */
-    public function TS_images_rte($value)
-    {
-        // Split content by <img> tags and traverse the resulting array for processing:
-        $imgSplit = $this->splitTags('img', $value);
-        if (count($imgSplit) > 1) {
-            $siteUrl = GeneralUtility::getIndpEnv('TYPO3_SITE_URL');
-            $sitePath = str_replace(GeneralUtility::getIndpEnv('TYPO3_REQUEST_HOST'), '', $siteUrl);
-            foreach ($imgSplit as $k => $v) {
-                // Image found
-                if ($k % 2) {
-                    // Get the attributes of the img tag
-                    list($attribArray) = $this->get_tag_attributes($v, true);
-                    $absoluteUrl = trim($attribArray['src']);
-                    // Transform the src attribute into an absolute url, if it not already
-                    if (stripos($absoluteUrl, 'http') !== 0) {
-                        // If site is in a subpath (eg. /~user_jim/) this path needs to be removed because it will be added with $siteUrl
-                        $attribArray['src'] = preg_replace('#^' . preg_quote($sitePath, '#') . '#', '', $attribArray['src']);
-                        $attribArray['src'] = $siteUrl . $attribArray['src'];
-                    }
-                    // Must have alt attribute
-                    if (!isset($attribArray['alt'])) {
-                        $attribArray['alt'] = '';
-                    }
-                    $imgSplit[$k] = '<img ' . GeneralUtility::implodeAttributes($attribArray, true, true) . ' />';
-                }
-            }
-        }
-        // Return processed content:
-        return implode('', $imgSplit);
-    }
 
     /**
      * Transformation handler: 'ts_links' / direction: "db"
@@ -963,41 +749,6 @@ class RteHtmlParser extends HtmlParser implements LoggerAwareInterface
     }
 
     /**
-     * Apply plain image settings to the dimensions of the image
-     *
-     * @param array $imageInfo: info array of the image
-     * @param array $attribArray: array of attributes of an image tag
-     *
-     * @return array a modified attributes array
-     */
-    protected function applyPlainImageModeSettings($imageInfo, $attribArray)
-    {
-        if ($this->procOptions['plainImageMode']) {
-            // Perform corrections to aspect ratio based on configuration
-            switch ((string)$this->procOptions['plainImageMode']) {
-                case 'lockDimensions':
-                    $attribArray['width'] = $imageInfo[0];
-                    $attribArray['height'] = $imageInfo[1];
-                    break;
-                case 'lockRatioWhenSmaller':
-                    if ($attribArray['width'] > $imageInfo[0]) {
-                        $attribArray['width'] = $imageInfo[0];
-                    }
-                    if ($imageInfo[0] > 0) {
-                        $attribArray['height'] = round($attribArray['width'] * ($imageInfo[1] / $imageInfo[0]));
-                    }
-                    break;
-                case 'lockRatio':
-                    if ($imageInfo[0] > 0) {
-                        $attribArray['height'] = round($attribArray['width'] * ($imageInfo[1] / $imageInfo[0]));
-                    }
-                    break;
-            }
-        }
-        return $attribArray;
-    }
-
-    /**
      * Called before any processing / transformation is made
      * Removing any CRs (char 13) and only deal with LFs (char 10) internally.
      * CR has a very disturbing effect, so just remove all CR and rely on LF
index dde3a2b..7be3406 100644 (file)
@@ -1075,7 +1075,6 @@ return [
         // Backend Configuration.
         'languageDebug' => false,
         'fileadminDir' => 'fileadmin/',
-        'RTE_imageStorageDir' => 'uploads/',
         'lockRootPath' => '',
         'userHomePath' => '',
         'groupHomePath' => '',
@@ -1379,7 +1378,6 @@ return [
             'softRefParser' => [
                 'substitute' => \TYPO3\CMS\Core\Database\SoftReferenceIndex::class,
                 'notify' => \TYPO3\CMS\Core\Database\SoftReferenceIndex::class,
-                'images' => \TYPO3\CMS\Core\Database\SoftReferenceIndex::class,
                 'typolink' => \TYPO3\CMS\Core\Database\SoftReferenceIndex::class,
                 'typolink_tag' => \TYPO3\CMS\Core\Database\SoftReferenceIndex::class,
                 'ext_fileref' => \TYPO3\CMS\Core\Database\SoftReferenceIndex::class,
index 1969a3c..7772a40 100644 (file)
@@ -241,9 +241,6 @@ BE:
         fileadminDir:
             type: text
             description: 'Path to the primary directory of files for editors. This is relative to the public web dir, DefaultStorage will be created with that configuration, do not access manually but via <code>\TYPO3\CMS\Core\Resource\ResourceFactory::getDefaultStorage().</code>'
-        RTE_imageStorageDir:
-            type: text
-            description: 'Default storage directory for Rich Text Editor files.'
         lockRootPath:
             type: text
             description: 'This path is used to evaluate if paths outside of public web path should be allowed. Ending slash required!'
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-88500-RTEImageHandlingFunctionalityDropped.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-88500-RTEImageHandlingFunctionalityDropped.rst
new file mode 100644 (file)
index 0000000..ecfe5e6
--- /dev/null
@@ -0,0 +1,63 @@
+.. include:: ../../Includes.txt
+
+===========================================================
+Breaking: #88500 - RTE image handling functionality dropped
+===========================================================
+
+See :issue:`88500`
+
+Description
+===========
+
+With the replacement of CKEditor as RTE instead of RTEHtmlArea in TYPO3 v8, the native
+and very incomplete functionality of having images within the RTE was unused.
+
+It is still possible to use HTMLArea in further versions (if adopted), however the
+handling of images is removed.
+
+This includes:
+- RTE processing mode ("ts_images")
+- SoftReference Index for handling inline images
+- Removed public method `ImportExport->getRTEoriginalFilename()`
+- Removed public method `RteHtmlParser->TS_images_rte()`
+- Removed CLI command "cleanup:rteimages" and relevant command class
+- The configuration option `$GLOBALS['TYPO3_CONF_VARS']['BE']['RTE_imageStorageDir']`
+
+
+Impact
+======
+
+Images within an RTE field are not processed at all anymore, not part of the CLI.
+
+Calling the CLI script, using the PHP methods or the PHP CLI command class directly
+within PHP, will result in a fatal error.
+
+Accessing the configuration option will trigger a PHP notice, as it is
+silently removed, if customly set in `LocalConfiguration.php`.
+
+
+Affected Installations
+======================
+
+Any TYPO3 installation using images within CKEditor (with plugins) or still
+using RTEHtmlArea.
+
+Any TYPO3 installation triggering the CLI command, handling RTE images via EXT:impexp
+or directly handling functionality from the CLI command PHP class.
+
+
+Migration
+=========
+
+If necessary, it is recommended to add this functionality to a custom extension
+where this functionality can live on. It is important however, that most of the
+added functionality of TYPO3 in the last years was not supported (image cropping
+inside RTE was not possible via the Image Cropper of FAL).
+
+It is recommended to move all images within an RTE to proper relations, or to
+use extensions like `rte_ckeditor_image` from https://extensions.typo3.org.
+
+If any fork of RTEHtmlArea is still used in TYPO3 v10.0, the image functionality for
+SoftRefParser, CLI command and the processing mode should be added there.
+
+.. index:: CLI, PHP-API, RTE, PartiallyScanned
index 65890c0..6b4a824 100644 (file)
@@ -582,7 +582,7 @@ return [
                 'type' => 'text',
                 'cols' => '80',
                 'rows' => '15',
-                'softref' => 'typolink_tag,images,email[subst],url',
+                'softref' => 'typolink_tag,email[subst],url',
                 'search' => [
                     'andWhere' => '{#CType}=\'text\' OR {#CType}=\'textpic\' OR {#CType}=\'textmedia\''
                 ]
index bcae088..a0af7d5 100644 (file)
@@ -728,32 +728,6 @@ class Export extends ImportExport
         $this->dat['files'][$fI['ID']] = $fileRec;
         // For soft references, do further processing:
         if ($recordRef === '_SOFTREF_') {
-            // RTE files?
-            if ($RTEoriginal = $this->getRTEoriginalFilename(PathUtility::basename($fI['ID_absFile']))) {
-                $RTEoriginal_absPath = PathUtility::dirname($fI['ID_absFile']) . '/' . $RTEoriginal;
-                if (@is_file($RTEoriginal_absPath)) {
-                    $RTEoriginal_ID = md5($RTEoriginal_absPath);
-                    $fileInfo = stat($RTEoriginal_absPath);
-                    $fileRec = [];
-                    $fileRec['filename'] = PathUtility::basename($RTEoriginal_absPath);
-                    $fileRec['filemtime'] = $fileInfo['mtime'];
-                    $fileRec['record_ref'] = '_RTE_COPY_ID:' . $fI['ID'];
-                    $this->dat['header']['files'][$fI['ID']]['RTE_ORIG_ID'] = $RTEoriginal_ID;
-                    // Setting this data in the header
-                    $this->dat['header']['files'][$RTEoriginal_ID] = $fileRec;
-                    $fileMd5 = md5_file($RTEoriginal_absPath);
-                    if (!$this->saveFilesOutsideExportFile) {
-                        // ... and finally add the heavy stuff:
-                        $fileRec['content'] = file_get_contents($RTEoriginal_absPath);
-                    } else {
-                        GeneralUtility::upload_copy_move($RTEoriginal_absPath, $this->getTemporaryFilesPathForExport() . $fileMd5);
-                    }
-                    $fileRec['content_md5'] = $fileMd5;
-                    $this->dat['files'][$RTEoriginal_ID] = $fileRec;
-                } else {
-                    $this->error('RTE original file "' . PathUtility::stripPathSitePrefix($RTEoriginal_absPath) . '" was not found!');
-                }
-            }
             // Files with external media?
             // This is only done with files grabbed by a softreference parser since it is deemed improbable that hard-referenced files should undergo this treatment.
             $html_fI = pathinfo(PathUtility::basename($fI['ID_absFile']));
index cb5c3d1..dd3b1d8 100644 (file)
@@ -1411,39 +1411,7 @@ class Import extends ImportExport
         if ($fileHeaderInfo = $this->dat['header']['files'][$cfg['file_ID']]) {
             // Initialize; Get directory prefix for file and find possible RTE filename
             $dirPrefix = PathUtility::dirname($relFileName) . '/';
-            $rteOrigName = $this->getRTEoriginalFilename(PathUtility::basename($relFileName));
-            // If filename looks like an RTE file, and the directory is in "uploads/", then process as a RTE file!
-            if ($rteOrigName && GeneralUtility::isFirstPartOfStr($dirPrefix, 'uploads/')) {
-                // RTE:
-                // First, find unique RTE file name:
-                if (@is_dir(Environment::getPublicPath() . '/' . $dirPrefix)) {
-                    // From the "original" RTE filename, produce a new "original" destination filename which is unused.
-                    // Even if updated, the image should be unique. Currently the problem with this is that it leaves a lot of unused RTE images...
-                    $fileProcObj = $this->getFileProcObj();
-                    $origDestName = $fileProcObj->getUniqueName($rteOrigName, Environment::getPublicPath() . '/' . $dirPrefix);
-                    // Create copy file name:
-                    $pI = pathinfo($relFileName);
-                    $copyDestName = PathUtility::dirname($origDestName) . '/RTEmagicC_' . substr(PathUtility::basename($origDestName), 10) . '.' . $pI['extension'];
-                    if (
-                        !@is_file($copyDestName) && !@is_file($origDestName)
-                        && $origDestName === GeneralUtility::getFileAbsFileName($origDestName)
-                        && $copyDestName === GeneralUtility::getFileAbsFileName($copyDestName)
-                    ) {
-                        if ($this->dat['header']['files'][$fileHeaderInfo['RTE_ORIG_ID']]) {
-                            // Write the copy and original RTE file to the respective filenames:
-                            $this->writeFileVerify($copyDestName, $cfg['file_ID'], true);
-                            $this->writeFileVerify($origDestName, $fileHeaderInfo['RTE_ORIG_ID'], true);
-                            // Return the relative path of the copy file name:
-                            return PathUtility::stripPathSitePrefix($copyDestName);
-                        }
-                        $this->error('ERROR: Could not find original file ID');
-                    } else {
-                        $this->error('ERROR: The destination filenames "' . $copyDestName . '" and "' . $origDestName . '" either existed or have non-valid names');
-                    }
-                } else {
-                    $this->error('ERROR: "' . Environment::getPublicPath() . '/' . $dirPrefix . '" was not a directory, so could not process file "' . $relFileName . '"');
-                }
-            } elseif (GeneralUtility::isFirstPartOfStr($dirPrefix, $this->fileadminFolderName . '/')) {
+            if (GeneralUtility::isFirstPartOfStr($dirPrefix, $this->fileadminFolderName . '/')) {
                 // File in fileadmin/ folder:
                 // Create file (and possible resources)
                 $newFileName = $this->processSoftReferences_saveFile_createRelFile($dirPrefix, PathUtility::basename($relFileName), $cfg['file_ID'], $table, $uid);
index b77544f..b89be66 100644 (file)
@@ -1171,25 +1171,6 @@ abstract class ImportExport
     }
 
     /**
-     * Creates the original file name for a copy-RTE image (magic type)
-     *
-     * @param string $string RTE copy filename, eg. "RTEmagicC_user_pm_icon_01.gif.gif
-     * @return string|null RTE original filename, eg. "RTEmagicP_user_pm_icon_01.gif". If the input filename was NOT prefixed RTEmagicC_ as RTE images would be, NULL is returned!
-     */
-    public function getRTEoriginalFilename($string)
-    {
-        // If "magic image":
-        if (GeneralUtility::isFirstPartOfStr($string, 'RTEmagicC_')) {
-            // Find original file:
-            $pI = pathinfo(substr($string, strlen('RTEmagicC_')));
-            $filename = substr($pI['basename'], 0, -strlen('.' . $pI['extension']));
-            $origFilePath = 'RTEmagicP_' . $filename;
-            return $origFilePath;
-        }
-        return null;
-    }
-
-    /**
      * Returns file processing object, initialized only once.
      *
      * @return ExtendedFileUtility File processor object
index 6a8ecde..5c711b2 100644 (file)
@@ -147,7 +147,9 @@ class SilentConfigurationUpgradeService
         'FE/pageUnavailable_handling',
         'FE/pageUnavailable_handling_statheader',
         // #88458
-        'FE/get_url_id_token'
+        'FE/get_url_id_token',
+        // #88500
+        'BE/RTE_imageStorageDir',
     ];
 
     public function __construct(ConfigurationManager $configurationManager = null)
index 65e885c..a34b905 100644 (file)
@@ -1281,4 +1281,9 @@ return [
             'Breaking-87193-DeprecatedFunctionalityRemoved.rst',
         ],
     ],
+    'TYPO3\CMS\Lowlevel\Command\RteImagesCommand' => [
+        'restFiles' => [
+            'Breaking-88500-RTEImageHandlingFunctionalityDropped.rst'
+        ],
+    ],
 ];
index 101b3ce..b12e1ab 100644 (file)
@@ -4161,4 +4161,25 @@ return [
             'Deprecation-88473-TypoScriptFrontendController-settingLocale.rst'
         ],
     ],
+    'TYPO3\CMS\Core\Database\SoftReferenceIndex->findRef_images' => [
+        'numberOfMandatoryArguments' => 1,
+        'maximumNumberOfArguments' => 1,
+        'restFiles' => [
+            'Breaking-88500-RTEImageHandlingFunctionalityDropped.rst'
+        ],
+    ],
+    'TYPO3\CMS\Core\Html\RteHtmlParser->TS_images_rte' => [
+        'numberOfMandatoryArguments' => 1,
+        'maximumNumberOfArguments' => 1,
+        'restFiles' => [
+            'Breaking-88500-RTEImageHandlingFunctionalityDropped.rst'
+        ],
+    ],
+    'TYPO3\CMS\Impexp\ImportExport->getRTEoriginalFilename' => [
+        'numberOfMandatoryArguments' => 1,
+        'maximumNumberOfArguments' => 1,
+        'restFiles' => [
+            'Breaking-88500-RTEImageHandlingFunctionalityDropped.rst'
+        ],
+    ],
 ];
index b461316..5bcf093 100644 (file)
@@ -25,7 +25,6 @@ use TYPO3\CMS\Core\Core\Environment;
 use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\Database\ReferenceIndex;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Core\Utility\PathUtility;
 
 /**
  * Finds files within uploads/ which are not needed anymore
@@ -44,7 +43,7 @@ class LostFilesCommand extends Command
 Assumptions:
 - a perfect integrity of the reference index table (always update the reference index table before using this tool!)
 - that all contents in the uploads folder are files attached to TCA records and exclusively managed by DataHandler through "group" type fields
-- index.html, .htaccess files and RTEmagic* image files (ignored)
+- index.html, .htaccess files (ignored)
 - Files found in deleted records are included (otherwise you would see a false list of lost files)
 
 The assumptions are not requirements by the TYPO3 API but reflects the de facto implementation of most TYPO3 installations and therefore a practical approach to cleaning up the uploads/ or costum folder.
@@ -204,11 +203,6 @@ If you want to get more detailed information, use the --verbose option.')
                 continue;
             }
 
-            // If the file is a RTEmagic-image name and if so, we allow it
-            if (preg_match('/^RTEmagic[P|C]_/', PathUtility::basenameDuringBootstrap($value))) {
-                continue;
-            }
-
             $fileIsInExcludedPath = false;
             foreach ($excludedPaths as $exclPath) {
                 if (GeneralUtility::isFirstPartOfStr($value, $exclPath)) {
diff --git a/typo3/sysext/lowlevel/Classes/Command/RteImagesCommand.php b/typo3/sysext/lowlevel/Classes/Command/RteImagesCommand.php
deleted file mode 100644 (file)
index 5bcd959..0000000
+++ /dev/null
@@ -1,382 +0,0 @@
-<?php
-declare(strict_types = 1);
-namespace TYPO3\CMS\Lowlevel\Command;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
-use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Style\SymfonyStyle;
-use TYPO3\CMS\Core\Core\Bootstrap;
-use TYPO3\CMS\Core\Core\Environment;
-use TYPO3\CMS\Core\Database\ConnectionPool;
-use TYPO3\CMS\Core\Database\ReferenceIndex;
-use TYPO3\CMS\Core\Utility\File\BasicFileUtility;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-use TYPO3\CMS\Core\Utility\PathUtility;
-
-/**
- * Looking up all occurencies of RTEmagic images in the database and check existence of parent and
- * copy files on the file system plus report possibly lost files of this type
- */
-class RteImagesCommand extends Command
-{
-
-    /**
-     * Configure the command by defining the name, options and arguments
-     */
-    public function configure()
-    {
-        $this
-            ->setDescription('Looking up all occurrences of RTEmagic images in the database and check existence of parent and copy files on the file system plus report possibly lost RTE files.')
-            ->setHelp('
-Assumptions:
-- a perfect integrity of the reference index table (always update the reference index table before using this tool!)
-- that all RTEmagic image files in the database are registered with the soft reference parser "images"
-- images found in deleted records are included (means that you might find lost RTEmagic images after flushing deleted records)
-
-The assumptions are not requirements by the TYPO3 API but reflects the de facto implementation of most TYPO3 installations.
-However, many custom fields using an RTE will probably not have the "images" soft reference parser registered and so the index will be incomplete and not listing all RTEmagic image files.
-The consequence of this limitation is that you should be careful if you wish to delete lost RTEmagic images - they could be referenced from a field not parsed by the "images" soft reference parser!
-
-Automatic Repair of Errors:
-- Will search for double-usages of RTEmagic images and make copies as required.
-- Lost files can be deleted automatically, but it is recommended to delete them manually if you do not recognize them as used somewhere the system does not know about.
-
-Manual repair suggestions:
-- Missing files: Re-insert missing files or edit record where the reference is found.
-
-If the option "--dry-run" is not set, the files are then deleted automatically.
-Warning: First, make sure those files are not used somewhere TYPO3 does not know about! See the assumptions above.
-
-If you want to get more detailed information, use the --verbose option.')
-            ->addOption(
-                'dry-run',
-                null,
-                InputOption::VALUE_NONE,
-                'If this option is set, the files will not actually be deleted, but just the output which files would be deleted are shown'
-            )
-            ->addOption(
-                'update-refindex',
-                null,
-                InputOption::VALUE_NONE,
-                'Setting this option automatically updates the reference index and does not ask on command line. Alternatively, use -n to avoid the interactive mode'
-            );
-    }
-
-    /**
-     * Executes the command to
-     * - optionally update the reference index (to have clean data)
-     * - find files within uploads/* which are not connected to the reference index
-     * - remove these files if --dry-run is not set
-     *
-     * @param InputInterface $input
-     * @param OutputInterface $output
-     */
-    protected function execute(InputInterface $input, OutputInterface $output)
-    {
-        // Make sure the _cli_ user is loaded
-        Bootstrap::initializeBackendAuthentication();
-
-        $io = new SymfonyStyle($input, $output);
-        $io->title($this->getDescription());
-
-        $dryRun = $input->hasOption('dry-run') && $input->getOption('dry-run') != false ? true : false;
-
-        $this->updateReferenceIndex($input, $io);
-
-        // Find the RTE files
-        $allRteImagesInUse = $this->findAllReferencedRteImagesWithOriginals();
-
-        if (count($allRteImagesInUse)) {
-            $allRteImagesWithOriginals = [];
-            $multipleReferenced = [];
-            $missingFiles = [];
-            $lostFiles = [];
-
-            // Searching for duplicates, and missing files (also missing originals)
-            foreach ($allRteImagesInUse as $fileName => $fileInfo) {
-                $allRteImagesWithOriginals[$fileName]++;
-                $allRteImagesWithOriginals[$fileInfo['original']]++;
-                if ($fileInfo['count'] > 1 && $fileInfo['exists'] && $fileInfo['original_exists']) {
-                    $multipleReferenced[$fileName] = $fileInfo['softReferences'];
-                }
-                // Missing files:
-                if (!$fileInfo['exists']) {
-                    $missingFiles[$fileName] = $fileInfo['softReferences'];
-                }
-                if (!$fileInfo['original_exists']) {
-                    $missingFiles[$fileInfo['original']] = $fileInfo['softReferences'];
-                }
-            }
-
-            // Now, ask for RTEmagic files inside uploads/ folder:
-            $magicFiles = $this->findAllRteFilesInDirectory();
-            foreach ($magicFiles as $fileName) {
-                if (!isset($allRteImagesWithOriginals[$fileName])) {
-                    $lostFiles[$fileName] = $fileName;
-                }
-            }
-            ksort($missingFiles);
-            ksort($multipleReferenced);
-
-            // Output info about missing files
-            if (!$io->isQuiet()) {
-                $io->note('Found ' . count($missingFiles) . ' RTE images that are referenced, but missing.');
-                if ($io->isVerbose()) {
-                    $io->listing($missingFiles);
-                }
-            }
-
-            // Duplicate RTEmagic image files
-            // These files are RTEmagic images found used in multiple records! RTEmagic images should be used by only
-            // one record at a time. A large amount of such images probably stems from previous versions of TYPO3 (before 4.2)
-            // which did not support making copies automatically of RTEmagic images in case of new copies / versions.
-            $this->copyMultipleReferencedRteImages($multipleReferenced, $dryRun, $io);
-
-            // Delete lost files
-            // Lost RTEmagic files from uploads/
-            // These files you might be able to delete but only if _all_ RTEmagic images are found by the soft reference parser.
-            // If you are using the RTE in third-party extensions it is likely that the soft reference parser is not applied
-            // correctly to their RTE and thus these "lost" files actually represent valid RTEmagic images,
-            // just not registered. Lost files can be auto-fixed but only if you specifically
-            // set "lostFiles" as parameter to the --AUTOFIX option.
-            if (count($lostFiles)) {
-                ksort($lostFiles);
-                $this->deleteLostFiles($lostFiles, $dryRun, $io);
-                $io->success('Deleted ' . count($lostFiles) . ' lost files.');
-            }
-        } else {
-            $io->success('Nothing to do, your system does not have any RTE images.');
-        }
-    }
-
-    /**
-     * Function to update the reference index
-     * - if the option --update-refindex is set, do it
-     * - otherwise, if in interactive mode (not having -n set), ask the user
-     * - otherwise assume everything is fine
-     *
-     * @param InputInterface $input holds information about entered parameters
-     * @param SymfonyStyle $io necessary for outputting information
-     */
-    protected function updateReferenceIndex(InputInterface $input, SymfonyStyle $io)
-    {
-        // Check for reference index to update
-        $io->note('Finding RTE images used in TYPO3 requires a clean reference index (sys_refindex)');
-        $updateReferenceIndex = false;
-        if ($input->hasOption('update-refindex') && $input->getOption('update-refindex')) {
-            $updateReferenceIndex = true;
-        } elseif ($input->isInteractive()) {
-            $updateReferenceIndex = $io->confirm('Should the reference index be updated right now?', false);
-        }
-
-        // Update the reference index
-        if ($updateReferenceIndex) {
-            $referenceIndex = GeneralUtility::makeInstance(ReferenceIndex::class);
-            $referenceIndex->updateIndex(false, !$io->isQuiet());
-        } else {
-            $io->writeln('Reference index is assumed to be up to date, continuing.');
-        }
-    }
-
-    /**
-     * Find lost files in uploads/ folder
-     *
-     * @return array an array of files (relative to Environment::getPublicPath()) that are not connected
-     */
-    protected function findAllReferencedRteImagesWithOriginals(): array
-    {
-        $allRteImagesInUse = [];
-
-        // Select all RTEmagic files in the reference table (only from soft references of course)
-        $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
-            ->getQueryBuilderForTable('sys_refindex');
-
-        $result = $queryBuilder
-            ->select('*')
-            ->from('sys_refindex')
-            ->where(
-                $queryBuilder->expr()->eq(
-                    'ref_table',
-                    $queryBuilder->createNamedParameter('_FILE', \PDO::PARAM_STR)
-                ),
-                $queryBuilder->expr()->like(
-                    'ref_string',
-                    $queryBuilder->createNamedParameter('%/RTEmagic%', \PDO::PARAM_STR)
-                ),
-                $queryBuilder->expr()->eq(
-                    'softref_key',
-                    $queryBuilder->createNamedParameter('images', \PDO::PARAM_STR)
-                )
-            )
-            ->execute();
-
-        // Traverse the files and put into a large table:
-        while ($rec = $result->fetch()) {
-            $file = $rec['ref_string'];
-            $filename = PathUtility::basenameDuringBootstrap($file);
-            if (strpos($filename, 'RTEmagicC_') === 0) {
-                // First time the file is referenced => build index
-                if (!is_array($allRteImagesInUse[$file])) {
-                    $original = 'RTEmagicP_' . preg_replace('/\\.[[:alnum:]]+$/', '', substr($filename, 10));
-                    $original = substr($file, 0, -strlen($filename)) . $original;
-                    $allRteImagesInUse[$file] = [
-                        'exists' => @is_file(Environment::getPublicPath() . '/' . $file),
-                        'original' => $original,
-                        'original_exists' => @is_file(Environment::getPublicPath() . '/' . $original),
-                        'count' => 0,
-                        'softReferences' => []
-                    ];
-                }
-                $allRteImagesInUse[$file]['count']++;
-                $allRteImagesInUse[$file]['softReferences'][$rec['hash']] = $this->formatReferenceIndexEntryToString($rec);
-            }
-        }
-
-        ksort($allRteImagesInUse);
-        return $allRteImagesInUse;
-    }
-
-    /**
-     * Find all RTE files in uploads/ folder
-     *
-     * @param string $folder the name of the folder to start from
-     * @return array an array of files (relative to Environment::getPublicPath()) that are not connected
-     */
-    protected function findAllRteFilesInDirectory($folder = 'uploads/'): array
-    {
-        $filesFound = [];
-
-        // Get all files
-        $files = [];
-        $files = GeneralUtility::getAllFilesAndFoldersInPath($files, Environment::getPublicPath() . '/' . $folder);
-        $files = GeneralUtility::removePrefixPathFromList($files, Environment::getPublicPath() . '/');
-
-        // Traverse files
-        foreach ($files as $key => $value) {
-            // If the file is a RTEmagic-image name
-            if (preg_match('/^RTEmagic[P|C]_/', PathUtility::basenameDuringBootstrap($value))) {
-                $filesFound[] = $value;
-                continue;
-            }
-        }
-
-        return $filesFound;
-    }
-
-    /**
-     * Removes given files from the uploads/ folder
-     *
-     * @param array $lostFiles Contains the lost files found
-     * @param bool $dryRun if set, the files are just displayed, but not deleted
-     * @param SymfonyStyle $io the IO object for output
-     */
-    protected function deleteLostFiles(array $lostFiles, bool $dryRun, SymfonyStyle $io)
-    {
-        foreach ($lostFiles as $lostFile) {
-            $absoluteFileName = GeneralUtility::getFileAbsFileName($lostFile);
-            if ($io->isVeryVerbose()) {
-                $io->writeln('Deleting file "' . $absoluteFileName . '"');
-            }
-            if (!$dryRun) {
-                if ($absoluteFileName && @is_file($absoluteFileName)) {
-                    unlink($absoluteFileName);
-                    if (!$io->isQuiet()) {
-                        $io->writeln('Permanently deleted file "' . $absoluteFileName . '".');
-                    }
-                } else {
-                    $io->error('File "' . $absoluteFileName . '" was not found!');
-                }
-            }
-        }
-    }
-
-    /**
-     * Duplicate RTEmagic image files which are used on several records. RTEmagic images should be used by only
-     * one record at a time. A large amount of such images probably stems from previous versions of TYPO3 (before 4.2)
-     * which did not support making copies automatically of RTEmagic images in case of new copies / versions.
-     *
-     * @param array $multipleReferencedImages
-     * @param bool $dryRun
-     * @param SymfonyStyle $io
-     */
-    protected function copyMultipleReferencedRteImages(array $multipleReferencedImages, bool $dryRun, SymfonyStyle $io)
-    {
-        $fileProcObj = GeneralUtility::makeInstance(BasicFileUtility::class);
-        foreach ($multipleReferencedImages as $fileName => $fileInfo) {
-            // Traverse all records using the file
-            $c = 0;
-            foreach ($fileInfo['usedIn'] as $hash => $recordID) {
-                if ($c === 0) {
-                    $io->writeln('Keeping file ' . $fileName . ' for record ' . $recordID);
-                } else {
-                    $io->writeln('Copying file ' . PathUtility::basenameDuringBootstrap($fileName) . ' for record ' . $recordID);
-                    // Get directory prefix for file and set the original name
-                    $dirPrefix = PathUtility::dirnameDuringBootstrap($fileName) . '/';
-                    $rteOrigName = PathUtility::basenameDuringBootstrap($fileInfo['original']);
-                    // If filename looks like an RTE file, and the directory is in "uploads/", then process as a RTE file!
-                    if ($rteOrigName && strpos($dirPrefix, 'uploads/') === 0 && @is_dir(Environment::getPublicPath() . '/' . $dirPrefix)) {
-                        // From the "original" RTE filename, produce a new "original" destination filename which is unused.
-                        $origDestName = $fileProcObj->getUniqueName($rteOrigName, Environment::getPublicPath() . '/' . $dirPrefix);
-                        // Create copy file name
-                        $pI = pathinfo($fileName);
-                        $copyDestName = PathUtility::dirnameDuringBootstrap($origDestName) . '/RTEmagicC_' . substr(PathUtility::basenameDuringBootstrap($origDestName), 10) . '.' . $pI['extension'];
-                        if (!@is_file($copyDestName) && !@is_file($origDestName) && $origDestName === GeneralUtility::getFileAbsFileName($origDestName) && $copyDestName === GeneralUtility::getFileAbsFileName($copyDestName)) {
-                            $io->writeln('Copying file ' . PathUtility::basenameDuringBootstrap($fileName) . ' for record ' . $recordID . ' to ' . PathUtility::basenameDuringBootstrap($copyDestName));
-                            if (!$dryRun) {
-                                // Making copies
-                                GeneralUtility::upload_copy_move(Environment::getPublicPath() . '/' . $fileInfo['original'], $origDestName);
-                                GeneralUtility::upload_copy_move(Environment::getPublicPath() . '/' . $fileName, $copyDestName);
-                                clearstatcache();
-                                if (@is_file($copyDestName)) {
-                                    $referenceIndex = GeneralUtility::makeInstance(ReferenceIndex::class);
-                                    $error = $referenceIndex->setReferenceValue($hash, PathUtility::stripPathSitePrefix($copyDestName));
-                                    if ($error) {
-                                        $io->error('ReferenceIndex::setReferenceValue() reported "' . $error . '"');
-                                    }
-                                } else {
-                                    $io->error('File "' . $copyDestName . '" could not be created.');
-                                }
-                            }
-                        } else {
-                            $io->error('Could not construct new unique names for file.');
-                        }
-                    } else {
-                        $io->error('Maybe directory of file was not within "uploads/"?');
-                    }
-                }
-                $c++;
-            }
-        }
-    }
-
-    /**
-     * Formats a sys_refindex entry to something readable
-     *
-     * @param array $record
-     * @return string
-     */
-    protected function formatReferenceIndexEntryToString(array $record): string
-    {
-        return $record['tablename']
-            . ':' . $record['recuid']
-            . ':' . $record['field']
-            . ($record['flexpointer'] ? ':' . $record['flexpointer'] : '')
-            . ($record['softref_key'] ? ':' . $record['softref_key'] . ' (Soft Reference) ' : '')
-            . ($record['deleted'] ? ' (DELETED)' : '');
-    }
-}
index 258d4c2..3b468e2 100644 (file)
@@ -18,9 +18,6 @@ return [
     'cleanup:multiplereferencedfiles' => [
         'class' => \TYPO3\CMS\Lowlevel\Command\FilesWithMultipleReferencesCommand::class
     ],
-    'cleanup:rteimages' => [
-        'class' => \TYPO3\CMS\Lowlevel\Command\RteImagesCommand::class
-    ],
     'cleanup:missingrelations' => [
         'class' => \TYPO3\CMS\Lowlevel\Command\MissingRelationsCommand::class
     ],
index 711b4ed..480a857 100644 (file)
@@ -112,11 +112,6 @@ case there is an optimal order that ensures you don't have to run the tests all
   - After the "deleted" tool since we cannot clean-up deleted records and to make sure nothing unimportant
     is cleaned up.
 
-- `[base command] cleanup:rteimages`
-
-  - Will be affected by flushed deleted records, versions and orphans so must be run after any of those tests.
-
-
 
 Executed anytime
 ----------------
@@ -143,7 +138,6 @@ report could look like this::
        [typo3_site_directory]/typo3/sysext/core/bin/typo3 cleanup:deletedrecords -v
        [typo3_site_directory]/typo3/sysext/core/bin/typo3 cleanup:missingrelations --update-refindex -vv
        [typo3_site_directory]/typo3/sysext/core/bin/typo3 cleanup:flexforms -vv
-       [typo3_site_directory]/typo3/sysext/core/bin/typo3 cleanup:rteimages --update-refindex -vv
        [typo3_site_directory]/typo3/sysext/core/bin/typo3 cleanup:missingfiles --update-refindex -vv
        [typo3_site_directory]/typo3/sysext/core/bin/typo3 cleanup:lostfiles --update-refindex -vv
 
@@ -166,7 +160,6 @@ Example script for checking your installation
     ./typo3/sysext/core/bin/typo3 cleanup:deletedrecords -v
     ./typo3/sysext/core/bin/typo3 cleanup:missingrelations -vv
     ./typo3/sysext/core/bin/typo3 cleanup:flexforms -vv
-    ./typo3/sysext/core/bin/typo3 cleanup:rteimages -vv
     ./typo3/sysext/core/bin/typo3 cleanup:missingfiles -vv
     ./typo3/sysext/core/bin/typo3 cleanup:lostfiles -vv
 
@@ -183,7 +176,6 @@ Example script for cleaning your installation
     ./typo3/sysext/core/bin/typo3 cleanup:deletedrecords -v
     ./typo3/sysext/core/bin/typo3 cleanup:missingrelations -vv  --update-refindex
     ./typo3/sysext/core/bin/typo3 cleanup:flexforms -vv
-    ./typo3/sysext/core/bin/typo3 cleanup:rteimages -vv
     ./typo3/sysext/core/bin/typo3 cleanup:missingfiles --update-refindex
     ./typo3/sysext/core/bin/typo3 cleanup:lostfiles -vv  --update-refindex
 
index 8a97d41..db4aaeb 100644 (file)
@@ -18,7 +18,6 @@ use TYPO3\CMS\Backend\Backend\Avatar\Avatar;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Database\ConnectionPool;
-use TYPO3\CMS\Core\Html\RteHtmlParser;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Imaging\IconFactory;
 use TYPO3\CMS\Core\Localization\LanguageService;
@@ -132,7 +131,6 @@ class RemoteServer
         $diffReturnArray = [];
         $liveReturnArray = [];
         $diffUtility = $this->getDifferenceHandler();
-        $parseObj = GeneralUtility::makeInstance(RteHtmlParser::class);
         $liveRecord = BackendUtility::getRecord($parameter->table, $parameter->t3ver_oid);
         $versionRecord = BackendUtility::getRecord($parameter->table, $parameter->uid);
         $iconFactory = GeneralUtility::makeInstance(IconFactory::class);
@@ -230,7 +228,7 @@ class RemoteServer
                     $liveReturnArray[] = [
                         'field' => $fieldName,
                         'label' => $fieldTitle,
-                        'content' => $parseObj->TS_images_rte($liveRecord[$fieldName])
+                        'content' => $liveRecord[$fieldName]
                     ];
                 }
             }