Edit file File name : ProjectVoter.php Content :<?php /* * This file is part of the Kimai time-tracking app. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace App\Voter; use App\Entity\Project; use App\Entity\Team; use App\Entity\User; use App\Security\RolePermissionManager; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Authorization\Voter\Voter; /** * A voter to check permissions on Projects. */ final class ProjectVoter extends Voter { /** * support rules based on the given project */ private const ALLOWED_ATTRIBUTES = [ 'view', 'edit', 'budget', 'delete', 'permissions', 'comments', 'comments_create', 'details', ]; private $permissionManager; public function __construct(RolePermissionManager $permissionManager) { $this->permissionManager = $permissionManager; } /** * @param string $attribute * @param Project $subject * @return bool */ protected function supports($attribute, $subject) { if (!($subject instanceof Project)) { return false; } if (!\in_array($attribute, self::ALLOWED_ATTRIBUTES)) { return false; } return true; } /** * @param string $attribute * @param Project $subject * @param TokenInterface $token * @return bool */ protected function voteOnAttribute($attribute, $subject, TokenInterface $token) { $user = $token->getUser(); if (!$user instanceof User) { return false; } if ($this->permissionManager->hasRolePermission($user, $attribute . '_project')) { return true; } // those cannot be assigned to teams if (\in_array($attribute, ['create', 'delete'])) { return false; } $hasTeamleadPermission = $this->permissionManager->hasRolePermission($user, $attribute . '_teamlead_project'); $hasTeamPermission = $this->permissionManager->hasRolePermission($user, $attribute . '_team_project'); if (!$hasTeamleadPermission && !$hasTeamPermission) { return false; } /** @var Team $team */ foreach ($subject->getTeams() as $team) { if ($hasTeamleadPermission && $user->isTeamleadOf($team)) { return true; } if ($hasTeamPermission && $user->isInTeam($team)) { return true; } } // new projects have no customer if (null === ($customer = $subject->getCustomer())) { return false; } /** @var Team $team */ foreach ($customer->getTeams() as $team) { if ($hasTeamleadPermission && $user->isTeamleadOf($team)) { return true; } if ($hasTeamPermission && $user->isInTeam($team)) { return true; } } return false; } } Save