src/Security/Voter/ContainerOwnerVoter.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\ContainerMappedInterface;
  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 ContainerOwnerVoter 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.         // IS_CO = Is container owner
  22.         return (in_array($attribute, [
  23.                 'IS_CO',
  24.                 'IS_CO_ANY',
  25.                 'IS_CO_ADM',
  26.                 'IS_CO_OPR',
  27.                 'IS_CO_SPE',
  28.                 'IS_CO_MOD',
  29.                 'IS_CO_USR',
  30.                 'IS_CO_ADM_SPE',
  31.                 'IS_CO_OPR_SPE',
  32.                 'IS_CO_USR_SPE',
  33.                 'IS_CO_ANY_SPE',
  34.                 'IS_CO_ANY_SPE_CHATTHREAD',
  35.                 'IS_CO_SESSCO_SPE_MODERATOR',
  36.                 'IS_CO_SESSCO_SPE_SPEAKER',
  37.                 'IS_CO_SESSQA_SPE_MODERATOR',
  38.                 'IS_CO_SESSQA_SPE_SPEAKER',
  39.                 'IS_CO_INS_SPE_COURSE',
  40.                 'IS_CO_ANY_SPE_DOCFILE_AUTHOR'
  41.             ])
  42.             && $subject instanceof ContainerMappedInterface)
  43.             || in_array($attribute, ['IS_ANY_SPE''IS_ANY_SPE_CHATMESSAGE_EDIT']);
  44.     }
  45.     protected function voteOnAttribute($attribute$subjectTokenInterface $token): bool
  46.     {
  47.         $user $token->getUser();
  48.         if (!$user instanceof UserInterface) {
  49.             return false;
  50.         }
  51.         if ($this->security->isGranted('ROLE_SUPER_ADMIN')) {
  52.             return true;
  53.         }
  54.         if (EsUtil::isCommunityEntity($subject)) {
  55.             return true;
  56.             /*
  57.             $client = $this->esCache->getClient();
  58.             if ($client->getIsCommunitySharingEnable()) {
  59.                 return true;
  60.             }
  61.             */
  62.         }
  63.         $container $isCo null;
  64.         if ($subject instanceof ContainerMappedInterface) {
  65.             $container $this->esCache->getContainer();
  66.             $isCo $subject->getContainer()->getId() === $container->getId();
  67.         }
  68.         switch ($attribute) {
  69.             case 'IS_ANY_SPE':
  70.                 if (method_exists($subject'getUser')) {
  71.                     return ($this->security->isGranted('IS_AUTHENTICATED_FULLY')
  72.                         && $subject->getUser() === $user);
  73.                 }
  74.                 break;
  75.             case 'IS_ANY_SPE_CHATMESSAGE_EDIT':
  76.                 if (method_exists($subject'getUser')) {
  77.                     $createdAt $subject->getCreatedAt();
  78.                     $createdAt->add(new \DateInterval('PT5M'));
  79.                     $isTimeValid = (new \DateTime()) < $createdAt;
  80.                     return ($this->security->isGranted('IS_AUTHENTICATED_FULLY')
  81.                         && $subject->getUser() === $user && $isTimeValid);
  82.                 }
  83.                 break;
  84.             case 'IS_CO':
  85.                 return $isCo;
  86.                 break;
  87.             case 'IS_CO_ANY':
  88.                 return ($isCo && $this->security->isGranted('IS_AUTHENTICATED_FULLY'));
  89.                 break;
  90.             case 'IS_CO_ADM':
  91.                 return ($isCo && $this->security->isGranted('ROLE_ADMIN'));
  92.                 break;
  93.             case 'IS_CO_OPR':
  94.                 return ($isCo && $this->security->isGranted('ROLE_OPERATOR'));
  95.                 break;
  96.             case 'IS_CO_SPE':
  97.                 return ($isCo && $this->security->isGranted('ROLE_SPEAKER'));
  98.                 break;
  99.             case 'IS_CO_MOD':
  100.                 return ($isCo && $this->security->isGranted('ROLE_MODERATOR'));
  101.                 break;
  102.             case 'IS_CO_USR':
  103.                 return ($isCo && $this->security->isGranted('ROLE_USER'));
  104.                 break;
  105.             case 'IS_CO_ADM_SPE':
  106.                 if (method_exists($subject'getUser')) {
  107.                     return ($isCo
  108.                         && $this->security->isGranted('ROLE_ADMIN')
  109.                         && $subject->getUser() === $user);
  110.                 }
  111.                 break;
  112.             case 'IS_CO_OPR_SPE':
  113.                 if (method_exists($subject'getUser')) {
  114.                     return ($isCo
  115.                         && $this->security->isGranted('ROLE_OPERATOR')
  116.                         && $subject->getUser() === $user);
  117.                 }
  118.                 break;
  119.             case 'IS_CO_USR_SPE':
  120.                 if (method_exists($subject'getUser')) {
  121.                     return ($isCo
  122.                         && $this->security->isGranted('ROLE_USER')
  123.                         && $subject->getUser() === $user);
  124.                 }
  125.                 break;
  126.             case 'IS_CO_ANY_SPE':
  127.                 if (method_exists($subject'getUser')) {
  128.                     return ($isCo
  129.                         && $this->security->isGranted('IS_AUTHENTICATED_FULLY')
  130.                         && $subject->getUser() === $user);
  131.                 }
  132.                 break;
  133.             case 'IS_CO_ANY_SPE_CHATTHREAD':
  134.                 if (method_exists($subject'getUsers')) {
  135.                     $users $subject->getUsers();
  136.                     $hasUser false;
  137.                     foreach ($users as $selectUser) {
  138.                         if ($selectUser === $user) {
  139.                             $hasUser true;
  140.                             break;
  141.                         }
  142.                     }
  143.                     return ($isCo
  144.                         && $this->security->isGranted('IS_AUTHENTICATED_FULLY')
  145.                         && $hasUser);
  146.                 }
  147.                 break;
  148.             case 'IS_CO_INS_SPE_COURSE':
  149.                 if (method_exists($subject'getInstructor')) {
  150.                     return ($isCo
  151.                         && $this->security->isGranted('ROLE_INSTRUCTOR')
  152.                         && $subject->getInstructor() === $user);
  153.                 }
  154.                 break;
  155.             case 'IS_CO_ANY_SPE_DOCFILE_AUTHOR':
  156.                 if (method_exists($subject'getAutors')) {
  157.                     $users $subject->getAuthors();
  158.                     $hasUser false;
  159.                     foreach ($users as $selectUser) {
  160.                         if ($selectUser === $user) {
  161.                             $hasUser true;
  162.                             break;
  163.                         }
  164.                     }
  165.                     return ($isCo
  166.                         && $this->security->isGranted('IS_AUTHENTICATED_FULLY')
  167.                         && $hasUser);
  168.                 }
  169.                 break;
  170.         }
  171.         /*
  172.         if ($this->security->isGranted('ROLE_SUPER_ADMIN')) {
  173.             return true;
  174.         } else if ($this->security->isGranted('ROLE_ADMIN')) {
  175.             $container = $this->esCache->getContainer();
  176.             switch ($attribute) {
  177.                 case 'IS_CO':
  178.                     return ($subject->getContainer()->getId() === $container->getId());
  179.                     break;
  180.             }
  181.         }
  182.         */
  183.         return false;
  184.     }
  185. }