src/OceanExpertBundle/Controller/ResettingController.php line 61

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the FOSUserBundle package.
  4.  *
  5.  * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace OceanExpertBundle\Controller;
  11. use DateTime;
  12. use FOS\UserBundle\Event\FilterUserResponseEvent;
  13. use FOS\UserBundle\Event\FormEvent;
  14. use FOS\UserBundle\Event\GetResponseUserEvent;
  15. use FOS\UserBundle\Form\Factory\FactoryInterface;
  16. use FOS\UserBundle\Form\Factory\FormFactory;
  17. use FOS\UserBundle\FOSUserEvents;
  18. use FOS\UserBundle\Mailer\MailerInterface;
  19. use FOS\UserBundle\Model\UserInterface;
  20. use FOS\UserBundle\Model\UserManagerInterface;
  21. use FOS\UserBundle\Util\TokenGenerator;
  22. use FOS\UserBundle\Util\TokenGeneratorInterface;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  25. use Symfony\Component\HttpFoundation\JsonResponse;
  26. use Symfony\Component\HttpFoundation\RedirectResponse;
  27. use Symfony\Component\HttpFoundation\Request;
  28. use Symfony\Component\HttpFoundation\Response;
  29. /**
  30.  * Controller managing the resetting of the password
  31.  *
  32.  * @author Thibault Duplessis <thibault.duplessis@gmail.com>
  33.  * @author Christophe Coevoet <stof@notk.org>
  34.  */
  35. class ResettingController extends AbstractController
  36. {
  37.     private TokenGenerator $fosTokenGenerator;
  38.     private MailerInterface $fosMailer;
  39.     private UserManagerInterface $fosUserManager;
  40.     private FormFactory $fosResettingFormFactory;
  41.     public function __construct(
  42.         TokenGenerator       $fosTokenGenerator,
  43.         MailerInterface      $fosMailer,
  44.         UserManagerInterface $fosUserManager,
  45.         FormFactory $fosResettingFormFactory
  46.     ) {
  47.         $this->fosTokenGenerator $fosTokenGenerator;
  48.         $this->fosMailer $fosMailer;
  49.         $this->fosUserManager $fosUserManager;
  50.         $this->fosResettingFormFactory $fosResettingFormFactory;
  51.     }
  52.     /**
  53.      * Request reset user password: show form
  54.      */
  55.     public function requestAction(): Response
  56.     {
  57.         return $this->render('Resetting/request.html.twig');
  58.     }
  59.     /**
  60.      * Request reset user password: submit form and send email
  61.      */
  62.     public function sendEmailAction(Request $request): Response
  63.     {
  64.         $username $request->request->get('username');
  65.         /** @var $user UserInterface */
  66.         $user $this->fosUserManager->findUserByUsernameOrEmail($username);
  67.         if (null === $user) {
  68.             return $this->render(
  69.                 'Resetting/request.html.twig',
  70.                 array(
  71.                     'invalid_username' => $username
  72.                 )
  73.             );
  74.         }
  75.         if ($user->isPasswordRequestNonExpired($this->container->getParameter('fos_user.resetting.token_ttl'))) {
  76.             return $this->render(
  77.                 'Default/error.html.twig',
  78.                 array(
  79.                     'message' => 'The password for this user has already been requested within the last 30 minutes.'
  80.                 )
  81.             );
  82.         }
  83.         if (null === $user->getConfirmationToken()) {
  84.             /**
  85.              * @var $tokenGenerator TokenGeneratorInterface
  86.              */
  87. //            $tokenGenerator = $this->get('fos_user.util.token_generator');
  88.             $tokenGenerator $this->fosTokenGenerator;
  89.             $user->setConfirmationToken($tokenGenerator->generateToken());
  90.         }
  91. //        $this->get('fos_user.mailer')->sendResettingEmailMessage($user);
  92.         $this->fosMailer->sendResettingEmailMessage($user);
  93.         $user->setPasswordRequestedAt(new DateTime());
  94. //        $this->get('fos_user.user_manager')->updateUser($user);
  95.         $this->fosUserManager->updateUser($user);
  96.         return new RedirectResponse($this->generateUrl('fos_user_resetting_check_email',
  97.             array('email' => $this->getObfuscatedEmail($user))
  98.         ));
  99.     }
  100.     /**
  101.      * Get the truncated email displayed when requesting the resetting.
  102.      *
  103.      * The default implementation only keeps the part following @ in the address.
  104.      *
  105.      * @param UserInterface $user
  106.      *
  107.      * @return string
  108.      */
  109.     protected function getObfuscatedEmail(UserInterface $user)
  110.     {
  111.         $email $user->getEmail();
  112.         if (false !== $pos strpos($email'@')) {
  113.             $email '...' substr($email$pos);
  114.         }
  115.         return $email;
  116.     }
  117.     /**
  118.      * Tell the user to check his email provider
  119.      */
  120.     public function checkEmailAction(Request $request): Response
  121.     {
  122.         $email $request->query->get('email');
  123.         if (empty($email)) {
  124.             // the user does not come from the sendEmail action
  125.             return new RedirectResponse($this->generateUrl('fos_user_resetting_request'));
  126.         }
  127.         return $this->render('Resetting/checkEmail.html.twig', array(
  128.             'email' => $email,
  129.         ));
  130.     }
  131.     /**
  132.      * Reset user password
  133.      */
  134.     public function resetAction(Request $request$token): Response
  135.     {
  136.         /**
  137.          * @var $dispatcher EventDispatcherInterface
  138.          */
  139.         $dispatcher $this->get('event_dispatcher');
  140.         $user $this->fosUserManager->findUserByConfirmationToken($token);
  141.         if (null === $user) {
  142.             return $this->render(
  143.                 'Default/error.html.twig',
  144.                 array(
  145.                     'message' => 'Invalid token or the token already has been used to reset the password. 
  146.                     Please try resetting password again.'
  147.                 )
  148.             );
  149.         }
  150.         $event = new GetResponseUserEvent($user$request);
  151.         $dispatcher->dispatch(FOSUserEvents::RESETTING_RESET_INITIALIZE$event);
  152.         if (null !== $event->getResponse()) {
  153.             return $event->getResponse();
  154.         }
  155.         $form $this->fosResettingFormFactory->createForm();
  156.         $form->setData($user);
  157.         $form->handleRequest($request);
  158.         if ($form->isSubmitted()
  159.             && $form->isValid()
  160.         ) {
  161.             $event = new FormEvent($form$request);
  162.             $dispatcher->dispatch(FOSUserEvents::RESETTING_RESET_SUCCESS$event);
  163.             $this->fosUserManager->updateUser($user);
  164.             if (null === $response $event->getResponse()) {
  165.                 $url $this->generateUrl(
  166.                     'view_profile',
  167.                     array(
  168.                         'user' => $user->getId()
  169.                     )
  170.                 );
  171.                 $response = new RedirectResponse($url);
  172.             }
  173.             $dispatcher->dispatch(
  174.                 FOSUserEvents::RESETTING_RESET_COMPLETED, new
  175.                 FilterUserResponseEvent(
  176.                     $user,
  177.                     $request,
  178.                     $response
  179.                 )
  180.             );
  181.             return $response;
  182.         }
  183.         return $this->render(
  184.             'Resetting/reset.html.twig',
  185.             array(
  186.                 'token' => $token,
  187.                 'form' => $form->createView(),
  188.                 'firstlogin'=> $request->query->get('firstlogin')
  189.             )
  190.         );
  191.     }
  192.     /**
  193.      * reset the username of an expert
  194.      *
  195.      * @param Request $request
  196.      *
  197.      * @return Response string
  198.      */
  199.     public function changeUsernameAction(Request $request): Response
  200.     {
  201.         $security_context $this->get('security.token_storage');
  202.         $username $request->request->get('username');
  203.         $loggedUser $security_context->getToken()->getUsername();
  204.         $message '';
  205.         if ($this->get('security.authorization_checker')->isGranted('ROLE_GLOBAL_EDITOR')
  206.             || $username == $loggedUser
  207.         ) {
  208.             $em $this->getDoctrine()->getManager();
  209.             $newusername $request->request->get('newusername');
  210.             $user $this->fosUserManager->findUserByUsername($username);
  211.             $existing $this->fosUserManager->findUserByUsername($newusername);
  212.             if ($existing) {
  213.                 $message "A user with username '$newusername' already exists.$existing";
  214.             } elseif ($user) {
  215.                 $changeUser $em->getRepository('OceanExpertBundle:FosUser')->findOneById($user->getId());
  216.                 if ($changeUser) {
  217.                     $changeUser->setUsername($newusername);
  218.                     $changeUser->setUsernameCanonical($newusername);
  219.                     $em->persist($changeUser);
  220.                     $em->flush();
  221.                     $message 'success';
  222.                 }
  223.             } else {
  224.                 $message 'Username does not exists.';
  225.             }
  226.         } else {
  227.             $message 'Invalid credentials';
  228.         }
  229.         return new Response($message);
  230.     }
  231.     /**
  232.      * reset the email address of an expert
  233.      *
  234.      * @param Request $request
  235.      *
  236.      * @return JsonResponse
  237.      */
  238.     public function changeEmailAction(Request $request): Response
  239.     {
  240.         $security_context $this->get('security.token_storage');
  241.         $loggedUser $security_context->getToken()->getUser();
  242.         if (!is_object($loggedUser)
  243.             || !($loggedUserEmail $loggedUser->getEmail())) {
  244.             $message = array(
  245.                 'status' => 0,
  246.                 'message' => "Are you logged in as valid user?"
  247.             );
  248.             return new JsonResponse($message);
  249.         }
  250.         $currentEmail trim($request->request->get('currentEmail'));
  251.         $newEmail trim($request->request->get('newEmail'));
  252.         //$currentEmail = 'w.appeltans@unesco.org';
  253.         //$newEmail = 'a.lambert@unesco.org';
  254.         //dump($currentEmail);
  255.         //dump($newEmail);
  256.         //die();
  257.         if (is_null($currentEmail)
  258.             || is_null($newEmail)
  259.             || $currentEmail === ''
  260.             || $newEmail === ''
  261.         ) {
  262.             $message = array(
  263.                 'status' => 0,
  264.                 'message' => "We need both a current and a new email address."
  265.             );
  266.             return new JsonResponse($message);
  267.         }
  268.         //get the user for whom we want to change the address
  269.         //this is not always the logged in user!!!
  270.         $em $this->getDoctrine()->getManager();
  271.         $user $this->fosUserManager->findUserByUsernameOrEmail($currentEmail);
  272.         //check if current email is valid
  273.         if (!filter_var($currentEmailFILTER_VALIDATE_EMAIL)) {
  274.             $message = array(
  275.                 'status' => 0,
  276.                 'message' => "Email ($currentEmail) is not a valid email address."
  277.             );
  278.             return new JsonResponse($message);
  279.         } else {
  280.             //sanitize current email
  281.             $currentEmail filter_var($currentEmailFILTER_SANITIZE_EMAIL);
  282.         }
  283.         //check if new email is valid
  284.         if (!filter_var($newEmailFILTER_VALIDATE_EMAIL)) {
  285.             $message = array(
  286.                 'status' => 0,
  287.                 'message' => "Email ($newEmail) is not a valid email address."
  288.             );
  289.             return new JsonResponse($message);
  290.         } else {
  291.             //sanitize new email
  292.             $newEmail filter_var($newEmailFILTER_SANITIZE_EMAIL);
  293.         }
  294.         //check if email already exists
  295.         //this is also done in RegistrationController.php:checkEmailAvailableAction
  296.         $existingUsername $this->fosUserManager->findUserByUsername($newEmail);
  297.         $existingEmail $this->fosUserManager->findUserByEmail($newEmail);
  298.         if ($existingEmail) {
  299.             $message = array(
  300.                 'status' => 0,
  301.                 'message' => 'A user (' $existingEmail->getId() . ') with email (' $newEmail ') already exists.'
  302.             );
  303.             return new JsonResponse($message);
  304.         } elseif ($existingUsername) {
  305.             $message = array(
  306.                 'status' => 0,
  307.                 'message' => 'A user (' $existingUsername->getId() . ') with username (' $newEmail ') already exists.'
  308.             );
  309.             return new JsonResponse($message);
  310.         }
  311.         if ($this->get('security.authorization_checker')->isGranted('ROLE_GLOBAL_EDITOR') ){
  312.             $changeUser $em->getRepository('OceanExpertBundle:FosUser')->findOneById($user->getId());
  313.             //we already checked the validity of the new email
  314.             $changeUser->setEmail($newEmail);
  315.             $changeUser->setEmailCanonical($newEmail);
  316.             $em->persist($changeUser);
  317.             $em->flush();
  318.             $indiv $em->getRepository('OceanExpertBundle:Indiv')->findOneByIdInd($user->getId());
  319.             if ($indiv) {
  320.                 //we already checked the validity of the new email
  321.                 $indiv->setEmail1($newEmail);
  322.                 $em->persist($indiv);
  323.                 $em->flush();
  324.             }
  325.             $message = array(
  326.                 'status' => 1,
  327.                 'message' => "Email changed successfully."
  328.             );
  329.         } elseif ($currentEmail == $loggedUserEmail) {
  330.             $confirmCode $request->request->get('confirmCode');
  331.             $emailToken sha1($confirmCode '' $newEmail);
  332.             $findCode $em->getRepository('OceanExpertBundle:ConfirmationTokens')->findOneByConfirmationToken($emailToken);
  333.             if (count($findCode) > 0) {
  334.                 $changeUser $em->getRepository('OceanExpertBundle:FosUser')->findOneById($user->getId());
  335.                 if ($changeUser) {
  336.                     $changeUser->setEmail($newEmail);
  337.                     $changeUser->setEmailCanonical($newEmail);
  338.                     $em->persist($changeUser);
  339.                     $em->flush();
  340.                     $indiv $em->getRepository('OceanExpertBundle:Indiv')->findOneByIdInd($user->getId());
  341.                     if ($indiv) {
  342.                         //we already checked the validity of the new email
  343.                         $indiv->setEmail1($newEmail);
  344.                         $em->persist($indiv);
  345.                         $em->flush();
  346.                     }
  347.                     $message = array(
  348.                         'status' => 1,
  349.                         'message' => "Email changed successfully."
  350.                     );
  351.                 }
  352.                 $em->remove($findCode);
  353.                 $em->flush();
  354.             } else {
  355.                 $message = array(
  356.                     'status' => 0,
  357.                     'message' => "Invalid token provided."
  358.                 );
  359.             }
  360.         } else {
  361.             $message = array(
  362.                 'status' => 0,
  363.                 'message' => "Invalid credentials."
  364.             );
  365.         }
  366.         return new JsonResponse($message);
  367.     }
  368. }