diff --git a/wcfsetup/install/files/lib/system/request/ControllerMap.class.php b/wcfsetup/install/files/lib/system/request/ControllerMap.class.php index ac0b7aa7710..29914b761fd 100644 --- a/wcfsetup/install/files/lib/system/request/ControllerMap.class.php +++ b/wcfsetup/install/files/lib/system/request/ControllerMap.class.php @@ -68,7 +68,7 @@ protected function init() * @param string $controller url controller * @param bool $isAcpRequest true if this is an ACP request * @param bool $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 + * @return mixed array containing className and controller or a string containing the controller name for aliased controllers * @throws SystemException */ public function resolve($application, $controller, $isAcpRequest, $skipCustomUrls = false) @@ -167,7 +167,6 @@ public function resolveCustomController($application, $controller) return [ 'className' => CmsPage::class, 'controller' => 'cms', - 'pageType' => 'page', // CMS page meta data 'cmsPageID' => $matches['pageID'], @@ -179,7 +178,6 @@ public function resolveCustomController($application, $controller) return [ 'className' => $data, 'controller' => $matches[1], - 'pageType' => \strtolower($matches[2]), ]; } } @@ -356,17 +354,16 @@ public function isDefaultController($application, $controller) /** * Returns true if currently active request represents the landing page. * - * @param string[] $classData * @param array $metaData * @return bool */ - public function isLandingPage(array $classData, array $metaData) + public function isLandingPage(string $className, array $metaData) { - if ($classData['className'] !== $this->landingPages['wcf'][2]) { + if ($className !== $this->landingPages['wcf'][2]) { return false; } - if ($classData['className'] === CmsPage::class) { + if ($className === CmsPage::class) { // check if page id matches if ($this->landingPages['wcf'][1] !== '__WCF_CMS__' . $metaData['cms']['pageID']) { return false; @@ -399,7 +396,7 @@ public function getApplicationOverride($application, $controller) * @param string $application application identifier * @param string $controller controller name * @param bool $isAcpRequest true if this is an ACP request - * @return string[]|null className, controller and pageType, or null if this is not a legacy controller name + * @return string[]|null className and controller, or null if this is not a legacy controller name */ protected function getLegacyClassData($application, $controller, $isAcpRequest) { @@ -407,11 +404,10 @@ protected function getLegacyClassData($application, $controller, $isAcpRequest) if (isset($this->ciControllers['lookup'][$application][$environment][$controller])) { $className = $this->ciControllers['lookup'][$application][$environment][$controller]; - if (\preg_match('~\\\\(?P[^\\\\]+)(?PAction|Form|Page)$~', $className, $matches)) { + if (\preg_match('~\\\\(?P[^\\\\]+)(Action|Form|Page)$~', $className, $matches)) { return [ 'className' => $className, 'controller' => $matches['controller'], - 'pageType' => \strtolower($matches['pageType']), ]; } } @@ -427,7 +423,7 @@ protected function getLegacyClassData($application, $controller, $isAcpRequest) * @param string $controller controller name * @param bool $isAcpRequest true if this is an ACP request * @param string $pageType page type, e.g. 'form' or 'action' - * @return string[]|null className, controller and pageType + * @return string[]|null className and controller */ protected function getClassData($application, $controller, $isAcpRequest, $pageType) { @@ -453,7 +449,6 @@ protected function getClassData($application, $controller, $isAcpRequest, $pageT return [ 'className' => $className, 'controller' => $controller, - 'pageType' => $pageType, ]; } diff --git a/wcfsetup/install/files/lib/system/request/Request.class.php b/wcfsetup/install/files/lib/system/request/Request.class.php index d20c144faea..d12a6607e60 100644 --- a/wcfsetup/install/files/lib/system/request/Request.class.php +++ b/wcfsetup/install/files/lib/system/request/Request.class.php @@ -41,18 +41,6 @@ final class Request implements RequestHandlerInterface */ protected $pageID; - /** - * page name - * @var string - */ - protected $pageName = ''; - - /** - * page type - * @var string - */ - protected $pageType = ''; - /** * request object * @var object @@ -63,16 +51,12 @@ final class Request implements RequestHandlerInterface * Creates a new request object. * * @param string $className fully qualified name - * @param string $pageName class name - * @param string $pageType can be 'action', 'form' or 'page' * @param string[] $metaData additional meta data */ - public function __construct($className, $pageName, $pageType, array $metaData) + public function __construct($className, array $metaData) { $this->className = $className; $this->metaData = $metaData; - $this->pageName = $pageName; - $this->pageType = $pageType; } /** @@ -144,26 +128,6 @@ public function getMetaData() return $this->metaData; } - /** - * Returns the page name of this request. - * - * @return string - */ - public function getPageName() - { - return $this->pageName; - } - - /** - * Returns the page type of this request. - * - * @return string - */ - public function getPageType() - { - return $this->pageType; - } - /** * Returns the current request object. * diff --git a/wcfsetup/install/files/lib/system/request/RequestHandler.class.php b/wcfsetup/install/files/lib/system/request/RequestHandler.class.php index 9b4c719ff3e..61b0146377e 100644 --- a/wcfsetup/install/files/lib/system/request/RequestHandler.class.php +++ b/wcfsetup/install/files/lib/system/request/RequestHandler.class.php @@ -26,11 +26,11 @@ * Handles http requests. * * @author Marcel Werk - * @copyright 2001-2020 WoltLab GmbH + * @copyright 2001-2022 WoltLab GmbH * @license GNU Lesser General Public License * @package WoltLabSuite\Core\System\Request */ -class RequestHandler extends SingletonFactory +final class RequestHandler extends SingletonFactory { /** * active request object @@ -122,9 +122,15 @@ protected function buildRequest($application) try { $routeData = RouteHandler::getInstance()->getRouteData(); - // handle landing page for frontend requests - if (!$this->isACPRequest()) { - $this->handleDefaultController($application, $routeData); + \assert(RouteHandler::getInstance()->isDefaultController() || $routeData['controller']); + + if ($this->isACPRequest()) { + if (empty($routeData['controller'])) { + $routeData['controller'] = 'index'; + } + } else { + // handle landing page for frontend requests + $routeData = $this->handleDefaultController($application, $routeData); // check if accessing from the wrong domain (e.g. "www." omitted but domain was configured with) $domainName = ApplicationHandler::getInstance()->getDomainName(); @@ -143,23 +149,13 @@ protected function buildRequest($application) exit; } - } elseif (empty($routeData['controller'])) { - $routeData['controller'] = 'index'; } - $controller = $routeData['controller']; - if (isset($routeData['className'])) { - $classData = [ - 'className' => $routeData['className'], - 'controller' => $routeData['controller'], - 'pageType' => $routeData['pageType'], - ]; - - unset($routeData['className']); - unset($routeData['controller']); - unset($routeData['pageType']); + $className = $routeData['className']; } else { + $controller = $routeData['controller']; + if ( $this->isACPRequest() && ($controller === 'login' || $controller === 'index') @@ -191,6 +187,8 @@ protected function buildRequest($application) ); if (\is_string($classData)) { $this->redirect($routeData, $application, $classData); + } else { + $className = $classData['className']; } } @@ -208,21 +206,16 @@ protected function buildRequest($application) ) { WCF::setLanguage($routeData['cmsPageLanguageID']); } - - unset($routeData['cmsPageID']); - unset($routeData['cmsPageLanguageID']); } $this->activeRequest = new Request( - $classData['className'], - $classData['controller'], - $classData['pageType'], + $className, $metaData ); if (!$this->isACPRequest()) { // determine if current request matches the landing page - if (ControllerMap::getInstance()->isLandingPage($classData, $metaData)) { + if (ControllerMap::getInstance()->isLandingPage($className, $metaData)) { $this->activeRequest->setIsLandingPage(); } } @@ -244,15 +237,11 @@ protected function buildRequest($application) * Redirects to the actual URL, e.g. controller has been aliased or mistyped (boardlist instead of board-list). * * @param string[] $routeData - * @param string $application - * @param string $controller */ - protected function redirect(array $routeData, $application, $controller = null) + protected function redirect(array $routeData, string $application, string $controller) { $routeData['application'] = $application; - if ($controller !== null) { - $routeData['controller'] = $controller; - } + $routeData['controller'] = $controller; // append the remaining query parameters foreach ($_GET as $key => $value) { @@ -274,10 +263,10 @@ protected function redirect(array $routeData, $application, $controller = null) * @param string[] $routeData * @throws IllegalLinkException */ - protected function handleDefaultController($application, array &$routeData) + protected function handleDefaultController(string $application, array $routeData): array { if (!RouteHandler::getInstance()->isDefaultController()) { - return; + return $routeData; } $data = ControllerMap::getInstance()->lookupDefaultController($application); @@ -315,6 +304,8 @@ protected function handleDefaultController($application, array &$routeData) } $routeData['isDefaultController'] = true; + + return $routeData; } /** diff --git a/wcfsetup/install/files/lib/system/request/RouteHandler.class.php b/wcfsetup/install/files/lib/system/request/RouteHandler.class.php index bcd213338b9..c84c417226d 100644 --- a/wcfsetup/install/files/lib/system/request/RouteHandler.class.php +++ b/wcfsetup/install/files/lib/system/request/RouteHandler.class.php @@ -144,6 +144,15 @@ public function matches() $this->isDefaultController = $this->routeData['isDefaultController']; unset($this->routeData['isDefaultController']); + if (!isset($this->routeData['controller']) || $this->routeData['controller'] === '') { + if (!$this->isDefaultController()) { + throw new \DomainException(\sprintf( + "Route implementation '%s' is buggy: Matched route is not the default controller, but no controller was returned.", + $route::class + )); + } + } + if (isset($this->routeData['isRenamedController'])) { $this->isRenamedController = $this->routeData['isRenamedController']; unset($this->routeData['isRenamedController']);