diff -r 806e57d67020 -r e54dfe4d0b2b vendor/bundles/FOS/UserBundle/Controller/ResettingController.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/FOS/UserBundle/Controller/ResettingController.php Fri Sep 30 11:24:53 2011 +0200 @@ -0,0 +1,147 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace FOS\UserBundle\Controller; + +use Symfony\Component\DependencyInjection\ContainerAware; +use Symfony\Component\HttpFoundation\RedirectResponse; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; +use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; +use FOS\UserBundle\Model\UserInterface; + +/** + * Controller managing the resetting of the password + * + * @author Thibault Duplessis + * @author Christophe Coevoet + */ +class ResettingController extends ContainerAware +{ + /** + * Request reset user password: show form + */ + public function requestAction() + { + return $this->container->get('templating')->renderResponse('FOSUserBundle:Resetting:request.html.'.$this->getEngine()); + } + + /** + * Request reset user password: submit form and send email + */ + public function sendEmailAction() + { + $username = $this->container->get('request')->request->get('username'); + + $user = $this->container->get('fos_user.user_manager')->findUserByUsernameOrEmail($username); + + if (null === $user){ + return $this->container->get('templating')->renderResponse('FOSUserBundle:Resetting:request.html.'.$this->getEngine(), array('invalid_username' => $username)); + } + + if ($user->isPasswordRequestNonExpired($this->container->getParameter('fos_user.resetting.token_ttl'))) { + return $this->container->get('templating')->renderResponse('FOSUserBundle:Resetting:passwordAlreadyRequested.html.'.$this->getEngine()); + } + + $user->generateConfirmationToken(); + $this->container->get('session')->set('fos_user_send_resetting_email/email', $user->getEmail()); + $this->container->get('fos_user.mailer')->sendResettingEmailMessage($user); + $user->setPasswordRequestedAt(new \DateTime()); + $this->container->get('fos_user.user_manager')->updateUser($user); + + return new RedirectResponse($this->container->get('router')->generate('fos_user_resetting_check_email')); + } + + /** + * Tell the user to check his email provider + */ + public function checkEmailAction() + { + $session = $this->container->get('session'); + $email = $session->get('fos_user_send_resetting_email/email'); + $session->remove('fos_user_send_resetting_email/email'); + $user = $this->container->get('fos_user.user_manager')->findUserByEmail($email); + if (empty($user)) { + return new RedirectResponse($this->container->get('router')->generate('fos_user_resetting_request')); + } + + return $this->container->get('templating')->renderResponse('FOSUserBundle:Resetting:checkEmail.html.'.$this->getEngine(), array( + 'user' => $user, + )); + } + + /** + * Reset user password + */ + public function resetAction($token) + { + $user = $this->container->get('fos_user.user_manager')->findUserByConfirmationToken($token); + + if (null === $user){ + throw new NotFoundHttpException(sprintf('The user with "confirmation token" does not exist for value "%s"', $token)); + } + + if (!$user->isPasswordRequestNonExpired($this->container->getParameter('fos_user.resetting.token_ttl'))) { + return new RedirectResponse($this->container->get('router')->generate('fos_user_resetting_request')); + } + + $form = $this->container->get('fos_user.resetting.form'); + $formHandler = $this->container->get('fos_user.resetting.form.handler'); + $process = $formHandler->process($user); + + if ($process) { + $this->authenticateUser($user); + + $this->setFlash('fos_user_success', 'resetting.flash.success'); + + return new RedirectResponse($this->getRedirectionUrl($user)); + } + + return $this->container->get('templating')->renderResponse('FOSUserBundle:Resetting:reset.html.'.$this->getEngine(), array( + 'token' => $token, + 'form' => $form->createView(), + 'theme' => $this->container->getParameter('fos_user.template.theme'), + )); + } + + /** + * Authenticate a user with Symfony Security + * + * @param UserInterface $user + */ + protected function authenticateUser(UserInterface $user) + { + $providerKey = $this->container->getParameter('fos_user.firewall_name'); + $token = new UsernamePasswordToken($user, null, $providerKey, $user->getRoles()); + + $this->container->get('security.context')->setToken($token); + } + + /** + * Generate the redirection url when the resetting is completed. + * + * @param UserInterface $user + * @return string + */ + protected function getRedirectionUrl(UserInterface $user) + { + return $this->container->get('router')->generate('fos_user_profile_show'); + } + + protected function setFlash($action, $value) + { + $this->container->get('session')->setFlash($action, $value); + } + + protected function getEngine() + { + return $this->container->getParameter('fos_user.template.engine'); + } +}