Commit 75457e01 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Améliorations des assertions en lien avec le workflow : sécurité renforcée

parent c1c6f5b0
Loading
Loading
Loading
Loading
+0 −1
Changes for module/Mission/config/module.config.php: 0 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -7,7 +7,6 @@ use UnicaenPrivilege\Assertion\AssertionFactory;

return [
    'services' => [
        Assertion\WorkflowAssertion::class => AssertionFactory::class,
        Service\MissionService::class     => Service\MissionServiceFactory::class,
    ],
];
 No newline at end of file
+12 −7
Changes for module/Mission/config/saisie.config.php: 12 added lines, 7 removed lines.
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ return [
                    'controller' => Controller\SaisieController::class,
                    'action' => 'index',
                    'privileges' => Privileges::MISSION_VISUALISATION,
                    //'assertion'  => Assertion\MissionAssertion::class,
                    'assertion'  => Assertion\SaisieAssertion::class,
                ],
            ],
        ],
@@ -29,46 +29,49 @@ return [
                    'controller' => Controller\SaisieController::class,
                    'action' => 'liste',
                    'privileges' => Privileges::MISSION_VISUALISATION,
                    //'assertion'  => Assertion\MissionAssertion::class,
                    'assertion'  => Assertion\SaisieAssertion::class,
                ],
                'get' => [
                    'route' => '/get/:mission',
                    'controller' => Controller\SaisieController::class,
                    'action' => 'get',
                    'privileges' => Privileges::MISSION_VISUALISATION,
                    //'assertion'  => Assertion\MissionAssertion::class,
                    'assertion'  => Assertion\SaisieAssertion::class,
                ],
                'ajout' => [
                    'route' => '/ajout/:intervenant',
                    'controller' => Controller\SaisieController::class,
                    'action' => 'ajout',
                    'privileges' => Privileges::MISSION_EDITION,
                    //'assertion'  => Assertion\MissionAssertion::class,
                    'assertion'  => Assertion\SaisieAssertion::class,
                ],
                'saisie' => [
                    'route' => '/saisie/:mission',
                    'controller' => Controller\SaisieController::class,
                    'action' => 'saisie',
                    'privileges' => Privileges::MISSION_EDITION,
                    //'assertion'  => Assertion\MissionAssertion::class,
                    'assertion'  => Assertion\SaisieAssertion::class,
                ],
                'supprimer' => [
                    'route' => '/supprimer/:mission',
                    'controller' => Controller\SaisieController::class,
                    'action' => 'supprimer',
                    'privileges' => Privileges::MISSION_EDITION,
                    'assertion'  => Assertion\SaisieAssertion::class,
                ],
                'valider' => [
                    'route' => '/valider/:mission',
                    'controller' => Controller\SaisieController::class,
                    'action' => 'valider',
                    'privileges' => Privileges::MISSION_VALIDATION,
                    'assertion'  => Assertion\SaisieAssertion::class,
                ],
                'devalider' => [
                    'route' => '/devalider/:mission',
                    'controller' => Controller\SaisieController::class,
                    'action' => 'devalider',
                    'privileges' => Privileges::MISSION_DEVALIDATION,
                    'assertion'  => Assertion\SaisieAssertion::class,
                ],
                'volume-horaire' => [
                    'route' => '/volume-horaire',
@@ -80,18 +83,21 @@ return [
                            'controller' => Controller\SaisieController::class,
                            'action' => 'volume-horaire-supprimer',
                            'privileges' => Privileges::MISSION_EDITION,
                            'assertion'  => Assertion\SaisieAssertion::class,
                        ],
                        'valider' => [
                            'route' => '/valider/:volumeHoraireMission',
                            'controller' => Controller\SaisieController::class,
                            'action' => 'volume-horaire-valider',
                            'privileges' => Privileges::MISSION_VALIDATION,
                            'assertion'  => Assertion\SaisieAssertion::class,
                        ],
                        'devalider' => [
                            'route' => '/devalider/:volumeHoraireMission',
                            'controller' => Controller\SaisieController::class,
                            'action' => 'volume-horaire-devalider',
                            'privileges' => Privileges::MISSION_DEVALIDATION,
                            'assertion'  => Assertion\SaisieAssertion::class,
                        ],
                    ],
                ],
@@ -109,9 +115,8 @@ return [
                    'paramsInject' => [
                        'intervenant',
                    ],
                    'workflow-etape-code' => WfEtape::CODE_MISSION_SAISIE,
                    'withtarget' => true,
                    'visible' => Assertion\WorkflowAssertion::class,
                    'visible' => Assertion\SaisieAssertion::class,
                    'order' => 8,
                ],
            ],
+8 −8
Changes for module/Mission/config/suivi.config.php: 8 added lines, 8 removed lines.
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@ return [
                    'controller' => Controller\SuiviController::class,
                    'action'     => 'index',
                    'privileges' => Privileges::MISSION_VISUALISATION,
                    //'assertion'  => Assertion\MissionAssertion::class,
                    'assertion'  => Assertion\SuiviAssertion::class,
                ],
            ],
        ],
@@ -30,41 +30,42 @@ return [
                            'controller' => Controller\SuiviController::class,
                            'action'     => 'liste',
                            'privileges' => Privileges::MISSION_VISUALISATION,
                            'assertion'  => Assertion\SuiviAssertion::class,
                        ],
                        'ajout'   => [
                            'route'      => '/ajout/:intervenant/:date',
                            'controller' => Controller\SuiviController::class,
                            'action'     => 'ajout',
                            'privileges' => Privileges::MISSION_EDITION_REALISE,
//                            'assertion'  => Assertion\SuiviAssertion::class,
                            'assertion'  => Assertion\SuiviAssertion::class,
                        ],
                        'modifier'  => [
                            'route'      => '/modifier/:volumeHoraireMission',
                            'controller' => Controller\SuiviController::class,
                            'action'     => 'modifier',
                            'privileges' => Privileges::MISSION_EDITION_REALISE,
//                            'assertion'  => Assertion\SuiviAssertion::class,
                            'assertion'  => Assertion\SuiviAssertion::class,
                        ],
                        'supprimer' => [
                            'route'      => '/supprimer/:volumeHoraireMission',
                            'controller' => Controller\SuiviController::class,
                            'action'     => 'supprimer',
                            'privileges' => Privileges::MISSION_EDITION_REALISE,
//                            'assertion'  => Assertion\SuiviAssertion::class,
                            'assertion'  => Assertion\SuiviAssertion::class,
                        ],
                        'valider'   => [
                            'route'      => '/valider/:volumeHoraireMission',
                            'controller' => Controller\SuiviController::class,
                            'action'     => 'valider',
                            'privileges' => Privileges::MISSION_VALIDATION_REALISE,
//                            'assertion'  => Assertion\SuiviAssertion::class,
                            'assertion'  => Assertion\SuiviAssertion::class,
                        ],
                        'devalider' => [
                            'route'      => '/devalider/:volumeHoraireMission',
                            'controller' => Controller\SuiviController::class,
                            'action'     => 'devalider',
                            'privileges' => Privileges::MISSION_DEVALIDATION_REALISE,
//                            'assertion'  => Assertion\SuiviAssertion::class,
                            'assertion'  => Assertion\SuiviAssertion::class,
                        ],
                    ],
                ],
@@ -83,9 +84,8 @@ return [
                    'paramsInject'        => [
                        'intervenant',
                    ],
                    'workflow-etape-code' => WfEtape::CODE_MISSION_SAISIE_REALISE,
                    'withtarget'          => true,
                    'visible'             => Assertion\WorkflowAssertion::class,
                    'visible'             => Assertion\SuiviAssertion::class,
                    'order'               => 13,
                ],
            ],
+82 −0
Changes for module/Mission/src/Assertion/SaisieAssertion.php: 82 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -3,8 +3,11 @@
namespace Mission\Assertion;

use Application\Acl\Role;
use Application\Entity\Db\Intervenant;
use Application\Entity\Db\Structure;
use Application\Entity\Db\WfEtape;
use Application\Provider\Privilege\Privileges;
use Application\Service\Traits\WorkflowServiceAwareTrait;
use Mission\Entity\Db\Mission;
use Mission\Entity\Db\VolumeHoraireMission;
use UnicaenPrivilege\Assertion\AbstractAssertion;
@@ -18,6 +21,85 @@ use Laminas\Permissions\Acl\Resource\ResourceInterface;
 */
class SaisieAssertion extends AbstractAssertion
{
    use WorkflowServiceAwareTrait;


    /* ---- Routage général ---- */
    public function __invoke(array $page) // gestion des visibilités de menus
    {
        return $this->assertPage($page);
    }



    protected function assertPage(array $page)
    {
        /* @var $role Role */
        $role = $this->getRole();

        /** @var Intervenant $intervenant */
        $intervenant = $this->getMvcEvent()->getParam('intervenant');

        if (!$role || !$intervenant) return false;

        return $this->assertWorkflow($intervenant,);
    }



    protected function assertController($controller, $action = null, $privilege = null)
    {
        /* @var $role Role */
        $role = $this->getRole();

        // Si le rôle n'est pas renseigné alors on s'en va...
        if (!$role instanceof Role) return false;
        // pareil si le rôle ne possède pas le privilège adéquat
        if ($privilege && !$role->hasPrivilege($privilege)) return false;

        // Si c'est bon alors on affine...
        $entity = $this->getMvcEvent()->getParam('intervenant');
        if (!$entity) {
            $entity = $this->getMvcEvent()->getParam('mission');
        }
        if (!$entity) {
            $entity = $this->getMvcEvent()->getParam('volumeHoraireMission');
        }
        if (!$entity) {
            return false;
        }
        return $this->assertWorkflow($entity);
    }



    protected function assertWorkflow(Mission|Intervenant|VolumeHoraireMission $entity)
    {
        $codeEtape = WfEtape::CODE_MISSION_SAISIE;

        $structure = null;
        if ($entity instanceof Intervenant) {
            /** @var Role $role */
            $role = $this->getRole();

            $structure = $role->getStructure();
        }
        if ($entity instanceof VolumeHoraireMission) {
            $entity = $entity->getMission();
        }
        if ($entity instanceof Mission) {
            $structure = $entity->getStructure();
            $entity = $entity->getIntervenant();
        }

        $wfEtape = $this->getServiceWorkflow()->getEtape($codeEtape, $entity, $structure);

        if (!$wfEtape) return false;

        return $wfEtape->isAtteignable();
    }



    protected function assertEntity(ResourceInterface $entity = null, $privilege = null)
    {
+78 −1
Changes for module/Mission/src/Assertion/SuiviAssertion.php: 78 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -5,7 +5,9 @@ namespace Mission\Assertion;
use Application\Acl\Role;
use Application\Entity\Db\Intervenant;
use Application\Entity\Db\Structure;
use Application\Entity\Db\WfEtape;
use Application\Provider\Privilege\Privileges;
use Application\Service\Traits\WorkflowServiceAwareTrait;
use Mission\Entity\Db\Mission;
use Mission\Entity\Db\VolumeHoraireMission;
use UnicaenPrivilege\Assertion\AbstractAssertion;
@@ -19,6 +21,82 @@ use Laminas\Permissions\Acl\Resource\ResourceInterface;
 */
class SuiviAssertion extends AbstractAssertion
{
    use WorkflowServiceAwareTrait;


    /* ---- Routage général ---- */
    public function __invoke(array $page) // gestion des visibilités de menus
    {
        return $this->assertPage($page);
    }



    protected function assertPage(array $page)
    {
        /* @var $role Role */
        $role = $this->getRole();

        /** @var Intervenant $intervenant */
        $intervenant = $this->getMvcEvent()->getParam('intervenant');

        if (!$role || !$intervenant) return false;

        return $this->assertWorkflow($intervenant,);
    }



    protected function assertController($controller, $action = null, $privilege = null)
    {
        /* @var $role Role */
        $role = $this->getRole();

        // Si le rôle n'est pas renseigné alors on s'en va...
        if (!$role instanceof Role) return false;
        // pareil si le rôle ne possède pas le privilège adéquat
        if ($privilege && !$role->hasPrivilege($privilege)) return false;

        // Si c'est bon alors on affine...
        $entity = $this->getMvcEvent()->getParam('intervenant');
        if (!$entity) {
            $entity = $this->getMvcEvent()->getParam('volumeHoraireMission');
        }
        if (!$entity) {
            return false;
        }
        return $this->assertWorkflow($entity);
    }



    protected function assertWorkflow(Mission|Intervenant|VolumeHoraireMission $entity)
    {
        $codeEtape = WfEtape::CODE_MISSION_SAISIE_REALISE;

        $structure = null;
        if ($entity instanceof Intervenant) {
            /** @var Role $role */
            $role = $this->getRole();

            $structure = $role->getStructure();
        }
        if ($entity instanceof VolumeHoraireMission) {
            $entity = $entity->getMission();
        }
        if ($entity instanceof Mission) {
            $structure = $entity->getStructure();
            $entity = $entity->getIntervenant();
        }

        $wfEtape = $this->getServiceWorkflow()->getEtape($codeEtape, $entity, $structure);

        if (!$wfEtape) return false;

        return $wfEtape->isAtteignable();
    }



    protected function assertEntity(ResourceInterface $entity = null, $privilege = null)
    {
@@ -49,7 +127,6 @@ class SuiviAssertion extends AbstractAssertion




    protected function assertVolumeHoraireEdition(Role $role, VolumeHoraireMission $vhm)
    {
        return $this->asserts([
Loading