<?php
namespace App\Security\Voter;
use App\Util\EsUtil;
use App\Service\EsCache;
use Symfony\Component\Security\Core\Security;
use App\Entity\Interfaces\ContainerMappedInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
class ContainerOwnerVoter extends Voter
{
private $esCache;
private $security;
public function __construct(EsCache $esCache, Security $security)
{
$this->esCache = $esCache;
$this->security = $security;
}
protected function supports($attribute, $subject): bool
{
// IS_CO = Is container owner
return (in_array($attribute, [
'IS_CO',
'IS_CO_ANY',
'IS_CO_ADM',
'IS_CO_OPR',
'IS_CO_SPE',
'IS_CO_MOD',
'IS_CO_USR',
'IS_CO_ADM_SPE',
'IS_CO_OPR_SPE',
'IS_CO_USR_SPE',
'IS_CO_ANY_SPE',
'IS_CO_ANY_SPE_CHATTHREAD',
'IS_CO_SESSCO_SPE_MODERATOR',
'IS_CO_SESSCO_SPE_SPEAKER',
'IS_CO_SESSQA_SPE_MODERATOR',
'IS_CO_SESSQA_SPE_SPEAKER',
'IS_CO_INS_SPE_COURSE',
'IS_CO_ANY_SPE_DOCFILE_AUTHOR'
])
&& $subject instanceof ContainerMappedInterface)
|| in_array($attribute, ['IS_ANY_SPE', 'IS_ANY_SPE_CHATMESSAGE_EDIT']);
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
$user = $token->getUser();
if (!$user instanceof UserInterface) {
return false;
}
if ($this->security->isGranted('ROLE_SUPER_ADMIN')) {
return true;
}
if (EsUtil::isCommunityEntity($subject)) {
return true;
/*
$client = $this->esCache->getClient();
if ($client->getIsCommunitySharingEnable()) {
return true;
}
*/
}
$container = $isCo = null;
if ($subject instanceof ContainerMappedInterface) {
$container = $this->esCache->getContainer();
$isCo = $subject->getContainer()->getId() === $container->getId();
}
switch ($attribute) {
case 'IS_ANY_SPE':
if (method_exists($subject, 'getUser')) {
return ($this->security->isGranted('IS_AUTHENTICATED_FULLY')
&& $subject->getUser() === $user);
}
break;
case 'IS_ANY_SPE_CHATMESSAGE_EDIT':
if (method_exists($subject, 'getUser')) {
$createdAt = $subject->getCreatedAt();
$createdAt->add(new \DateInterval('PT5M'));
$isTimeValid = (new \DateTime()) < $createdAt;
return ($this->security->isGranted('IS_AUTHENTICATED_FULLY')
&& $subject->getUser() === $user && $isTimeValid);
}
break;
case 'IS_CO':
return $isCo;
break;
case 'IS_CO_ANY':
return ($isCo && $this->security->isGranted('IS_AUTHENTICATED_FULLY'));
break;
case 'IS_CO_ADM':
return ($isCo && $this->security->isGranted('ROLE_ADMIN'));
break;
case 'IS_CO_OPR':
return ($isCo && $this->security->isGranted('ROLE_OPERATOR'));
break;
case 'IS_CO_SPE':
return ($isCo && $this->security->isGranted('ROLE_SPEAKER'));
break;
case 'IS_CO_MOD':
return ($isCo && $this->security->isGranted('ROLE_MODERATOR'));
break;
case 'IS_CO_USR':
return ($isCo && $this->security->isGranted('ROLE_USER'));
break;
case 'IS_CO_ADM_SPE':
if (method_exists($subject, 'getUser')) {
return ($isCo
&& $this->security->isGranted('ROLE_ADMIN')
&& $subject->getUser() === $user);
}
break;
case 'IS_CO_OPR_SPE':
if (method_exists($subject, 'getUser')) {
return ($isCo
&& $this->security->isGranted('ROLE_OPERATOR')
&& $subject->getUser() === $user);
}
break;
case 'IS_CO_USR_SPE':
if (method_exists($subject, 'getUser')) {
return ($isCo
&& $this->security->isGranted('ROLE_USER')
&& $subject->getUser() === $user);
}
break;
case 'IS_CO_ANY_SPE':
if (method_exists($subject, 'getUser')) {
return ($isCo
&& $this->security->isGranted('IS_AUTHENTICATED_FULLY')
&& $subject->getUser() === $user);
}
break;
case 'IS_CO_ANY_SPE_CHATTHREAD':
if (method_exists($subject, 'getUsers')) {
$users = $subject->getUsers();
$hasUser = false;
foreach ($users as $selectUser) {
if ($selectUser === $user) {
$hasUser = true;
break;
}
}
return ($isCo
&& $this->security->isGranted('IS_AUTHENTICATED_FULLY')
&& $hasUser);
}
break;
case 'IS_CO_INS_SPE_COURSE':
if (method_exists($subject, 'getInstructor')) {
return ($isCo
&& $this->security->isGranted('ROLE_INSTRUCTOR')
&& $subject->getInstructor() === $user);
}
break;
case 'IS_CO_ANY_SPE_DOCFILE_AUTHOR':
if (method_exists($subject, 'getAutors')) {
$users = $subject->getAuthors();
$hasUser = false;
foreach ($users as $selectUser) {
if ($selectUser === $user) {
$hasUser = true;
break;
}
}
return ($isCo
&& $this->security->isGranted('IS_AUTHENTICATED_FULLY')
&& $hasUser);
}
break;
}
/*
if ($this->security->isGranted('ROLE_SUPER_ADMIN')) {
return true;
} else if ($this->security->isGranted('ROLE_ADMIN')) {
$container = $this->esCache->getContainer();
switch ($attribute) {
case 'IS_CO':
return ($subject->getContainer()->getId() === $container->getId());
break;
}
}
*/
return false;
}
}