[!!!][BUGFIX] Throw exception on invalid charset 71/54471/3
authorMathias Brodala <mbrodala@pagemachine.de>
Wed, 25 Oct 2017 07:45:08 +0000 (09:45 +0200)
committerStefan Neufeind <typo3.neufeind@speedpartner.de>
Mon, 30 Oct 2017 16:07:15 +0000 (17:07 +0100)
This gives users a clear hint if e.g. config.metaCharset contains
an invalid value instead of showing a blank page.

Change-Id: I9cdb37cc7e61af10e2d1985ef43f488e53b17a48
Resolves: #82852
Releases: master, 8.7
Reviewed-on: https://review.typo3.org/54471
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Frank Naegler <frank.naegler@typo3.org>
Reviewed-by: Wolfgang Klinger <wolfgang@wazum.com>
Tested-by: Riccardo De Contardi <erredeco@gmail.com>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
Tested-by: Stefan Neufeind <typo3.neufeind@speedpartner.de>
typo3/sysext/core/Classes/Charset/CharsetConverter.php
typo3/sysext/core/Classes/Charset/UnknownCharsetException.php [new file with mode: 0644]
typo3/sysext/core/Documentation/Changelog/master/Breaking-82852-ExceptionIsThrownOnInvalidCharset.rst [new file with mode: 0644]
typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php

index ff1e600..dac3185 100644 (file)
@@ -629,7 +629,8 @@ class CharsetConverter implements SingletonInterface
      * PLEASE SEE: http://www.unicode.org/Public/MAPPINGS/
      *
      * @param string $charset The charset to be initialized. Use lowercase charset always (the charset must match exactly with a filename in csconvtbl/ folder ([charset].tbl)
-     * @return int Returns '1' if already loaded. Returns FALSE if charset conversion table was not found. Returns '2' if the charset conversion table was found and parsed.
+     * @return int Returns '1' if already loaded, '2' if the charset conversion table was found and parsed.
+     * @throws UnknownCharsetException if no charset table was found
      * @access private
      */
     public function initCharset($charset)
@@ -684,7 +685,7 @@ class CharsetConverter implements SingletonInterface
                 }
                 return 2;
             }
-            return false;
+            throw new UnknownCharsetException(sprintf('Unknown charset "%s"', $charset), 1508916031);
         }
         return 1;
     }
diff --git a/typo3/sysext/core/Classes/Charset/UnknownCharsetException.php b/typo3/sysext/core/Classes/Charset/UnknownCharsetException.php
new file mode 100644 (file)
index 0000000..dfe3294
--- /dev/null
@@ -0,0 +1,24 @@
+<?php
+namespace TYPO3\CMS\Core\Charset;
+
+/*
+ * 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 TYPO3\CMS\Core\Exception;
+
+/**
+ * Exception for unknown charsets
+ */
+class UnknownCharsetException extends Exception
+{
+}
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-82852-ExceptionIsThrownOnInvalidCharset.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-82852-ExceptionIsThrownOnInvalidCharset.rst
new file mode 100644 (file)
index 0000000..31435c9
--- /dev/null
@@ -0,0 +1,32 @@
+.. include:: ../../Includes.txt
+
+=========================================================
+Breaking: #82852 - Exception is thrown on invalid charset
+=========================================================
+
+See :issue:`82852`
+
+Description
+===========
+
+The method :php:`\TYPO3\CMS\Core\Charset\CharsetConverter::initCharset()` and consequently all methods in this class calling that method now throw an :php:`\TYPO3\CMS\Core\Charset\UnknownCharsetException` if an unknown charset was provided.
+
+The :php:`TypoScriptFrontendController` aka TSFE uses this to throw a :php:`\RuntimeException` in case of an invalid :ts:`config.metaCharset`. Before this resulted in a blank page instead.
+
+
+Impact
+======
+
+Third party code directly using the :php:`CharsetConverter` class need to be aware of the new exception in case of an invalid charset.
+
+Sites with an invalid :ts:`config.metaCharset` will now see a clear error message.
+
+
+Migration
+=========
+
+Catch the :php:`UnknownCharsetException` of the :php:`CharsetConverter` if necessary.
+
+Ensure that :ts:`config.metaCharset` is set to a known charset.
+
+.. index:: Frontend, PHP-API, NotScanned
\ No newline at end of file
index 3b04edf..5254dd8 100644 (file)
@@ -21,6 +21,7 @@ use TYPO3\CMS\Backend\FrontendBackendUserAuthentication;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Charset\CharsetConverter;
+use TYPO3\CMS\Core\Charset\UnknownCharsetException;
 use TYPO3\CMS\Core\Controller\ErrorPageController;
 use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\Database\Query\QueryHelper;
@@ -4139,13 +4140,18 @@ class TypoScriptFrontendController implements LoggerAwareInterface
      *
      * @param string $content Content to be converted.
      * @return string Converted content string.
+     * @throws \RuntimeException if an invalid charset was configured
      */
     public function convOutputCharset($content)
     {
         if ($this->metaCharset !== 'utf-8') {
             /** @var CharsetConverter $charsetConverter */
             $charsetConverter = GeneralUtility::makeInstance(CharsetConverter::class);
-            $content = $charsetConverter->conv($content, 'utf-8', $this->metaCharset, true);
+            try {
+                $content = $charsetConverter->conv($content, 'utf-8', $this->metaCharset, true);
+            } catch (UnknownCharsetException $e) {
+                throw new \RuntimeException('Invalid config.metaCharset: ' . $e->getMessage(), 1508916185);
+            }
         }
         return $content;
     }