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:
Clemente Raposo 2020-03-23 16:57:10 +00:00 committed by Dillon-Brown
parent 32f6ddd81b
commit baae4e2129
6 changed files with 225 additions and 3 deletions

View file

@ -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

View file

@ -0,0 +1,5 @@
parameters:
legacy.asset_paths:
- cache
- include
- themes

View file

@ -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;

View file

@ -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());
}
}

View 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;
}
}

View 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);
}
}