<?php 
 
namespace Scheb\TwoFactorBundle\Security\Authorization\Voter; 
 
use Scheb\TwoFactorBundle\Security\Authentication\Token\TwoFactorTokenInterface; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter; 
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface; 
 
class TwoFactorInProgressVoter implements VoterInterface 
{ 
    const IS_AUTHENTICATED_2FA_IN_PROGRESS = 'IS_AUTHENTICATED_2FA_IN_PROGRESS'; 
 
    public function vote(TokenInterface $token, $subject, array $attributes) 
    { 
        if (!($token instanceof TwoFactorTokenInterface)) { 
            return VoterInterface::ACCESS_ABSTAIN; 
        } 
 
        foreach ($attributes as $attribute) { 
            if (self::IS_AUTHENTICATED_2FA_IN_PROGRESS === $attribute) { 
                return VoterInterface::ACCESS_GRANTED; 
            } 
            if (AuthenticatedVoter::IS_AUTHENTICATED_ANONYMOUSLY === $attribute) { 
                return VoterInterface::ACCESS_GRANTED; 
            } 
        } 
 
        return VoterInterface::ACCESS_ABSTAIN; 
    } 
}