diff -r 806e57d67020 -r e54dfe4d0b2b vendor/bundles/FOS/UserBundle/Controller/RegistrationController.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vendor/bundles/FOS/UserBundle/Controller/RegistrationController.php Fri Sep 30 11:24:53 2011 +0200 @@ -0,0 +1,134 @@ + + * + * 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 Symfony\Component\Security\Core\Exception\AccessDeniedException; +use FOS\UserBundle\Model\UserInterface; + +/** + * Controller managing the registration + * + * @author Thibault Duplessis + * @author Christophe Coevoet + */ +class RegistrationController extends ContainerAware +{ + public function registerAction() + { + $form = $this->container->get('fos_user.registration.form'); + $formHandler = $this->container->get('fos_user.registration.form.handler'); + $confirmationEnabled = $this->container->getParameter('fos_user.registration.confirmation.enabled'); + + $process = $formHandler->process($confirmationEnabled); + if ($process) { + $user = $form->getData(); + + if ($confirmationEnabled) { + $this->container->get('session')->set('fos_user_send_confirmation_email/email', $user->getEmail()); + $route = 'fos_user_registration_check_email'; + } else { + $this->authenticateUser($user); + $route = 'fos_user_registration_confirmed'; + } + + $this->setFlash('fos_user_success', 'registration.flash.user_created'); + $url = $this->container->get('router')->generate($route); + + return new RedirectResponse($url); + } + + return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:register.html.'.$this->getEngine(), array( + 'form' => $form->createView(), + 'theme' => $this->container->getParameter('fos_user.template.theme'), + )); + } + + /** + * Tell the user to check his email provider + */ + public function checkEmailAction() + { + $email = $this->container->get('session')->get('fos_user_send_confirmation_email/email'); + $this->container->get('session')->remove('fos_user_send_confirmation_email/email'); + $user = $this->container->get('fos_user.user_manager')->findUserByEmail($email); + + if (null === $user) { + throw new NotFoundHttpException(sprintf('The user with email "%s" does not exist', $email)); + } + + return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:checkEmail.html.'.$this->getEngine(), array( + 'user' => $user, + )); + } + + /** + * Receive the confirmation token from user email provider, login the user + */ + public function confirmAction($token) + { + $user = $this->container->get('fos_user.user_manager')->findUserByConfirmationToken($token); + + if (null === $user) { + throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist', $token)); + } + + $user->setConfirmationToken(null); + $user->setEnabled(true); + + $this->container->get('fos_user.user_manager')->updateUser($user); + $this->authenticateUser($user); + + return new RedirectResponse($this->container->get('router')->generate('fos_user_registration_confirmed')); + } + + /** + * Tell the user his account is now confirmed + */ + public function confirmedAction() + { + $user = $this->container->get('security.context')->getToken()->getUser(); + if (!is_object($user) || !$user instanceof UserInterface) { + throw new AccessDeniedException('This user does not have access to this section.'); + } + + return $this->container->get('templating')->renderResponse('FOSUserBundle:Registration:confirmed.html.'.$this->getEngine(), array( + 'user' => $user, + )); + } + + /** + * Authenticate a user with Symfony Security + * + * @param Boolean $reAuthenticate + */ + 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); + } + + protected function setFlash($action, $value) + { + $this->container->get('session')->setFlash($action, $value); + } + + protected function getEngine() + { + return $this->container->getParameter('fos_user.template.engine'); + } +}