Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 7 additions & 12 deletions wcfsetup/install/files/lib/system/request/ControllerMap.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -167,7 +167,6 @@ public function resolveCustomController($application, $controller)
return [
'className' => CmsPage::class,
'controller' => 'cms',
'pageType' => 'page',

// CMS page meta data
'cmsPageID' => $matches['pageID'],
Expand All @@ -179,7 +178,6 @@ public function resolveCustomController($application, $controller)
return [
'className' => $data,
'controller' => $matches[1],
'pageType' => \strtolower($matches[2]),
];
}
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -399,19 +396,18 @@ 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)
{
$environment = $isAcpRequest ? 'acp' : 'frontend';
if (isset($this->ciControllers['lookup'][$application][$environment][$controller])) {
$className = $this->ciControllers['lookup'][$application][$environment][$controller];

if (\preg_match('~\\\\(?P<controller>[^\\\\]+)(?P<pageType>Action|Form|Page)$~', $className, $matches)) {
if (\preg_match('~\\\\(?P<controller>[^\\\\]+)(Action|Form|Page)$~', $className, $matches)) {
return [
'className' => $className,
'controller' => $matches['controller'],
'pageType' => \strtolower($matches['pageType']),
];
}
}
Expand All @@ -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)
{
Expand All @@ -453,7 +449,6 @@ protected function getClassData($application, $controller, $isAcpRequest, $pageT
return [
'className' => $className,
'controller' => $controller,
'pageType' => $pageType,
];
}

Expand Down
38 changes: 1 addition & 37 deletions wcfsetup/install/files/lib/system/request/Request.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
}

/**
Expand Down Expand Up @@ -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.
*
Expand Down
57 changes: 24 additions & 33 deletions wcfsetup/install/files/lib/system/request/RequestHandler.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 <http://opensource.org/licenses/lgpl-license.php>
* @package WoltLabSuite\Core\System\Request
*/
class RequestHandler extends SingletonFactory
final class RequestHandler extends SingletonFactory
{
/**
* active request object
Expand Down Expand Up @@ -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();
Expand All @@ -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')
Expand Down Expand Up @@ -191,6 +187,8 @@ protected function buildRequest($application)
);
if (\is_string($classData)) {
$this->redirect($routeData, $application, $classData);
} else {
$className = $classData['className'];
}
}

Expand All @@ -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();
}
}
Expand All @@ -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) {
Expand All @@ -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);
Expand Down Expand Up @@ -315,6 +304,8 @@ protected function handleDefaultController($application, array &$routeData)
}

$routeData['isDefaultController'] = true;

return $routeData;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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']);
Expand Down