- //With mail and field
- if (!empty($field) && !empty($hash)) {
- //With invalid hash
- if ($hash != $this->slugger->hash($mail.$field)) {
- //Throw bad request
- throw new BadRequestHttpException($this->translator->trans('Invalid %field% field: %value%', ['%field%' => 'hash', '%value%' => $hash]));
- }
-
- //With mail
- if (!empty($mail)) {
- //Get mail
- $mail = $this->slugger->unshort($smail = $mail);
-
- //Without valid mail
- if (filter_var($mail, FILTER_VALIDATE_EMAIL) === false) {
- //Throw bad request
- //XXX: prevent slugger reverse engineering by not displaying decoded mail
- throw new BadRequestHttpException($this->translator->trans('Invalid %field% field: %value%', ['%field%' => 'mail', '%value%' => $smail]));
- }
-
- //With existing registrant
- if ($existing = $this->doctrine->getRepository($this->config['class']['user'])->findOneByMail($mail)) {
- //With disabled existing
- if ($existing->isDisabled()) {
- //Render view
- $response = $this->render(
- //Template
- $this->config['register']['view']['name'],
- //Context
- ['title' => $this->translator->trans('Access denied'), 'disabled' => 1]+$this->config['register']['view']['context']
- );
-
- //Set 403
- $response->setStatusCode(403);
-
- //Return response
- return $response;
- //With unactivated existing
- } elseif (!$existing->isActivated()) {
- //Set mail shortcut
- $activateMail =& $this->config['register']['mail'];
-
- //Generate each route route
- foreach($this->config['register']['route'] as $route => $tag) {
- //Only process defined routes
- if (!empty($this->config['route'][$route])) {
- //Process for confirm url
- if ($route == 'confirm') {
- //Set the url in context
- $activateMail['context'][$tag] = $this->router->generate(
- $this->config['route'][$route]['name'],
- //Prepend subscribe context with tag
- [
- 'mail' => $smail = $this->slugger->short($existing->getMail()),
- 'hash' => $this->slugger->hash($smail)
- ]+$this->config['route'][$route]['context'],
- UrlGeneratorInterface::ABSOLUTE_URL
- );
- }
- }
- }
-
- //Set recipient_name
- $activateMail['context']['recipient_mail'] = $existing->getMail();
-
- //Set recipient name
- $activateMail['context']['recipient_name'] = $existing->getRecipientName();
-
- //Init subject context
- $subjectContext = $this->slugger->flatten(array_replace_recursive($this->config['register']['view']['context'], $activateMail['context']), null, '.', '%', '%');
-
- //Translate subject
- $activateMail['subject'] = ucfirst($this->translator->trans($activateMail['subject'], $subjectContext));
-
- //Create message
- $message = (new TemplatedEmail())
- //Set sender
- ->from(new Address($this->config['contact']['mail'], $this->config['contact']['title']))
- //Set recipient
- //XXX: remove the debug set in vendor/symfony/mime/Address.php +46
- ->to(new Address($activateMail['context']['recipient_mail'], $activateMail['context']['recipient_name']))
- //Set subject
- ->subject($activateMail['subject'])
-
- //Set path to twig templates
- ->htmlTemplate($activateMail['html'])
- ->textTemplate($activateMail['text'])
-
- //Set context
- ->context(['subject' => $activateMail['subject']]+$activateMail['context']);
-
- //Try sending message
- //XXX: mail delivery may silently fail
- try {
- //Send message
- $this->mailer->send($message);
- //Catch obvious transport exception
- } catch(TransportExceptionInterface $e) {
- //Add error message mail unreachable
- $this->addFlash('error', $this->translator->trans('Account %mail% tried activate but unable to contact', ['%mail%' => $existing->getMail()]));
- }
-
- //Get route params
- $routeParams = $request->get('_route_params');
-
- //Remove mail, field and hash from route params
- unset($routeParams['mail'], $routeParams['field'], $routeParams['hash']);
-
- //Redirect on the same route with sent=1 to cleanup form
- return $this->redirectToRoute($request->get('_route'), ['sent' => 1]+$routeParams);
- }
-
- //Add error message mail already exists
- $this->addFlash('warning', $this->translator->trans('Account %mail% already exists', ['%mail%' => $existing->getMail()]));
-
- //Redirect to user view
- return $this->redirectToRoute(
- $this->config['route']['edit']['name'],
- [
- 'mail' => $smail = $this->slugger->short($existing->getMail()),
- 'hash' => $this->slugger->hash($smail)
- ]+$this->config['route']['edit']['context']
- );
- }
- //Without mail
- } else {
- //Set smail
- $smail = $mail;
- }
-
- //Try
- try {
- //Unshort then unserialize field
- $field = $this->slugger->unserialize($sfield = $field);
- //Catch type error
- } catch (\Error|\Exception $e) {
- //Throw bad request
- throw new BadRequestHttpException($this->translator->trans('Invalid %field% field: %value%', ['%field%' => 'field', '%value%' => $field]), $e);
- }
-
- //With non array field
- if (!is_array($field)) {
- //Throw bad request
- throw new BadRequestHttpException($this->translator->trans('Invalid %field% field: %value%', ['%field%' => 'field', '%value%' => $field]));
- }
- //Without field and hash
- } else {
- //Set smail
- $smail = $mail;
-
- //Set smail
- $sfield = $field;
-
- //Reset field
- $field = [];
- }
-