<?php 
 
/* 
 * This file is part of the FOSUserBundle package. 
 * 
 * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/> 
 * 
 * For the full copyright and license information, please view the LICENSE 
 * file that was distributed with this source code. 
 */ 
 
namespace FOS\UserBundle\EventListener; 
 
use FOS\UserBundle\Event\FilterUserResponseEvent; 
use FOS\UserBundle\Event\UserEvent; 
use FOS\UserBundle\FOSUserEvents; 
use FOS\UserBundle\Security\LoginManagerInterface; 
use Symfony\Component\EventDispatcher\EventDispatcherInterface; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\Security\Core\Exception\AccountStatusException; 
 
class AuthenticationListener implements EventSubscriberInterface 
{ 
    /** 
     * @var LoginManagerInterface 
     */ 
    private $loginManager; 
 
    /** 
     * @var string 
     */ 
    private $firewallName; 
 
    /** 
     * AuthenticationListener constructor. 
     * 
     * @param LoginManagerInterface $loginManager 
     * @param string                $firewallName 
     */ 
    public function __construct(LoginManagerInterface $loginManager, $firewallName) 
    { 
        $this->loginManager = $loginManager; 
        $this->firewallName = $firewallName; 
    } 
 
    /** 
     * {@inheritdoc} 
     */ 
    public static function getSubscribedEvents() 
    { 
        return array( 
            FOSUserEvents::REGISTRATION_COMPLETED => 'authenticate', 
            FOSUserEvents::REGISTRATION_CONFIRMED => 'authenticate', 
            FOSUserEvents::RESETTING_RESET_COMPLETED => 'authenticate', 
        ); 
    } 
 
    /** 
     * @param FilterUserResponseEvent  $event 
     * @param string                   $eventName 
     * @param EventDispatcherInterface $eventDispatcher 
     */ 
    public function authenticate(FilterUserResponseEvent $event, $eventName, EventDispatcherInterface $eventDispatcher) 
    { 
        try { 
            $this->loginManager->logInUser($this->firewallName, $event->getUser(), $event->getResponse()); 
 
            $eventDispatcher->dispatch(FOSUserEvents::SECURITY_IMPLICIT_LOGIN, new UserEvent($event->getUser(), $event->getRequest())); 
        } catch (AccountStatusException $ex) { 
            // We simply do not authenticate users which do not pass the user 
            // checker (not enabled, expired, etc.). 
        } 
    } 
}