From 65d167e15856c04005e978c6539d87d3b19eb956 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 29 Aug 2023 16:09:56 +0200 Subject: [PATCH 1/4] Add configuration for proxy middleware --- Configuration/RequestMiddlewares.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Configuration/RequestMiddlewares.php b/Configuration/RequestMiddlewares.php index f328daa0f6..090715da07 100644 --- a/Configuration/RequestMiddlewares.php +++ b/Configuration/RequestMiddlewares.php @@ -12,6 +12,9 @@ return [ 'frontend' => [ + 'dlf/page-view-proxy' => [ + 'target' => \Kitodo\Dlf\Middleware\PageViewProxy::class, + ], 'dlf/search-in-document' => [ 'target' => \Kitodo\Dlf\Middleware\SearchInDocument::class, 'after' => [ From ac12990abee141b65e88742284d01c36664eb68d Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 29 Aug 2023 16:22:09 +0200 Subject: [PATCH 2/4] Implement middleware for PageViewProxy --- Classes/Controller/AbstractController.php | 2 +- Classes/{Eid => Middleware}/PageViewProxy.php | 57 +++++++++++-------- .../Api/PageViewProxyDisabledTest.php | 2 +- Tests/Functional/Api/PageViewProxyTest.php | 2 +- 4 files changed, 37 insertions(+), 26 deletions(-) rename Classes/{Eid => Middleware}/PageViewProxy.php (90%) diff --git a/Classes/Controller/AbstractController.php b/Classes/Controller/AbstractController.php index 856958bb27..67a262bf37 100644 --- a/Classes/Controller/AbstractController.php +++ b/Classes/Controller/AbstractController.php @@ -311,7 +311,7 @@ protected function configureProxyUrl(string &$url): void ->setCreateAbsoluteUri(!empty($this->extConf['general']['forceAbsoluteUrl'])) ->setArguments( [ - 'eID' => 'tx_dlf_pageview_proxy', + 'middleware' => 'dlf/page-view-proxy', 'url' => $url, 'uHash' => GeneralUtility::hmac($url, 'PageViewProxy') ] diff --git a/Classes/Eid/PageViewProxy.php b/Classes/Middleware/PageViewProxy.php similarity index 90% rename from Classes/Eid/PageViewProxy.php rename to Classes/Middleware/PageViewProxy.php index 7278a3289a..e86bc1c6bd 100644 --- a/Classes/Eid/PageViewProxy.php +++ b/Classes/Middleware/PageViewProxy.php @@ -10,12 +10,14 @@ * LICENSE.txt file that was distributed with this source code. */ -namespace Kitodo\Dlf\Eid; +namespace Kitodo\Dlf\Middleware; use Kitodo\Dlf\Common\Helper; use Kitodo\Dlf\Common\StdOutStream; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Server\MiddlewareInterface; +use Psr\Http\Server\RequestHandlerInterface; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Http\JsonResponse; use TYPO3\CMS\Core\Http\RequestFactory; @@ -23,7 +25,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; /** - * eID image proxy for plugin 'Page View' of the 'dlf' extension + * Image proxy Middleware for plugin 'Page View' of the 'dlf' extension * * Supported query parameters: * - `url` (mandatory): The URL to be proxied @@ -34,7 +36,7 @@ * * @access public */ -class PageViewProxy +class PageViewProxy implements MiddlewareInterface { /** * @access protected @@ -61,6 +63,35 @@ public function __construct() $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('dlf', 'general'); } + /** + * The process method of the middleware. + * + * @access public + * + * @param ServerRequestInterface $request + * @param RequestHandlerInterface $handler + * + * @return ResponseInterface + */ + public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface + { + $response = $handler->handle($request); + // Get input parameters and decrypt core name. + $parameters = $request->getQueryParams(); + // Return if not this middleware + if (!isset($parameters['middleware']) || ($parameters['middleware'] != 'dlf/page-view-proxy')) { + return $response; + } + + return match ($request->getMethod()) { + 'OPTIONS' => $this->handleOptions($request), + 'GET' => $this->handleGet($request), + 'HEAD' => $this->handleHead($request), + default => GeneralUtility::makeInstance(Response::class) + ->withStatus(405), + }; + } + /** * Return a response that is derived from $response and contains CORS * headers to be sent to the client. @@ -223,24 +254,4 @@ protected function handleGet(ServerRequestInterface $request): ResponseInterface return $this->withCorsResponseHeaders($clientResponse, $request); } - - /** - * The main method of the eID script - * - * @access public - * - * @param ServerRequestInterface $request - * - * @return ResponseInterface - */ - public function main(ServerRequestInterface $request): ResponseInterface - { - return match ($request->getMethod()) { - 'OPTIONS' => $this->handleOptions($request), - 'GET' => $this->handleGet($request), - 'HEAD' => $this->handleHead($request), - default => GeneralUtility::makeInstance(Response::class) - ->withStatus(405), - }; - } } diff --git a/Tests/Functional/Api/PageViewProxyDisabledTest.php b/Tests/Functional/Api/PageViewProxyDisabledTest.php index 1b4dedc50d..07c30ea979 100644 --- a/Tests/Functional/Api/PageViewProxyDisabledTest.php +++ b/Tests/Functional/Api/PageViewProxyDisabledTest.php @@ -34,7 +34,7 @@ class PageViewProxyDisabledTest extends FunctionalTestCase protected function queryProxy(array $query, string $method = 'GET'): ResponseInterface { $request = (new InternalRequest($this->baseUrl))->withQueryParameters( - array_merge([ 'eID' => 'tx_dlf_pageview_proxy' ], $query) + array_merge([ 'middleware' => 'dlf/page-view-proxy' ], $query) )->withMethod($method); return $this->executeInternalRequest($request); diff --git a/Tests/Functional/Api/PageViewProxyTest.php b/Tests/Functional/Api/PageViewProxyTest.php index d35f9d7f1c..46a707f012 100644 --- a/Tests/Functional/Api/PageViewProxyTest.php +++ b/Tests/Functional/Api/PageViewProxyTest.php @@ -55,7 +55,7 @@ protected function getDlfConfiguration(): array protected function queryProxy(array $query, string $method = 'GET'): ResponseInterface { $request = (new InternalRequest($this->baseUrl))->withQueryParameters( - array_merge([ 'eID' => 'tx_dlf_pageview_proxy' ], $query) + array_merge([ 'middleware' => 'dlf/page-view-proxy' ], $query) )->withMethod($method); return $this->executeInternalRequest($request); From 7f9c2efa1ea760720015e43456391aea85d56c2a Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 29 Aug 2023 16:23:47 +0200 Subject: [PATCH 3/4] Unregister proxy eID handler --- ext_localconf.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ext_localconf.php b/ext_localconf.php index 4f1f1739d5..3b93055730 100644 --- a/ext_localconf.php +++ b/ext_localconf.php @@ -104,10 +104,6 @@ 'description' => 'LLL:EXT:dlf/Resources/Private/Language/locallang_tasks.xlf:suggestBuildTask.description', 'additionalFields' => \Kitodo\Dlf\Task\SuggestBuildAdditionalFieldProvider::class, ]; -// Register AJAX eID handlers. -if ($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['dlf']['general']['enableInternalProxy'] ?? false) { - $GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['tx_dlf_pageview_proxy'] = \Kitodo\Dlf\Eid\PageViewProxy::class . '::main'; -} // Use Caching Framework for Solr queries $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['tx_dlf_solr'] ??= []; From da4e9751ee2cee19ecb23d3f1c98a839cc4e7732 Mon Sep 17 00:00:00 2001 From: Beatrycze Volk Date: Tue, 5 Sep 2023 13:59:06 +0200 Subject: [PATCH 4/4] Change middleware type --- Classes/Middleware/PageViewProxy.php | 4 ++-- Configuration/RequestMiddlewares.php | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Classes/Middleware/PageViewProxy.php b/Classes/Middleware/PageViewProxy.php index e86bc1c6bd..a7e2dde57e 100644 --- a/Classes/Middleware/PageViewProxy.php +++ b/Classes/Middleware/PageViewProxy.php @@ -75,12 +75,12 @@ public function __construct() */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { - $response = $handler->handle($request); // Get input parameters and decrypt core name. $parameters = $request->getQueryParams(); + // Return if not this middleware if (!isset($parameters['middleware']) || ($parameters['middleware'] != 'dlf/page-view-proxy')) { - return $response; + return $handler->handle($request); } return match ($request->getMethod()) { diff --git a/Configuration/RequestMiddlewares.php b/Configuration/RequestMiddlewares.php index 090715da07..f584f670ea 100644 --- a/Configuration/RequestMiddlewares.php +++ b/Configuration/RequestMiddlewares.php @@ -14,6 +14,13 @@ 'frontend' => [ 'dlf/page-view-proxy' => [ 'target' => \Kitodo\Dlf\Middleware\PageViewProxy::class, + // Ensure this runs before the router/dispatcher so it can handle the request + 'before' => [ + // replace with the actual TYPO3 router middleware id if known + 'typo3/cms-frontend/router' + ], + //'after' => [], + 'priority' => 50, ], 'dlf/search-in-document' => [ 'target' => \Kitodo\Dlf\Middleware\SearchInDocument::class,