diff --git a/Classes/Service/PageService.php b/Classes/Service/PageService.php index 311c3e0e9..bc7ac7cf2 100644 --- a/Classes/Service/PageService.php +++ b/Classes/Service/PageService.php @@ -9,6 +9,7 @@ * LICENSE.md file that was distributed with this source code. */ +use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Core\Context\Context; use TYPO3\CMS\Core\Context\LanguageAspect; use TYPO3\CMS\Core\Domain\Repository\PageRepository; @@ -17,6 +18,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\RootlineUtility; use TYPO3\CMS\Core\Utility\VersionNumberUtility; +use TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication; /** * Page Service @@ -216,8 +218,17 @@ public function isAccessGranted(array $page): bool $hide = (in_array(-1, $groups)); $show = (in_array(-2, $groups)); - $userIsLoggedIn = (is_array($GLOBALS['TSFE']->fe_user->user)); - $userGroups = $GLOBALS['TSFE']->fe_user->groupData['uid']; + if (version_compare(VersionNumberUtility::getCurrentTypo3Version(), '13.0', '<')) { + $userIsLoggedIn = (is_array($GLOBALS['TSFE']->fe_user->user)); + $userGroups = $GLOBALS['TSFE']->fe_user->groupData['uid']; + } else { + /** @var ServerRequestInterface $serverRequest */ + $serverRequest = $GLOBALS['TYPO3_REQUEST']; + /** @var FrontendUserAuthentication $frontendUserAuthentication */ + $frontendUserAuthentication = $serverRequest->getAttribute('frontend.user'); + $userIsLoggedIn = ($frontendUserAuthentication->getUserId() ?? 0) > 0; + $userGroups = $frontendUserAuthentication->groupData['uid']; + } $userIsInGrantedGroups = (0 < count(array_intersect($userGroups, $groups))); return (!$userIsLoggedIn && $hide) || ($userIsLoggedIn && $show) || ($userIsLoggedIn && $userIsInGrantedGroups); diff --git a/Tests/Unit/Service/PageServiceTest.php b/Tests/Unit/Service/PageServiceTest.php index 18ffcad57..912b70e94 100644 --- a/Tests/Unit/Service/PageServiceTest.php +++ b/Tests/Unit/Service/PageServiceTest.php @@ -4,6 +4,8 @@ use FluidTYPO3\Vhs\Service\PageService; use FluidTYPO3\Vhs\Tests\Unit\AbstractTestCase; use PHPUnit\Framework\MockObject\MockObject; +use Psr\Http\Message\ServerRequestInterface; +use TYPO3\CMS\Core\Core\SystemEnvironmentBuilder; use TYPO3\CMS\Core\Domain\Repository\PageRepository; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\RootlineUtility; @@ -88,19 +90,36 @@ public function testIsAccessGranted(bool $expected, array $page, FrontendUserAut { $subject = new PageService(); $GLOBALS['TSFE'] = (object) ['fe_user' => $user]; + $GLOBALS['TYPO3_REQUEST'] = $this->getMockBuilder(ServerRequestInterface::class) + ->onlyMethods(['getAttribute']) + ->getMockForAbstractClass(); + $GLOBALS['TYPO3_REQUEST']->method('getAttribute')->willReturn($user); self::assertSame($expected, $subject->isAccessGranted($page)); } public function getIsAccessGrantedTestValues(): array { - $noUser = $this->getMockBuilder(FrontendUserAuthentication::class)->disableOriginalConstructor()->getMock(); - $pseudoUser = $this->getMockBuilder(FrontendUserAuthentication::class)->disableOriginalConstructor()->getMock(); - $groupUser = $this->getMockBuilder(FrontendUserAuthentication::class)->disableOriginalConstructor()->getMock(); + $noUser = $this->getMockBuilder(FrontendUserAuthentication::class) + ->disableOriginalConstructor() + ->getMock(); + $noUser->method('getUserId')->willReturn(null); + + $pseudoUser = $this->getMockBuilder(FrontendUserAuthentication::class) + ->disableOriginalConstructor() + ->getMock(); + $pseudoUser->method('getUserId')->willReturn(null); + + $groupUser = $this->getMockBuilder(FrontendUserAuthentication::class) + ->disableOriginalConstructor() + ->getMock(); + $groupUser->method('getUserId')->willReturn(1); $groupUser->groupData = ['uid' => [3, 4]]; $groupUser->user = []; + $anyGroupUser = $this->getMockBuilder(FrontendUserAuthentication::class) ->disableOriginalConstructor() ->getMock(); + $anyGroupUser->method('getUserId')->willReturn(null); $anyGroupUser->groupData = ['uid' => [3, 4]]; return [