From 3a4bd6f633e29535e7298c06888f2512741a825d Mon Sep 17 00:00:00 2001
From: Xavier Perseguers <xavier@typo3.org>
Date: Thu, 6 Mar 2014 11:43:16 +0100
Subject: [PATCH] [BUGFIX] ResourceStorage::SIGNAL_PreFileAdd should be
 triggered earlier

The PreFileAdd signal should be triggered before the file exist check.
So the name and/or content can be manipulated before the target filename
is checked.

Change-Id: I0bbe32a4efa395a99278c480210310bd7466f259
Fixes: #56394
Releases: 6.2
Reviewed-on: https://review.typo3.org/28099
Reviewed-by: Christian Kuhn
Tested-by: Christian Kuhn
Reviewed-by: Anja Leichsenring
Tested-by: Anja Leichsenring
---
 .../core/Classes/Resource/ResourceStorage.php     | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/typo3/sysext/core/Classes/Resource/ResourceStorage.php b/typo3/sysext/core/Classes/Resource/ResourceStorage.php
index 18d36fb3ed5a..9284cf55959d 100644
--- a/typo3/sysext/core/Classes/Resource/ResourceStorage.php
+++ b/typo3/sysext/core/Classes/Resource/ResourceStorage.php
@@ -1106,14 +1106,16 @@ class ResourceStorage {
 		$this->assureFileAddPermissions($localFilePath, $targetFolder, $targetFileName);
 		$targetFolder = $targetFolder ?: $this->getDefaultFolder();
 		$targetFileName = $this->driver->sanitizeFileName($targetFileName ?: PathUtility::basename($localFilePath));
+
+		// We do not care whether the file exists yet because $targetFileName may be changed by an
+		// external slot and only then we should check how to proceed according to $conflictMode
+		$this->emitPreFileAddSignal($targetFileName, $targetFolder, $localFilePath);
+
 		if ($conflictMode === 'cancel' && $this->driver->fileExistsInFolder($targetFileName, $targetFolder->getIdentifier())) {
 			throw new Exception\ExistingTargetFileNameException('File "' . $targetFileName . '" already exists in folder ' . $targetFolder->getIdentifier(), 1322121068);
 		} elseif ($conflictMode === 'changeName') {
 			$targetFileName = $this->getUniqueName($targetFolder, $targetFileName);
 		}
-		// We do not care whether the file exists if $conflictMode is "replace",
-		// so just use the name as is in that case
-		$this->emitPreFileAddSignal($targetFileName, $targetFolder);
 
 		$fileIdentifier = $this->driver->addFile($localFilePath, $targetFolder->getIdentifier(), $targetFileName);
 		$file = ResourceFactory::getInstance()->getFileObjectByStorageAndIdentifier($this->getUid(), $fileIdentifier);
@@ -2094,12 +2096,13 @@ class ResourceStorage {
 	/**
 	 * Emits file pre-add signal
 	 *
-	 * @param string $fileName
+	 * @param string $targetFileName
 	 * @param Folder $targetFolder
+	 * @param string $sourceFilePath
 	 * @return void
 	 */
-	protected function emitPreFileAddSignal($fileName, Folder $targetFolder) {
-		$this->getSignalSlotDispatcher()->dispatch('TYPO3\\CMS\\Core\\Resource\\ResourceStorage', self::SIGNAL_PreFileAdd, array($fileName, $targetFolder));
+	protected function emitPreFileAddSignal(&$targetFileName, Folder $targetFolder, $sourceFilePath) {
+		$this->getSignalSlotDispatcher()->dispatch('TYPO3\\CMS\\Core\\Resource\\ResourceStorage', self::SIGNAL_PreFileAdd, array(&$targetFileName, $targetFolder, $sourceFilePath, $this, $this->driver));
 	}
 
 	/**
-- 
GitLab