Skip to content

Commit

Permalink
[BUGFIX] Check if site language is enabled before redirecting
Browse files Browse the repository at this point in the history
Only if a site language is enabled, it should be taken into account for
redirecting.
To keep the interface valid, the 1st site language is returned if no
other site language is found.

Resolves: #93920
Releases: master, 10.4
Change-Id: I304c845012d3d76cd230e775030ac08a8d003e6b
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/68775
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: core-ci <typo3@b13.com>
Tested-by: Oliver Hader <oliver.hader@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
Reviewed-by: Benni Mack <benni@typo3.org>
  • Loading branch information
bmack committed Apr 19, 2021
1 parent 89af98c commit 58eceaf
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 1 deletion.
Expand Up @@ -58,7 +58,13 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
if ($site instanceof Site && !($language instanceof SiteLanguage)) {
if ($routeResult instanceof SiteRouteResult && $routeResult->getTail() === '') {
$language = $site->getDefaultLanguage();
return new RedirectResponse($language->getBase(), 307);
if ($language->isEnabled()) {
return new RedirectResponse($language->getBase(), 307);
}
// Default language is disabled, check for the first (enabled) language in list to redirect to that
foreach ($site->getLanguages() as $language) {
return new RedirectResponse($language->getBase(), 307);
}
}
return GeneralUtility::makeInstance(ErrorController::class)->pageNotFoundAction(
$request,
Expand Down
Expand Up @@ -301,4 +301,80 @@ public function doNotRedirectOnBaseWithoutQuery(
$response = $subject->process($request, $this->siteFoundRequestHandler);
self::assertEquals(200, $response->getStatusCode());
}

/**
* @test
*/
public function useDefaultLanguageIfNoLanguageIsGiven(): void
{
$incomingUrl = 'https://twenty.one/';
$site = new Site('random-site', 13, [
'base' => 'https://twenty.one/',
'languages' => [
0 => [
'languageId' => 0,
'locale' => 'en_US.UTF-8',
'base' => '/en/'
],
1 => [
'languageId' => 1,
'locale' => 'fr_FR.UTF-8',
'base' => '/fr'
],
2 => [
'languageId' => 2,
'locale' => 'fr_CA.UTF-8',
'base' => '/fr_ca'
]
]
]);

$routeResult = new SiteRouteResult(new Uri($incomingUrl), $site);
$request = new ServerRequest($incomingUrl, 'GET');
$request = $request->withAttribute('site', $site);
$request = $request->withAttribute('routing', $routeResult);

$subject = new SiteBaseRedirectResolver();
$response = $subject->process($request, $this->siteFoundRequestHandler);
self::assertEquals('https://twenty.one/en/', $response->getHeader('Location')[0]);
}

/**
* @test
*/
public function useFirstAvailableLanguageIfDefaultLanguageIsNotEnabledAndLanguageIsGiven(): void
{
$incomingUrl = 'https://twenty.one/';
$site = new Site('random-site', 13, [
'base' => 'https://twenty.one/',
'languages' => [
0 => [
'languageId' => 0,
'enabled' => false,
'locale' => 'en_US.UTF-8',
'base' => '/en/'
],
1 => [
'languageId' => 1,
'enabled' => false,
'locale' => 'fr_FR.UTF-8',
'base' => '/fr'
],
2 => [
'languageId' => 2,
'locale' => 'fr_CA.UTF-8',
'base' => '/fr_ca'
]
]
]);

$routeResult = new SiteRouteResult(new Uri($incomingUrl), $site);
$request = new ServerRequest($incomingUrl, 'GET');
$request = $request->withAttribute('site', $site);
$request = $request->withAttribute('routing', $routeResult);

$subject = new SiteBaseRedirectResolver();
$response = $subject->process($request, $this->siteFoundRequestHandler);
self::assertEquals('https://twenty.one/fr_ca', $response->getHeader('Location')[0]);
}
}

0 comments on commit 58eceaf

Please sign in to comment.