<?php
namespace App\Security\Voter;
use App\Util\EsUtil;
use App\Service\EsCache;
use Symfony\Component\Security\Core\Security;
use App\Entity\Interfaces\ClientMappedInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
class ClientOwnerVoter 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
{
return in_array($attribute, [
'IS_CLIENT_OWNER',
'IS_CLIENT_OPR',
'IS_CLIENT_OWNER_ANY_SPE',
'IS_CLIENT_OWNER_ANY_SPE_OR_MEETING_OWNER',
'IS_CLIENT_OWNER_COMPANY_SPE',
'IS_CLIENT_OWNER_COMPANY_SPE_PRODUCT',
'IS_CLIENT_OWNER_COMPANY_SPE_PRODUCT_TAG'
]) && $subject instanceof ClientMappedInterface;
}
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;
} elseif ($this->security->isGranted('ROLE_ADMIN') || $this->security->isGranted('ROLE_OPERATOR') || $this->security->isGranted('ROLE_SUPPORT')) {
if (EsUtil::allowCrossClientOwnerObjects($subject)) {
return true;
}
}
$client = $this->esCache->getClient();
$isCo = $subject->getClient()->getId() === $client->getId();
switch ($attribute) {
case 'IS_CLIENT_OWNER':
return $isCo;
break;
case 'IS_CLIENT_OPR':
return ($isCo && $this->security->isGranted('ROLE_OPERATOR'));
break;
case 'IS_CLIENT_OWNER_ANY_SPE':
if (method_exists($subject, 'getUser')) {
return ($isCo
&& $this->security->isGranted('IS_AUTHENTICATED_FULLY')
&& $subject->getUser() === $user);
}
break;
case 'IS_CLIENT_OWNER_COMPANY_SPE':
if (method_exists($subject, 'getOwners')) {
$users = $subject->getOwners();
$hasUser = false;
foreach ($users as $selectUser) {
if ($selectUser === $user) {
$hasUser = true;
break;
}
}
return ($isCo && $hasUser);
}
break;
case 'IS_CLIENT_OWNER_COMPANY_SPE_PRODUCT':
$company = $subject->getCompany();
$hasUser = false;
if ($company && method_exists($company, 'getOwners')) {
$users = $company->getOwners();
foreach ($users as $selectUser) {
if ($selectUser === $user) {
$hasUser = true;
break;
}
}
}
return ($isCo && $hasUser);
break;
case 'IS_CLIENT_OWNER_COMPANY_SPE_PRODUCT_TAG':
$companyProduct = $subject->getCompanyProduct();
$hasUser = false;
if ($companyProduct) {
$company = $companyProduct->getCompany();
if ($company && method_exists($company, 'getOwners')) {
$users = $company->getOwners();
foreach ($users as $selectUser) {
if ($selectUser === $user) {
$hasUser = true;
break;
}
}
}
}
return ($isCo && $hasUser);
break;
case 'IS_CLIENT_OWNER_ANY_SPE_OR_MEETING_OWNER':
if (method_exists($subject, 'getUser')) {
return ($isCo
&& $this->security->isGranted('IS_AUTHENTICATED_FULLY')
&& ($subject->getUser() === $user || $subject->getMeeting()->getUser() === $user));
}
break;
}
return false;
}
}