src/Controller/AuthController.php line 134

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Model\DataObject\Business;
  4. use App\Model\DataObject\User;
  5. use Carbon\Carbon;
  6. use Pimcore\Controller\FrontendController;
  7. use Pimcore\Mail;
  8. use Pimcore\Model\DataObject;
  9. use Pimcore\Model\DataObject\Folder;
  10. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  13. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  14. use Symfony\Component\Security\Core\Security as FrontSecurity;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. use Symfony\Component\Validator\Constraints as Assert;
  17. use Symfony\Component\Validator\Validator\ValidatorInterface;
  18. use Pimcore\Model\Element\Service;
  19. class AuthController extends FrontendController
  20. {
  21.     /**
  22.      * @Template
  23.      * @param Request $request
  24.      * @param AuthenticationUtils $authenticationUtils
  25.      * @return array
  26.      * @Route(
  27.      *      "/{_locale}/login",
  28.      *      name="login",
  29.      *      methods={"GET","POST"}
  30.      * )
  31.      */
  32.     public function loginAction(Request $requestAuthenticationUtils $authenticationUtilsFrontSecurity $security)
  33.     {
  34.         $lang $request->getLocale();
  35.         $securityUser $security->getUser();
  36.         if ($securityUser) {
  37.             $user User::getByUsername($securityUser->getUserIdentifier())->load()[0];
  38.             if($user->getBusinesses()) {
  39.                 return $this->redirect($this->generateUrl('dashboard'));
  40.             }else {
  41.                 return $this->redirect('/'.$lang);
  42.             }
  43.         }
  44.         // get the login error if there is one
  45.         $error $authenticationUtils->getLastAuthenticationError();
  46.         // last username entered by the user
  47.         $lastUsername $authenticationUtils->getLastUsername();
  48.         // dd($lastUsername);
  49.         return [
  50.             '_username'       => $lastUsername,
  51.             'error'           => $error,
  52.             '_target_path'    => $request->get('_target_path')??null
  53.         ];
  54.     }
  55.     /**
  56.      * @Route(
  57.      *      "/{_locale}/afterLogin",
  58.      *      name="afterLogin",
  59.      *      methods={"GET"}
  60.      * )
  61.      */
  62.     public function afterLoginAction(Request $requestFrontSecurity $security)
  63.     {
  64.         $lang $request->getLocale();
  65.         $securityUser $security->getUser();
  66.         if ($securityUser) {
  67.             $roles $securityUser->getRoles();
  68.             if (in_array("ROLE_PRO",$roles)){
  69.                 return $this->redirect($this->generateUrl('dashboard'));
  70.             }else if(in_array("ROLE_USER",$roles)){
  71.                 return $this->redirect('/'.$lang);
  72.             }else {
  73.                 return $this->redirect('/'.$lang);
  74.             }
  75.         }else {
  76.             return $this->redirect('/'.$lang);
  77.         }
  78.     }
  79.     /**
  80.      * @Template
  81.      * @param Request $request
  82.      * @return \Symfony\Component\HttpFoundation\JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse
  83.      * @throws \Exception
  84.      * @Route(
  85.      *      "/{_locale}/reset/password/{renew_token}",
  86.      *      name="reset_password",
  87.      *      methods={"GET","POST"}
  88.      * )
  89.      */
  90.     public function resetPasswordAction(Request $request)
  91.     {
  92.         if ($request->isMethod('POST') && $request->get("new_password")) {
  93.             $user User::getById($request->get('user_id'));
  94.             if (!$user) {
  95.                 return ['error' => "Impossible de trouver l'utilisateur"];
  96.             }
  97.             $user->setPassword($request->get('new_password'));
  98.             $user->setRenewToken(null);
  99.             $user->setRenewExpire(null);
  100.             $user->save();
  101.             return $this->redirect($this->generateUrl("login"));
  102.         } elseif ($request->get("renew_token")) {
  103.             $user User::getByRenewToken($request->get("renew_token"))->load()[0];
  104.             if (!$user) {
  105.                 return $this->redirect($this->generateUrl('login'));
  106.             }
  107.             $expired false;
  108.             if ($user->getRenewExpire()->lt(Carbon::now())) {
  109.                 $expired true;
  110.             }
  111.             $this->view->user $user;
  112.             return ["user" => $user"expired" => $expired];
  113.         } else {
  114.             return $this->redirect($this->generateUrl('login'));
  115.         }
  116.     }
  117.     /**
  118.      * @Template
  119.      * @param Request $request
  120.      * @return \Symfony\Component\HttpFoundation\JsonResponse
  121.      * @throws \Exception
  122.      * @Route(
  123.      *      "/{_locale}/reset/password",
  124.      *      name="ask_reset_password",
  125.      *      methods={"GET","POST"}
  126.      * )
  127.      */
  128.     public function askResetPasswordAction(Request $requestFrontSecurity $security\Pimcore\Config\Config $websiteConfig)
  129.     {
  130.         $lang $request->getLocale();
  131.         $securityUser $security->getUser();
  132.         if ($securityUser) {
  133.             $user User::getByUsername($securityUser->getUserIdentifier())->load()[0];
  134.             if($user->getBusinesses()) {
  135.                 return $this->redirect('/'.$lang.'/pro');
  136.             }else {
  137.                 return $this->redirect('/'.$lang);
  138.             }
  139.         }
  140.         if ($request->isMethod('POST') && $request->get('username')) {
  141.             $user User::getByUsername($request->get('username'))->load()[0];
  142.             if (!$user) {
  143.                 return ["error" => "Le compte n'existe pas"];
  144.             }
  145.             $token md5(time() * 10000);
  146.             $user->setRenewToken($token);
  147.             $nbrDays intval($websiteConfig->get('expirationDays')) === intval($websiteConfig->get('expirationDays'));
  148.             $user->setRenewExpire(Carbon::now()->addDay($nbrDays));
  149.             $user->save();
  150.             $mail = new Mail();
  151.             $mail->setDocument('/'.$lang."/emails/reset-password");
  152.             $mail->to($user->getUsername());
  153.             $mail->setParam('renewLink'$this->generateUrl("reset_password", ['renew_token' => $token],  UrlGeneratorInterface::ABSOLUTE_URL));
  154.             $mail->send();
  155.             return ["message" => "Vous avez reçu un lien pour modifier votre mot de passe par email."];
  156.         }
  157.     }
  158.     /**
  159.      * @Template
  160.      * @Route(
  161.      *      "/{_locale}/register",
  162.      *      name="register",
  163.      *      methods={"GET","POST"}
  164.      * )
  165.      */
  166.     public function registerAction(Request $requestFrontSecurity $security\Pimcore\Config\Config $websiteConfigValidatorInterface $validator)
  167.     {
  168.         $lang $request->getLocale();
  169.         $securityUser $security->getUser();
  170.         if ($securityUser) {
  171.             $user User::getByUsername($securityUser->getUserIdentifier())->load()[0];
  172.             if($user->getBusinesses()) {
  173.                 return $this->redirect('/'.$lang.'/pro');
  174.             }else {
  175.                 return $this->redirect('/'.$lang);
  176.             }
  177.         }
  178.         if ($request->isMethod('POST')) {
  179.             foreach (['gender''lastname''firstname''email''confirm-email''phone''password''confirm-password'] as $required_field) {
  180.                 $isSet false;
  181.                 if (is_array($required_field)) {
  182.                     foreach ($required_field as $field) {
  183.                         if ($request->get($field)) {
  184.                             $isSet true;
  185.                         }
  186.                     }
  187.                 } else {
  188.                     $isSet $request->get($required_field);
  189.                 }
  190.                 if (!$isSet) {
  191.                     return ["error" => "Vous devez remplir tous les champs.""previousValues" =>$request->request->all()];
  192.                 }
  193.             }
  194.             $email $request->get('email');
  195.             $confirmEmail $request->get('confirm-email');
  196.             if ($email !== $confirmEmail) {
  197.                 return ["error" => "Les 2 adresses email ne sont pas identiques""previousValues" =>$request->request->all()];
  198.             }
  199.             $password $request->get('password');
  200.             $confirmPassword $request->get('confirm-password');
  201.             if ($password !== $confirmPassword) {
  202.                 return ["error" => "Les 2 mots de passe ne sont pas identiques""previousValues" =>$request->request->all()];
  203.             }
  204.             $emailConstraint = new Assert\Email();
  205.             $errors $validator->validate($email$emailConstraint);
  206.             if (count($errors) > 0) {
  207.                 return ["error" => $errors[0]->getMessage(), "previousValues" =>$request->request->all()];
  208.             }
  209.             $checkUser User::getByUsername($email, ['limit' => 1,'unpublished' => true]);
  210.             if ($checkUser) {
  211.                 return ["message" => 'Le compte existe déjà, <a href="'$this->generateUrl('login') .'">connectez-vous</a> ou <a href="'$this->generateUrl('ask_reset_password') .'">cliquez ici</a> pour réinitialiser votre mot de passe'];
  212.             }
  213.             $gender $request->get('gender');
  214.             $firstName $request->get('firstname');
  215.             $lastName $request->get('lastname');
  216.             $phone $request->get('phone');
  217.             $user = new User();
  218.             $user->setGender($gender);
  219.             $user->setFirstname($firstName);
  220.             $user->setLastname($lastName);
  221.             $user->setPhone($phone);
  222.             $user->setUsername($email);
  223.             $user->setPassword($password);
  224.             $businesses Business::getByEmail($email);
  225.             if(!$businesses) {
  226.                 $user->setRoles(["ROLE_USER"]);
  227.             }else {
  228.                 $user->setRoles(["ROLE_PRO"]);
  229.                 $businesses->load();
  230.                 $businessesToAdd = [];
  231.                 foreach($businesses as $business) {
  232.                     $businessesToAdd = [...$businessesToAdd$business];
  233.                 }
  234.                 $user->setBusinesses($businessesToAdd);
  235.             }
  236.             $keyname Service::getValidKey($email'object');
  237.             $user->setKey($keyname);
  238.             $user->setParent(Folder::getByPath('/users') ?? Folder::create(['o_parentId' => 1'o_key' => 'users']));
  239.             $user->setPublished(false);
  240.             $token md5(uniqid('renew_token'true));
  241.             $user->setRenewToken($token);
  242.             $nbrDays intval($websiteConfig->get('expirationDays')) === intval($websiteConfig->get('expirationDays'));
  243.             $user->setRenewExpire(Carbon::now()->addDays($nbrDays));
  244.             $user->save();
  245.             $mail = new Mail();
  246.             $mail->setDocument('/'.$request->getLocale()."/emails/verify-email");
  247.             $mail->to($user->getUsername());
  248.             $mail->setParam('Link'$this->generateUrl('verify_email', ['renew_token' => $user->getRenewToken()], UrlGeneratorInterface::ABSOLUTE_URL));
  249.             $mail->send();
  250.             return ["message" => "Votre adresse email doit être confirmée, vous allez recevoir un email de confirmation"];
  251.         }
  252.         return ["previousValues" => ["gender"=> """firstname" => """lastname" => """email" => """confirm-email" =>"""phone" => ""]];
  253.     }
  254.     /**
  255.      * @Template
  256.      * @Route(
  257.      *      "/verify-email/{renew_token}",
  258.      *      name="verify_email",
  259.      *      methods={"GET"}
  260.      * )
  261.      */
  262.     public function verifyEmailAction(Request $request\Pimcore\Config\Config $websiteConfig)
  263.     {
  264.         if ($request->get('renew_token')) {
  265.             $user User::getByRenewToken($request->get("renew_token"), ['limit' => 1,'unpublished' => true]);
  266.             if (!$user) {
  267.                 return ["error" => "Vous devez définir un token valide""message" => false];
  268.             }
  269.             $user->setPublished(true);
  270.             $user->setRenewToken(null);
  271.             $user->setRenewExpire(null);
  272.             $user->save();
  273.             return ["message" => "Merci d'avoir validé votre compte, vous pouvez désormais vous connecter"];
  274.         } else {
  275.             return ["error" => "Vous devez définir un token valide""message" => false];
  276.         }
  277.     }
  278.     /**
  279.      * @Route("/logout", name="logout", methods={"GET"})
  280.      */
  281.     public function logout()
  282.     {
  283.         // controller can be blank: it will never be executed!
  284.         throw new \Exception('Don\'t forget to activate logout in security.yaml');
  285.     }
  286. }