[TASK] PHP-functionality instead of GeneralUtility::deHSCentities 80/22580/8
authorStefan Neufeind <typo3.neufeind@speedpartner.de>
Wed, 5 Feb 2014 11:52:05 +0000 (12:52 +0100)
committerAnja Leichsenring <aleichsenring@ab-softlab.de>
Thu, 13 Mar 2014 21:14:16 +0000 (22:14 +0100)
Use native PHP-functionality provided by htmlspecialchars()
with a parameter since PHP 5.2.3 to prevent double-encoding
instead of calling deHSCentities().

Change-Id: I2863181259046f16b554770a3f1ed8b03112fedf
Resolves: #50449
Releases: 6.2
Reviewed-on: https://review.typo3.org/22580
Reviewed-by: Markus Klein
Tested-by: Markus Klein
Reviewed-by: Alexander Opitz
Tested-by: Alexander Opitz
Reviewed-by: Pascal Dürsteler
Reviewed-by: Stefan Froemken
Reviewed-by: Anja Leichsenring
Tested-by: Anja Leichsenring
typo3/sysext/backend/Classes/Form/FormEngine.php
typo3/sysext/backend/Classes/Template/DocumentTemplate.php
typo3/sysext/backend/Classes/Utility/BackendUtility.php
typo3/sysext/core/Classes/Html/HtmlParser.php
typo3/sysext/core/Classes/Utility/GeneralUtility.php
typo3/sysext/feedit/Classes/FrontendEditPanel.php
typo3/sysext/frontend/Classes/ContentObject/ContentObjectRenderer.php
typo3/sysext/frontend/Classes/ContentObject/FormContentObject.php
typo3/sysext/perm/Classes/Controller/PermissionModuleController.php
typo3/sysext/rtehtmlarea/Classes/RteHtmlAreaBase.php

index bdd82da..6641b4f 100644 (file)
@@ -1146,7 +1146,7 @@ class FormEngine {
                                                $item = $this->renderDefaultLanguageDiff($table, $field, $row, $item);
                                        }
                                        // If the record has been saved and the "linkTitleToSelf" is set, we make the field name into a link, which will load ONLY this field in alt_doc.php
-                                       $label = GeneralUtility::deHSCentities(htmlspecialchars($PA['label']));
+                                       $label = htmlspecialchars($PA['label'], ENT_COMPAT, 'UTF-8', FALSE);
                                        if (MathUtility::canBeInterpretedAsInteger($row['uid']) && $PA['fieldTSConfig']['linkTitleToSelf'] && !GeneralUtility::_GP('columnsOnly')) {
                                                $lTTS_url = $this->backPath . 'alt_doc.php?edit[' . $table . '][' . $row['uid'] . ']=edit&columnsOnly=' . $field . '&returnUrl=' . rawurlencode($this->thisReturnUrl());
                                                $label = '<a href="' . htmlspecialchars($lTTS_url) . '">' . $label . '</a>';
@@ -1966,12 +1966,12 @@ TBE_EDITOR.customEvalFunctions[\'' . $evalData . '\'] = function(value) {
                                                if ($optGroupOpen) {
                                                        $opt[] = '</optgroup>' . LF;
                                                }
-                                               $opt[] = '<optgroup label="' . GeneralUtility::deHSCentities(htmlspecialchars($optGroupStart[0])) . '"' . ($optGroupStart[1] ? ' style="' . htmlspecialchars($optGroupStart[1]) . '"' : '') . ' class="c-divider">' . LF;
+                                               $opt[] = '<optgroup label="' . htmlspecialchars($optGroupStart[0], ENT_COMPAT, 'UTF-8', FALSE) . '"' . ($optGroupStart[1] ? ' style="' . htmlspecialchars($optGroupStart[1]) . '"' : '') . ' class="c-divider">' . LF;
                                                $optGroupOpen = TRUE;
                                                $c--;
                                                $optGroupStart = array();
                                        }
-                                       $opt[] = '<option value="' . htmlspecialchars($p[1]) . '"' . $sM . ($styleAttrValue ? ' style="' . htmlspecialchars($styleAttrValue) . '"' : '') . '>' . GeneralUtility::deHSCentities($p[0]) . '</option>' . LF;
+                                       $opt[] = '<option value="' . htmlspecialchars($p[1]) . '"' . $sM . ($styleAttrValue ? ' style="' . htmlspecialchars($styleAttrValue) . '"' : '') . '>' . htmlspecialchars($p[0], ENT_COMPAT, 'UTF-8', FALSE) . '</option>' . LF;
                                }
                        }
                        // If there is an icon for the selector box (rendered in selicon-table below)...:
@@ -2122,7 +2122,7 @@ TBE_EDITOR.customEvalFunctions[\'' . $evalData . '\'] = function(value) {
                                                        $helpArray['description'] = $p[3];
                                                }
                                        }
-                                       $label = GeneralUtility::deHSCentities(htmlspecialchars($p[0]));
+                                       $label = htmlspecialchars($p[0], ENT_COMPAT, 'UTF-8', FALSE);
                                        if ($hasHelp) {
                                                $help = BackendUtility::wrapInHelp('', '', '', $helpArray);
                                        }
@@ -2143,7 +2143,7 @@ TBE_EDITOR.customEvalFunctions[\'' . $evalData . '\'] = function(value) {
                                array_unshift($tRows, '
                                                <tr class="c-invalidItem">
                                                        <td class="c-checkbox"><input type="checkbox"' . $this->insertDefStyle('check') . ' name="' . htmlspecialchars(($PA['itemFormElName'] . '[' . $c . ']')) . '" value="' . htmlspecialchars($theNoMatchValue) . '" checked="checked" onclick="' . htmlspecialchars($sOnChange) . '"' . $PA['onFocus'] . $disabled . ' /></td>
-                                                       <td class="c-labelCell">' . GeneralUtility::deHSCentities(htmlspecialchars(@sprintf($nMV_label, $theNoMatchValue))) . '</td><td>&nbsp;</td>
+                                                       <td class="c-labelCell">' . htmlspecialchars(@sprintf($nMV_label, $theNoMatchValue), ENT_COMPAT, 'UTF-8', FALSE) . '</td><td>&nbsp;</td>
                                                </tr>');
                                $c++;
                        }
@@ -2219,14 +2219,14 @@ TBE_EDITOR.customEvalFunctions[\'' . $evalData . '\'] = function(value) {
                                $styleAttrValue = $this->optionTagStyle($p[2]);
                        }
                        // Compile <option> tag:
-                       $opt[] = '<option value="' . htmlspecialchars($p[1]) . '"' . $sM . $nonSel . ($styleAttrValue ? ' style="' . htmlspecialchars($styleAttrValue) . '"' : '') . '>' . GeneralUtility::deHSCentities(htmlspecialchars($p[0])) . '</option>';
+                       $opt[] = '<option value="' . htmlspecialchars($p[1]) . '"' . $sM . $nonSel . ($styleAttrValue ? ' style="' . htmlspecialchars($styleAttrValue) . '"' : '') . '>' . htmlspecialchars($p[0], ENT_COMPAT, 'UTF-8', FALSE) . '</option>';
                        $c++;
                }
                // Remaining values:
                if (count($itemArray) && !$PA['fieldTSConfig']['disableNoMatchingValueElement'] && !$config['disableNoMatchingValueElement']) {
                        foreach ($itemArray as $theNoMatchValue => $temp) {
                                // Compile <option> tag:
-                               array_unshift($opt, '<option value="' . htmlspecialchars($theNoMatchValue) . '" selected="selected">' . GeneralUtility::deHSCentities(htmlspecialchars(@sprintf($nMV_label, $theNoMatchValue))) . '</option>');
+                               array_unshift($opt, '<option value="' . htmlspecialchars($theNoMatchValue) . '" selected="selected">' . htmlspecialchars(@sprintf($nMV_label, $theNoMatchValue), ENT_COMPAT, 'UTF-8', FALSE) . '</option>');
                        }
                }
                // Compile selector box:
index 24fccb3..e85756e 100644 (file)
@@ -1635,7 +1635,7 @@ function jumpToUrl(URL) {
                        $menuDef = array();
                        foreach ($menuItems as $value => $label) {
                                $menuDef[$value]['isActive'] = (string)$currentValue === (string)$value;
-                               $menuDef[$value]['label'] = GeneralUtility::deHSCentities(htmlspecialchars($label));
+                               $menuDef[$value]['label'] = htmlspecialchars($label, ENT_COMPAT, 'UTF-8', FALSE);
                                $menuDef[$value]['url'] = $script . '?' . $mainParams . $addparams . '&' . $elementName . '=' . $value;
                        }
                        $content = $this->getTabMenuRaw($menuDef);
index b1831c2..9eb238d 100644 (file)
@@ -2682,7 +2682,7 @@ class BackendUtility {
                }
                $options = array();
                foreach ($menuItems as $value => $label) {
-                       $options[] = '<option value="' . htmlspecialchars($value) . '"' . ((string)$currentValue === (string)$value ? ' selected="selected"' : '') . '>' . GeneralUtility::deHSCentities(htmlspecialchars($label)) . '</option>';
+                       $options[] = '<option value="' . htmlspecialchars($value) . '"' . ((string)$currentValue === (string)$value ? ' selected="selected"' : '') . '>' . htmlspecialchars($label, ENT_COMPAT, 'UTF-8', FALSE) . '</option>';
                }
                if (count($options)) {
                        $onChange = 'jumpToUrl(' . GeneralUtility::quoteJSvalue($scriptUrl . '&' . $elementName . '=') . '+this.options[this.selectedIndex].value,this);';
index 865600d..d7dc4ff 100644 (file)
@@ -980,16 +980,17 @@ class HtmlParser {
         * Converts htmlspecialchars forth ($dir=1) AND back ($dir=-1)
         *
         * @param string $value Input value
-        * @param integer $dir Direction: forth ($dir=1, dir=2 for preserving entities) AND back ($dir=-1)
+        * @param int $dir Direction: forth ($dir=1, dir=2 for preserving entities) AND back ($dir=-1)
         * @return string Output value
         * @todo Define visibility
         */
        public function bidir_htmlspecialchars($value, $dir) {
-               if ($dir == 1) {
+               $dir = (int)$dir;
+               if ($dir === 1) {
                        $value = htmlspecialchars($value);
-               } elseif ($dir == 2) {
-                       $value = GeneralUtility::deHSCentities(htmlspecialchars($value));
-               } elseif ($dir == -1) {
+               } elseif ($dir === 2) {
+                       $value = htmlspecialchars($value, ENT_COMPAT, 'UTF-8', FALSE);
+               } elseif ($dir === -1) {
                        $value = htmlspecialchars_decode($value);
                }
                return $value;
index 18a66d5..922b4d1 100644 (file)
@@ -1025,9 +1025,12 @@ class GeneralUtility {
 
        /**
         * Re-converts HTML entities if they have been converted by htmlspecialchars()
+        * Note: Use htmlspecialchars($str, ENT_COMPAT, 'UTF-8', FALSE) to avoid double encoding.
+        *       This makes the call to this method obsolete.
         *
         * @param string $str String which contains eg. "&amp;amp;" which should stay "&amp;". Or "&amp;#1234;" to "&#1234;". Or "&amp;#x1b;" to "&#x1b;
         * @return string Converted result.
+        *
         */
        static public function deHSCentities($str) {
                return preg_replace('/&amp;([#[:alnum:]]*;)/', '&\\1', $str);
index 5a9a10a..9ded0ff 100644 (file)
@@ -183,7 +183,7 @@ class FrontendEditPanel {
                $GLOBALS['TSFE']->set_no_cache('Display frontend edit icons', TRUE);
                $style = $conf['styleAttribute'] ? ' style="' . htmlspecialchars($conf['styleAttribute']) . '"' : '';
                $iconTitle = $this->cObj->stdWrap($conf['iconTitle'], $conf['iconTitle.']);
-               $iconImg = $conf['iconImg'] ? $conf['iconImg'] : '<img  ' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg(TYPO3_mainDir, 'gfx/edit_fe.gif', 'width="11" height="12" border="0" align="top" ') . ' title="' . GeneralUtility::deHSCentities(htmlspecialchars($iconTitle)) . '"' . $style . ' class="frontEndEditIcons" alt="" />';
+               $iconImg = $conf['iconImg'] ? $conf['iconImg'] : '<img  ' . \TYPO3\CMS\Backend\Utility\IconUtility::skinImg(TYPO3_mainDir, 'gfx/edit_fe.gif', 'width="11" height="12" border="0" align="top" ') . ' title="' . htmlspecialchars($iconTitle, ENT_COMPAT, 'UTF-8', FALSE) . '"' . $style . ' class="frontEndEditIcons" alt="" />';
                $nV = GeneralUtility::_GP('ADMCMD_view') ? 1 : 0;
                $adminURL = GeneralUtility::getIndpEnv('TYPO3_SITE_URL') . TYPO3_mainDir;
                $icon = $this->editPanelLinkWrap_doWrap($iconImg, $adminURL . 'alt_doc.php?edit[' . $table . '][' . $editUid . ']=edit&columnsOnly=' . rawurlencode($fieldList) . '&noView=' . $nV . $addUrlParamStr);
index d007622..513899a 100644 (file)
@@ -2839,9 +2839,10 @@ class ContentObjectRenderer {
         * @return string The processed input value
         */
        public function stdWrap_htmlSpecialChars($content = '', $conf = array()) {
-               $content = htmlSpecialChars($content);
-               if ($conf['htmlSpecialChars.']['preserveEntities']) {
-                       $content = GeneralUtility::deHSCentities($content);
+               if (!empty($conf['htmlSpecialChars.']['preserveEntities'])) {
+                       $content = htmlspecialchars($content, ENT_COMPAT, 'UTF-8', FALSE);
+               } else {
+                       $content = htmlspecialchars($content);
                }
                return $content;
        }
index fc6cfb1..636d849 100644 (file)
@@ -417,12 +417,12 @@ class FormContentObject extends \TYPO3\CMS\Frontend\ContentObject\AbstractConten
                                                if ($image) {
                                                        $fieldCode = sprintf('<input type="image" name="%s"%s src="%s"%s />', $confData['fieldname'], $elementIdAttribute, $image, $params);
                                                } else {
-                                                       $fieldCode = sprintf('<input type="submit" name="%s"%s value="%s"%s />', $confData['fieldname'], $elementIdAttribute, GeneralUtility::deHSCentities(htmlspecialchars($value)), $addParams);
+                                                       $fieldCode = sprintf('<input type="submit" name="%s"%s value="%s"%s />', $confData['fieldname'], $elementIdAttribute, htmlspecialchars($value, ENT_COMPAT, 'UTF-8', FALSE), $addParams);
                                                }
                                                break;
                                        case 'reset':
                                                $value = trim($parts[2]);
-                                               $fieldCode = sprintf('<input type="reset" name="%s"%s value="%s"%s />', $confData['fieldname'], $elementIdAttribute, GeneralUtility::deHSCentities(htmlspecialchars($value)), $addParams);
+                                               $fieldCode = sprintf('<input type="reset" name="%s"%s value="%s"%s />', $confData['fieldname'], $elementIdAttribute, htmlspecialchars($value, ENT_COMPAT, 'UTF-8', FALSE), $addParams);
                                                break;
                                        case 'label':
                                                $fieldCode = nl2br(htmlspecialchars(trim($parts[2])));
index 781e6e3..73ec103 100644 (file)
@@ -637,7 +637,7 @@ class PermissionModuleController {
                                        }
                                        $lKey = $this->getLevels - $a + 1;
                                        $opts .= '
-                                               <option value="' . htmlspecialchars(implode(',', $theIdListArr)) . '">' . GeneralUtility::deHSCentities(htmlspecialchars(($label_recur . ' ' . $lKey . ' ' . $label_levels))) . ' (' . count($theIdListArr) . ' ' . $label_pA . ')' . '</option>';
+                                               <option value="' . htmlspecialchars(implode(',', $theIdListArr)) . '">' . htmlspecialchars($label_recur . ' ' . $lKey . ' ' . $label_levels, ENT_COMPAT, 'UTF-8', FALSE) . ' (' . count($theIdListArr) . ' ' . $label_pA . ')' . '</option>';
                                }
                        }
                        // Put the selector box together:
index 93aac01..ef3a9e6 100644 (file)
@@ -517,7 +517,7 @@ class RteHtmlAreaBase extends \TYPO3\CMS\Backend\Rte\AbstractRte {
                        $item = $this->triggerField($PA['itemFormElName']) . '
                                <div id="pleasewait' . $textAreaId . '" class="pleasewait" style="display: block;" >' . $LANG->getLL('Please wait') . '</div>
                                <div id="editorWrap' . $textAreaId . '" class="editorWrap" style="visibility: hidden; width:' . $editorWrapWidth . '; height:' . $editorWrapHeight . ';">
-                               <textarea id="RTEarea' . $textAreaId . '" name="' . htmlspecialchars($PA['itemFormElName']) . '" rows="0" cols="0" style="' . GeneralUtility::deHSCentities(htmlspecialchars($this->RTEdivStyle)) . '">' . GeneralUtility::formatForTextarea($value) . '</textarea>
+                               <textarea id="RTEarea' . $textAreaId . '" name="' . htmlspecialchars($PA['itemFormElName']) . '" rows="0" cols="0" style="' . htmlspecialchars($this->RTEdivStyle, ENT_COMPAT, 'UTF-8', FALSE) . '">' . GeneralUtility::formatForTextarea($value) . '</textarea>
                                </div>' . LF;
                }
                // Return form item: