src/Security/Voter/ClientOwnerVoter.php line 13

Open in your IDE?
  1. <?php
  2. namespace App\Security\Voter;
  3. use App\Util\EsUtil;
  4. use App\Service\EsCache;
  5. use Symfony\Component\Security\Core\Security;
  6. use App\Entity\Interfaces\ClientMappedInterface;
  7. use Symfony\Component\Security\Core\User\UserInterface;
  8. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  9. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  10. class ClientOwnerVoter extends Voter
  11. {
  12.     private $esCache;
  13.     private $security;
  14.     public function __construct(EsCache $esCacheSecurity $security)
  15.     {
  16.         $this->esCache $esCache;
  17.         $this->security $security;
  18.     }
  19.     protected function supports($attribute$subject): bool
  20.     {
  21.         return in_array($attribute, [
  22.                 'IS_CLIENT_OWNER',
  23.                 'IS_CLIENT_OPR',
  24.                 'IS_CLIENT_OWNER_ANY_SPE',
  25.                 'IS_CLIENT_OWNER_ANY_SPE_OR_MEETING_OWNER',
  26.                 'IS_CLIENT_OWNER_COMPANY_SPE',
  27.                 'IS_CLIENT_OWNER_COMPANY_SPE_PRODUCT',
  28.                 'IS_CLIENT_OWNER_COMPANY_SPE_PRODUCT_TAG'
  29.             ]) && $subject instanceof ClientMappedInterface;
  30.     }
  31.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  32.     {
  33.         $user $token->getUser();
  34.         if (!$user instanceof UserInterface) {
  35.             return false;
  36.         }
  37.         if ($this->security->isGranted('ROLE_SUPER_ADMIN')) {
  38.             return true;
  39.         } elseif ($this->security->isGranted('ROLE_ADMIN') || $this->security->isGranted('ROLE_OPERATOR') || $this->security->isGranted('ROLE_SUPPORT')) {
  40.             if (EsUtil::allowCrossClientOwnerObjects($subject)) {
  41.                 return true;
  42.             }
  43.         }
  44.         $client $this->esCache->getClient();
  45.         $isCo $subject->getClient()->getId() === $client->getId();
  46.         switch ($attribute) {
  47.             case 'IS_CLIENT_OWNER':
  48.                 return $isCo;
  49.                 break;
  50.             case 'IS_CLIENT_OPR':
  51.                 return ($isCo && $this->security->isGranted('ROLE_OPERATOR'));
  52.                 break;
  53.             case 'IS_CLIENT_OWNER_ANY_SPE':
  54.                 if (method_exists($subject'getUser')) {
  55.                     return ($isCo
  56.                         && $this->security->isGranted('IS_AUTHENTICATED_FULLY')
  57.                         && $subject->getUser() === $user);
  58.                 }
  59.                 break;
  60.             case 'IS_CLIENT_OWNER_COMPANY_SPE':
  61.                 if (method_exists($subject'getOwners')) {
  62.                     $users $subject->getOwners();
  63.                     $hasUser false;
  64.                     foreach ($users as $selectUser) {
  65.                         if ($selectUser === $user) {
  66.                             $hasUser true;
  67.                             break;
  68.                         }
  69.                     }
  70.                     return ($isCo && $hasUser);
  71.                 }
  72.                 break;
  73.             case 'IS_CLIENT_OWNER_COMPANY_SPE_PRODUCT':
  74.                 $company $subject->getCompany();
  75.                 $hasUser false;
  76.                 if ($company && method_exists($company'getOwners')) {
  77.                     $users $company->getOwners();
  78.                     foreach ($users as $selectUser) {
  79.                         if ($selectUser === $user) {
  80.                             $hasUser true;
  81.                             break;
  82.                         }
  83.                     }
  84.                 }
  85.                 return ($isCo && $hasUser);
  86.                 break;
  87.             case 'IS_CLIENT_OWNER_COMPANY_SPE_PRODUCT_TAG':
  88.                 $companyProduct $subject->getCompanyProduct();
  89.                 $hasUser false;
  90.                 if ($companyProduct) {
  91.                     $company $companyProduct->getCompany();
  92.                     if ($company && method_exists($company'getOwners')) {
  93.                         $users $company->getOwners();
  94.                         foreach ($users as $selectUser) {
  95.                             if ($selectUser === $user) {
  96.                                 $hasUser true;
  97.                                 break;
  98.                             }
  99.                         }
  100.                     }
  101.                 }
  102.                 return ($isCo && $hasUser);
  103.                 break;
  104.             case 'IS_CLIENT_OWNER_ANY_SPE_OR_MEETING_OWNER':
  105.                 if (method_exists($subject'getUser')) {
  106.                     return ($isCo
  107.                         && $this->security->isGranted('IS_AUTHENTICATED_FULLY')
  108.                         && ($subject->getUser() === $user || $subject->getMeeting()->getUser() === $user));
  109.                 }
  110.                 break;
  111.         }
  112.         return false;
  113.     }
  114. }