<?php//----------------------------------------------------------------------// src/Services/Mission/MissionSecurityTools.php//// Plan.io Task #4024// We need to test the fact that a Mission is shareable// inside voters and outside.// So in order to avoid duplicating code, have a special service// which deals with this (shit) :)//----------------------------------------------------------------------namespace App\Services\Mission;use Doctrine\Common\Collections\ArrayCollection;use Doctrine\Persistence\ManagerRegistry;use App\Entity\Access;use App\Entity\SocietyGroup;use App\Entity\Mission\Mission;use App\Entity\Planning\TaskShareData;use App\Services\LogTools;class MissionSecurityTools{ public function __construct(ManagerRegistry $doctrine, LogTools $logTools) { $this->em = $doctrine->getManager(); $this->logTools = $logTools; } public function cannotBeShared(Mission $mission) { return !$this->canBeShared($mission); } public function canBeShared(Mission $mission) { if ($this->verifyCommonRestrictions($mission) === false) { return false; } // Cannot share a mission that is already shared if ($mission->isShared()) { return false; } // Plan.io Task #4071 // Deny sharing a parent mission with at least one child if ($mission->hasChildren()) { return false; // Old code // // Deny sharing a parent mission with at least one shared child foreach ($mission->getChildren() as $child) { if ($child->isShared()) { return false; } } } // Plan.io Task #4071 // Deny sharing a child mission if the parent is already shared if ($mission->getParent() !== null) { if ($mission->getParent()->isShared()) { return false; } } // If we are here all is good return true; } // Used in MissionSearchController :: searchSelect_sharedTaskEmitterSide public function canBeShared_sharedTask(Mission $mission, TaskShareData $taskShareData) { if ($this->verifyCommonRestrictions($mission) === false) { return false; } $societyGroupReceiver = $taskShareData->getSocietyGroupReceiver(); if ($societyGroupReceiver === null) { return false; } // Cannot share a mission that is already shared // Exception : if it is shared with the taskShareData->societyGroupReceiver $sharedWithReceiver = $societyGroupReceiver->equals($mission->getSocietyGroupOwner()); if ($mission->isShared() && !$sharedWithReceiver) { return false; } // Plan.io Task #4071 // Deny sharing a parent mission with at least one shared child if ($mission->hasChildren()) { return false; // Old code // Deny sharing a parent mission with at least one shared child foreach ($mission->getChildren() as $child) { // Exception : if it is shared with the taskShareData->societyGroupReceiver $sharedWithReceiver = $societyGroupReceiver->equals($child->getSocietyGroupOwner()); if ($child->isShared() && !$sharedWithReceiver) { return false; } } } // Plan.io Task #4071 // Deny sharing a child mission if the parent is already shared if ($mission->getParent() !== null) { // Exception : if it is shared with the taskShareData->societyGroupReceiver $sharedWithReceiver = $societyGroupReceiver->equals($mission->getParent()->getSocietyGroupOwner()); if ($mission->getParent()->isShared() && !$sharedWithReceiver) { return false; } } // If we are here all is good return true; } protected function verifyCommonRestrictions(Mission $mission) { // Plan.io Task #3182 : Custom MissionStatus // Deny sharing missions with custom statuses if ($mission->hasCustomStatus()) { return false; } // Deny sharing on missions that have already been synced with Rekto if (!empty($mission->getRemoteMissionId())) { return false; } // Deny sharing on archivedRefused objects if ($mission->isArchivedRefused()) { return false; } // Plan.io Task #3304 // Deny sharing a mission for which the owner was paid if ($mission->ownerWasPaid()) { return false; } return true; }}