X-Git-Url: https://git.rapsys.eu/userbundle/blobdiff_plain/7d0059507fed3fd5a81142370a46308e884c5c3d..e63d9bc97a04027f2bf6b53341d47537eb261c1b:/Controller/DefaultController.php diff --git a/Controller/DefaultController.php b/Controller/DefaultController.php index 11c7afb..4bab49b 100644 --- a/Controller/DefaultController.php +++ b/Controller/DefaultController.php @@ -10,8 +10,9 @@ use Symfony\Component\Form\FormError; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Mailer\Exception\TransportExceptionInterface; use Symfony\Component\Mailer\MailerInterface; -use Symfony\Component\Mime\NamedAddress; +use Symfony\Component\Mime\Address; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; +use Symfony\Component\Routing\RouterInterface; use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface; use Symfony\Component\Security\Http\Authentication\AuthenticationUtils; use Symfony\Component\Translation\TranslatorInterface; @@ -23,34 +24,89 @@ class DefaultController extends AbstractController { //Translator instance protected $translator; - public function __construct(ContainerInterface $container, TranslatorInterface $translator) { + public function __construct(ContainerInterface $container, TranslatorInterface $translator, RouterInterface $router) { //Retrieve config $this->config = $container->getParameter($this->getAlias()); //Set the translator $this->translator = $translator; + + //Get current action + //XXX: we don't use this as it would be too slow, maybe ??? + #$action = str_replace(self::getAlias().'_', '', $container->get('request_stack')->getCurrentRequest()->get('_route')); + + //Inject every requested route in view and mail context + foreach($this->config as $tag => $current) { + //Look for entry with route subkey + if (!empty($current['route'])) { + //Generate url for both view and mail + foreach(['view', 'mail'] as $view) { + //Check that context key is usable + if (isset($current[$view]['context']) && is_array($current[$view]['context'])) { + //Process every routes + foreach($current['route'] as $route => $key) { + //Skip recover_mail route as it requires some parameters + if ($route == 'recover_mail') { + continue; + } + //Check that key is empty + if (!isset($current[$view]['context'][$key])) { + //Generate the route + $this->config[$tag][$view]['context'][$key] = $router->generate( + $this->config['route'][$route]['name'], + $this->config['route'][$route]['context'], + //Generate absolute url for mails + $view=='mail'?UrlGeneratorInterface::ABSOLUTE_URL:UrlGeneratorInterface::ABSOLUTE_PATH + ); + } + } + } + } + } + } } public function login(Request $request, AuthenticationUtils $authenticationUtils) { //Create the LoginType form and give the proper parameters - $form = $this->createForm($this->config['login']['view']['form'], null, [ + $login = $this->createForm($this->config['login']['view']['form'], null, [ //Set action to login route name and context 'action' => $this->generateUrl($this->config['route']['login']['name'], $this->config['route']['login']['context']), 'method' => 'POST' ]); + //Init context + $context = []; + + //Last username entered by the user + if ($lastUsername = $authenticationUtils->getLastUsername()) { + $login->get('mail')->setData($lastUsername); + } + //Get the login error if there is one if ($error = $authenticationUtils->getLastAuthenticationError()) { //Get translated error $error = $this->translator->trans($error->getMessageKey()); //Add error message to mail field - $form->get('mail')->addError(new FormError($error)); - } + $login->get('mail')->addError(new FormError($error)); - //Last username entered by the user - if ($lastUsername = $authenticationUtils->getLastUsername()) { - $form->get('mail')->setData($lastUsername); + //Create the RecoverType form and give the proper parameters + $recover = $this->createForm($this->config['recover']['view']['form'], null, [ + //Set action to recover route name and context + 'action' => $this->generateUrl($this->config['route']['recover']['name'], $this->config['route']['recover']['context']), + 'method' => 'POST' + ]); + + //Set mail from login form + $recover->get('mail')->setData($login->get('mail')->getData()); + + //Add recover error + $recover->addError(new FormError( + $this->translator->trans('Use this form to recover your account') + )); + + //Add recover form to context + $context['recover'] = $recover->createView(); } //Render view @@ -58,7 +114,7 @@ class DefaultController extends AbstractController { //Template $this->config['login']['view']['name'], //Context - ['form' => $form->createView(), 'error' => $error]+$this->config['login']['view']['context'] + ['login' => $login->createView()]+$context+$this->config['login']['view']['context'] ); } @@ -87,7 +143,7 @@ class DefaultController extends AbstractController { $mail =& $this->config['recover']['mail']; //Generate each route route - foreach($mail['route'] as $route => $tag) { + foreach($this->config['recover']['route'] as $route => $tag) { //Only process defined routes if (empty($mail['context'][$tag]) && !empty($this->config['route'][$route])) { //Process for recover mail url @@ -118,7 +174,7 @@ class DefaultController extends AbstractController { $subjectContext = []; //Process each context pair - foreach($mail['context'] as $k => $v) { + foreach($mail['context']+$this->config['recover']['view']['context'] as $k => $v) { //Reinsert each context pair with the key surrounded by % $subjectContext['%'.$k.'%'] = $v; } @@ -129,10 +185,10 @@ class DefaultController extends AbstractController { //Create message $message = (new TemplatedEmail()) //Set sender - ->from(new NamedAddress($this->config['contact']['mail'], $this->config['contact']['name'])) + ->from(new Address($this->config['contact']['mail'], $this->config['contact']['name'])) //Set recipient //XXX: remove the debug set in vendor/symfony/mime/Address.php +46 - ->to(new NamedAddress($mail['context']['recipient_mail'], $mail['context']['recipient_name'])) + ->to(new Address($mail['context']['recipient_mail'], $mail['context']['recipient_name'])) //Set subject ->subject($mail['subject']) @@ -141,7 +197,7 @@ class DefaultController extends AbstractController { ->textTemplate($mail['text']) //Set context - ->context(['subject' => $mail['subject']]+$mail['context']); + ->context(['subject' => $mail['subject']]+$mail['context']+$this->config['recover']['view']['context']); //Try sending message //XXX: mail delivery may silently fail @@ -185,14 +241,11 @@ class DefaultController extends AbstractController { //Get doctrine $doctrine = $this->getDoctrine(); - //Init not found - $notfound = 1; + //Init found + $found = false; //Retrieve user - if (($user = $doctrine->getRepository($this->config['class']['user'])->findOneByMail($slugger->unshort($recipient))) && $hash == $slugger->hash($user->getPassword())) { - //User was found - $notfound = 0; - + if (($user = $doctrine->getRepository($this->config['class']['user'])->findOneByMail($slugger->unshort($recipient))) && $found = ($hash == $slugger->hash($user->getPassword()))) { if ($request->isMethod('POST')) { //Refill the fields in case the form is not valid. $form->handleRequest($request); @@ -223,7 +276,7 @@ class DefaultController extends AbstractController { $hash = $slugger->hash($encoded); //Generate each route route - foreach($mail['route'] as $route => $tag) { + foreach($this->config['recover_mail']['route'] as $route => $tag) { //Only process defined routes if (empty($mail['context'][$tag]) && !empty($this->config['route'][$route])) { //Process for recover mail url @@ -253,7 +306,7 @@ class DefaultController extends AbstractController { $subjectContext = []; //Process each context pair - foreach($mail['context'] as $k => $v) { + foreach($mail['context']+$this->config['recover_mail']['view']['context'] as $k => $v) { //Reinsert each context pair with the key surrounded by % $subjectContext['%'.$k.'%'] = $v; } @@ -264,10 +317,10 @@ class DefaultController extends AbstractController { //Create message $message = (new TemplatedEmail()) //Set sender - ->from(new NamedAddress($this->config['contact']['mail'], $this->config['contact']['name'])) + ->from(new Address($this->config['contact']['mail'], $this->config['contact']['name'])) //Set recipient //XXX: remove the debug set in vendor/symfony/mime/Address.php +46 - ->to(new NamedAddress($mail['context']['recipient_mail'], $mail['context']['recipient_name'])) + ->to(new Address($mail['context']['recipient_mail'], $mail['context']['recipient_name'])) //Set subject ->subject($mail['subject']) @@ -276,7 +329,7 @@ class DefaultController extends AbstractController { ->textTemplate($mail['text']) //Set context - ->context(['subject' => $mail['subject']]+$mail['context']); + ->context(['subject' => $mail['subject']]+$mail['context']+$this->config['recover_mail']['view']['context']); //Try sending message //XXX: mail delivery may silently fail @@ -289,14 +342,14 @@ class DefaultController extends AbstractController { //Catch obvious transport exception } catch(TransportExceptionInterface $e) { //Add error message mail unreachable - $form->get('mail')->addError(new FormError($this->translator->trans('Account password updated but unable to contact: %mail%', array('%mail%' => $mail['context']['recipient_mail'])))); + $form->get('password')->get('first')->addError(new FormError($this->translator->trans('Account password updated but unable to contact: %mail%', array('%mail%' => $mail['context']['recipient_mail'])))); } } } //Accout not found } else { //Add error message to mail field - $form->get('mail')->addError(new FormError($this->translator->trans('Unable to find account: %mail%', ['%mail%' => $slugger->unshort($recipient)]))); + $form->addError(new FormError($this->translator->trans('Unable to find account: %mail%', ['%mail%' => $slugger->unshort($recipient)]))); } //Render view @@ -304,7 +357,7 @@ class DefaultController extends AbstractController { //Template $this->config['recover_mail']['view']['name'], //Context - ['form' => $form->createView(), 'sent' => $request->query->get('sent', 0), 'notfound' => $notfound]+$this->config['recover_mail']['view']['context'] + ['form' => $form->createView(), 'sent' => $request->query->get('sent', 0), 'found' => $found]+$this->config['recover_mail']['view']['context'] ); } @@ -318,7 +371,7 @@ class DefaultController extends AbstractController { )); if ($request->isMethod('POST')) { - // Refill the fields in case the form is not valid. + //Refill the fields in case the form is not valid. $form->handleRequest($request); if ($form->isValid()) { @@ -329,7 +382,7 @@ class DefaultController extends AbstractController { $mail =& $this->config['register']['mail']; //Generate each route route - foreach($mail['route'] as $route => $tag) { + foreach($this->config['register']['route'] as $route => $tag) { if (empty($mail['context'][$tag]) && !empty($this->config['route'][$route])) { $mail['context'][$tag] = $this->get('router')->generate( $this->config['route'][$route]['name'], @@ -349,7 +402,7 @@ class DefaultController extends AbstractController { $subjectContext = []; //Process each context pair - foreach($mail['context'] as $k => $v) { + foreach($mail['context']+$this->config['register']['view']['context'] as $k => $v) { //Reinsert each context pair with the key surrounded by % $subjectContext['%'.$k.'%'] = $v; } @@ -360,10 +413,10 @@ class DefaultController extends AbstractController { //Create message $message = (new TemplatedEmail()) //Set sender - ->from(new NamedAddress($this->config['contact']['mail'], $this->config['contact']['name'])) + ->from(new Address($this->config['contact']['mail'], $this->config['contact']['name'])) //Set recipient //XXX: remove the debug set in vendor/symfony/mime/Address.php +46 - ->to(new NamedAddress($mail['context']['recipient_mail'], $mail['context']['recipient_name'])) + ->to(new Address($mail['context']['recipient_mail'], $mail['context']['recipient_name'])) //Set subject ->subject($mail['subject']) @@ -372,7 +425,7 @@ class DefaultController extends AbstractController { ->textTemplate($mail['text']) //Set context - ->context(['subject' => $mail['subject']]+$mail['context']); + ->context(['subject' => $mail['subject']]+$mail['context']+$this->config['register']['view']['context']); //Get doctrine $doctrine = $this->getDoctrine();