2019-08-10 18:06:28 +02:00
< ? php
2020-02-22 18:14:36 +01:00
/**
* This file is part of Part - DB ( https :// github . com / Part - DB / Part - DB - symfony ) .
*
* Copyright ( C ) 2019 - 2020 Jan Böhmer ( https :// github . com / jbtronics )
*
* 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 < https :// www . gnu . org / licenses />.
*/
2020-01-05 15:46:58 +01:00
declare ( strict_types = 1 );
2019-08-10 18:06:28 +02:00
/**
2019-11-09 00:47:20 +01:00
* This file is part of Part - DB ( https :// github . com / Part - DB / Part - DB - symfony ) .
2019-08-10 18:06:28 +02:00
*
2019-11-01 13:40:30 +01:00
* Copyright ( C ) 2019 Jan Böhmer ( https :// github . com / jbtronics )
2019-08-10 18:06:28 +02:00
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation ; either version 2
* 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 General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA
*/
namespace App\Security\Voter ;
2019-08-12 15:47:57 +02:00
use App\Entity\Attachments\Attachment ;
use App\Entity\UserSystem\User ;
2022-11-14 20:15:06 +01:00
use App\Services\UserSystem\PermissionManager ;
2022-11-02 23:27:44 +01:00
use Doctrine\ORM\EntityManagerInterface ;
use Symfony\Component\Security\Core\Security ;
2020-01-05 22:49:00 +01:00
use function in_array ;
2019-08-10 18:06:28 +02:00
class AttachmentVoter extends ExtendedVoter
{
2022-11-02 23:27:44 +01:00
protected $security ;
2022-11-14 20:15:06 +01:00
public function __construct ( PermissionManager $resolver , EntityManagerInterface $entityManager , Security $security )
2022-11-02 23:27:44 +01:00
{
parent :: __construct ( $resolver , $entityManager );
$this -> security = $security ;
}
2019-08-10 18:06:28 +02:00
/**
* Similar to voteOnAttribute , but checking for the anonymous user is already done .
* The current user ( or the anonymous user ) is passed by $user .
*
2022-08-14 19:09:07 +02:00
* @ param string $attribute
2019-08-10 18:06:28 +02:00
*/
2022-08-14 19:09:07 +02:00
protected function voteOnUser ( string $attribute , $subject , User $user ) : bool
2019-08-10 18:06:28 +02:00
{
2022-11-02 23:27:44 +01:00
//return $this->resolver->inherit($user, 'attachments', $attribute) ?? false;
//If the attachment has no element (which should not happen), we deny access, as we can not determine if the user is allowed to access the associated element
$target_element = $subject -> getElement ();
if ( ! $subject instanceof Attachment || null === $target_element ) {
return false ;
}
//Depending on the operation delegate either to the attachments element or to the attachment permission
switch ( $attribute ) {
//We can view the attachment if we can view the element
case 'read' :
case 'view' :
return $this -> security -> isGranted ( 'read' , $target_element );
//We can edit/create/delete the attachment if we can edit the element
case 'edit' :
case 'create' :
case 'delete' :
return $this -> security -> isGranted ( 'edit' , $target_element );
case 'show_private' :
return $this -> resolver -> inherit ( $user , 'attachments' , 'show_private' ) ? ? false ;
}
2022-11-27 16:53:44 +01:00
throw new \RuntimeException ( 'Encountered unknown attribute "' . $attribute . '" in AttachmentVoter!' );
2019-08-10 18:06:28 +02:00
}
/**
* Determines if the attribute and subject are supported by this voter .
*
2022-08-14 19:09:07 +02:00
* @ param string $attribute An attribute
2019-11-09 00:47:20 +01:00
* @ param mixed $subject The subject to secure , e . g . an object the user wants to access or any other PHP type
2019-08-10 18:06:28 +02:00
*
* @ return bool True if the attribute and subject are supported , false otherwise
*/
2022-08-14 19:09:07 +02:00
protected function supports ( string $attribute , $subject ) : bool
2019-08-10 18:06:28 +02:00
{
2020-03-07 20:49:52 +01:00
if ( is_a ( $subject , Attachment :: class , true )) {
2022-11-02 23:27:44 +01:00
//These are the allowed attributes
2022-11-09 23:33:50 +01:00
return in_array ( $attribute , [ 'read' , 'view' , 'edit' , 'delete' , 'create' , 'show_private' ], true );
2019-08-10 18:06:28 +02:00
}
2020-03-07 20:49:52 +01:00
//Allow class name as subject
2019-08-10 18:06:28 +02:00
return false ;
}
2019-11-09 00:47:20 +01:00
}