[BUGFIX] Fix script URLs for traditional modules 07/33707/2
authorHelmut Hummel <helmut.hummel@typo3.org>
Thu, 30 Oct 2014 16:44:11 +0000 (17:44 +0100)
committerAnja Leichsenring <aleichsenring@ab-softlab.de>
Sat, 1 Nov 2014 21:09:54 +0000 (22:09 +0100)
The introduction of CSRF protection for backend modules
introduced a regression for traditional modules.

Previously the script was calculated correctly if
not provided. Now API calls without providing the script
are assumed to be mod.php dispatched.

Fix that by checking if the M GET argument was sent
and fall back to traditional URL calculation.

Resolves: #62569
Releases: 6.2, master
Change-Id: I26d16acb513d678f117e0b645fe3eefebf909e3d
Reviewed-on: http://review.typo3.org/33707
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
typo3/sysext/backend/Classes/Utility/BackendUtility.php

index 28a812d..808667b 100644 (file)
@@ -2765,15 +2765,7 @@ class BackendUtility {
                if (!is_array($menuItems) || count($menuItems) <= 1) {
                        return '';
                }
-               if (!is_array($mainParams)) {
-                       $mainParams = array('id' => $mainParams);
-               }
-               if (!$script) {
-                       $scriptUrl = self::getModuleUrl(GeneralUtility::_GET('M'), $mainParams) . $addparams;
-               } else {
-                       $mainParams = GeneralUtility::implodeArrayForUrl('', $mainParams);
-                       $scriptUrl = $script . '?' . $mainParams . $addparams;
-               }
+               $scriptUrl = self::buildScriptUrl($mainParams, $addparams, $script);
                $options = array();
                foreach ($menuItems as $value => $label) {
                        $options[] = '<option value="' . htmlspecialchars($value) . '"' . ((string)$currentValue === (string)$value ? ' selected="selected"' : '') . '>' . htmlspecialchars($label, ENT_COMPAT, 'UTF-8', FALSE) . '</option>';
@@ -2804,16 +2796,8 @@ class BackendUtility {
         * @return string HTML code for checkbox
         * @see getFuncMenu()
         */
-       static public function getFuncCheck($mainParams, $elementName, $currentValue, $script = '', $addparams = '', $tagParams = '') {
-               if (!is_array($mainParams)) {
-                       $mainParams = array('id' => $mainParams);
-               }
-               if (!$script) {
-                       $scriptUrl = self::getModuleUrl(GeneralUtility::_GET('M'), $mainParams) . $addparams;
-               } else {
-                       $mainParams = GeneralUtility::implodeArrayForUrl('', $mainParams);
-                       $scriptUrl = $script . '?' . $mainParams . $addparams;
-               }
+       static public function getFuncCheck($mainParams, $elementName, $currentValue, $script = '', $addParams = '', $tagParams = '') {
+               $scriptUrl = self::buildScriptUrl($mainParams, $addParams, $script);
                $onClick = 'jumpToUrl(' . GeneralUtility::quoteJSvalue($scriptUrl . '&' . $elementName . '=') . '+(this.checked?1:0),this);';
 
                return
@@ -2841,18 +2825,34 @@ class BackendUtility {
         * @return string HTML code for input text field.
         * @see getFuncMenu()
         */
-       static public function getFuncInput($mainParams, $elementName, $currentValue, $size = 10, $script = '', $addparams = '') {
+       static public function getFuncInput($mainParams, $elementName, $currentValue, $size = 10, $script = '', $addParams = '') {
+               $scriptUrl = self::buildScriptUrl($mainParams, $addParams, $script);
+               $onChange = 'jumpToUrl(' . GeneralUtility::quoteJSvalue($scriptUrl . '&' . $elementName . '=') . '+escape(this.value),this);';
+               return '<input type="text"' . $GLOBALS['TBE_TEMPLATE']->formWidth($size) . ' name="' . $elementName . '" value="' . htmlspecialchars($currentValue) . '" onchange="' . htmlspecialchars($onChange) . '" />';
+       }
+
+       /**
+        * Builds the URL to the current script with given arguments
+        *
+        * @param mixed $mainParams $id is the "&id=" parameter value to be sent to the module, but it can be also a parameter array which will be passed instead of the &id=...
+        * @param string $addParams Additional parameters to pass to the script.
+        * @param string $script The script to send the &id to, if empty it's automatically found
+        * @return string The completes script URL
+        */
+       protected static function buildScriptUrl($mainParams, $addParams, $script = '') {
                if (!is_array($mainParams)) {
                        $mainParams = array('id' => $mainParams);
                }
                if (!$script) {
-                       $scriptUrl = self::getModuleUrl(GeneralUtility::_GET('M'), $mainParams) . $addparams;
+                       $script = basename(PATH_thisScript);
+               }
+               if ($script === 'mod.php' && GeneralUtility::_GET('M')) {
+                       $scriptUrl = self::getModuleUrl(GeneralUtility::_GET('M'), $mainParams) . $addParams;
                } else {
-                       $mainParams = GeneralUtility::implodeArrayForUrl('', $mainParams);
-                       $scriptUrl = $script . '?' . $mainParams . $addparams;
+                       $scriptUrl = $script . '?' . GeneralUtility::implodeArrayForUrl('', $mainParams) . $addParams;
                }
-               $onChange = 'jumpToUrl(' . GeneralUtility::quoteJSvalue($scriptUrl . '&' . $elementName . '=') . '+escape(this.value),this);';
-               return '<input type="text"' . $GLOBALS['TBE_TEMPLATE']->formWidth($size) . ' name="' . $elementName . '" value="' . htmlspecialchars($currentValue) . '" onchange="' . htmlspecialchars($onChange) . '" />';
+
+               return $scriptUrl;
        }
 
        /**