src/Profile/Controller/ProfileAuthController.php line 55

Open in your IDE?
  1. <?php
  2. namespace App\Profile\Controller;
  3. use App\Profile\Entity\ForgotPassword;
  4. use App\Profile\Entity\Login;
  5. use App\Profile\Entity\Register;
  6. use App\Profile\Entity\ResetPassword;
  7. use App\Profile\Form\Type\Auth\ForgotPasswordType;
  8. use App\Profile\Form\Type\Auth\LoginType;
  9. use App\Profile\Form\Type\Auth\RegisterType;
  10. use App\Profile\Form\Type\Auth\ResetPasswordType;
  11. use App\Profile\Model\Profile;
  12. use App\Profile\Model\ProfileRoles;
  13. use App\Profile\Service\ProfileAuthService;
  14. use Codeception\Exception\ConfigurationException;
  15. use Exception;
  16. use Pimcore\Config\Config;
  17. use Pimcore\Controller\FrontendController;
  18. use Pimcore\Model\WebsiteSetting;
  19. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  20. use Symfony\Component\HttpFoundation\Request;
  21. use Symfony\Component\HttpFoundation\Response;
  22. use Symfony\Component\HttpFoundation\Session\Session;
  23. use Symfony\Component\Routing\Annotation\Route;
  24. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  25. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  26. use Symfony\Contracts\Translation\TranslatorInterface;
  27. class ProfileAuthController extends FrontendController
  28. {
  29.   protected ProfileAuthService $authService;
  30.   protected TranslatorInterface $translator;
  31.   public function __construct(ProfileAuthService $authServiceTranslatorInterface $translator)
  32.   {
  33.     $this->authService $authService;
  34.     $this->translator $translator;
  35.   }
  36.   #[Route([
  37.     'name' => 'auth_register',
  38.     'localizedPaths' => [
  39.       'en' => '/{_locale}/signup',
  40.       'de' => '/{_locale}/signup',
  41.       'fr' => '/{_locale}/signup',
  42.     ],
  43.   ])]
  44.   #[IsGranted('IS_ANONYMOUS')]
  45.   public function register(Request $requestConfig $websiteConfig): Response
  46.   {
  47.     $data = new Register();
  48.     $data->setProfileType($request->get('register') ? $request->get('register')['profileType'] : null);
  49.     $registerForm $this->createForm(RegisterType::class, $data);
  50.     $registerForm->handleRequest($request);
  51.     if ($registerForm->isSubmitted() && $registerForm->isValid()) {
  52.       $data $registerForm->getData();
  53.       try {
  54.         $mailDocument WebsiteSetting::getByName('authActivationMailDocument'null$request->getLocale(), 'en') ?? null;
  55.         if (!$mailDocument) {
  56.           throw new ConfigurationException('Website Config "authActivationMailDocument" is not configured properly.');
  57.         }
  58.         $mailDocument $mailDocument->getData();
  59.         $activationToken $this->authService->registerUser($data);
  60.         $mail = new \Pimcore\Mail();
  61.         $mail->setDocument($mailDocument);
  62.         $mail->setParams([
  63.           'activationToken' => $activationToken,
  64.           'activationLink' => $this->generateUrl('auth_activate', [
  65.             'activationToken' => $activationToken,
  66.             '_locale' => $request->getLocale(),
  67.           ], UrlGeneratorInterface::ABSOLUTE_URL),
  68.         ]);
  69.         $mail->to($data->getEmail());
  70.         $mail->send();
  71.         return $this->redirectToRoute('auth_register_success', ['_locale' => $request->getLocale()]);
  72.       } catch (Exception $e) {
  73.         $isDuplicate strtok($e->getMessage(), ' ') == 'Duplicate';
  74.         if ($isDuplicate) {
  75.           $passwortForgotUrl $this->generateUrl('auth_forgotpassword', ['email' => $registerForm->get('email')->getData()]);
  76.           $link ' <a href="'.$passwortForgotUrl.'">'.$this->translator->trans('auth.form.register.forgotLinkText').'</a>';
  77.           $this->addFlash('error'$this->translator->trans('auth.form.register.alreadyRegisteredError').$link);
  78.         } else {
  79.           $this->addFlash('error'$this->translator->trans('auth.form.register.unknownError'));
  80.         }
  81.       }
  82.     }
  83.     return $this->renderTemplate('auth/register.html.twig', [
  84.       'registerForm' => $registerForm->createView(),
  85.     ]);
  86.   }
  87.   #[Route([
  88.     'name' => 'auth_register_success',
  89.     'localizedPaths' => [
  90.       'en' => '/{_locale}/signup/success',
  91.       'de' => '/{_locale}/signup/success',
  92.       'fr' => '/{_locale}/signup/success',
  93.     ],
  94.   ])]
  95.   #[IsGranted('IS_ANONYMOUS')]
  96.   public function registerSuccess(): Response
  97.   {
  98.     return $this->renderTemplate('auth/register_success.html.twig');
  99.   }
  100.   #[Route([
  101.     'name' => 'auth_activate',
  102.     'localizedPaths' => [
  103.       'en' => '/{_locale}/signup/activate/{activationToken}',
  104.       'de' => '/{_locale}/signup/activate/{activationToken}',
  105.       'fr' => '/{_locale}/signup/activate/{activationToken}',
  106.     ],
  107.   ])]
  108.   #[IsGranted('IS_ANONYMOUS')]
  109.   public function activate(Request $requeststring $activationTokenSession $session): Response
  110.   {
  111.     if ($this->authService->activateUser($activationToken)) {
  112.       $session->getFlashBag()->add('success'$this->translator->trans('auth.form.login.activateSuccess'));
  113.       return $this->redirectToRoute('auth_login', ['_locale' => $request->getLocale()]);
  114.     } else {
  115.       $response $this->renderTemplate('auth/activation_failed.html.twig');
  116.     }
  117.     return $response;
  118.   }
  119.   #[Route([
  120.     'name' => 'auth_login',
  121.     'localizedPaths' => [
  122.       'en' => '/{_locale}/signin',
  123.       'de' => '/{_locale}/signin',
  124.       'fr' => '/{_locale}/signin',
  125.     ],
  126.   ])]
  127.   #[IsGranted('IS_ANONYMOUS')]
  128.   public function login(Request $requestAuthenticationUtils $authenticationUtilsSession $session): Response
  129.   {
  130.     $error $authenticationUtils->getLastAuthenticationError();
  131.     if ($error) {
  132.       $this->addFlash('error'$this->translator->trans('auth.form.login.error'));
  133.     }
  134.     $lastUsername $authenticationUtils->getLastUsername();
  135.     $data = new Login();
  136.     if ($lastUsername) {
  137.       $data->setEmail($lastUsername);
  138.     }
  139.     $loginForm $this->createForm(LoginType::class, $data);
  140.     return $this->renderTemplate('auth/login.html.twig', [
  141.       'loginForm' => $loginForm->createView(),
  142.       'error' => $error,
  143.       'flashesSuccess' => $session->getFlashBag()->get('success'),
  144.     ]);
  145.   }
  146.   #[Route([
  147.     'name' => 'auth_logout',
  148.     'localizedPaths' => [
  149.       'en' => '/{_locale}/signout',
  150.       'de' => '/{_locale}/signout',
  151.       'fr' => '/{_locale}/signout',
  152.     ],
  153.   ])]
  154.   #[IsGranted(ProfileRoles::ROLE_USER)]
  155.   public function logout()
  156.   {
  157.     throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  158.   }
  159.   #[Route([
  160.     'name' => 'auth_logout_success',
  161.     'localizedPaths' => [
  162.       'en' => '/{_locale}/signout/success',
  163.       'de' => '/{_locale}/signout/success',
  164.       'fr' => '/{_locale}/signout/success',
  165.     ],
  166.   ])]
  167.   #[IsGranted('IS_ANONYMOUS')]
  168.   public function logoutSuccess()
  169.   {
  170.     return $this->renderTemplate('auth/logout.html.twig', []);
  171.   }
  172.   #[Route([
  173.     'name' => 'auth_forgotpassword',
  174.     'localizedPaths' => [
  175.       'en' => '/{_locale}/password/request',
  176.       'de' => '/{_locale}/password/request',
  177.       'fr' => '/{_locale}/password/request',
  178.     ],
  179.   ])]
  180.   #[IsGranted('IS_ANONYMOUS')]
  181.   public function forgotPassword(Request $requestConfig $websiteConfig): Response
  182.   {
  183.     $data = new ForgotPassword();
  184.     if ($request->get('email')) {
  185.       $data->setEmail($request->get('email'));
  186.     }
  187.     $forgotForm $this->createForm(ForgotPasswordType::class, $data);
  188.     $forgotForm->handleRequest($request);
  189.     if ($forgotForm->isSubmitted() && $forgotForm->isValid()) {
  190.       $data $forgotForm->getData();
  191.       try {
  192.         $mailDocument WebsiteSetting::getByName('authResetMailDocument'null$request->getLocale(), 'en') ?? null;
  193.         if (!$mailDocument) {
  194.           throw new ConfigurationException('Website Config "authResetMailDocument" is not configured properly.');
  195.         }
  196.         $mailDocument $mailDocument->getData();
  197.         $resetToken $this->authService->forgotPassword($data);
  198.         $mail = new \Pimcore\Mail();
  199.         $mail->setDocument($mailDocument);
  200.         $mail->setParams([
  201.           'resetToken' => $resetToken,
  202.           'resetLink' => $this->generateUrl('auth_resetpassword', [
  203.             'resetToken' => $resetToken,
  204.             '_locale' => $request->getLocale(),
  205.           ], UrlGeneratorInterface::ABSOLUTE_URL),
  206.         ]);
  207.         $mail->to($data->getEmail());
  208.         $mail->send();
  209.         return $this->redirectToRoute('auth_forgotpassword_success', ['_locale' => $request->getLocale()]);
  210.       } catch (Exception $e) {
  211.         $this->addFlash('error'$this->translator->trans('auth.form.forgot.error'));
  212.       }
  213.     }
  214.     return $this->renderTemplate('auth/password_forgot.html.twig', [
  215.             'forgotForm' => $forgotForm->createView(),
  216.         ]);
  217.   }
  218.   #[Route([
  219.     'name' => 'auth_forgotpassword_success',
  220.     'localizedPaths' => [
  221.       'en' => '/{_locale}/password/request/success',
  222.       'de' => '/{_locale}/password/request/success',
  223.       'fr' => '/{_locale}/password/request/success',
  224.     ],
  225.   ])]
  226.   #[IsGranted('IS_ANONYMOUS')]
  227.   public function forgotPasswordSuccess(): Response
  228.   {
  229.     return $this->renderTemplate('auth/password_forgot_success.html.twig');
  230.   }
  231.   #[Route([
  232.     'name' => 'auth_resetpassword',
  233.     'localizedPaths' => [
  234.       'en' => '/{_locale}/password/reset/{resetToken}',
  235.       'de' => '/{_locale}/password/reset/{resetToken}',
  236.       'fr' => '/{_locale}/password/reset/{resetToken}',
  237.     ],
  238.   ])]
  239.   #[IsGranted('IS_ANONYMOUS')]
  240.   public function resetPassword(Request $requeststring $resetTokenConfig $websiteConfig): Response
  241.   {
  242.     $data = new ResetPassword();
  243.     $data->setResetToken($resetToken);
  244.     $profile Profile::getByResetToken($data->getResetToken(), 1);
  245.     $data->setEmail($profile->getEmail());
  246.     $resetForm $this->createForm(ResetPasswordType::class, $data);
  247.     $resetForm->handleRequest($request);
  248.     if ($resetForm->isSubmitted() && $resetForm->isValid()) {
  249.       $data $resetForm->getData();
  250.       try {
  251.         $isReset $this->authService->resetPassword($data);
  252.         if (!$isReset) {
  253.           throw new Exception();
  254.         }
  255.         $mailDocument WebsiteSetting::getByName('authResetConfirmationMailDocument'null$request->getLocale(), 'en') ?? null;
  256.         if (!$mailDocument) {
  257.           throw new ConfigurationException('Website Config "authResetConfirmationMailDocument" is not configured properly.');
  258.         }
  259.         $mailDocument $mailDocument->getData();
  260.         $mail = new \Pimcore\Mail();
  261.         $mail->setDocument($mailDocument);
  262.         $mail->to($data->getEmail());
  263.         $mail->send();
  264.         $this->addFlash('success'$this->translator->trans('auth.form.login.resetSuccess'));
  265.         return $this->redirectToRoute('auth_login', ['_locale' => $request->getLocale()]);
  266.       } catch (Exception $e) {
  267.         $this->addFlash('error'$this->translator->trans('auth.form.reset.error'));
  268.       }
  269.     }
  270.     return $this->renderTemplate('auth/password_reset.html.twig', [
  271.       'resetForm' => $resetForm->createView(),
  272.     ]);
  273.   }
  274. }