src/mvk/Auth/Services/VoterPermissions.php line 22

Open in your IDE?
  1. <?php
  2. /**
  3.  * This file is part of the Pimcore X Installation by
  4.  * ercas GmbH & CO. KG <https://www.ercasdieagentur.de>
  5.  *
  6.  *  @license GPLv3
  7.  */
  8. namespace App\mvk\Auth\Services;
  9. use Pimcore\Model\DataObject\Agent;
  10. use Pimcore\Model\DataObject\BmsSubAgent;
  11. use Pimcore\Model\DataObject\SubAgent;
  12. use Pimcore\Model\DataObject\Supervisor;
  13. use Psr\Container\ContainerInterface;
  14. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  15. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  16. use Symfony\Component\Security\Core\Security ;
  17. use Symfony\Component\Security\Core\User\UserInterface;
  18. class VoterPermissions extends Voter
  19. {
  20.     private $permissionService;
  21.     public function __construct(private Security $security, private ContainerInterface $container)
  22.     {
  23.         $this->security $security;
  24.         $this->container $container;
  25.         $this->permissionService $container->get('auth.frontend_permission_toolkit_bundle');
  26.     }
  27.     const SUBJECTS = ['Policy''Policyholder''PolicyDocument''Agent''SubAgent''BmsSubAgent''AgentDocument''InsuranceApplication''InsuranceOffer''DamageDeclaration'];
  28.     const VIEWCUSTOMERLIST 'viewCustmerList';
  29.     const VIEWSETTLEMENTS  'viewSettlements';
  30.     const VIEWGDVDOWNLOAD  'viewGdvDownload';
  31.     const VIEWAUFSICHTSRAT 'viewAufsichtsrat';
  32.     const VIEWMYUSERS      'viewMyUsers';
  33.     const GDVDOWNLOAD      'gdvDownload';
  34.     const AGENTDOCUMENTDOWNLOAD 'agentDocumentDownload';
  35.     const ACCESS 'access';
  36.     protected function supports(string $attributemixed $subject): bool
  37.     {
  38.         /**  if the attribute isn't one we support, return false */
  39.         if (!in_array($attribute, [self::VIEWCUSTOMERLISTself::VIEWSETTLEMENTSself::VIEWGDVDOWNLOADself::VIEWMYUSERSself::VIEWAUFSICHTSRATself::GDVDOWNLOADself::AGENTDOCUMENTDOWNLOADself::ACCESS])) {
  40.             return false;
  41.         }
  42.         /**  if the subject isn't one we support, return false. (can also use instanceof )  */
  43.         if ($subject && !in_array($subject->getClassName(), self::SUBJECTS)) {
  44.             return false;
  45.         }
  46.         return true;
  47.     }
  48.     protected function voteOnAttribute(string $attributemixed $subjectTokenInterface $token): bool
  49.     {
  50.         $user $token->getUser();
  51.         /** the user must be logged in; if not, deny access */
  52.         if (!$user instanceof UserInterface) {
  53.             return false;
  54.         }
  55.         $orginalUser$this->getOriginalUser($user);
  56.         return match($attribute) {
  57.             self::GDVDOWNLOAD => $this->canGdvDownload($attribute$orginalUser),
  58.             self::AGENTDOCUMENTDOWNLOAD => $this->canAgentDocumentDownload($attribute$orginalUser),
  59.             self::VIEWCUSTOMERLIST => $this->canViewCustmerList($attribute$orginalUser),
  60.             self::VIEWAUFSICHTSRAT => $this->canViewAufsichtsrat($attribute$orginalUser),
  61.             self::VIEWSETTLEMENTS => $this->canViewSettlements($attribute$orginalUser),
  62.             self::VIEWGDVDOWNLOAD => $this->canViewGdvDownload($attribute$orginalUser),
  63.             self::VIEWMYUSERS => $this->canViewMyUsers($attribute$orginalUser),
  64.             self::ACCESS => $this->canAccess($orginalUser$subject),
  65.             default => throw new \LogicException('This code should not be reached!')
  66.         };
  67.     }
  68.     /**
  69.      * This function checks Subjects that don't need special Treatments
  70.      */
  71.     private function checkSubject($user$subject): bool
  72.     {
  73.         $subject$this->reset($subject);
  74.         $method'get'.$user->getClassName();
  75.         if ($user instanceof SubAgent || $user instanceof BmsSubAgent) {
  76.             $user $user->getAgent();
  77.             if (!$user) {
  78.                 return false;
  79.             }
  80.             $method 'getAgent';
  81.         }
  82.         $userId$this->getUserOwners($user);
  83.         $allowedUsers$this->getAllowedUsers($subject$method);
  84.         return $this->getFinalDecision($allowedUsers$userId);
  85.     }
  86.     /**
  87.      * This function checks Subjects that  need special Treatments
  88.      */
  89.     private function checkSubjectSpecial($user$subject$attribute): bool
  90.     {
  91.         $subject$this->reset($subject);
  92.         if ($user instanceof Agent || $user instanceof SubAgent) {
  93.             $method 'getId';
  94.             if ($user instanceof SubAgent) {
  95.                 if (!$this->canAgentDocumentDownload($attribute$user)) {
  96.                     return false;
  97.                 }
  98.                 $user $user->getAgent();
  99.                 if (!$user) {
  100.                     return false;
  101.                 }
  102.             }
  103.             $userId$this->getUserOwners($user);
  104.             $allowedUsers$this->getAllowedUsers($subject$method);
  105.             return $this->getFinalDecision($allowedUsers$userId);
  106.         }
  107.         return false;
  108.     }
  109.     /**
  110.      * This function checks Related  SubAgent and BmsSubAgent to an Agent
  111.      */
  112.     private function checkRelatedAgent($user$subject)
  113.     {
  114.         if ($user instanceof Agent && $subject instanceof Agent) {
  115.             if ($subject->getId() === $user->getId()) {
  116.                 return true;
  117.             }
  118.         }
  119.         if ($user instanceof Agent && ($subject instanceof SubAgent ||  $subject instanceof BmsSubAgent)) {
  120.             $user $subject->getAgent();
  121.             if (!$user) {
  122.                 return false;
  123.             }
  124.             $method 'getAgent';
  125.             $userId$this->getUserOwners($user);
  126.             $allowedUsers$this->getAllowedUsers($subject$method);
  127.             return $this->getFinalDecision($allowedUsers$userId);
  128.         }
  129.         if ($user instanceof SubAgent || $user instanceof BmsSubAgent) {
  130.             $user $user->getAgent();
  131.             if (!$user) {
  132.                 return false;
  133.             }
  134.             $method 'getAgent';
  135.             $userId$this->getUserOwners($user);
  136.             $allowedUsers$this->getAllowedUsers($subject$method);
  137.             return $this->getFinalDecision($allowedUsers$userId);
  138.         }
  139.         return false;
  140.     }
  141.     /**
  142.      * This function checks Policy Object
  143.      */
  144.     private function checkPolicy($user$subject): bool
  145.     {
  146.         return $this->checkSubject($user$subject);
  147.     }
  148.     /**
  149.      * This function checks PolicyHolder Object
  150.      */
  151.     private function checkPolicyHolder($user$subject): bool
  152.     {
  153.         $subject $subject->getPolicies();
  154.         return $this->checkPolicy($user$subject);
  155.     }
  156.     /**
  157.      * This function checks Agent Object
  158.      */
  159.     private function checkAgent($user$subject): bool
  160.     {
  161.         return $this->checkRelatedAgent($user$subject);
  162.     }
  163.     /**
  164.      * This function checks SubAgent Object
  165.      */
  166.     private function checkSubAgent($user$subject): bool
  167.     {
  168.         return $this->checkRelatedAgent($user$subject);
  169.     }
  170.     /**
  171.      * This function checks BmsSubAgent Object
  172.      */
  173.     private function checkBmsSubAgent($user$subject): bool
  174.     {
  175.         return $this->checkRelatedAgent($user$subject);
  176.     }
  177.     /**
  178.      * This function checks InsuranceApplication Object
  179.      */
  180.     private function checkInsuranceApplication($user$subject): bool
  181.     {
  182.         return $this->checkSubject($user$subject);
  183.     }
  184.     /**
  185.      * This function checks InsuranceOffer Object
  186.      */
  187.     private function checkInsuranceOffer($user$subject): bool
  188.     {
  189.         return $this->checkSubject($user$subject);
  190.     }
  191.     /**
  192.      * This function checks DamageDeclaration Object
  193.      */
  194.     private function checkDamageDeclaration($user$subject): bool
  195.     {
  196.         return $this->checkSubject($user$subject);
  197.     }
  198.     /**
  199.      * This function checks PolicyDocument Object
  200.      */
  201.     private function checkPolicyDocument($user$subject): bool
  202.     {
  203.         $subject $subject->getpolicyNr();
  204.         return $this->checkSubject($user$subject);
  205.     }
  206.     /**
  207.      * This function checks AgentDocument Object
  208.      */
  209.     private function checkAgentDocument($user$subject): bool
  210.     {
  211.         $subject $subject->getagentNr();
  212.         return $this->checkSubjectSpecial($user$subject'agentDocumentDownload');
  213.     }
  214.     /**
  215.      * This function that get called in controllers with different subjects
  216.      */
  217.     private function canAccess($user$subject): bool
  218.     {
  219.         $method'check'.$subject->getClassName();
  220.         return $this->$method($user$subject);
  221.     }
  222.     /**
  223.      * This function checks User's Role GdvDownload
  224.      */
  225.     private function canGdvDownload($attribute$user): bool
  226.     {
  227.         if ($user instanceof Agent) {
  228.             return true;
  229.         } else {
  230.             if ($this->isAllowed('viewGdvDownload'$user)) {
  231.                 return true;
  232.             }
  233.         }
  234.         return false;
  235.     }
  236.     /**
  237.      * This function checks User's Role AgentDocumentDownload
  238.      */
  239.     private function canAgentDocumentDownload($attribute$user): bool
  240.     {
  241.         if ($user instanceof Agent) {
  242.             return true;
  243.         } else {
  244.             if ($this->isAllowed('viewSettlements'$user)) {
  245.                 return true;
  246.             }
  247.         }
  248.         return false;
  249.     }
  250.     /**
  251.      * This function checks wether the user can view Kundenliste Pimcore Document
  252.      */
  253.     private function canViewCustmerList($attribute$user): bool
  254.     {
  255.         if ($user instanceof Agent || $user instanceof SubAgent || $user instanceof BmsSubAgent) {
  256.             return true;
  257.         }
  258.         return false;
  259.     }
  260.     /**
  261.      * This function checks wether the user can access ViewAufsichtsrat
  262.      */
  263.     private function canViewAufsichtsrat($attribute$user): bool
  264.     {
  265.         if ($user instanceof Supervisor) {
  266.             return true;
  267.         }
  268.         return false;
  269.     }
  270.     /**
  271.      * This function checks wether the user can view Abrechnungen Pimcore Document
  272.      */
  273.     private function canViewSettlements($attribute$user): bool
  274.     {
  275.         return $this->canAgentDocumentDownload($attribute$user);
  276.     }
  277.     /**
  278.      * This function checks wether the user can view GDV Download Pimcore Document
  279.      */
  280.     private function canViewGdvDownload($attribute$user): bool
  281.     {
  282.         return $this->canGdvDownload($attribute$user);
  283.     }
  284.     /**
  285.      * This function checks wether the user can view  Meine Benutzer Pimcore Document
  286.      */
  287.     private function canViewMyUsers($attribute$user): bool
  288.     {
  289.         if ($user instanceof Agent) {
  290.             return true;
  291.         }
  292.         return false;
  293.     }
  294.     /**
  295.      * This function checks wether the user is granted the permission based on their Role
  296.      */
  297.     private function isAllowed($attribute$user)
  298.     {
  299.         if ($this->permissionService->isAllowed($user$attribute)) {
  300.             return true;
  301.         }
  302.         return false;
  303.     }
  304.     private function getOriginalUser($user)
  305.     {
  306.         $class=  "Pimcore\Model\DataObject\\".$user->getClassName();
  307.         $user $class::getById($user->getId());
  308.         return  $user;
  309.     }
  310.     private function reset($subject)
  311.     {
  312.         if (is_array($subject) && count($subject)==1) {
  313.             $subject =  reset($subject);
  314.         }
  315.         return $subject;
  316.     }
  317.     private function getAllowedUsers($subject$method)
  318.     {
  319.         $allowedUsers=[];
  320.         if (is_array($subject)) {
  321.             foreach ($subject as $mSubject) {
  322.                 $holder $mSubject->$method();
  323.                 if ($holder) {
  324.                     $holder$this->reset($holder);
  325.                     if (is_array($holder)) {
  326.                         foreach ($holder as $subHolder) {
  327.                             array_push($allowedUsers$subHolder->getId());
  328.                         }
  329.                     } else {
  330.                         is_int($holder) ? $holderId=$holder $holderId=$holder->getId();
  331.                         array_push($allowedUsers$holderId);
  332.                     }
  333.                 }
  334.             }
  335.         } else {
  336.             $holder $subject->$method();
  337.             if ($holder) {
  338.                 $holder$this->reset($holder);
  339.                 if (is_array($holder)) {
  340.                     $method 'getId';
  341.                     $allowedUsers $this->getAllowedUsers($holder$method);
  342.                 } else {
  343.                     $holder$this->reset($holder);
  344.                     is_int($holder) ? $holderId=$holder $holderId=$holder->getId();
  345.                     array_push($allowedUsers$holderId);
  346.                 }
  347.             }
  348.         }
  349.         return $allowedUsers;
  350.     }
  351.     private function getUserOwners($user)
  352.     {
  353.         $users=[];
  354.         if (is_array($user)) {
  355.             foreach ($user as $agent) {
  356.                 array_push($users$agent->getId());
  357.             }
  358.         } else {
  359.             array_push($users$user->getId());
  360.         }
  361.         return $users;
  362.     }
  363.     private function getFinalDecision($allowedUsers$userId)
  364.     {
  365.         if ($allowedUsers) {
  366.             if (is_array($userId)) {
  367.                 foreach ($userId as $user) {
  368.                     if (in_array($user$allowedUsers)) {
  369.                         return true;
  370.                     }
  371.                 }
  372.             } else {
  373.                 if (in_array($userId$allowedUsers)) {
  374.                     return true;
  375.                 }
  376.             }
  377.         }
  378.         return false;
  379.     }
  380. }