<?php
namespace App\Security\Voter;
use App\Entity\File\OSFile;
use App\Features\OSFile\IOSFileAccessManager;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class OSFileAccessVoter extends Voter
{
public const READ = 'READ_OS_FILE';
public const DOWNLOAD = 'DOWNLOAD_OS_FILE';
public function __construct(private IOSFileAccessManager $fileAccessManager){}
protected function supports(string $attribute, $subject): bool
{
return in_array($attribute, [self::READ, self::DOWNLOAD]) && $subject instanceof OSFile;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
if($this->fileAccessManager->isPublic($subject)){
return true;
}
$user = $token->getUser();
if (!$user instanceof UserInterface) {
return false;
}
return match ($attribute) {
self::READ => $this->fileAccessManager->canRead($subject, $user),
self::DOWNLOAD => $this->fileAccessManager->canDownload($subject, $user),
default => false,
};
}
}