From 12367f37cf243ec65c2de39c4cfdca9bb2167e93 Mon Sep 17 00:00:00 2001
From: Benni Mack <benni@typo3.org>
Date: Tue, 5 Sep 2023 17:12:30 +0200
Subject: [PATCH] [BUGFIX] Ensure online media without author works

When an oembed provider does not send
an "author_name" property, then the request fails,
and there is a sys_file without a sys_file_metadata.

This then results that the show info popup does not work.

Resolves: #101877
Releases: main, 12.4, 11.5
Change-Id: If6ead0084664372b9133fdd544ede90aa8a0e5d7
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/80903
Reviewed-by: Benjamin Franzke <ben@bnf.dev>
Tested-by: Benjamin Franzke <ben@bnf.dev>
Tested-by: core-ci <typo3@b13.com>
---
 .../ElementInformationController.php          | 44 ++++++++++---------
 .../Helpers/AbstractOEmbedHelper.php          |  8 ++--
 2 files changed, 28 insertions(+), 24 deletions(-)

diff --git a/typo3/sysext/backend/Classes/Controller/ContentElement/ElementInformationController.php b/typo3/sysext/backend/Classes/Controller/ContentElement/ElementInformationController.php
index a7aa92e9d2c7..775fae8d716e 100644
--- a/typo3/sysext/backend/Classes/Controller/ContentElement/ElementInformationController.php
+++ b/typo3/sysext/backend/Classes/Controller/ContentElement/ElementInformationController.php
@@ -295,27 +295,31 @@ class ElementInformationController
                 $table = 'sys_file_metadata';
                 $metaDataRepository = GeneralUtility::makeInstance(MetaDataRepository::class);
                 /** @var array<string, string> $metaData */
-                $metaData = $metaDataRepository->findByFileUid($this->row['uid']);
-                $allowedFields = $this->getFieldList($request, $table, (int)$metaData['uid']);
-
-                foreach ($metaData as $name => $value) {
-                    if (in_array($name, $allowedFields, true)) {
-                        if (!isset($GLOBALS['TCA'][$table]['columns'][$name])) {
-                            continue;
-                        }
-
-                        $isExcluded = !(!($GLOBALS['TCA'][$table]['columns'][$name]['exclude'] ?? false) || $this->getBackendUser()->check('non_exclude_fields', $table . ':' . $name));
-                        if ($isExcluded) {
-                            continue;
+                $metaData = $metaDataRepository->findByFileUid($this->row['uid'] ?? 0);
+
+                // If there is no metadata record, skip it
+                if ($metaData !== []) {
+                    $allowedFields = $this->getFieldList($request, $table, (int)$metaData['uid']);
+
+                    foreach ($metaData as $name => $value) {
+                        if (in_array($name, $allowedFields, true)) {
+                            if (!isset($GLOBALS['TCA'][$table]['columns'][$name])) {
+                                continue;
+                            }
+
+                            $isExcluded = !(!($GLOBALS['TCA'][$table]['columns'][$name]['exclude'] ?? false) || $this->getBackendUser()->check('non_exclude_fields', $table . ':' . $name));
+                            if ($isExcluded) {
+                                continue;
+                            }
+
+                            $label = $lang->sL(BackendUtility::getItemLabel($table, $name));
+                            $label = $label ?: $name;
+
+                            $propertiesForTable['fields'][] = [
+                                'fieldValue' => BackendUtility::getProcessedValue($table, $name, $metaData[$name], 0, false, false, (int)$metaData['uid']),
+                                'fieldLabel' => htmlspecialchars($label),
+                            ];
                         }
-
-                        $label = $lang->sL(BackendUtility::getItemLabel($table, $name));
-                        $label = $label ?: $name;
-
-                        $propertiesForTable['fields'][] = [
-                            'fieldValue' => BackendUtility::getProcessedValue($table, $name, $metaData[$name], 0, false, false, (int)$metaData['uid']),
-                            'fieldLabel' => htmlspecialchars($label),
-                        ];
                     }
                 }
             }
diff --git a/typo3/sysext/core/Classes/Resource/OnlineMedia/Helpers/AbstractOEmbedHelper.php b/typo3/sysext/core/Classes/Resource/OnlineMedia/Helpers/AbstractOEmbedHelper.php
index 0eb3f174988e..cbd374ca45b0 100644
--- a/typo3/sysext/core/Classes/Resource/OnlineMedia/Helpers/AbstractOEmbedHelper.php
+++ b/typo3/sysext/core/Classes/Resource/OnlineMedia/Helpers/AbstractOEmbedHelper.php
@@ -89,12 +89,12 @@ abstract class AbstractOEmbedHelper extends AbstractOnlineMediaHelper
         $oEmbed = $this->getOEmbedData($this->getOnlineMediaId($file));
 
         if (is_array($oEmbed) && $oEmbed !== []) {
-            $metadata['width'] = (int)$oEmbed['width'];
-            $metadata['height'] = (int)$oEmbed['height'];
+            $metadata['width'] = (int)($oEmbed['width'] ?? 0);
+            $metadata['height'] = (int)($oEmbed['height'] ?? 0);
             if (empty($file->getProperty('title'))) {
-                $metadata['title'] = strip_tags($oEmbed['title']);
+                $metadata['title'] = strip_tags($oEmbed['title'] ?? '');
             }
-            $metadata['author'] = $oEmbed['author_name'];
+            $metadata['author'] = $oEmbed['author_name'] ?? '';
         }
 
         return $metadata;
-- 
GitLab