<?php
namespace App\Security\Voter;
use App\Entity\Affiliate;
use App\Entity\AffiliateIP;
use App\Utils\RoutePathUtils;
use App\Utils\UserUtils;
use Doctrine\ORM\EntityManager;
use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\HttpFoundation\Request;
class RouteVoter extends Voter
{
public static $allowRoutes = [
'login',
'logout',
'push_alerts'
];
protected $container;
/** @var EntityManager $em */
protected $em;
public function __construct(ContainerInterface $container) // this is @service_container
{
$this->container = $container;
$this->em = $this->container->get('doctrine');
}
protected function supports($attribute, $subject)
{
$allRouteNames = RoutePathUtils::getAllName($this->container);
$allRouteNames = array_merge($allRouteNames, self::$allowRoutes);
if (in_array($attribute, $allRouteNames)) {
return true;
}
return false;
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
{
if (in_array($attribute, self::$allowRoutes)) {
return true;
}
$isGranted = false;
if ($subject instanceof Request) {
/** @var Request $request */
$request = $subject;
$ipAddress = $subject->getClientIp();
/** @var AffiliateIP $IP */
if ($request->request->has('afid') && ($AFID = $this->em->getRepository(Affiliate::class)->findOneBy(['name' => $request->request->get('afid')])) !== null) {
/** @var AffiliateIP $IP */
if (($IP = $this->em->getRepository(AffiliateIP::class)->findOneBy(['affiliate' => $AFID->getId()])) !== null
&& $IP->getIPaddress() === '*'
) {
$isGranted = true;
} elseif (($IP = $this->em->getRepository(AffiliateIP::class)->findOneBy(['IPaddress' => $ipAddress, 'affiliate' => $AFID->getId()])) !== null) {
$isGranted = true;
}
} elseif (($IP = $this->em->getRepository(AffiliateIP::class)->findOneBy(['IPaddress' => $ipAddress])) !== null) {
$isGranted = true;
}
}
$afids = UserUtils::getAfids($token->getUser());
if (count($afids) && $this->em->getRepository(Affiliate::class)->findBy(['id' => $afids]) !== null) {
if (in_array($attribute, ['admin_access_index', 'admin_access_remove', 'admin_access_new'])) {
$isGranted = true;
}
}
return $isGranted;
}
}