X-Git-Url: https://git.rapsys.eu/userbundle/blobdiff_plain/7d0059507fed3fd5a81142370a46308e884c5c3d..f344fb18512a937babe0c86179bdad366160ad17:/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();