[!!!][TASK] Remove deprecated old Backend AJAX registry 00/52500/5
authorBenni Mack <benni@typo3.org>
Wed, 19 Apr 2017 08:33:28 +0000 (10:33 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Wed, 19 Apr 2017 15:30:48 +0000 (17:30 +0200)
Removes the functionality related to $TYPO3_CONF_VARS['BE']['AJAX']
which has been superseeded by AjaxRoutes introduced in TYPO3 v7.

Resolves: #80889
Releases: master
Change-Id: Ie56d71ccfbb63b518c1d12361ad43bf79bead60d
Reviewed-on: https://review.typo3.org/52500
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Henrik Elsner <helsner@dfau.de>
Tested-by: Henrik Elsner <helsner@dfau.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
typo3/sysext/backend/Classes/Http/AjaxRequestHandler.php
typo3/sysext/backend/Classes/Routing/UriBuilder.php
typo3/sysext/backend/Classes/Utility/BackendUtility.php
typo3/sysext/core/Classes/Http/AjaxRequestHandler.php [deleted file]
typo3/sysext/core/Classes/Page/PageRenderer.php
typo3/sysext/core/Configuration/DefaultConfiguration.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-80700-DeprecatedFunctionalityRemoved.rst

index 1cf008a..a07f2dd 100644 (file)
@@ -19,7 +19,6 @@ use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Backend\Routing\Exception\InvalidRequestTokenException;
 use TYPO3\CMS\Backend\Routing\Exception\ResourceNotFoundException;
 use TYPO3\CMS\Core\Core\Bootstrap;
-use TYPO3\CMS\Core\FormProtection\FormProtectionFactory;
 use TYPO3\CMS\Core\Http\RequestHandlerInterface;
 use TYPO3\CMS\Core\Http\Response;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
@@ -30,10 +29,8 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
  * Main entry point for AJAX calls in the TYPO3 Backend. Based on ?ajaxId of the outside application.
  * Before doing the basic BE-related set up of this request (see the additional calls on $this->bootstrap inside
  * handleRequest()), some AJAX-calls can be made without a valid user, which is determined here.
- * See $GLOBALS['TYPO3_CONF_VARS']['BE']['AJAX'] and the Core APIs on how to register an AJAX call in the TYPO3 Backend.
  *
- * Due to legacy reasons, the actual logic is in EXT:core/Http/AjaxRequestHandler which will eventually
- * be moved into this class.
+ * AJAX Requests are typically registered within EXT:myext/Configuration/Backend/AjaxRoutes.php
  */
 class AjaxRequestHandler implements RequestHandlerInterface
 {
@@ -79,13 +76,8 @@ class AjaxRequestHandler implements RequestHandlerInterface
         $proceedIfNoUserIsLoggedIn = $this->isLoggedInBackendUserRequired($ajaxID);
         $this->boot($proceedIfNoUserIsLoggedIn);
 
-        try {
-            // Backend Routing - check if a valid route is there, and dispatch
-            return $this->dispatch($request);
-        } catch (ResourceNotFoundException $e) {
-            // no Route found, fallback to the traditional AJAX request
-        }
-        return $this->dispatchTraditionalAjaxRequest($request);
+        // Backend Routing - check if a valid route is there, and dispatch
+        return $this->dispatch($request);
     }
 
     /**
@@ -165,72 +157,4 @@ class AjaxRequestHandler implements RequestHandlerInterface
         $dispatcher = GeneralUtility::makeInstance(RouteDispatcher::class);
         return $dispatcher->dispatch($request, $response);
     }
-
-    /**
-     * Calls the ajax callback method registered in TYPO3_CONF_VARS[BE][AJAX]
-     *
-     * @param ServerRequestInterface $request
-     * @return ResponseInterface
-     * @deprecated since TYPO3 v8, will be removed in TYPO3 v9
-     */
-    protected function dispatchTraditionalAjaxRequest($request)
-    {
-        GeneralUtility::deprecationLog('Using the traditional way for AJAX requests via $TYPO3_CONF_VARS[BE][AJAX] is discouraged. Use the Backend Routes logic instead.');
-        $ajaxID = $request->getAttribute('routePath');
-        // Finding the script path from the registry
-        $ajaxRegistryEntry = isset($GLOBALS['TYPO3_CONF_VARS']['BE']['AJAX'][$ajaxID]) ? $GLOBALS['TYPO3_CONF_VARS']['BE']['AJAX'][$ajaxID] : null;
-        $ajaxScript = null;
-        $csrfTokenCheck = false;
-        if ($ajaxRegistryEntry !== null && is_array($ajaxRegistryEntry) && isset($ajaxRegistryEntry['callbackMethod'])) {
-            $ajaxScript = $ajaxRegistryEntry['callbackMethod'];
-            $csrfTokenCheck = $ajaxRegistryEntry['csrfTokenCheck'];
-        }
-
-        // Instantiating the AJAX object
-        /** @var \TYPO3\CMS\Core\Http\AjaxRequestHandler $ajaxObj */
-        $ajaxObj = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Http\AjaxRequestHandler::class, $ajaxID);
-        $ajaxParams = ['request' => $request];
-
-        // Evaluating the arguments and calling the AJAX method/function
-        if (empty($ajaxID)) {
-            $ajaxObj->setError('No valid ajaxID parameter given.');
-        } elseif (empty($ajaxScript)) {
-            $ajaxObj->setError('No backend function registered for ajaxID "' . $ajaxID . '".');
-        } elseif ($csrfTokenCheck && !$this->isValidRequest($request)) {
-            $ajaxObj->setError('Invalid CSRF token detected for ajaxID "' . $ajaxID . '", reload the backend of TYPO3');
-        } else {
-            $success = GeneralUtility::callUserFunction($ajaxScript, $ajaxParams, $ajaxObj, '', 1);
-            if ($success === false) {
-                $ajaxObj->setError('Registered backend function for ajaxID "' . $ajaxID . '" was not found.');
-            }
-        }
-
-        // Outputting the content (and setting the X-JSON-Header)
-        return $ajaxObj->render();
-    }
-
-    /**
-     * Wrapper method for static form protection utility
-     *
-     * @return \TYPO3\CMS\Core\FormProtection\AbstractFormProtection
-     */
-    protected function getFormProtection()
-    {
-        return FormProtectionFactory::get();
-    }
-
-    /**
-     * Checks if the request token is valid. This is checked to see if the route is really
-     * created by the same instance. Should be called for all routes in the backend except
-     * for the ones that don't require a login.
-     *
-     * @param ServerRequestInterface $request
-     * @return bool
-     * @see \TYPO3\CMS\Backend\Routing\UriBuilder where the token is generated.
-     */
-    protected function isValidRequest(ServerRequestInterface $request)
-    {
-        $token = (string)(isset($request->getParsedBody()['ajaxToken']) ? $request->getParsedBody()['ajaxToken'] : $request->getQueryParams()['ajaxToken']);
-        return $this->getFormProtection()->validateToken($token, 'ajaxCall', $request->getAttribute('routePath'));
-    }
 }
index ef847e0..8e7d171 100644 (file)
@@ -125,32 +125,6 @@ class UriBuilder
     }
 
     /**
-     * Returns the Ajax URL for a given AjaxID including a CSRF token.
-     *
-     * This method is only called by the core and must not be used by extensions.
-     * Ajax URLs of all registered backend Ajax handlers are automatically published
-     * to JavaScript inline settings: TYPO3.settings.ajaxUrls['ajaxId']
-     *
-     * @param string $ajaxIdentifier the ajaxID (used as GET parameter)
-     * @param array $parameters An array of parameters
-     * @param string $referenceType The type of reference to be generated (one of the constants)
-     *
-     * @return Uri The generated Uri
-     * @deprecated since TYPO3 v8, will be removed in TYPO3 v9, use the buildUriFromRoute() method
-     */
-    public function buildUriFromAjaxId($ajaxIdentifier, $parameters = [], $referenceType = self::ABSOLUTE_PATH)
-    {
-        GeneralUtility::logDeprecatedFunction();
-        $parameters = [
-            'ajaxID' => $ajaxIdentifier
-        ] + $parameters;
-        if (!empty($GLOBALS['TYPO3_CONF_VARS']['BE']['AJAX'][$ajaxIdentifier]['csrfTokenCheck'])) {
-            $parameters['ajaxToken'] = FormProtectionFactory::get('backend')->generateToken('ajaxCall', $ajaxIdentifier);
-        }
-        return $this->buildUri($parameters, $referenceType);
-    }
-
-    /**
      * Internal method building a Uri object, merging the GET parameters array into a flat queryString
      *
      * @param array $parameters An array of GET parameters
index 237226e..b376255 100644 (file)
@@ -3662,33 +3662,6 @@ class BackendUtility
     }
 
     /**
-     * Returns the Ajax URL for a given AjaxID including a CSRF token.
-     *
-     * This method is only called by the core and must not be used by extensions.
-     * Ajax URLs of all registered backend Ajax handlers are automatically published
-     * to JavaScript inline settings: TYPO3.settings.ajaxUrls['ajaxId']
-     *
-     * @param string $ajaxIdentifier Identifier of the AJAX callback
-     * @param array $urlParameters URL parameters that should be added as key value pairs
-     * @return string Calculated URL
-     * @deprecated since TYPO3 v8, will be removed in TYPO3 v9, use the UriBuilder directly.
-     */
-    public static function getAjaxUrl($ajaxIdentifier, array $urlParameters = [])
-    {
-        GeneralUtility::logDeprecatedFunction();
-        /** @var UriBuilder $uriBuilder */
-        $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
-        try {
-            $routeIdentifier = 'ajax_' . $ajaxIdentifier;
-            $uri = $uriBuilder->buildUriFromRoute($routeIdentifier, $urlParameters);
-        } catch (\TYPO3\CMS\Backend\Routing\Exception\RouteNotFoundException $e) {
-            // no route registered, use the fallback logic to check for a module
-            $uri = $uriBuilder->buildUriFromAjaxId($ajaxIdentifier, $urlParameters);
-        }
-        return (string)$uri;
-    }
-
-    /**
      * Return a link to the list view
      *
      * @param array $urlParameters URL parameters that should be added as key value pairs
diff --git a/typo3/sysext/core/Classes/Http/AjaxRequestHandler.php b/typo3/sysext/core/Classes/Http/AjaxRequestHandler.php
deleted file mode 100644 (file)
index 5f65b71..0000000
+++ /dev/null
@@ -1,305 +0,0 @@
-<?php
-namespace TYPO3\CMS\Core\Http;
-
-/*
- * 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 Psr\Http\Message\ResponseInterface;
-use TYPO3\CMS\Core\Utility\GeneralUtility;
-
-/**
- * Class to hold all the information about an AJAX call and send
- * the right headers for the request type
- * @deprecated since TYPO3 v8, will be removed in TYPO3 v9
- */
-class AjaxRequestHandler
-{
-    /**
-     * @var string|NULL
-     */
-    protected $ajaxId = null;
-
-    /**
-     * @var string|NULL
-     */
-    protected $errorMessage = null;
-
-    /**
-     * @var bool
-     */
-    protected $isError = false;
-
-    /**
-     * @var array
-     */
-    protected $content = [];
-
-    /**
-     * @var string
-     */
-    protected $contentFormat = 'plain';
-
-    /**
-     * @var string
-     */
-    protected $javascriptCallbackWrap = '
-               <script type="text/javascript">
-                       /*<![CDATA[*/
-                       response = |;
-                       /*]]>*/
-               </script>
-       ';
-
-    /**
-     * Sets the ID for the AJAX call
-     *
-     * @param string $ajaxId The AJAX id
-     */
-    public function __construct($ajaxId)
-    {
-        $this->ajaxId = $ajaxId;
-    }
-
-    /**
-     * Returns the ID for the AJAX call
-     *
-     * @return string The AJAX id
-     */
-    public function getAjaxID()
-    {
-        return $this->ajaxId;
-    }
-
-    /**
-     * Overwrites the existing content with the data supplied
-     *
-     * @param array $content The new content
-     * @return mixed The old content as array; if the new content was not an array, FALSE is returned
-     */
-    public function setContent($content)
-    {
-        $oldcontent = false;
-        if (is_array($content)) {
-            $oldcontent = $this->content;
-            $this->content = $content;
-        }
-        return $oldcontent;
-    }
-
-    /**
-     * Adds new content
-     *
-     * @param string $key The new content key where the content should be added in the content array
-     * @param string $content The new content to add
-     * @return mixed The old content; if the old content didn't exist before, FALSE is returned
-     */
-    public function addContent($key, $content)
-    {
-        $oldcontent = false;
-        if (array_key_exists($key, $this->content)) {
-            $oldcontent = $this->content[$key];
-        }
-        if (!isset($content) || empty($content)) {
-            unset($this->content[$key]);
-        } elseif (!isset($key) || empty($key)) {
-            $this->content[] = $content;
-        } else {
-            $this->content[$key] = $content;
-        }
-        return $oldcontent;
-    }
-
-    /**
-     * Returns the content for the ajax call
-     *
-     * @return mixed The content for a specific key or the whole content
-     */
-    public function getContent($key = '')
-    {
-        return $key && array_key_exists($key, $this->content) ? $this->content[$key] : $this->content;
-    }
-
-    /**
-     * Sets the content format for the ajax call
-     *
-     * @param string $format Can be one of 'plain' (default), 'xml', 'json', 'javascript', 'jsonbody' or 'jsonhead'
-     */
-    public function setContentFormat($format)
-    {
-        if (in_array($format, ['plain', 'xml', 'json', 'jsonhead', 'jsonbody', 'javascript'], true)) {
-            $this->contentFormat = $format;
-        }
-    }
-
-    /**
-     * Specifies the wrap to be used if contentFormat is "javascript".
-     * The wrap used by default stores the results in a variable "response" and
-     * adds <script>-Tags around it.
-     *
-     * @param string $javascriptCallbackWrap The javascript callback wrap to be used
-     */
-    public function setJavascriptCallbackWrap($javascriptCallbackWrap)
-    {
-        $this->javascriptCallbackWrap = $javascriptCallbackWrap;
-    }
-
-    /**
-     * Sets an error message and the error flag
-     *
-     * @param string $errorMsg The error message
-     */
-    public function setError($errorMsg = '')
-    {
-        $this->errorMessage = $errorMsg;
-        $this->isError = true;
-    }
-
-    /**
-     * Checks whether an error occurred during the execution or not
-     *
-     * @return bool Whether this AJAX call had errors
-     */
-    public function isError()
-    {
-        return $this->isError;
-    }
-
-    /**
-     * Renders the AJAX call based on the $contentFormat variable and exits the request
-     *
-     * @return ResponseInterface|NULL
-     */
-    public function render()
-    {
-        if ($this->isError) {
-            return $this->renderAsError();
-        }
-        switch ($this->contentFormat) {
-            case 'jsonhead':
-            case 'jsonbody':
-            case 'json':
-                return $this->renderAsJSON();
-                break;
-            case 'javascript':
-                return $this->renderAsJavascript();
-                break;
-            case 'xml':
-                return $this->renderAsXML();
-                break;
-            default:
-                return $this->renderAsPlain();
-        }
-    }
-
-    /**
-     * Renders the AJAX call in XML error style to handle with JS
-     * the "responseXML" of the transport object will be filled with the error message then
-     *
-     * @return ResponseInterface
-     */
-    protected function renderAsError()
-    {
-        /** @var Response $response */
-        $response = GeneralUtility::makeInstance(Response::class);
-        $response = $response
-            ->withStatus(500, ' (AJAX)')
-            ->withHeader('Content-Type', 'text/xml; charset=utf-8')
-            ->withHeader('X-JSON', 'false');
-
-        $response->getBody()->write('<t3err>' . htmlspecialchars($this->errorMessage) . '</t3err>');
-        return $response;
-    }
-
-    /**
-     * Renders the AJAX call with text/html headers
-     * the content will be available in the "responseText" value of the transport object
-     *
-     * @return ResponseInterface
-     * @throws \InvalidArgumentException
-     */
-    protected function renderAsPlain()
-    {
-        /** @var Response $response */
-        $response = GeneralUtility::makeInstance(Response::class);
-        $response = $response
-            ->withHeader('Content-Type', 'text/html; charset=utf-8')
-            ->withHeader('X-JSON', 'true');
-
-        $response->getBody()->write(implode('', $this->content));
-        return $response;
-    }
-
-    /**
-     * Renders the AJAX call with text/xml headers
-     * the content will be available in the "responseXML" value of the transport object
-     *
-     * @return ResponseInterface
-     * @throws \InvalidArgumentException
-     */
-    protected function renderAsXML()
-    {
-        /** @var Response $response */
-        $response = GeneralUtility::makeInstance(Response::class);
-        $response = $response
-            ->withHeader('Content-Type', 'text/xml; charset=utf-8')
-            ->withHeader('X-JSON', 'true');
-
-        $response->getBody()->write(implode('', $this->content));
-        return $response;
-    }
-
-    /**
-     * Renders the AJAX call with JSON evaluated headers
-     * note that you need to have requestHeaders: {Accept: 'application/json'},
-     * in your AJAX options of your AJAX request object in JS
-     *
-     * the content will be available
-     * - in the second parameter of the onSuccess / onComplete callback
-     * - and in the xhr.responseText as a string (except when contentFormat = 'jsonhead')
-     * you can evaluate this in JS with xhr.responseText.evalJSON();
-     *
-     * @return ResponseInterface
-     * @throws \InvalidArgumentException
-     */
-    protected function renderAsJSON()
-    {
-        /** @var Response $response */
-        $response = GeneralUtility::makeInstance(Response::class);
-        $response = $response->withHeader('Content-Type', 'application/json; charset=utf-8');
-
-        $content = json_encode($this->content);
-        // Bring content in xhr.responseText except when in "json head only" mode
-        if ($this->contentFormat === 'jsonhead') {
-            $response = $response->withHeader('X-JSON', $content);
-        } else {
-            $response = $response->withHeader('X-JSON', 'true');
-            $response->getBody()->write($content);
-        }
-        return $response;
-    }
-
-    /**
-     * Renders the AJAX call as inline JSON inside a script tag. This is useful
-     * when an iframe is used as the AJAX transport.
-     *
-     * @return ResponseInterface
-     * @throws \InvalidArgumentException
-     */
-    protected function renderAsJavascript()
-    {
-        $response = GeneralUtility::makeInstance(Response::class);
-        $response = $response->withHeader('Content-Type', 'text/html; charset=utf-8');
-        $response->getBody()->write(str_replace('|', json_encode($this->content), $this->javascriptCallbackWrap));
-        return $response;
-    }
-}
index 5660b88..2ed215d 100644 (file)
@@ -16,7 +16,6 @@ namespace TYPO3\CMS\Core\Page;
 
 use TYPO3\CMS\Backend\Routing\Router;
 use TYPO3\CMS\Backend\Routing\UriBuilder;
-use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Cache\CacheManager;
 use TYPO3\CMS\Core\Cache\Frontend\VariableFrontend;
 use TYPO3\CMS\Core\Localization\LocalizationFactory;
@@ -2102,12 +2101,7 @@ class PageRenderer implements \TYPO3\CMS\Core\SingletonInterface
     protected function addAjaxUrlsToInlineSettings()
     {
         $ajaxUrls = [];
-        // Note: this method of adding Ajax URLs is @deprecated as of TYPO3 v8, and will be removed in TYPO3 v9
-        foreach ($GLOBALS['TYPO3_CONF_VARS']['BE']['AJAX'] as $ajaxHandler => $_) {
-            $ajaxUrls[$ajaxHandler] = BackendUtility::getAjaxUrl($ajaxHandler);
-        }
-
-        // also add the ajax-based routes
+        // Add the ajax-based routes
         /** @var UriBuilder $uriBuilder */
         $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
         /** @var Router $router */
index d530d1c..af10366 100644 (file)
@@ -947,7 +947,6 @@ return [
         'explicitConfirmationOfTranslation' => false,
         'versionNumberInFilename' => false,
         'debug' => false,
-        'AJAX' => [], // array of key-value pairs for a unified use of AJAX calls in the TYPO3 backend. Keys are the unique ajaxIDs where the value will be resolved to call a method in an object. See the AjaxRequestHandler class for more information.
         'toolbarItems' => [], // Array: Registered toolbar items classes
         'HTTP' => [
             'Response' => [
index 8439f7a..fe8de94 100644 (file)
@@ -14,9 +14,12 @@ The following PHP classes that have been previously deprecated for v8 have been
 * TYPO3\CMS\Backend\Console\Application
 * TYPO3\CMS\Backend\Console\CliRequestHandler
 * TYPO3\CMS\Core\Controller\CommandLineController
+* TYPO3\CMS\Core\Http\AjaxRequestHandler
 * TYPO3\CMS\Lowlevel\CleanerCommand
 
 The following PHP class methods that have been previously deprecated for v8 have been removed:
+* TYPO3\CMS\Backend\Routing\UriBuilder->buildUriFromAjaxId()
+* TYPO3\CMS\Backend\Utility\BackendUtility::getAjaxUrl()
 * TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addExtJSModule()
 * TYPO3\CMS\Core\Utility\ExtensionManagementUtility::appendToTypoConfVars()
 * TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extRelPath()