+<?php
+
+namespace Rapsys\UserBundle\Controller;
+
+use Symfony\Bundle\FrameworkBundle\Controller\Controller;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
+use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
+use Symfony\Component\Form\FormError;
+use Rapsys\UserBundle\Utils\Slugger;
+
+class DefaultController extends Controller {
+ public function loginAction(Request $request, AuthenticationUtils $authenticationUtils) {
+ //Get template
+ $template = $this->container->getParameter(($alias = $this->getAlias()).'.login.template');
+ //Get context
+ $context = $this->container->getParameter($alias.'.login.context');
+
+ //Create the form according to the FormType created previously.
+ //And give the proper parameters
+ $form = $this->createForm('Rapsys\UserBundle\Form\LoginType', null, array(
+ // To set the action use $this->generateUrl('route_identifier')
+ 'action' => $this->generateUrl('rapsys_user_login'),
+ 'method' => 'POST'
+ ));
+
+ //Get the login error if there is one
+ if ($error = $authenticationUtils->getLastAuthenticationError()) {
+ //Get translator
+ $trans = $this->get('translator');
+
+ //Get translated error
+ $error = $trans->trans($error->getMessageKey());
+
+ //Add error message to mail field
+ $form->get('mail')->addError(new FormError($error));
+ }
+
+ //Last username entered by the user
+ if ($lastUsername = $authenticationUtils->getLastUsername()) {
+ $form->get('mail')->setData($lastUsername);
+ }
+
+ //Render view
+ return $this->render($template, $context+array('form' => $form->createView(), 'error' => $error));
+ }
+
+ public function registerAction(Request $request, UserPasswordEncoderInterface $encoder) {
+ //Get mail template
+ $mailTemplate = $this->container->getParameter(($alias = $this->getAlias()).'.register.mail_template');
+ //Get mail context
+ $mailContext = $this->container->getParameter($alias.'.register.mail_context');
+ //Get template
+ $template = $this->container->getParameter($alias.'.register.template');
+ //Get context
+ $context = $this->container->getParameter($alias.'.register.context');
+ //Get home name
+ $homeName = $this->container->getParameter($alias.'.contact.home_name');
+ //Get home args
+ $homeArgs = $this->container->getParameter($alias.'.contact.home_args');
+ //Get contact name
+ $contactName = $this->container->getParameter($alias.'.contact.name');
+ //Get contact mail
+ $contactMail = $this->container->getParameter($alias.'.contact.mail');
+ //TODO: check if doctrine orm replacement is enough with default classes here
+ //Get class user
+ $classUser = $this->container->getParameter($alias.'.class.user');
+ //Get class group
+ $classGroup = $this->container->getParameter($alias.'.class.group');
+ //Get class title
+ $classTitle = $this->container->getParameter($alias.'.class.title');
+
+ //Create the form according to the FormType created previously.
+ //And give the proper parameters
+ $form = $this->createForm('Rapsys\UserBundle\Form\RegisterType', null, array(
+ // To set the action use $this->generateUrl('route_identifier')
+ 'class_title' => $classTitle,
+ 'action' => $this->generateUrl('rapsys_user_register'),
+ 'method' => 'POST'
+ ));
+
+ if ($request->isMethod('POST')) {
+ // Refill the fields in case the form is not valid.
+ $form->handleRequest($request);
+
+ if ($form->isValid()) {
+ //Get translator
+ $trans = $this->get('translator');
+
+ //Set data
+ $data = $form->getData();
+
+ //Translate title
+ $mailContext['title'] = $trans->trans($mailContext['title']);
+
+ //Translate title
+ $mailContext['subtitle'] = $trans->trans($mailContext['subtitle'], array('%name%' => $data['forename'].' '.$data['surname'].' ('.$data['pseudonym'].')'));
+
+ //Translate subject
+ $mailContext['subject'] = $trans->trans($mailContext['subject'], array('%title%' => $mailContext['title']));
+
+ //Translate message
+ $mailContext['message'] = $trans->trans($mailContext['message'], array('%title%' => $mailContext['title']));
+
+ //Create message
+ $message = \Swift_Message::newInstance()
+ ->setSubject($mailContext['subject'])
+ ->setFrom(array($contactMail => $contactName))
+ ->setTo(array($data['mail'] => $data['forename'].' '.$data['surname']))
+ ->setBody($mailContext['message'])
+ ->addPart(
+ $this->renderView(
+ $mailTemplate,
+ $mailContext+array(
+ 'home' => $this->get('router')->generate($homeName, $homeArgs, UrlGeneratorInterface::ABSOLUTE_URL)
+ )
+ ),
+ 'text/html'
+ );
+
+ //Get doctrine
+ $doctrine = $this->getDoctrine();
+
+ //Get manager
+ $manager = $doctrine->getManager();
+
+ //Init reflection
+ $reflection = new \ReflectionClass($classUser);
+
+ //Create new user
+ $user = $reflection->newInstance();
+
+ $user->setMail($data['mail']);
+ $user->setPseudonym($data['pseudonym']);
+ $user->setForename($data['forename']);
+ $user->setSurname($data['surname']);
+ $user->setPassword($encoder->encodePassword($user, $data['password']));
+ $user->setActive(true);
+ $user->setTitle($data['title']);
+ //TODO: see if we can't modify group constructor to set role directly from args
+ //XXX: see vendor/symfony/symfony/src/Symfony/Component/Security/Core/Role/Role.php
+ $user->addGroup($doctrine->getRepository($classGroup)->findOneByRole('ROLE_USER'));
+ $user->setCreated(new \DateTime('now'));
+ $user->setUpdated(new \DateTime('now'));
+
+ //Persist user
+ $manager->persist($user);
+
+ try {
+ //Send to database
+ $manager->flush();
+
+ //Send message
+ if ($this->get('mailer')->send($message)) {
+ //Redirect to cleanup the form
+ return $this->redirectToRoute('rapsys_user_register', array('sent' => 1));
+ }
+ } catch (\Doctrine\DBAL\Exception\UniqueConstraintViolationException $e) {
+ //Add error message mail already exists
+ $form->get('mail')->addError(new FormError($trans->trans('Account already exists: %mail%', array('%mail%' => $data['mail']))));
+ }
+ }
+ }
+
+ //Render view
+ return $this->render($template, $context+array('form' => $form->createView(), 'sent' => $request->query->get('sent', 0)));
+ }
+
+ public function recoverAction(Request $request, Slugger $slugger) {
+ //Get mail template
+ $mailTemplate = $this->container->getParameter(($alias = $this->getAlias()).'.recover.mail_template');
+ //Get mail context
+ $mailContext = $this->container->getParameter($alias.'.recover.mail_context');
+ //Get template
+ $template = $this->container->getParameter($alias.'.recover.template');
+ //Get context
+ $context = $this->container->getParameter($alias.'.recover.context');
+ //Get url name
+ $urlName = $this->container->getParameter($alias.'.recover.url_name');
+ //Get url args
+ $urlArgs = $this->container->getParameter($alias.'.recover.url_args');
+ //Get home name
+ $homeName = $this->container->getParameter($alias.'.contact.home_name');
+ //Get home args
+ $homeArgs = $this->container->getParameter($alias.'.contact.home_args');
+ //Get contact name
+ $contactName = $this->container->getParameter($alias.'.contact.name');
+ //Get contact mail
+ $contactMail = $this->container->getParameter($alias.'.contact.mail');
+ //Get class user
+ $classUser = $this->container->getParameter($alias.'.class.user');
+
+ //Create the form according to the FormType created previously.
+ //And give the proper parameters
+ $form = $this->createForm('Rapsys\UserBundle\Form\RecoverType', null, array(
+ // To set the action use $this->generateUrl('route_identifier')
+ 'action' => $this->generateUrl('rapsys_user_recover'),
+ 'method' => 'POST'
+ ));
+
+ if ($request->isMethod('POST')) {
+ // Refill the fields in case the form is not valid.
+ $form->handleRequest($request);
+
+ if ($form->isValid()) {
+ //Get translator
+ $trans = $this->get('translator');
+
+ //Get doctrine
+ $doctrine = $this->getDoctrine();
+
+ //Set data
+ $data = $form->getData();
+
+ //Translate title
+ $mailContext['title'] = $trans->trans($mailContext['title']);
+
+ //Try to find user
+ if ($user = $doctrine->getRepository($classUser)->findOneByMail($data['mail'])) {
+ //Translate title
+ $mailContext['subtitle'] = $trans->trans($mailContext['subtitle'], array('%name%' => $user->getForename().' '.$user->getSurname().' ('.$user->getPseudonym().')'));
+
+ //Translate subject
+ $mailContext['subject'] = $trans->trans($mailContext['subject'], array('%title%' => $mailContext['title']));
+
+ //Translate message
+ $mailContext['raw'] = $trans->trans($mailContext['raw'], array('%title%' => $mailContext['title'], '%url%' => $this->get('router')->generate($urlName, $urlArgs+array('mail' => $slugger->short($user->getMail()), 'hash' => $slugger->hash($user->getPassword())), UrlGeneratorInterface::ABSOLUTE_URL)));
+
+ //Create message
+ $message = \Swift_Message::newInstance()
+ ->setSubject($mailContext['subject'])
+ ->setFrom(array($contactMail => $contactName))
+ ->setTo(array($user->getMail() => $user->getForename().' '.$user->getSurname()))
+ ->setBody(strip_tags($mailContext['raw']))
+ ->addPart(
+ $this->renderView(
+ $mailTemplate,
+ $mailContext+array(
+ 'home' => $this->get('router')->generate($homeName, $homeArgs, UrlGeneratorInterface::ABSOLUTE_URL)
+ )
+ ),
+ 'text/html'
+ );
+
+ //Send message
+ if ($this->get('mailer')->send($message)) {
+ //Redirect to cleanup the form
+ return $this->redirectToRoute('rapsys_user_recover', array('sent' => 1));
+ }
+ //Accout not found
+ } else {
+ //Add error message to mail field
+ $form->get('mail')->addError(new FormError($trans->trans('Unable to find account: %mail%', array('%mail%' => $data['mail']))));
+ }
+ }
+ }
+
+ //Render view
+ return $this->render($template, $context+array('form' => $form->createView(), 'sent' => $request->query->get('sent', 0)));
+ }
+
+ public function recoverMailAction(Request $request, UserPasswordEncoderInterface $encoder, Slugger $slugger, $mail, $hash) {
+ //Get mail template
+ $mailTemplate = $this->container->getParameter(($alias = $this->getAlias()).'.recover_mail.mail_template');
+ //Get mail context
+ $mailContext = $this->container->getParameter($alias.'.recover_mail.mail_context');
+ //Get template
+ $template = $this->container->getParameter($alias.'.recover_mail.template');
+ //Get context
+ $context = $this->container->getParameter($alias.'.recover_mail.context');
+ //Get url name
+ $urlName = $this->container->getParameter($alias.'.recover_mail.url_name');
+ //Get url args
+ $urlArgs = $this->container->getParameter($alias.'.recover_mail.url_args');
+ //Get home name
+ $homeName = $this->container->getParameter($alias.'.contact.home_name');
+ //Get home args
+ $homeArgs = $this->container->getParameter($alias.'.contact.home_args');
+ //Get contact name
+ $contactName = $this->container->getParameter($alias.'.contact.name');
+ //Get contact mail
+ $contactMail = $this->container->getParameter($alias.'.contact.mail');
+ //Get class user
+ $classUser = $this->container->getParameter($alias.'.class.user');
+
+ //Create the form according to the FormType created previously.
+ //And give the proper parameters
+ $form = $this->createForm('Rapsys\UserBundle\Form\RecoverMailType', null, array(
+ // To set the action use $this->generateUrl('route_identifier')
+ 'action' => $this->generateUrl('rapsys_user_recover_mail', array('mail' => $mail, 'hash' => $hash)),
+ 'method' => 'POST'
+ ));
+
+ //Get doctrine
+ $doctrine = $this->getDoctrine();
+
+ //Get translator
+ $trans = $this->get('translator');
+
+ //Init not found
+ $notfound = 1;
+
+ //Retrieve user
+ if (($user = $doctrine->getRepository($classUser)->findOneByMail($slugger->unshort($mail))) && $hash == $slugger->hash($user->getPassword())) {
+ //User was found
+ $notfound = 0;
+
+ if ($request->isMethod('POST')) {
+ // Refill the fields in case the form is not valid.
+ $form->handleRequest($request);
+
+ if ($form->isValid()) {
+ //Set data
+ $data = $form->getData();
+
+ //Translate title
+ $mailContext['title'] = $trans->trans($mailContext['title']);
+
+ //Translate title
+ $mailContext['subtitle'] = $trans->trans($mailContext['subtitle'], array('%name%' => $user->getForename().' '.$user->getSurname().' ('.$user->getPseudonym().')'));
+
+ //Translate subject
+ $mailContext['subject'] = $trans->trans($mailContext['subject'], array('%title%' => $mailContext['title']));
+
+ //Set user password
+ $user->setPassword($encoder->encodePassword($user, $data['password']));
+
+ //Translate message
+ $mailContext['raw'] = $trans->trans($mailContext['raw'], array('%title%' => $mailContext['title'], '%url%' => $this->get('router')->generate($urlName, $urlArgs+array('mail' => $slugger->short($user->getMail()), 'hash' => $slugger->hash($user->getPassword())), UrlGeneratorInterface::ABSOLUTE_URL)));
+
+ //Get manager
+ $manager = $doctrine->getManager();
+
+ //Persist user
+ $manager->persist($user);
+
+ //Send to database
+ $manager->flush();
+
+ //Create message
+ $message = \Swift_Message::newInstance()
+ ->setSubject($mailContext['subject'])
+ ->setFrom(array($contactMail => $contactName))
+ ->setTo(array($user->getMail() => $user->getForename().' '.$user->getSurname()))
+ ->setBody(strip_tags($mailContext['raw']))
+ ->addPart(
+ $this->renderView(
+ $mailTemplate,
+ $mailContext+array(
+ 'home' => $this->get('router')->generate($homeName, $homeArgs, UrlGeneratorInterface::ABSOLUTE_URL)
+ )
+ ),
+ 'text/html'
+ );
+
+ //Send message
+ if ($this->get('mailer')->send($message)) {
+ //Redirect to cleanup the form
+ return $this->redirectToRoute('rapsys_user_recover_mail', array('mail' => $mail, 'hash' => $hash, 'sent' => 1));
+ }
+ }
+ }
+ }
+
+ //Render view
+ return $this->render($template, $context+array('form' => $form->createView(), 'sent' => $request->query->get('sent', 0), 'notfound' => $notfound));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAlias() {
+ return 'rapsys_user';
+ }
+}