mirror of
https://github.com/SuiteCRM/SuiteCRM-Core.git
synced 2025-09-07 10:36:27 +08:00
Add Legacy asset re-direction
- Add handler to check and build re-direction path - Re-direct legacy assets on LegacyRedirectListener - Add configuration with list of legacy asset paths - Add dummy image call to the ClassicViewItemDataProvider
This commit is contained in:
parent
32f6ddd81b
commit
baae4e2129
6 changed files with 225 additions and 3 deletions
|
@ -4,6 +4,7 @@ framework:
|
|||
parameters:
|
||||
secret: ThisTokenIsNotSoSecretChangeIt
|
||||
legacy.dir: '%kernel.project_dir%/legacy'
|
||||
legacy.path: '/legacy'
|
||||
legacy.session_name: 'LEGACYSESSID'
|
||||
default_session_name: 'PHPSESSID'
|
||||
|
||||
|
@ -18,11 +19,13 @@ services:
|
|||
bind:
|
||||
$projectDir: '%kernel.project_dir%'
|
||||
$legacyDir: '%legacy.dir%'
|
||||
$legacyPath: '%legacy.path%'
|
||||
$legacySessionName: '%legacy.session_name%'
|
||||
$defaultSessionName: '%default_session_name%'
|
||||
$exposedSystemConfigs: '%legacy.exposed_system_configs%'
|
||||
$legacyModuleNameMap: '%legacy.module_name_map%'
|
||||
$legacyActionNameMap: '%legacy.action_name_map%'
|
||||
$legacyAssetPaths: '%legacy.asset_paths%'
|
||||
|
||||
# makes classes in src/ available to be used as services
|
||||
# this creates a service per class whose id is the fully-qualified class name
|
||||
|
|
5
config/services/legacy/asset_paths.yaml
Normal file
5
config/services/legacy/asset_paths.yaml
Normal file
|
@ -0,0 +1,5 @@
|
|||
parameters:
|
||||
legacy.asset_paths:
|
||||
- cache
|
||||
- include
|
||||
- themes
|
|
@ -38,7 +38,9 @@ final class ClassicViewItemDataProvider implements ItemDataProviderInterface, Re
|
|||
$output->setId('123');
|
||||
|
||||
$html = '<h1>HTML working</h1><script>alert(\'JS Working\');</script><button onClick="alert(\'JS Working\');">Click Me</button>';
|
||||
$html .= '<a href="index.php?module=Contacts&action=ListView">Legacy Link to Contacts List View</a>';
|
||||
$html .= '<br/><a href="index.php?module=Contacts&action=ListView">Legacy Link to Contacts List View</a>';
|
||||
$html .= '<br/><strong>Legacy folder Image:</strong>';
|
||||
$html .= '<img src="themes/default/images/company_logo.png" alt="SuiteCRM" style="margin: 5px 0;">';
|
||||
$output->setHtml($html);
|
||||
|
||||
return $output;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace App\EventListener;
|
||||
|
||||
use App\Service\LegacyAssetHandler;
|
||||
use App\Service\RouteConverter;
|
||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||
use Symfony\Component\HttpKernel\Event\RequestEvent;
|
||||
|
@ -12,15 +13,25 @@ use Symfony\Component\HttpKernel\Event\RequestEvent;
|
|||
*/
|
||||
class LegacyRedirectListener
|
||||
{
|
||||
/**
|
||||
* @var RouteConverter
|
||||
*/
|
||||
private $routeConverter;
|
||||
|
||||
/**
|
||||
* @var LegacyAssetHandler
|
||||
*/
|
||||
private $legacyAssetHandler;
|
||||
|
||||
/**
|
||||
* LegacyRedirectListener constructor.
|
||||
* @param RouteConverter $routeConverter
|
||||
* @param LegacyAssetHandler $legacyAssetHandler
|
||||
*/
|
||||
public function __construct(RouteConverter $routeConverter)
|
||||
public function __construct(RouteConverter $routeConverter, LegacyAssetHandler $legacyAssetHandler)
|
||||
{
|
||||
$this->routeConverter = $routeConverter;
|
||||
$this->legacyAssetHandler = $legacyAssetHandler;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -29,7 +40,15 @@ class LegacyRedirectListener
|
|||
*/
|
||||
public function __invoke(RequestEvent $event): void
|
||||
{
|
||||
if($this->isConvertible($event)){
|
||||
if ($this->isLegacyAsset($event)) {
|
||||
$url = $this->legacyAssetHandler->convert($event->getRequest());
|
||||
$response = new RedirectResponse($url);
|
||||
$event->setResponse($response);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->isConvertible($event)) {
|
||||
$url = $this->routeConverter->convert($event->getRequest());
|
||||
$response = new RedirectResponse($url);
|
||||
$event->setResponse($response);
|
||||
|
@ -45,4 +64,14 @@ class LegacyRedirectListener
|
|||
{
|
||||
return $this->routeConverter->isLegacyRoute($event->getRequest());
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if it is legacy asset requests
|
||||
* @param RequestEvent $event
|
||||
* @return bool
|
||||
*/
|
||||
protected function isLegacyAsset(RequestEvent $event): bool
|
||||
{
|
||||
return $this->legacyAssetHandler->isLegacyAssetRequest($event->getRequest());
|
||||
}
|
||||
}
|
71
core/src/Service/LegacyAssetHandler.php
Normal file
71
core/src/Service/LegacyAssetHandler.php
Normal file
|
@ -0,0 +1,71 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace App\Service;
|
||||
|
||||
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
class LegacyAssetHandler
|
||||
{
|
||||
/**
|
||||
* @var string[]
|
||||
*/
|
||||
private $legacyAssetPaths;
|
||||
/**
|
||||
* @var String
|
||||
*/
|
||||
private $legacyPath;
|
||||
|
||||
/**
|
||||
* LegacyAssetHandler constructor.
|
||||
* @param array $legacyAssetPaths
|
||||
* @param String $legacyPath
|
||||
*/
|
||||
public function __construct(array $legacyAssetPaths, String $legacyPath)
|
||||
{
|
||||
$this->legacyAssetPaths = $legacyAssetPaths;
|
||||
$this->legacyPath = $legacyPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the given $request is a legacy asset request
|
||||
*
|
||||
* @param Request $request
|
||||
* @return bool
|
||||
*/
|
||||
public function isLegacyAssetRequest(Request $request): bool
|
||||
{
|
||||
if (empty($request->getPathInfo()) || $request->getPathInfo() === '/') {
|
||||
return false;
|
||||
}
|
||||
|
||||
$pathParts = explode('/', $request->getPathInfo());
|
||||
|
||||
if (empty($pathParts) || empty($pathParts[1])) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (in_array($pathParts[1], $this->legacyAssetPaths)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert given $request route
|
||||
*
|
||||
* @param Request $request
|
||||
* @return string
|
||||
*/
|
||||
public function convert(Request $request): string
|
||||
{
|
||||
|
||||
if (null !== $queryString = $request->getQueryString()) {
|
||||
$queryString = '?' . $queryString;
|
||||
}
|
||||
|
||||
return $request->getBaseUrl() . $this->legacyPath . $request->getPathInfo() . $queryString;
|
||||
}
|
||||
}
|
112
tests/unit/service/LegacyAssetHandlerTest.php
Normal file
112
tests/unit/service/LegacyAssetHandlerTest.php
Normal file
|
@ -0,0 +1,112 @@
|
|||
<?php namespace App\Tests;
|
||||
|
||||
use App\Service\LegacyAssetHandler;
|
||||
use \Codeception\Test\Unit;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
|
||||
class LegacyAssetHandlerTest extends Unit
|
||||
{
|
||||
/**
|
||||
* @var UnitTester
|
||||
*/
|
||||
protected $tester;
|
||||
|
||||
|
||||
/**
|
||||
* @var LegacyAssetHandler
|
||||
*/
|
||||
private $legacyAssetHandler;
|
||||
|
||||
protected function _before()
|
||||
{
|
||||
$legacyAssetPaths = [
|
||||
'cache',
|
||||
'include',
|
||||
'themes'
|
||||
];
|
||||
|
||||
$this->legacyAssetHandler = new LegacyAssetHandler($legacyAssetPaths, '/legacy');
|
||||
}
|
||||
|
||||
public function testAPIRequestCheck()
|
||||
{
|
||||
$queryParams = [
|
||||
];
|
||||
|
||||
$serverParams = [
|
||||
'REDIRECT_BASE' => '/suiteinstance',
|
||||
'BASE' => '/suiteinstance',
|
||||
'HTTP_HOST' => 'localhost',
|
||||
'HTTP_ORIGIN' => 'http://localhost',
|
||||
'HTTP_REFERER' => 'http://localhost/suiteinstance/public/docs/graphql-playground/index.html',
|
||||
'SERVER_NAME' => 'localhost',
|
||||
'REDIRECT_URL' => '/suiteinstance/api/graphql',
|
||||
'REQUEST_METHOD' => 'POST',
|
||||
'REQUEST_URI' => '/suiteinstance/api/graphql',
|
||||
'SCRIPT_FILENAME' => '/var/www/html/suiteinstance/index.php',
|
||||
'SCRIPT_NAME' => '/suiteinstance/index.php',
|
||||
'PHP_SELF' => '/suiteinstance/index.php',
|
||||
];
|
||||
|
||||
$request = new Request($queryParams, [], [], [], [], $serverParams);
|
||||
|
||||
$valid = $this->legacyAssetHandler->isLegacyAssetRequest($request);
|
||||
|
||||
static::assertFalse($valid);
|
||||
}
|
||||
|
||||
public function testLegacyValidAssetPathRequestCheck()
|
||||
{
|
||||
$queryParams = [
|
||||
'v' => 'Y0_lwfeIA-XvM4ey09-htw',
|
||||
];
|
||||
|
||||
$serverParams = [
|
||||
'BASE' => '/suiteinstance',
|
||||
'HTTP_HOST' => 'localhost',
|
||||
'SERVER_NAME' => 'localhost',
|
||||
'REDIRECT_URL' => '/suiteinstance/',
|
||||
'REDIRECT_QUERY_STRING' => 'v=Y0_lwfeIA-XvM4ey09-htw',
|
||||
'REQUEST_METHOD' => 'GET',
|
||||
'QUERY_STRING' => 'v=Y0_lwfeIA-XvM4ey09-htw',
|
||||
'SCRIPT_FILENAME' => '/var/www/html/suiteinstance/index.php',
|
||||
'REQUEST_URI' => '/suiteinstance/themes/default/images/company_logo.png?v=Y0_lwfeIA-XvM4ey09-htw',
|
||||
'SCRIPT_NAME' => '/suiteinstance/index.php',
|
||||
'PHP_SELF' => '/suiteinstance/index.php'
|
||||
];
|
||||
|
||||
$request = new Request($queryParams, [], [], [], [], $serverParams);
|
||||
|
||||
$valid = $this->legacyAssetHandler->isLegacyAssetRequest($request);
|
||||
|
||||
static::assertTrue($valid);
|
||||
}
|
||||
|
||||
public function testValidLegacyAssetPathConvertion()
|
||||
{
|
||||
$resultingRoute = '/suiteinstance/legacy/themes/default/images/company_logo.png?v=Y0_lwfeIA-XvM4ey09-htw';
|
||||
$queryParams = [
|
||||
'v' => 'Y0_lwfeIA-XvM4ey09-htw',
|
||||
];
|
||||
|
||||
$serverParams = [
|
||||
'BASE' => '/suiteinstance',
|
||||
'HTTP_HOST' => 'localhost',
|
||||
'SERVER_NAME' => 'localhost',
|
||||
'REDIRECT_URL' => '/suiteinstance/',
|
||||
'REDIRECT_QUERY_STRING' => 'v=Y0_lwfeIA-XvM4ey09-htw',
|
||||
'REQUEST_METHOD' => 'GET',
|
||||
'QUERY_STRING' => 'v=Y0_lwfeIA-XvM4ey09-htw',
|
||||
'SCRIPT_FILENAME' => '/var/www/html/suiteinstance/index.php',
|
||||
'REQUEST_URI' => '/suiteinstance/themes/default/images/company_logo.png?v=Y0_lwfeIA-XvM4ey09-htw',
|
||||
'SCRIPT_NAME' => '/suiteinstance/index.php',
|
||||
'PHP_SELF' => '/suiteinstance/index.php'
|
||||
];
|
||||
|
||||
$request = new Request($queryParams, [], [], [], [], $serverParams);
|
||||
|
||||
$route = $this->legacyAssetHandler->convert($request);
|
||||
|
||||
static::assertEquals($resultingRoute, $route);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue