<?php declare(strict_types=1);namespace Nen\Bundle\KennisbankPlatformBundle\Security\Voter;use Nen\Bundle\KennisbankPlatformBundle\Entity\BoltPublication;use App\Entity\User;use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;use Symfony\Component\Security\Core\Authorization\Voter\Voter;class PublicationVoter extends Voter{ /** * */ const ATTRIBUTE_READ = 'publication.read'; /** * */ const ATTRIBUTE_DOWNLOAD = 'publication.download'; /** * {@inheritDoc} */ protected function supports($attribute, $subject) { return is_object($subject) && get_class($subject) === BoltPublication::class; } /** * {@inheritDoc} */ protected function voteOnAttribute($attribute, $subject, TokenInterface $token) { /** @var User|null $user */ $user = $token->getUser(); if (!$user instanceof User) { $user = null; } /** @var BoltPublication $publication */ $publication = $subject; switch ($attribute) { case self::ATTRIBUTE_READ: return $this->canReadPublication($publication, $user); case self::ATTRIBUTE_DOWNLOAD: return $this->canDownloadPublication($publication, $user); } return false; } /** * @param BoltPublication $publication * @param User|null $user * @return bool */ private function canReadPublication(BoltPublication $publication, User $user = null): bool { if (!$publication->isOnlineReadable()) { return false; } if ($publication->isOnlineReadablePublic()) { return true; } if (empty($user)) { return false; } $subscriptions = $publication->getOnlineReadableSubscriptions(); if (empty($subscriptions)) { return true; } return in_array($user->getCompany()->getLicenseType(), $subscriptions); } /** * @param BoltPublication $publication * @param User|null $user * @return bool */ private function canDownloadPublication(BoltPublication $publication, User $user = null): bool { if (!$publication->isDownloadable()) { return false; } if ($publication->isDownloadablePublic()) { return true; } if (empty($user)) { return false; } $subscriptions = $publication->getDownloadableSubscriptions(); if (empty($subscriptions)) { return !$user->isCompanyTrialSubscription(); } return in_array($user->getCompany()->getLicenseType(), $subscriptions); }}