From 97c23f75dd5246bfe792c78bd901f995fcc10ffe Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Thu, 20 Jan 2022 22:24:19 +0100 Subject: [PATCH] improve permission handling for quick entry controller (#3081) --- src/Controller/QuickEntryController.php | 10 +--- src/EventSubscriber/MenuSubscriber.php | 16 ++---- src/Voter/QuickEntryVoter.php | 69 +++++++++++++++++++++++++ 3 files changed, 75 insertions(+), 20 deletions(-) create mode 100644 src/Voter/QuickEntryVoter.php diff --git a/src/Controller/QuickEntryController.php b/src/Controller/QuickEntryController.php index 86b740df..727f970f 100644 --- a/src/Controller/QuickEntryController.php +++ b/src/Controller/QuickEntryController.php @@ -25,7 +25,7 @@ use Symfony\Component\Routing\Annotation\Route; * Controller used to enter times in weekly form. * * @Route(path="/quick_entry") - * @Security("is_granted('weekly_own_timesheet') and is_granted('edit_own_timesheet')") + * @Security("is_granted('quick-entry')") */ class QuickEntryController extends AbstractController { @@ -45,14 +45,6 @@ class QuickEntryController extends AbstractController */ public function quickEntry(Request $request, ?string $begin = null) { - $mode = $this->timesheetService->getActiveTrackingMode(); - - if (!$mode->canEditDuration() && !$mode->canEditEnd()) { - $this->flashError('Not allowed'); - - return $this->redirectToRoute('homepage'); - } - $factory = $this->getDateTimeFactory(); if ($begin === null) { $begin = $factory->createDateTime(); diff --git a/src/EventSubscriber/MenuSubscriber.php b/src/EventSubscriber/MenuSubscriber.php index 99655769..99c43408 100644 --- a/src/EventSubscriber/MenuSubscriber.php +++ b/src/EventSubscriber/MenuSubscriber.php @@ -10,7 +10,6 @@ namespace App\EventSubscriber; use App\Event\ConfigureMainMenuEvent; -use App\Timesheet\TrackingModeService; use App\Twig\IconExtension; use App\Utils\MenuItemModel; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -22,12 +21,10 @@ use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; final class MenuSubscriber implements EventSubscriberInterface { private $security; - private $trackingModeService; - public function __construct(AuthorizationCheckerInterface $security, TrackingModeService $trackingModeService) + public function __construct(AuthorizationCheckerInterface $security) { $this->security = $security; - $this->trackingModeService = $trackingModeService; } public static function getSubscribedEvents(): array @@ -55,13 +52,10 @@ final class MenuSubscriber implements EventSubscriberInterface $timesheets->setChildRoutes(['timesheet_export', 'timesheet_edit', 'timesheet_create', 'timesheet_multi_update']); $menu->addItem($timesheets); - if ($auth->isGranted('weekly_own_timesheet') && $auth->isGranted('edit_own_timesheet')) { - $mode = $this->trackingModeService->getActiveMode(); - if ($mode->canEditDuration() || $mode->canEditEnd()) { - $menu->addItem( - new MenuItemModel('quick_entry', 'quick_entry.title', 'quick_entry', [], $icons->icon('weekly-times')) - ); - } + if ($auth->isGranted('quick-entry')) { + $menu->addItem( + new MenuItemModel('quick_entry', 'quick_entry.title', 'quick_entry', [], $icons->icon('weekly-times')) + ); } $menu->addItem( diff --git a/src/Voter/QuickEntryVoter.php b/src/Voter/QuickEntryVoter.php new file mode 100644 index 00000000..d2b04f13 --- /dev/null +++ b/src/Voter/QuickEntryVoter.php @@ -0,0 +1,69 @@ +permissionManager = $permissionManager; + $this->trackingModeService = $trackingModeService; + } + + /** + * @param string $attribute + * @param mixed $subject + * @return bool + */ + protected function supports($attribute, $subject) + { + return 'quick-entry' === $attribute; + } + + /** + * @param string $attribute + * @param User $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, 'weekly_own_timesheet')) { + return false; + } + + if (!$this->permissionManager->hasRolePermission($user, 'edit_own_timesheet')) { + return false; + } + + $mode = $this->trackingModeService->getActiveMode(); + + if ($mode->canEditDuration() || $mode->canEditEnd()) { + return true; + } + + return false; + } +}