From 71440487f772fa8404fb5ac894914d487ff40c27 Mon Sep 17 00:00:00 2001
From: Benni Mack <benni@typo3.org>
Date: Mon, 11 May 2020 21:45:15 +0200
Subject: [PATCH] [BUGFIX] Fix internal + external links with URLs fragment

Internal and external links have been incorrectly processed
by the legacy link notation converter which removed the
fragment from the URL before checking whether
the link is actually a legacy (file) link.

The change is now narrowed down to only append the fragment to
file links.

Resolves: #90916
Resolves: #91357
Related: #75213
Releases: master, 9.5
Change-Id: Ibdbfae4ac2ca0caa6710fb944810336e875e8929
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64411
Reviewed-by: Benjamin Franzke <bfr@qbus.de>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Benni Mack <benni@typo3.org>
---
 .../LinkHandling/LegacyLinkNotationConverter.php | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/typo3/sysext/core/Classes/LinkHandling/LegacyLinkNotationConverter.php b/typo3/sysext/core/Classes/LinkHandling/LegacyLinkNotationConverter.php
index 9bb4a541622a..9bf76ab24e8d 100644
--- a/typo3/sysext/core/Classes/LinkHandling/LegacyLinkNotationConverter.php
+++ b/typo3/sysext/core/Classes/LinkHandling/LegacyLinkNotationConverter.php
@@ -200,18 +200,26 @@ class LegacyLinkNotationConverter
     protected function getFileOrFolderObjectFromMixedIdentifier(string $mixedIdentifier): array
     {
         $result = [];
-        if (strpos($mixedIdentifier, '#') !== false) {
-            [$mixedIdentifier, $result['fragment']] = explode('#', $mixedIdentifier, 2);
-        }
         try {
-            $fileOrFolderObject = $this->getResourceFactory()->retrieveFileOrFolderObject($mixedIdentifier);
+            $fileIdentifier = $mixedIdentifier;
+            $fragment = null;
+            if (strpos($fileIdentifier, '#') !== false) {
+                [$fileIdentifier, $fragment] = explode('#', $fileIdentifier, 2);
+            }
+            $fileOrFolderObject = $this->getResourceFactory()->retrieveFileOrFolderObject($fileIdentifier);
             // Link to a folder or file
             if ($fileOrFolderObject instanceof File) {
                 $result['type'] = LinkService::TYPE_FILE;
                 $result['file'] = $fileOrFolderObject;
+                if ($fragment) {
+                    $result['fragment'] = $fragment;
+                }
             } elseif ($fileOrFolderObject instanceof Folder) {
                 $result['type'] = LinkService::TYPE_FOLDER;
                 $result['folder'] = $fileOrFolderObject;
+                if ($fragment) {
+                    $result['fragment'] = $fragment;
+                }
             } else {
                 $result['type'] = LinkService::TYPE_UNKNOWN;
                 $result['file'] = $mixedIdentifier;
-- 
GitLab