From df05ba1455d64cc2411297398ffbff189ceaba6f Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Thu, 28 Sep 2017 15:39:32 +0200 Subject: [PATCH] Improved support for renamed static routes --- .../system/request/ControllerMap.class.php | 26 ++++++++++------ .../system/request/RequestHandler.class.php | 6 +++- .../lib/system/request/RouteHandler.class.php | 31 ++++++++++++++++--- .../route/LookupRequestRoute.class.php | 2 +- .../route/StaticRequestRoute.class.php | 3 +- 5 files changed, 50 insertions(+), 18 deletions(-) diff --git a/wcfsetup/install/files/lib/system/request/ControllerMap.class.php b/wcfsetup/install/files/lib/system/request/ControllerMap.class.php index 9feeca6309..60da31ff56 100644 --- a/wcfsetup/install/files/lib/system/request/ControllerMap.class.php +++ b/wcfsetup/install/files/lib/system/request/ControllerMap.class.php @@ -57,10 +57,11 @@ class ControllerMap extends SingletonFactory { * @param string $application application identifier * @param string $controller url controller * @param boolean $isAcpRequest true if this is an ACP request + * @param boolean $skipCustomUrls true if custom url resolution should be suppressed, is always true for ACP requests * @return mixed array containing className, controller and pageType or a string containing the controller name for aliased controllers * @throws SystemException */ - public function resolve($application, $controller, $isAcpRequest) { + public function resolve($application, $controller, $isAcpRequest, $skipCustomUrls = false) { // validate controller if (!preg_match('~^[a-z][a-z0-9]+(?:\-[a-z][a-z0-9]+)*$~', $controller)) { throw new SystemException("Malformed controller name '" . $controller . "'"); @@ -88,16 +89,21 @@ class ControllerMap extends SingletonFactory { if ($classData === null) { throw new SystemException("Unknown controller '" . $controller . "'"); } - else if (!$isAcpRequest) { - // handle controllers with a custom url - $controller = $classData['controller']; + else { + // the ACP does not support custom urls at all + if ($isAcpRequest) $skipCustomUrls = true; - if (isset($this->customUrls['reverse'][$application]) && isset($this->customUrls['reverse'][$application][$controller])) { - return $this->customUrls['reverse'][$application][$controller]; - } - else if ($application !== 'wcf') { - if (isset($this->customUrls['reverse']['wcf']) && isset($this->customUrls['reverse']['wcf'][$controller])) { - return $this->customUrls['reverse']['wcf'][$controller]; + if (!$skipCustomUrls) { + // handle controllers with a custom url + $controller = $classData['controller']; + + if (isset($this->customUrls['reverse'][$application]) && isset($this->customUrls['reverse'][$application][$controller])) { + return $this->customUrls['reverse'][$application][$controller]; + } + else if ($application !== 'wcf') { + if (isset($this->customUrls['reverse']['wcf']) && isset($this->customUrls['reverse']['wcf'][$controller])) { + return $this->customUrls['reverse']['wcf'][$controller]; + } } } } diff --git a/wcfsetup/install/files/lib/system/request/RequestHandler.class.php b/wcfsetup/install/files/lib/system/request/RequestHandler.class.php index 8525b4efdc..1f11e1fd10 100644 --- a/wcfsetup/install/files/lib/system/request/RequestHandler.class.php +++ b/wcfsetup/install/files/lib/system/request/RequestHandler.class.php @@ -159,7 +159,7 @@ class RequestHandler extends SingletonFactory { exit; } - $classData = ControllerMap::getInstance()->resolve($application, $controller, $this->isACPRequest()); + $classData = ControllerMap::getInstance()->resolve($application, $controller, $this->isACPRequest(), RouteHandler::getInstance()->isRenamedController()); if (is_string($classData)) { $this->redirect($routeData, $application, $classData); } @@ -191,6 +191,10 @@ class RequestHandler extends SingletonFactory { } } catch (SystemException $e) { + if (defined('ENABLE_DEBUG_MODE') && ENABLE_DEBUG_MODE && defined('ENABLE_DEVELOPER_TOOLS') && ENABLE_DEVELOPER_TOOLS) { + throw $e; + } + throw new IllegalLinkException(); } } diff --git a/wcfsetup/install/files/lib/system/request/RouteHandler.class.php b/wcfsetup/install/files/lib/system/request/RouteHandler.class.php index 31870c2016..36aaab1da5 100644 --- a/wcfsetup/install/files/lib/system/request/RouteHandler.class.php +++ b/wcfsetup/install/files/lib/system/request/RouteHandler.class.php @@ -38,7 +38,7 @@ class RouteHandler extends SingletonFactory { * current path info component * @var string */ - protected static $pathInfo = null; + protected static $pathInfo; /** * HTTP protocol, either 'http://' or 'https://' @@ -50,20 +50,26 @@ class RouteHandler extends SingletonFactory { * HTTP encryption * @var boolean */ - protected static $secure = null; + protected static $secure; /** * list of application abbreviation and default controller name * @var string[] */ - protected $defaultControllers = null; + protected $defaultControllers; /** - * true, if default controller is used (support for custom landing page) + * true if the default controller is used (support for custom landing page) * @var boolean */ protected $isDefaultController = false; + /** + * true if the controller was renamed and has already been transformed + * @var boolean + */ + protected $isRenamedController = false; + /** * list of available routes * @var IRequestRoute[] @@ -74,7 +80,7 @@ class RouteHandler extends SingletonFactory { * parsed route data * @var array */ - protected $routeData = null; + protected $routeData; /** * Sets default routes. @@ -131,6 +137,11 @@ class RouteHandler extends SingletonFactory { $this->isDefaultController = $this->routeData['isDefaultController']; unset($this->routeData['isDefaultController']); + if (isset($this->routeData['isRenamedController'])) { + $this->isRenamedController = $this->routeData['isRenamedController']; + unset($this->routeData['isRenamedController']); + } + $this->registerRouteData(); return true; } @@ -148,6 +159,16 @@ class RouteHandler extends SingletonFactory { return $this->isDefaultController; } + + /** + * Returns true if the controller was renamed and has already been transformed. + * + * @return boolean + */ + public function isRenamedController() { + return $this->isRenamedController; + } + /** * Returns parsed route data * diff --git a/wcfsetup/install/files/lib/system/request/route/LookupRequestRoute.class.php b/wcfsetup/install/files/lib/system/request/route/LookupRequestRoute.class.php index 7592d6380c..f4dc02e643 100644 --- a/wcfsetup/install/files/lib/system/request/route/LookupRequestRoute.class.php +++ b/wcfsetup/install/files/lib/system/request/route/LookupRequestRoute.class.php @@ -40,7 +40,7 @@ class LookupRequestRoute implements IRequestRoute { - (?P[^/]+) )? - / + /? )? $~x'; diff --git a/wcfsetup/install/files/lib/system/request/route/StaticRequestRoute.class.php b/wcfsetup/install/files/lib/system/request/route/StaticRequestRoute.class.php index 5548380516..fddacb2397 100644 --- a/wcfsetup/install/files/lib/system/request/route/StaticRequestRoute.class.php +++ b/wcfsetup/install/files/lib/system/request/route/StaticRequestRoute.class.php @@ -100,8 +100,9 @@ class StaticRequestRoute extends DynamicRequestRoute { } $this->routeData['application'] = $this->staticApplication; - $this->routeData['controller'] = $controller; + $this->routeData['controller'] = ControllerMap::transformController($this->staticController); $this->routeData['isDefaultController'] = false; + $this->routeData['isRenamedController'] = (strcasecmp($controller, $this->staticController) !== 0); return true; } -- 2.20.1