fix some authorization check in menu

This commit is contained in:
Julien Fastré 2022-03-25 13:11:03 +01:00
parent b423821ae9
commit d11eebefae
4 changed files with 43 additions and 11 deletions

View File

@ -41,12 +41,14 @@ class AccompanyingCourseMenuBuilder implements LocalMenuBuilderInterface
$period = $parameters['accompanyingCourse']; $period = $parameters['accompanyingCourse'];
if (AccompanyingPeriod::STEP_DRAFT !== $period->getStep()) { if (AccompanyingPeriod::STEP_DRAFT !== $period->getStep()) {
/*
$menu->addChild($this->translator->trans('Calendar'), [ $menu->addChild($this->translator->trans('Calendar'), [
'route' => 'chill_calendar_calendar_list', 'route' => 'chill_calendar_calendar_list',
'routeParameters' => [ 'routeParameters' => [
'accompanying_period_id' => $period->getId(), 'accompanying_period_id' => $period->getId(),
], ]) ], ])
->setExtras(['order' => 35]); ->setExtras(['order' => 35]);
*/
} }
} }

View File

@ -96,23 +96,27 @@ class AccompanyingCourseMenuBuilder implements LocalMenuBuilderInterface
$workflow = $this->registry->get($period, 'accompanying_period_lifecycle'); $workflow = $this->registry->get($period, 'accompanying_period_lifecycle');
if (null !== $period->getClosingDate()) { if ($this->security->isGranted(AccompanyingPeriodVoter::EDIT, $period)) {
if ($workflow->can($period, 'close')) {
$menu->addChild($this->translator->trans('Close Accompanying Course'), [
'route' => 'chill_person_accompanying_course_close',
'routeParameters' => [
'accompanying_period_id' => $period->getId(),
],])
->setExtras(['order' => 99999]);
}
}
if (null !== $period->getClosingDate()
&& $this->security->isGranted(AccompanyingPeriodVoter::RE_OPEN_COURSE, $period)) {
$menu->addChild($this->translator->trans('Re-open accompanying course'), [ $menu->addChild($this->translator->trans('Re-open accompanying course'), [
'route' => 'chill_person_accompanying_course_reopen', 'route' => 'chill_person_accompanying_course_reopen',
'routeParameters' => [ 'routeParameters' => [
'accompanying_period_id' => $period->getId(), 'accompanying_period_id' => $period->getId(),
], ]) ],])
->setExtras(['order' => 99998]); ->setExtras(['order' => 99998]);
} }
if ($workflow->can($period, 'close')) {
$menu->addChild($this->translator->trans('Close Accompanying Course'), [
'route' => 'chill_person_accompanying_course_close',
'routeParameters' => [
'accompanying_period_id' => $period->getId(),
], ])
->setExtras(['order' => 99999]);
}
} }
public static function getMenuIds(): array public static function getMenuIds(): array

View File

@ -34,12 +34,23 @@ class AccompanyingPeriodVoter extends AbstractChillVoter implements ProvideRoleH
self::FULL, self::FULL,
self::TOGGLE_CONFIDENTIAL_ALL, self::TOGGLE_CONFIDENTIAL_ALL,
self::TOGGLE_INTENSITY, self::TOGGLE_INTENSITY,
self::RE_OPEN_COURSE,
]; ];
public const CREATE = 'CHILL_PERSON_ACCOMPANYING_PERIOD_CREATE'; public const CREATE = 'CHILL_PERSON_ACCOMPANYING_PERIOD_CREATE';
/**
* role to DELETE the course
*
* Will be true only for the creator, and if the course is still at DRAFT step.
*/
public const DELETE = 'CHILL_PERSON_ACCOMPANYING_PERIOD_DELETE'; public const DELETE = 'CHILL_PERSON_ACCOMPANYING_PERIOD_DELETE';
/**
* role to EDIT the course.
*
* If the course is closed, it will be always false.
*/
public const EDIT = 'CHILL_PERSON_ACCOMPANYING_PERIOD_UPDATE'; public const EDIT = 'CHILL_PERSON_ACCOMPANYING_PERIOD_UPDATE';
/** /**
@ -56,6 +67,14 @@ class AccompanyingPeriodVoter extends AbstractChillVoter implements ProvideRoleH
*/ */
public const SEE_DETAILS = 'CHILL_PERSON_ACCOMPANYING_PERIOD_SEE_DETAILS'; public const SEE_DETAILS = 'CHILL_PERSON_ACCOMPANYING_PERIOD_SEE_DETAILS';
/**
* Reopen a closed course.
*
* This forward to the EDIT role, without taking into account that the course
* is closed
*/
public const RE_OPEN_COURSE = 'CHILL_PERSON_ACCOMPANYING_PERIOD_REOPEN';
public const TOGGLE_CONFIDENTIAL = 'CHILL_PERSON_ACCOMPANYING_PERIOD_TOGGLE_CONFIDENTIAL'; public const TOGGLE_CONFIDENTIAL = 'CHILL_PERSON_ACCOMPANYING_PERIOD_TOGGLE_CONFIDENTIAL';
/** /**
@ -116,6 +135,10 @@ class AccompanyingPeriodVoter extends AbstractChillVoter implements ProvideRoleH
if (in_array($attribute, [self::EDIT, self::DELETE], true)) { if (in_array($attribute, [self::EDIT, self::DELETE], true)) {
return false; return false;
} }
if (self::RE_OPEN_COURSE === $attribute) {
return $this->voterHelper->voteOnAttribute(self::EDIT, $subject, $token);
}
} }
if (AccompanyingPeriod::STEP_DRAFT === $subject->getStep()) { if (AccompanyingPeriod::STEP_DRAFT === $subject->getStep()) {

View File

@ -12,6 +12,7 @@ declare(strict_types=1);
namespace Chill\TaskBundle\Menu; namespace Chill\TaskBundle\Menu;
use Chill\MainBundle\Routing\LocalMenuBuilderInterface; use Chill\MainBundle\Routing\LocalMenuBuilderInterface;
use Chill\PersonBundle\Entity\AccompanyingPeriod;
use Chill\TaskBundle\Security\Authorization\TaskVoter; use Chill\TaskBundle\Security\Authorization\TaskVoter;
use Knp\Menu\MenuItem; use Knp\Menu\MenuItem;
use LogicException; use LogicException;
@ -40,9 +41,11 @@ class MenuBuilder implements LocalMenuBuilderInterface
public function buildAccompanyingCourseMenu($menu, $parameters) public function buildAccompanyingCourseMenu($menu, $parameters)
{ {
/** @var AccompanyingPeriod $course */
$course = $parameters['accompanyingCourse']; $course = $parameters['accompanyingCourse'];
if ($this->authorizationChecker->isGranted(TaskVoter::SHOW, $course)) { if ($this->authorizationChecker->isGranted(TaskVoter::SHOW, $course)
&& AccompanyingPeriod::STEP_DRAFT !== $course->getStep()) {
$menu->addChild( $menu->addChild(
$this->translator->trans('Tasks'), $this->translator->trans('Tasks'),
[ [