diff --git a/Resources/config/services/workflow.yml b/Resources/config/services/workflow.yml index 01a26f1fc..a80cf40dd 100644 --- a/Resources/config/services/workflow.yml +++ b/Resources/config/services/workflow.yml @@ -3,4 +3,10 @@ services: Chill\TaskBundle\Workflow\Definition\DefaultTaskDefinition: tags: - - { name: 'chill_task.workflow_definition' } \ No newline at end of file + - { name: 'chill_task.workflow_definition' } + + Chill\TaskBundle\Workflow\Event\DefaultTaskGuardEvent: + arguments: + - '@Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface' + tags: + - { name: kernel.event_subscriber } \ No newline at end of file diff --git a/Workflow/Event/DefaultTaskGuardEvent.php b/Workflow/Event/DefaultTaskGuardEvent.php new file mode 100644 index 000000000..e4ceff327 --- /dev/null +++ b/Workflow/Event/DefaultTaskGuardEvent.php @@ -0,0 +1,59 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +namespace Chill\TaskBundle\Workflow\Event; + +use Symfony\Component\EventDispatcher\EventSubscriberInterface; +use Symfony\Component\Workflow\Event\GuardEvent; +use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; +use Chill\TaskBundle\Security\Authorization\TaskVoter; + +/** + * + * + * @author Julien Fastré + */ +class DefaultTaskGuardEvent implements EventSubscriberInterface +{ + public static function getSubscribedEvents(): array + { + return [ + 'workflow.task_default.guard' => [ + 'checkACL' + ] + ]; + } + + /** + * + * @var AuthorizationCheckerInterface + */ + protected $authorizationChecker; + + public function __construct(AuthorizationCheckerInterface $authorizationChecker) + { + $this->authorizationChecker = $authorizationChecker; + } + + public function checkACL(GuardEvent $event) + { + if (FALSE === $this->authorizationChecker->isGranted(TaskVoter::UPDATE, + $event->getSubject())) { + $event->setBlocked(true); + } + } +}