Merge remote-tracking branch 'origin/master'

pull/4014/head^2
Yannick Warnier 4 years ago
commit 38830b800d
  1. 7
      src/CoreBundle/Entity/SessionRelCourse.php
  2. 23
      src/CoreBundle/Security/Authorization/Voter/SessionVoter.php

@ -32,7 +32,7 @@ use Symfony\Component\Serializer\Annotation\Groups;
#[ApiResource( #[ApiResource(
collectionOperations: [ collectionOperations: [
'get' => [ 'get' => [
'security' => "is_granted('ROLE_ADMIN')", 'security' => "is_granted('ROLE_USER')",
], ],
'post' => [ 'post' => [
'security' => "is_granted('ROLE_ADMIN')", 'security' => "is_granted('ROLE_ADMIN')",
@ -40,15 +40,12 @@ use Symfony\Component\Serializer\Annotation\Groups;
], ],
itemOperations: [ itemOperations: [
'get' => [ 'get' => [
'security' => "is_granted('ROLE_ADMIN')", 'security' => "is_granted('ROLE_ADMIN') or is_granted('VIEW', object)",
], ],
'put' => [ 'put' => [
'security' => "is_granted('ROLE_ADMIN')", 'security' => "is_granted('ROLE_ADMIN')",
], ],
], ],
attributes: [
'security' => "is_granted('ROLE_ADMIN')",
],
denormalizationContext: [ denormalizationContext: [
'groups' => ['session_rel_course:write'], 'groups' => ['session_rel_course:write'],
], ],

@ -65,32 +65,35 @@ class SessionVoter extends Voter
{ {
/** @var User $user */ /** @var User $user */
$user = $token->getUser(); $user = $token->getUser();
// Make sure there is a user object (i.e. that the user is logged in) // Make sure there is a user object (i.e. that the user is logged in)
if (!$user instanceof UserInterface) { if (!$user instanceof UserInterface) {
return false; return false;
} }
// Admins have access to everything // Admins have access to everything.
if ($this->security->isGranted('ROLE_ADMIN')) { if ($this->security->isGranted('ROLE_ADMIN')) {
return true; return true;
} }
// Checks if the current course was set up // Checks if the current course was set up
// $session->getCurrentCourse() is set in the class CourseListener // $session->getCurrentCourse() is set in the class CourseListener.
/** @var Session $session */ /** @var Session $session */
$session = $subject; $session = $subject;
$currentCourse = $session->getCurrentCourse(); $currentCourse = $session->getCurrentCourse();
switch ($attribute) { switch ($attribute) {
case self::VIEW: case self::VIEW:
// @todo improve performance.
$userIsGeneralCoach = $session->hasUserAsGeneralCoach($user); $userIsGeneralCoach = $session->hasUserAsGeneralCoach($user);
$userIsCourseCoach = $currentCourse && $session->hasCoachInCourseWithStatus($user, $currentCourse); if (null === $currentCourse) {
$userIsStudent = $currentCourse $userIsStudent = $session->getSessionRelCourseByUser($user, Session::STUDENT)->count() > 0;
? $session->hasUserInCourse($user, $currentCourse, Session::STUDENT) $userIsCourseCoach = false;
: $session->getSessionRelCourseByUser($user, Session::STUDENT)->count() > 0; } else {
$userIsCourseCoach = $session->hasCoachInCourseWithStatus($user, $currentCourse);
if (empty($session->getDuration())) { $userIsStudent = $session->hasUserInCourse($user, $currentCourse, Session::STUDENT);
}
$duration = (int) $session->getDuration();
if (0 === $duration) {
// General coach. // General coach.
if ($userIsGeneralCoach && $session->isActiveForCoach()) { if ($userIsGeneralCoach && $session->isActiveForCoach()) {
$user->addRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_SESSION_TEACHER); $user->addRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_SESSION_TEACHER);
@ -105,7 +108,7 @@ class SessionVoter extends Voter
return true; return true;
} }
// Student access // Student access.
if ($userIsStudent && $session->isActiveForStudent()) { if ($userIsStudent && $session->isActiveForStudent()) {
$user->addRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_SESSION_STUDENT); $user->addRole(ResourceNodeVoter::ROLE_CURRENT_COURSE_SESSION_STUDENT);

Loading…
Cancel
Save