<?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\FormEvent; 
use FOS\UserBundle\Event\GetResponseUserEvent; 
use FOS\UserBundle\FOSUserEvents; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; 
 
class ResettingListener implements EventSubscriberInterface 
{ 
    /** 
     * @var UrlGeneratorInterface 
     */ 
    private $router; 
 
    /** 
     * @var int 
     */ 
    private $tokenTtl; 
 
    /** 
     * ResettingListener constructor. 
     * 
     * @param UrlGeneratorInterface $router 
     * @param int                   $tokenTtl 
     */ 
    public function __construct(UrlGeneratorInterface $router, $tokenTtl) 
    { 
        $this->router = $router; 
        $this->tokenTtl = $tokenTtl; 
    } 
 
    /** 
     * {@inheritdoc} 
     */ 
    public static function getSubscribedEvents() 
    { 
        return array( 
            FOSUserEvents::RESETTING_RESET_INITIALIZE => 'onResettingResetInitialize', 
            FOSUserEvents::RESETTING_RESET_SUCCESS => 'onResettingResetSuccess', 
            FOSUserEvents::RESETTING_RESET_REQUEST => 'onResettingResetRequest', 
        ); 
    } 
 
    /** 
     * @param GetResponseUserEvent $event 
     */ 
    public function onResettingResetInitialize(GetResponseUserEvent $event) 
    { 
        if (!$event->getUser()->isPasswordRequestNonExpired($this->tokenTtl)) { 
            $event->setResponse(new RedirectResponse($this->router->generate('fos_user_resetting_request'))); 
        } 
    } 
 
    /** 
     * @param FormEvent $event 
     */ 
    public function onResettingResetSuccess(FormEvent $event) 
    { 
        /** @var $user \FOS\UserBundle\Model\UserInterface */ 
        $user = $event->getForm()->getData(); 
 
        $user->setConfirmationToken(null); 
        $user->setPasswordRequestedAt(null); 
        $user->setEnabled(true); 
    } 
 
    /** 
     * @param GetResponseUserEvent $event 
     */ 
    public function onResettingResetRequest(GetResponseUserEvent $event) 
    { 
        if (!$event->getUser()->isAccountNonLocked()) { 
            $event->setResponse(new RedirectResponse($this->router->generate('fos_user_resetting_request'))); 
        } 
    } 
}