<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace App\Security\Voter;
use App\Entity\JIT\Person;
use App\Entity\Security\User;
use LogicException;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\Security;
/**
* Description of PersonVoter
*
* @author NOUTCHEU Blaise
*/
class PersonVoter extends Voter {
// these strings are just invented: you can use anything
const LISTE = 'ROLE_JIT_PERSON_INDEXE';
const LISTP = 'ROLE_JIT_PERSON_INDEXP';
const LISTL = 'ROLE_JIT_PERSON_INDEXL';
const LISTD = 'ROLE_JIT_PERSON_INDEXD';
const LIST = 'ROLE_JIT_PERSON_INDEX';
const ADD = 'ROLE_JIT_PERSON_ADD';
const ADDE = 'ROLE_JIT_PERSON_ADDE';
const ADDP = 'ROLE_JIT_PERSON_ADDP';
const ADDL = 'ROLE_JIT_PERSON_ADDL';
const ADDD = 'ROLE_JIT_PERSON_ADDD';
const VIEW = 'ROLE_JIT_PERSON_VIEW';
const VIEWE = 'ROLE_JIT_PERSON_VIEWE';
const VIEWP = 'ROLE_JIT_PERSON_VIEWP';
const VIEWL = 'ROLE_JIT_PERSON_VIEWL';
const VIEWD = 'ROLE_JIT_PERSON_VIEWD';
const CLONE = 'ROLE_JIT_PERSON_CLONE';
const EDIT = 'ROLE_JIT_PERSON_EDIT';
const DELETE = 'ROLE_JIT_PERSON_DELETE';
const EDIT_ACCOUNT = 'ROLE_JIT_PERSON_EDIT_ACCOUNT';
private $security;
public function __construct(Security $security) {
$this->security = $security;
}
protected function supports(string $attribute, $subject) {
if (in_array($attribute, [
self::LISTE,
self::LISTP,
self::LISTL,
self::LISTD,
self::LIST,
self::ADD,
self::ADDE,
self::ADDP,
self::ADDL,
self::ADDD,
self::VIEW,
self::VIEWD,
self::VIEWE,
self::VIEWL,
self::VIEWP,
self::CLONE,
self::EDIT,
self::DELETE,
self::EDIT_ACCOUNT,
])) {
return true;
}
if (!in_array($attribute, [
self::VIEW,
])) {
return false;
}
// only vote on `Person` objects
if (!$subject instanceof Person) {
return false;
}
return true;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token) {
$user = $token->getUser();
if (!$user instanceof User) {
// the user must be logged in; if not, deny access
return false;
}
// ROLE_JIT_PERSON_MANAGE can do anything on person! The power!
if ($this->security->isGranted('ROLE_DEV')) {
return true;
}
switch ($attribute) {
case self::LIST:
return false;
case self::LISTE:
case self::LISTD:
case self::LISTL:
case self::LISTP:
return $this->canList($user);
case self::VIEW:
case self::VIEWE:
case self::VIEWD:
case self::VIEWL:
case self::VIEWP:
return $subject!== null && $this->canView($subject, $user);
case self::ADD:
return false;
case self::ADDE:
return $this->canAddE($user);
case self::ADDP:
return $this->canAddP($user);
case self::ADDL:
return $this->canAddL($user);
case self::ADDD:
return $this->canAddD($user);
case self::CLONE:
return $this->canClone($subject, $user);
case self::EDIT:
return $this->canEdit($subject, $user);
case self::DELETE:
return $this->canDelete($subject, $user);
case self::EDIT_ACCOUNT:
return $this->canEditAccount($subject, $user);
}
throw new LogicException('This code should not be reached!');
}
private function canList(User $user) {
return true;
}
private function canView(Person $person, User $user) {
//Vérifier si c'est lié à une personne (ie person null)
// if($person == null){
// return false;
// }
// vérifier que c'est une person de l'utilisateur connecté
if ($user->getPersons()->contains($person)) {
return true;
}
// vérifier que c'est un employé de l'utilisateur connecté
if ($user->getMyEmployees()->contains($person)) {
return true;
}
// vérifier que c'est un propriétaire de l'utilisateur connecté
if ($user->getMyAOwners()->contains($person)) {
return true;
}
// vérifier que c'est un locataire de l'utilisateur connecté
if ($user->getMyATenants()->contains($person)) {
return true;
}
return false;
}
private function canAddE(User $user) {
if ($user->hasAgency()) {
return true;
}
return false;
}
private function canAddP(User $user) {
if ($user->isEmployee()) {
return true;
}
return false;
}
private function canAddL(User $user) {
if ($user->isEmployee()) {
return true;
}
return false;
}
private function canAddD(User $user) {
if ($user->isEmployee()) {
return true;
}
return false;
}
private function canClone(Person $person, User $user) {
//Uniquement le chef d'agence peut modifier une personne
if ($this->canView($person, $user)) {
if ($person->isOwner()) {
return $this->canAddP($user);
} else if ($person->isLocataire()) {
return $this->canAddL($user);
} else if ($person->isDemarcheur()) {
return $this->canAddD($user);
} else if ($person->isEmployee()) {
return $this->canAddE($user);
}
}
return false;
}
private function canEdit(Person $person, User $user) {
//Uniquement le chef d'agence peut modifier une personne
if ($user->getMyAgencies()->contains($person->getAgency())) {
return true;
}
return false;
}
private function canDelete(Person $person, User $user) {
//Uniquement le chef d'agence peut modifier une personne
if ($user->getMyAgencies()->contains($person->getAgency())) {
return true;
}
return false;
}
private function canEditAccount(Person $person, User $user) {
if (!$this->security->isGranted('ROLE_SECURITY_USER_LIST_ALL')) {
return false;
}
if ($user->getMyAgencies()->contains($person->getAgency())) {
return true;
}
return false;
}
}