vendor/shopware/storefront/Controller/AuthController.php line 50

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Storefront\Controller;
  3. use Shopware\Core\Checkout\Customer\Exception\BadCredentialsException;
  4. use Shopware\Core\Checkout\Customer\Exception\CustomerNotFoundByHashException;
  5. use Shopware\Core\Checkout\Customer\Exception\CustomerNotFoundException;
  6. use Shopware\Core\Checkout\Customer\Exception\CustomerRecoveryHashExpiredException;
  7. use Shopware\Core\Checkout\Customer\Exception\InactiveCustomerException;
  8. use Shopware\Core\Checkout\Customer\SalesChannel\AccountService;
  9. use Shopware\Core\Content\Category\Exception\CategoryNotFoundException;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Exception\InconsistentCriteriaIdsException;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  13. use Shopware\Core\Framework\Routing\Annotation\RouteScope;
  14. use Shopware\Core\Framework\Routing\Exception\MissingRequestParameterException;
  15. use Shopware\Core\Framework\Validation\DataBag\RequestDataBag;
  16. use Shopware\Core\Framework\Validation\Exception\ConstraintViolationException;
  17. use Shopware\Core\System\SalesChannel\SalesChannelContext;
  18. use Shopware\Storefront\Page\Account\Login\AccountLoginPageLoader;
  19. use Symfony\Component\HttpFoundation\Request;
  20. use Symfony\Component\HttpFoundation\Response;
  21. use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
  22. use Symfony\Component\Routing\Annotation\Route;
  23. /**
  24.  * @RouteScope(scopes={"storefront"})
  25.  */
  26. class AuthController extends StorefrontController
  27. {
  28.     /**
  29.      * @var AccountLoginPageLoader
  30.      */
  31.     private $loginPageLoader;
  32.     /**
  33.      * @var AccountService
  34.      */
  35.     private $accountService;
  36.     public function __construct(AccountLoginPageLoader $loginPageLoaderAccountService $accountService)
  37.     {
  38.         $this->loginPageLoader $loginPageLoader;
  39.         $this->accountService $accountService;
  40.     }
  41.     /**
  42.      * @Route("/account/login", name="frontend.account.login.page", methods={"GET"})
  43.      */
  44.     public function loginPage(Request $requestRequestDataBag $dataSalesChannelContext $context): Response
  45.     {
  46.         /** @var string $redirect */
  47.         $redirect $request->get('redirectTo''frontend.account.home.page');
  48.         if ($context->getCustomer()) {
  49.             return $this->createActionResponse($request);
  50.         }
  51.         $page $this->loginPageLoader->load($request$context);
  52.         return $this->renderStorefront('@Storefront/storefront/page/account/register/index.html.twig', [
  53.             'redirectTo' => $redirect,
  54.             'redirectParameters' => $request->get('redirectParameters'json_encode([])),
  55.             'page' => $page,
  56.             'loginError' => (bool) $request->get('loginError'),
  57.             'errorSnippet' => $request->get('errorSnippet'),
  58.             'data' => $data,
  59.         ]);
  60.     }
  61.     /**
  62.      * @Route("/account/logout", name="frontend.account.logout.page", methods={"GET"})
  63.      */
  64.     public function logout(SalesChannelContext $context): Response
  65.     {
  66.         if ($context->getCustomer() === null) {
  67.             return $this->redirectToRoute('frontend.account.login.page');
  68.         }
  69.         try {
  70.             $this->accountService->logout($context);
  71.             $this->addFlash('success'$this->trans('account.logoutSucceeded'));
  72.             $parameters = [];
  73.         } catch (ConstraintViolationException $formViolations) {
  74.             $parameters = ['formViolations' => $formViolations];
  75.         }
  76.         return $this->redirectToRoute('frontend.account.login.page'$parameters);
  77.     }
  78.     /**
  79.      * @Route("/account/login", name="frontend.account.login", methods={"POST"}, defaults={"XmlHttpRequest"=true})
  80.      */
  81.     public function login(Request $requestRequestDataBag $dataSalesChannelContext $context): Response
  82.     {
  83.         if ($context->getCustomer()) {
  84.             return $this->createActionResponse($request);
  85.         }
  86.         try {
  87.             $token $this->accountService->loginWithPassword($data$context);
  88.             if (!empty($token)) {
  89.                 return $this->createActionResponse($request);
  90.             }
  91.         } catch (BadCredentialsException UnauthorizedHttpException InactiveCustomerException $e) {
  92.             if ($e instanceof InactiveCustomerException) {
  93.                 $errorSnippet $e->getSnippetKey();
  94.             }
  95.         }
  96.         $data->set('password'null);
  97.         return $this->forwardToRoute(
  98.             'frontend.account.login.page',
  99.             [
  100.                 'loginError' => true,
  101.                 'errorSnippet' => $errorSnippet ?? null,
  102.             ]
  103.         );
  104.     }
  105.     /**
  106.      * @Route("/account/recover", name="frontend.account.recover.page", methods={"GET"})
  107.      *
  108.      * @throws CategoryNotFoundException
  109.      * @throws InconsistentCriteriaIdsException
  110.      * @throws MissingRequestParameterException
  111.      */
  112.     public function recoverAccountForm(Request $requestSalesChannelContext $context): Response
  113.     {
  114.         $page $this->loginPageLoader->load($request$context);
  115.         return $this->renderStorefront('@Storefront/storefront/page/account/profile/recover-password.html.twig', [
  116.             'page' => $page,
  117.         ]);
  118.     }
  119.     /**
  120.      * @Route("/account/recover", name="frontend.account.recover.request", methods={"POST"})
  121.      */
  122.     public function generateAccountRecovery(Request $requestRequestDataBag $dataSalesChannelContext $context): Response
  123.     {
  124.         try {
  125.             $data->get('email')->set('storefrontUrl'$request->attributes->get('sw-sales-channel-absolute-base-url'));
  126.             $this->accountService->generateAccountRecovery($data->get('email'), $context);
  127.             $this->addFlash('success'$this->trans('account.recoveryMailSend'));
  128.         } catch (CustomerNotFoundException $e) {
  129.             $this->addFlash('success'$this->trans('account.recoveryMailSend'));
  130.         } catch (InconsistentCriteriaIdsException $e) {
  131.             $this->addFlash('danger'$this->trans('error.message-default'));
  132.         }
  133.         return $this->redirectToRoute('frontend.account.recover.page');
  134.     }
  135.     /**
  136.      * @Route("/account/recover/password", name="frontend.account.recover.password.page", methods={"GET"})
  137.      *
  138.      * @throws CategoryNotFoundException
  139.      * @throws InconsistentCriteriaIdsException
  140.      * @throws MissingRequestParameterException
  141.      */
  142.     public function resetPasswordForm(Request $requestSalesChannelContext $context): Response
  143.     {
  144.         $page $this->loginPageLoader->load($request$context);
  145.         $hash $request->get('hash');
  146.         if (!$hash) {
  147.             $this->addFlash('danger'$this->trans('account.passwordHashNotFound'));
  148.             return $this->redirectToRoute('frontend.account.recover.request');
  149.         }
  150.         $customerHashCriteria = new Criteria();
  151.         $customerHashCriteria->addFilter(new EqualsFilter('hash'$hash));
  152.         $customerRecovery $this->accountService->getCustomerRecovery($customerHashCriteria$context->getContext());
  153.         if ($customerRecovery === null) {
  154.             $this->addFlash('danger'$this->trans('account.passwordHashNotFound'));
  155.             return $this->redirectToRoute('frontend.account.recover.request');
  156.         }
  157.         if (!$this->accountService->checkHash($hash$context->getContext())) {
  158.             $this->addFlash('danger'$this->trans('account.passwordHashExpired'));
  159.             return $this->redirectToRoute('frontend.account.recover.request');
  160.         }
  161.         return $this->renderStorefront('@Storefront/storefront/page/account/profile/reset-password.html.twig', [
  162.             'page' => $page,
  163.             'hash' => $hash,
  164.             'formViolations' => $request->get('formViolations'),
  165.         ]);
  166.     }
  167.     /**
  168.      * @Route("/account/recover/password", name="frontend.account.recover.password.reset", methods={"POST"})
  169.      *
  170.      * @throws InconsistentCriteriaIdsException
  171.      */
  172.     public function resetPassword(RequestDataBag $dataSalesChannelContext $context): Response
  173.     {
  174.         $hash $data->get('password')->get('hash');
  175.         try {
  176.             $this->accountService->resetPassword($data->get('password'), $context);
  177.             $this->addFlash('success'$this->trans('account.passwordChangeSuccess'));
  178.         } catch (ConstraintViolationException $formViolations) {
  179.             $this->addFlash('danger'$this->trans('account.passwordChangeNoSuccess'));
  180.             return $this->forwardToRoute(
  181.                 'frontend.account.recover.password.page',
  182.                 ['hash' => $hash'formViolations' => $formViolations'passwordFormViolation' => true]
  183.             );
  184.         } catch (CustomerNotFoundByHashException $e) {
  185.             $this->addFlash('danger'$this->trans('account.passwordChangeNoSuccess'));
  186.             return $this->forwardToRoute('frontend.account.recover.request');
  187.         } catch (CustomerRecoveryHashExpiredException $e) {
  188.             $this->addFlash('danger'$this->trans('account.passwordHashExpired'));
  189.             return $this->forwardToRoute('frontend.account.recover.request');
  190.         }
  191.         return $this->redirectToRoute('frontend.account.profile.page');
  192.     }
  193. }