bookmark-pages/Classes/Service/AccessControlService.php
2021-08-17 19:45:38 +02:00

188 lines
6.0 KiB
PHP

<?php
/*
* This file is part of the package thucke/th-rating.
*
* For the full copyright and license information, please read the
* LICENSE file that was distributed with this source code.
*/
/** @noinspection PhpFullyQualifiedNameUsageInspection */
namespace WapplerSystems\BookmarksLikesRatings\Service;
use WapplerSystems\BookmarksLikesRatings\Domain\Model\Voter;
use WapplerSystems\BookmarksLikesRatings\Exception\FeUserNotFoundException;
use TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository;
use TYPO3\CMS\Extbase\Utility\LocalizationUtility;
/**
* An access control service
*
* @version $Id:$
* @license http://opensource.org/licenses/gpl-license.php GNU protected License, version 2
*/
class AccessControlService extends AbstractExtensionService
{
/**
* @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository $frontendUserRepository
*/
protected $frontendUserRepository;
/**
* @param \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository $frontendUserRepository
* @noinspection PhpUnused
*/
public function injectFrontendUserRepository(FrontendUserRepository $frontendUserRepository): void
{
$this->frontendUserRepository = $frontendUserRepository;
}
/**
* @var \WapplerSystems\BookmarksLikesRatings\Domain\Repository\VoterRepository $voterRepository
*/
protected $voterRepository;
/**
* @param \WapplerSystems\BookmarksLikesRatings\Domain\Repository\VoterRepository $voterRepository
*/
public function injectVoterRepository(\WapplerSystems\BookmarksLikesRatings\Domain\Repository\VoterRepository $voterRepository): void
{
$this->voterRepository = $voterRepository;
}
/**
* @var \TYPO3\CMS\Core\Context\Context $context
*/
protected $context;
/**
* @param \TYPO3\CMS\Core\Context\Context $context
*/
public function injectContext(\TYPO3\CMS\Core\Context\Context $context): void
{
$this->context = $context;
}
/**
* Tests, if the given person is logged into the frontend
*
* @param \TYPO3\CMS\Extbase\Domain\Model\FrontendUser|null $person The person
* @return bool The result; true if the given person is logged in; otherwise false
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException
*/
public function isLoggedIn(\TYPO3\CMS\Extbase\Domain\Model\FrontendUser $person = null): bool
{
if (is_object($person)) {
if ($person->getUid() &&
($person->getUid() === $this->getFrontendUserUid())) {
return true; //treat anonymous user also as logged in
}
}
return false;
}
/**
* @return bool
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException
*/
public function backendAdminIsLoggedIn(): bool
{
return $this->context->getPropertyFromAspect('backend.user', 'isLoggedIn');
}
/**
* @return bool
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException
*/
public function hasLoggedInFrontendUser(): bool
{
return $this->context->getPropertyFromAspect('frontend.user', 'isLoggedIn');
}
/**
* @return array
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException
*/
public function getFrontendUserGroups(): array
{
if ($this->hasLoggedInFrontendUser()) {
return $this->context->getPropertyFromAspect('frontend.user', 'groupIds');
}
return [];
}
/**
* @return int|null
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException
*/
public function getFrontendUserUid(): ?int
{
if ($this->hasLoggedInFrontendUser()) {
return $this->context->getPropertyFromAspect('frontend.user', 'id');
}
return null;
}
/**
* Loads objects from repositories
*
* @param mixed $voter
* @return \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException
*/
public function getFrontendUser($voter = null): ?\TYPO3\CMS\Extbase\Domain\Model\FrontendUser
{
//set userobject
if (!$voter instanceof \TYPO3\CMS\Extbase\Domain\Model\FrontendUser) {
//TODO Errorhandling if no user is logged in
if ((int)$voter === 0) {
//get logged in fe-user
$voter = $this->frontendUserRepository->findByUid($this->getFrontendUserUid());
} else {
$voter = $this->frontendUserRepository->findByUid((int)$voter);
}
}
return $voter;
}
/**
* Loads objects from repositories
*
* @param int|null $voter
* @return \WapplerSystems\BookmarksLikesRatings\Domain\Model\Voter
* @throws FeUserNotFoundException
* @throws \TYPO3\CMS\Core\Context\Exception\AspectNotFoundException
*/
public function getFrontendVoter(?int $voter = 0): Voter
{
$exceptionMessageArray = [];
/** @var Voter $voterObject */
$voterObject = null;
//TODO Errorhandling if no user is logged in
if ((int)$voter === 0) {
//get logged in fe-user
$voterObject = $this->voterRepository->findByUid($this->getFrontendUserUid());
$exceptionMessageArray = [$this->getFrontendUserUid()];
$exceptionMessageType = 'feUser';
} else {
$voterObject = $this->voterRepository->findByUid((int)$voter);
$exceptionMessageArray = [(int)$voter];
$exceptionMessageType = 'anonymousUser';
}
if (empty($voterObject)) {
throw new FeUserNotFoundException(
LocalizationUtility::translate(
'flash.pluginConfiguration.missing.' . $exceptionMessageType,
'ThRating',
$exceptionMessageArray
),
1602095329
);
}
return $voterObject;
}
}