From 0064da7fb7714dc007fae4839d26d0c5feae8414 Mon Sep 17 00:00:00 2001
From: Nicole Cordes <typo3@cordes.co>
Date: Thu, 19 Feb 2015 10:55:13 +0100
Subject: [PATCH] [BUGFIX] Prevent wrong ref_index for fields with soft
 references
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

If you add a page link to a field which is defined as softrefs, the
ReferenceIndex creates an index to a FAL record if there exists a file
record with the page id. As file links are always prefixed with 'file:'
this patch adds a proper check before generating a file ref_index.

Because the functional tests of impexp extension still use a hardcoded
file path for the header_link field the patch corrects the value to
refer to a file.

Furthermore if you add a file or folder link, the field is referenced
twice for the FAL record. So we have to suppress the softreference for
those records.

Releases: master, 6.2
Resolves: #60226
Change-Id: I969224e2a291491cb7ece1f61b375071bf0eaebc
Reviewed-on: http://review.typo3.org/37086
Reviewed-by: Markus Klein <klein.t3@reelworx.at>
Tested-by: Markus Klein <klein.t3@reelworx.at>
Reviewed-by: Andreas Fernandez <andreas.fernandez@aspedia.de>
Reviewed-by: Göran Bodenschatz <coding@46halbe.de>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
---
 .../core/Classes/Database/ReferenceIndex.php  |  8 ++-
 .../Fixtures/Database/tt_content.xml          |  4 +-
 .../ImportExportXml/pages-and-ttcontent.xml   | 52 ++++++++++++++++---
 .../importPagesAndRelatedTtContent.csv        |  4 +-
 4 files changed, 56 insertions(+), 12 deletions(-)

diff --git a/typo3/sysext/core/Classes/Database/ReferenceIndex.php b/typo3/sysext/core/Classes/Database/ReferenceIndex.php
index 04016ec2276b..93f40a87e0a2 100644
--- a/typo3/sysext/core/Classes/Database/ReferenceIndex.php
+++ b/typo3/sysext/core/Classes/Database/ReferenceIndex.php
@@ -17,6 +17,7 @@ namespace TYPO3\CMS\Core\Database;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
+use TYPO3\CMS\Core\Utility\StringUtility;
 
 /**
  * Reference index processing and relation extraction
@@ -308,7 +309,10 @@ class ReferenceIndex {
 							switch ((string)$el['subst']['type']) {
 								case 'db':
 									list($tableName, $recordId) = explode(':', $el['subst']['recordRef']);
-									$this->relations[] = $this->createEntryData($table, $uid, $fieldname, $flexpointer, $deleted, $tableName, $recordId, '', -1, $spKey, $subKey);
+									// Prevent double references for files and file relations
+									if ($tableName !== 'sys_file' && $tableName !== 'sys_file_reference') {
+										$this->relations[] = $this->createEntryData($table, $uid, $fieldname, $flexpointer, $deleted, $tableName, $recordId, '', -1, $spKey, $subKey);
+									}
 									break;
 								case 'file_reference':
 									// not used (see getRelations()), but fallback to file
@@ -597,7 +601,7 @@ class ReferenceIndex {
 				$fileArray[] = array('table' => 'sys_file', 'id' => $fileUid['uid_local']);
 			}
 			return $fileArray;
-		} elseif ($conf['type'] == 'input' && isset($conf['wizards']['link']) && trim($value)) {
+		} elseif ($conf['type'] == 'input' && isset($conf['wizards']['link']) && StringUtility::beginsWith($value, 'file:')) {
 			try {
 				$file = \TYPO3\CMS\Core\Resource\ResourceFactory::getInstance()->retrieveFileOrFolderObject($value);
 			} catch (\Exception $e) {
diff --git a/typo3/sysext/impexp/Tests/Functional/Fixtures/Database/tt_content.xml b/typo3/sysext/impexp/Tests/Functional/Fixtures/Database/tt_content.xml
index 6a7a7b69c8b4..420f7cbd27eb 100644
--- a/typo3/sysext/impexp/Tests/Functional/Fixtures/Database/tt_content.xml
+++ b/typo3/sysext/impexp/Tests/Functional/Fixtures/Database/tt_content.xml
@@ -5,7 +5,7 @@
 		<pid>1</pid>
 		<CType>text</CType>
 		<header>Test content</header>
-		<header_link>fileadmin/user_upload/typo3_image3.jpg</header_link>
+		<header_link>file:2</header_link>
 		<deleted>0</deleted>
 		<t3ver_oid>0</t3ver_oid>
 		<t3ver_wsid>0</t3ver_wsid>
@@ -15,7 +15,7 @@
 		<pid>1</pid>
 		<CType>text</CType>
 		<header>Test content 2</header>
-		<header_link>typo3conf/ext/template_extension/Resources/Public/Templates/Empty.html</header_link>
+		<header_link>file:4</header_link>
 		<deleted>0</deleted>
 		<t3ver_oid>0</t3ver_oid>
 		<t3ver_wsid>0</t3ver_wsid>
diff --git a/typo3/sysext/impexp/Tests/Functional/Fixtures/ImportExportXml/pages-and-ttcontent.xml b/typo3/sysext/impexp/Tests/Functional/Fixtures/ImportExportXml/pages-and-ttcontent.xml
index 9c839bae3b5b..2a1be5242cf3 100644
--- a/typo3/sysext/impexp/Tests/Functional/Fixtures/ImportExportXml/pages-and-ttcontent.xml
+++ b/typo3/sysext/impexp/Tests/Functional/Fixtures/ImportExportXml/pages-and-ttcontent.xml
@@ -29,7 +29,7 @@
 					<uid>1</uid>
 					<pid>1</pid>
 					<title>Test content</title>
-					<size>230</size>
+					<size>197</size>
 					<relations index="rels" type="array">
 						<element index="sys_file:2" type="array">
 							<table>sys_file</table>
@@ -37,13 +37,24 @@
 						</element>
 					</relations>
 					<softrefs type="array">
+						<softref_element index="header_link:typolink:2487ce518ed56d22f20f259928ff43f1:0" type="array">
+							<field>header_link</field>
+							<spKey>typolink</spKey>
+							<matchString>file:2</matchString>
+							<subst type="array">
+								<type>db</type>
+								<recordRef>sys_file:2</recordRef>
+								<tokenID>2487ce518ed56d22f20f259928ff43f1</tokenID>
+								<tokenValue>file:2</tokenValue>
+							</subst>
+						</softref_element>
 					</softrefs>
 				</rec>
 				<rec index="2" type="array">
 					<uid>2</uid>
 					<pid>1</pid>
 					<title>Test content 2</title>
-					<size>264</size>
+					<size>199</size>
 					<relations index="rels" type="array">
 						<element index="sys_file:4" type="array">
 							<table>sys_file</table>
@@ -54,7 +65,13 @@
 						<softref_element index="header_link:typolink:81b8b33df54ef433f1cbc7c3e513e6c4:0" type="array">
 							<field>header_link</field>
 							<spKey>typolink</spKey>
-							<matchString>typo3conf/ext/template_extension/Resources/Public/Templates/Empty.html</matchString>
+							<matchString>file:4</matchString>
+							<subst type="array">
+								<type>db</type>
+								<recordRef>sys_file:4</recordRef>
+								<tokenID>81b8b33df54ef433f1cbc7c3e513e6c4</tokenID>
+								<tokenValue>file:4</tokenValue>
+							</subst>
 						</softref_element>
 					</softrefs>
 				</rec>
@@ -167,7 +184,7 @@
 				<field index="CType">text</field>
 				<field index="header">Test content</field>
 				<field index="deleted">0</field>
-				<field index="header_link">fileadmin/user_upload/typo3_image3.jpg</field>
+				<field index="header_link">file:2</field>
 			</fieldlist>
 			<related index="rels" type="array">
 				<field index="header_link" type="array">
@@ -178,6 +195,22 @@
 							<id>2</id>
 						</element>
 					</relations>
+					<softrefs type="array">
+						<keys type="array">
+							<softref_key index="typolink" type="array">
+								<softref_element index="2487ce518ed56d22f20f259928ff43f1:0" type="array">
+									<matchString>file:2</matchString>
+									<subst type="array">
+										<type>db</type>
+										<recordRef>sys_file:2</recordRef>
+										<tokenID>2487ce518ed56d22f20f259928ff43f1</tokenID>
+										<tokenValue>file:2</tokenValue>
+									</subst>
+								</softref_element>
+							</softref_key>
+						</keys>
+						<tokenizedContent>{softref:2487ce518ed56d22f20f259928ff43f1}</tokenizedContent>
+					</softrefs>
 				</field>
 			</related>
 		</tablerow>
@@ -190,7 +223,7 @@
 				<field index="CType">text</field>
 				<field index="header">Test content 2</field>
 				<field index="deleted">0</field>
-				<field index="header_link">typo3conf/ext/template_extension/Resources/Public/Templates/Empty.html</field>
+				<field index="header_link">file:4</field>
 			</fieldlist>
 			<related index="rels" type="array">
 				<field index="header_link" type="array">
@@ -205,10 +238,17 @@
 						<keys type="array">
 							<softref_key index="typolink" type="array">
 								<softref_element index="81b8b33df54ef433f1cbc7c3e513e6c4:0" type="array">
-									<matchString>typo3conf/ext/template_extension/Resources/Public/Templates/Empty.html</matchString>
+									<matchString>file:4</matchString>
+									<subst type="array">
+										<type>db</type>
+										<recordRef>sys_file:4</recordRef>
+										<tokenID>81b8b33df54ef433f1cbc7c3e513e6c4</tokenID>
+										<tokenValue>file:4</tokenValue>
+									</subst>
 								</softref_element>
 							</softref_key>
 						</keys>
+						<tokenizedContent>{softref:81b8b33df54ef433f1cbc7c3e513e6c4}</tokenizedContent>
 					</softrefs>
 				</field>
 			</related>
diff --git a/typo3/sysext/impexp/Tests/Functional/Import/PagesAndTtContent/DataSet/Assertion/importPagesAndRelatedTtContent.csv b/typo3/sysext/impexp/Tests/Functional/Import/PagesAndTtContent/DataSet/Assertion/importPagesAndRelatedTtContent.csv
index 8c3a3dbedf38..45e833edcd1b 100644
--- a/typo3/sysext/impexp/Tests/Functional/Import/PagesAndTtContent/DataSet/Assertion/importPagesAndRelatedTtContent.csv
+++ b/typo3/sysext/impexp/Tests/Functional/Import/PagesAndTtContent/DataSet/Assertion/importPagesAndRelatedTtContent.csv
@@ -4,8 +4,8 @@
 ,2,1,256,0,"Dummy 1-2"
 "tt_content"
 ,"uid","pid","sorting","deleted","header","header_link"
-,1,1,256,0,"Test content 2","typo3conf/ext/template_extension/Resources/Public/Templates/Empty.html"
-,2,1,128,0,"Test content","fileadmin/user_upload/typo3_image3.jpg"
+,1,1,256,0,"Test content 2","file:2"
+,2,1,128,0,"Test content","file:1"
 "sys_file"
 ,"uid","pid","storage","type","identifier","identifier_hash","folder_hash","extension","mime_type","name","sha1","size"
 ,1,0,1,2,"/user_upload/typo3_image3.jpg","25777b72e5e1cbed2d1b33e4fe5b737304b5bd28","19669f1e02c2f16705ec7587044c66443be70725","jpg","image/jpeg","typo3_image3.jpg","e873c1e2ffd0f191e183a1057de3eef4d62e782d","5565"
-- 
GitLab