[BUGFIX] Fix module access regressions 83/27883/3
authorHelmut Hummel <helmut.hummel@typo3.org>
Wed, 26 Feb 2014 20:37:14 +0000 (21:37 +0100)
committerMarkus Klein <klein.t3@mfc-linz.at>
Wed, 26 Feb 2014 23:00:15 +0000 (00:00 +0100)
During the addition of the token check for mod.php
some places have been missed where a correct
token needs to be added.

Resolves: #56359
Releases: 6.2
Change-Id: I435cb36641fe96ecf050c915d200f94cbb31ce9f
Reviewed-on: https://review.typo3.org/27883
Reviewed-by: Markus Klein
Tested-by: Markus Klein
typo3/sysext/backend/Classes/Toolbar/ShortcutToolbarItem.php
typo3/sysext/backend/Classes/Utility/BackendUtility.php
typo3/sysext/extbase/Classes/Mvc/Web/Routing/UriBuilder.php
typo3/sysext/workspaces/Classes/Service/WorkspaceService.php

index 7bf1f80..f83d700 100644 (file)
@@ -313,7 +313,7 @@ class ShortcutToolbarItem implements \TYPO3\CMS\Backend\Toolbar\ToolbarItemHookI
                        $shortcut['group'] = $shortcutGroup;
                        $shortcut['icon'] = $this->getShortcutIcon($row, $shortcut);
                        $shortcut['iconTitle'] = $this->getShortcutIconTitle($shortcut['label'], $row['module_name'], $row['M_module_name']);
-                       $shortcut['action'] = 'jump(unescape(\'' . rawurlencode($row['url']) . '\'),\'' . $moduleName . '\',\'' . $moduleParts[0] . '\', ' . (int)$pageId . ');';
+                       $shortcut['action'] = 'jump(unescape(\'' . rawurlencode($this->getTokenUrl($row['url'])) . '\'),\'' . $moduleName . '\',\'' . $moduleParts[0] . '\', ' . (int)$pageId . ');';
 
                        $shortcuts[] = $shortcut;
                }
@@ -321,6 +321,23 @@ class ShortcutToolbarItem implements \TYPO3\CMS\Backend\Toolbar\ToolbarItemHookI
        }
 
        /**
+        * Adds the correct token, if the url is a mod.php script
+        *
+        * @param string $url
+        * @return string
+        */
+       protected function getTokenUrl($url) {
+               $parsedUrl = parse_url($url);
+               parse_str($parsedUrl['query'], $parameters);
+               if (strpos($parsedUrl['path'], 'mod.php') !== FALSE && isset($parameters['M'])) {
+                       $module = $parameters['M'];
+                       unset($parameters['M']);
+                       $url = str_replace('mod.php', '', $parsedUrl['path']) . BackendUtility::getModuleUrl($module, $parameters);
+               }
+               return $url;
+       }
+
+       /**
         * Gets shortcuts for a specific group
         *
         * @param integer $groupId Group Id
index dc03289..c726662 100644 (file)
@@ -2731,11 +2731,9 @@ 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 {
@@ -2776,12 +2774,13 @@ class BackendUtility {
                if (!is_array($mainParams)) {
                        $mainParams = array('id' => $mainParams);
                }
-               $mainParams = GeneralUtility::implodeArrayForUrl('', $mainParams);
                if (!$script) {
-                       $script = basename(PATH_thisScript);
-                       $mainParams .= GeneralUtility::_GET('M') ? '&M=' . rawurlencode(GeneralUtility::_GET('M')) : '';
+                       $scriptUrl = self::getModuleUrl(GeneralUtility::_GET('M'), $mainParams) . $addparams;
+               } else {
+                       $mainParams = GeneralUtility::implodeArrayForUrl('', $mainParams);
+                       $scriptUrl = $script . '?' . $mainParams . $addparams;
                }
-               $onClick = 'jumpToUrl(' . GeneralUtility::quoteJSvalue($script . '?' . $mainParams . $addparams . '&' . $elementName . '=') . '+(this.checked?1:0),this);';
+               $onClick = 'jumpToUrl(' . GeneralUtility::quoteJSvalue($scriptUrl . '&' . $elementName . '=') . '+(this.checked?1:0),this);';
 
                return
                '<input' .
@@ -2812,12 +2811,13 @@ class BackendUtility {
                if (!is_array($mainParams)) {
                        $mainParams = array('id' => $mainParams);
                }
-               $mainParams = GeneralUtility::implodeArrayForUrl('', $mainParams);
                if (!$script) {
-                       $script = basename(PATH_thisScript);
-                       $mainParams .= GeneralUtility::_GET('M') ? '&M=' . rawurlencode(GeneralUtility::_GET('M')) : '';
+                       $scriptUrl = self::getModuleUrl(GeneralUtility::_GET('M'), $mainParams) . $addparams;
+               } else {
+                       $mainParams = GeneralUtility::implodeArrayForUrl('', $mainParams);
+                       $scriptUrl = $script . '?' . $mainParams . $addparams;
                }
-               $onChange = 'jumpToUrl(\'' . $script . '?' . $mainParams . $addparams . '&' . $elementName . '=\'+escape(this.value),this);';
+               $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) . '" />';
        }
 
index 995598c..2550a53 100644 (file)
@@ -282,7 +282,7 @@ class UriBuilder {
         * which results in using QUERY_STRING.
         *
         * @param string $addQueryStringMethod
-        * @return Tx_Extbase_MVC_Web_Routing_UriBuilder the current UriBuilder to allow method chaining
+        * @return \TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder the current UriBuilder to allow method chaining
         * @api
         * @see TSref/typolink.addQueryString.method
         */
@@ -613,7 +613,7 @@ class UriBuilder {
                $this->lastArguments = $arguments;
                $moduleName = $arguments['M'];
                unset($arguments['M'], $arguments['moduleToken']);
-               $uri = BackendUtility::getModuleUrl($moduleName, $arguments);
+               $uri = BackendUtility::getModuleUrl($moduleName, $arguments, '');
                if ($this->section !== '') {
                        $uri .= '#' . $this->section;
                }
index c658bbe..b54bb97 100644 (file)
@@ -28,6 +28,7 @@ namespace TYPO3\CMS\Workspaces\Service;
  ***************************************************************/
 
 use TYPO3\CMS\Backend\Utility\BackendUtility;
+use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Core\Versioning\VersionState;
 
 /**
@@ -605,17 +606,19 @@ class WorkspaceService implements \TYPO3\CMS\Core\SingletonInterface {
                        $uid = $this->getLivePageUid($uid);
                }
                /** @var $uriBuilder \TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder */
-               $uriBuilder = $this->getObjectManager()->create('TYPO3\\CMS\\Extbase\\Mvc\\Web\\Routing\\UriBuilder');
+               $uriBuilder = $this->getObjectManager()->get('TYPO3\\CMS\\Extbase\\Mvc\\Web\\Routing\\UriBuilder');
                // This seems to be very harsh to set this directly to "/typo3 but the viewOnClick also
                // has /index.php as fixed value here and dealing with the backPath is very error-prone
                // @todo make sure this would work in local extension installation too
                $backPath = '/' . TYPO3_mainDir;
                $redirect = $backPath . 'index.php?redirect_url=';
-               // @todo why do we need these additional params? the URIBuilder should add the controller, but he doesn't :(
-               $additionalParams = '&tx_workspaces_web_workspacesworkspaces%5Bcontroller%5D=Preview&M=web_WorkspacesWorkspaces&id=';
-               $viewScript = $backPath . $uriBuilder->uriFor('index', array(), 'TYPO3\\CMS\\Workspaces\\Controller\\PreviewController', 'workspaces', 'web_workspacesworkspaces') . $additionalParams;
+               // @todo this should maybe be changed so that the extbase URI Builder can deal with module names directly
+               $originalM = GeneralUtility::_GET('M');
+               GeneralUtility::_GETset('web_WorkspacesWorkspaces', 'M');
+               $viewScript = $backPath . $uriBuilder->uriFor('index', array(), 'Preview', 'workspaces', 'web_workspacesworkspaces') . '&id=';
+               GeneralUtility::_GETset($originalM, 'M');
                if ($addDomain === TRUE) {
-                       return BackendUtility::getViewDomain($uid) . $redirect . urlencode($viewScript) . $uid;
+                       return BackendUtility::getViewDomain($uid) . $redirect . urlencode($viewScript);
                } else {
                        return $viewScript;
                }