src/Controller/Front/UserZone/SecurityController.php line 42

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front\UserZone;
  3. use App\Config\Pages;
  4. use App\Entity\Order\Orders;
  5. use App\Entity\Page\Page;
  6. use App\Entity\User\Admin;
  7. use App\Entity\User\User;
  8. use App\Entity\User\UserPackage;
  9. use App\Exception\TokenNotException;
  10. use App\Exception\UserAccountIsActivatedException;
  11. use App\Exception\UserExistException;
  12. use App\Exception\EmailExistException;
  13. use App\Exception\PasswordNotEqualException;
  14. use Exception;
  15. use Symfony\Component\HttpFoundation\JsonResponse;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use App\Exception\UserAccountBlockedException;
  18. use App\Utils\ResponseMessage\ResponseMessage;
  19. use Symfony\Component\HttpFoundation\Response;
  20. use App\Exception\OldPasswordNotEqualException;
  21. use App\Exception\UserAccountNotActiveException;
  22. use App\Exception\PasswordIsNotSecureEnoughException;
  23. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  24. use Symfony\Component\Security\Core\Exception\BadCredentialsException;
  25. use Symfony\Component\Routing\Annotation\Route;
  26. use Symfony\Component\Security\Core\User\UserInterface;
  27. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  28. class SecurityController extends SecurityUtilsController
  29. {
  30.     private const LOGIN_TEMPLATE_PATH = 'front/user_zone/security/login.twig';
  31.     private const REGISTER_TEMPLATE_PATH = 'front/user_zone/security/register.twig';
  32.     private const REMIND_PASSWORD_PATH = 'front/user_zone/security/remind_password.twig';
  33.     private const CHANGE_PASSWORD_PATH = 'front/user_zone/security/change_password.twig';
  34.     private const ACCOUNT_TEMPLATE_PATH = 'front/user_zone/my_account.twig';
  35.     private const COMPANY_TEMPLATE_PATH = 'front/user_zone/my_company_data.twig';
  36.     private const ADVERTISING_PACKAGE_TEMPLATE_PATH = 'front/user_zone/advertising/advertising_package.twig';
  37.     private const ADVERTISING_PACKAGE_SHOW_TEMPLATE_PATH = 'front/user_zone/advertising/advertising_package_show.twig';
  38.     public function registerAction(Request $originalRequest, Page $page): Response
  39.     {
  40.         $error = '';
  41.         $locale = $originalRequest->getLocale();
  42.         $userLogged = $this->checkUserLogIn($originalRequest, $page);
  43.         $data = $originalRequest->request->all();
  44.         $viewParams = $this->createViewParams($originalRequest, $error, $page);
  45.         $viewParams['links_in_footer'] = $this->footerLinkProvider->getAll();
  46.         if (false === is_null($userLogged)) {
  47.             return $userLogged;
  48.         }
  49.         if ($originalRequest->isMethod('POST')) {
  50.             try {
  51.                 return $this->registerUser($originalRequest);
  52.             } catch (UserExistException $e) {
  53.                 $page = $this->pageProvider->getOneByMigrationId(Pages::USER_ZONE_LOGIN);
  54.                 $link = $page->translate($locale, false)->getUrl();
  55.                 $error = ResponseMessage::onUserExistException($locale, $link);
  56.                 $viewParams['old_email'] = $data['email'] ?? '';
  57.                 $viewParams['old_password_1'] = $data['password'] ?? '';
  58.                 $viewParams['old_password_2'] = $data['password_repeat'] ?? '';
  59.             } catch (PasswordNotEqualException $e) {
  60.                 $error = ResponseMessage::onPasswordNotEqualException($locale);
  61.                 $viewParams['old_email'] = $data['email'] ?? '';
  62.                 $viewParams['old_password_1'] = $data['password'] ?? '';
  63.                 $viewParams['old_password_2'] = $data['password_repeat'] ?? '';
  64.             } catch (PasswordIsNotSecureEnoughException $e) {
  65.                 $error = ResponseMessage::onPasswordIsNotSecureEnoughException($locale);
  66.                 $viewParams['old_email'] = $data['email'] ?? '';
  67.                 $viewParams['old_password_1'] = $data['password'] ?? '';
  68.                 $viewParams['old_password_2'] = $data['password_repeat'] ?? '';
  69.             }
  70.             if (!empty($error)) {
  71.                 $this->addFlash('response_message', $error);
  72.             }
  73.         }
  74.         return $this->render(self::REGISTER_TEMPLATE_PATH, $viewParams);
  75.     }
  76.     public function loginAction(Request $originalRequest, Page $page): Response
  77.     {
  78.         $error = '';
  79.         $locale = $originalRequest->getLocale();
  80.         $userLogged = $this->checkUserLogIn($originalRequest, $page);
  81.         if (false === is_null($userLogged)) {
  82.             return $userLogged;
  83.         }
  84.         if ($originalRequest->isMethod('POST')) {
  85.             try {
  86.                 return $this->logInUser($originalRequest);
  87.             } catch (BadCredentialsException $e) {
  88.                 $error = ResponseMessage::onBadCredentialsException($locale);
  89.             } catch (UserAccountNotActiveException $e) {
  90.                 $error = ResponseMessage::onUserAccountNotActiveException($locale);
  91.             } catch (UserAccountBlockedException $e) {
  92.                 $error = ResponseMessage::onUserAccountBlockedException($locale);
  93.             }
  94.         }
  95.         if (!empty($error)) {
  96.             $this->addFlash('response_message', $error);
  97.         }
  98.         $viewParams = $this->createViewParams($originalRequest, $error, $page);
  99.         return $this->render(self::LOGIN_TEMPLATE_PATH, $viewParams);
  100.     }
  101.     public function logoutAction(Request $originalRequest, Page $page): Response
  102.     {
  103.         return $this->logOutUser($originalRequest);
  104.     }
  105.     public function activateAccount(Request $request, Page $page): Response
  106.     {
  107.         $error = '';
  108.         $viewParams = $this->createViewParams($request, $error, $page);
  109.         $originalRequest = $request->attributes->get('originalRequest');
  110.         $token = $originalRequest->query->get('token') ?? $originalRequest->query->get('securityLoginToken');
  111.         $locale = $request->getLocale();
  112.         $login = $this->pageProvider->getOneByMigrationId(Pages::USER_ZONE_LOGIN);
  113.         $loginPageUrl = $login->translate($locale, false)->getUrl();
  114.         try {
  115.             return $this->checkIfTokenActivationExists($token, $request);
  116.         } catch (TokenNotException $e) {
  117.             $error = ResponseMessage::badToken($locale);
  118.             $this->addFlash('response_message', $error);
  119.         } catch (UserAccountIsActivatedException $e) {
  120.             $error = ResponseMessage::tryActivateAccount($locale);
  121.             $this->addFlash('response_message', $error);
  122.             return $this->redirectToRoute('front-page', ['_locale' => $locale, 'url' => $loginPageUrl]);
  123.         }
  124.         return $this->render(self::LOGIN_TEMPLATE_PATH, $viewParams);
  125.     }
  126.     public function forgotPasswordAction(Request $request, Page $page): ?Response
  127.     {
  128.         $error = '';
  129.         $locale = $request->getLocale();
  130.         $viewParams = $this->createViewParams($request, $error, $page);
  131.         if ($request->isMethod("POST")) {
  132.             try {
  133.                 $this->checkIfEmailExists($request);
  134.                 $error = ResponseMessage::onSendMessageResetPassword($locale);
  135.             } catch (EmailExistException $e) {
  136.                 $error = ResponseMessage::onEmailExistException($locale);
  137.             }
  138.             if (!empty($error)) {
  139.                 $this->addFlash('response_message', $error);
  140.             }
  141.         }
  142.         return $this->render(self::REMIND_PASSWORD_PATH, $viewParams);
  143.     }
  144.     public function orderCreatePasswordAndLoginAction(Request $request, Page $page): Response
  145.     {
  146.         $originalRequest = $request->attributes->get('originalRequest');
  147.         $securityLoginToken = $originalRequest->query->get('securityLoginToken') ??
  148.             $originalRequest->query->get('token');
  149.         $locale = $request->getLocale();
  150.         $viewParams = $this->createViewParams($request, '', $page);
  151.         $data = $request->request->all();
  152.         $viewParams['mode'] = 'order_set_password';
  153.         $errorMessage = ResponseMessage::onTokenExistException($locale);
  154.         $userLinkLoginUsed = $this->userLinkLoginProvider->getOneByTokenAndUsed($securityLoginToken, true);
  155.         $userLinkLoginNoUsed = $this->userLinkLoginProvider->getOneByTokenAndUsed($securityLoginToken, false);
  156.         if ($userLinkLoginNoUsed) {
  157.             if ($request->isMethod('POST')) {
  158.                 if ($data['password_1'] === $data['password_2']) {
  159.                     try {
  160.                         $user = $userLinkLoginNoUsed->getUser();
  161.                         $this->userService->checkIfPasswordSecureEnough($data['password_1']);
  162.                         $newPassword = $this->userFactory->changePassword($data['password_1'], $user);
  163.                         $this->userService->updatePassword($newPassword);
  164.                         $page = $this->pageProvider->getOneByMigrationId(Pages::USER_ZONE_PACKAGE_ADVERTISING);
  165.                         $pageUrl = $page->translate($locale, false)->getUrl();
  166.                         $token = new UsernamePasswordToken(
  167.                             $userLinkLoginNoUsed->getUser(),
  168.                             'user_firewall', $user->getRoles(),
  169.                         );
  170.                         $this->container->get("security.token_storage")->setToken($token);
  171.                         $event = new InteractiveLoginEvent($originalRequest, $token);
  172.                         $this->eventDispatcher->dispatch($event);
  173.                         $userLinkLoginNoUsed->setUsed(true);
  174.                         $this->userLinkLoginService->update($userLinkLoginNoUsed);
  175.                         return $this->redirectToRoute('front-page', ['_locale' => $locale, 'url' => $pageUrl]);
  176.                     } catch (PasswordIsNotSecureEnoughException $e) {
  177.                         $this->addFlash(
  178.                             'response_message',
  179.                             ResponseMessage::onPasswordIsNotSecureEnoughException($locale),
  180.                         );
  181.                     }
  182.                 } else {
  183.                     $this->addFlash(
  184.                         'response_message',
  185.                         ResponseMessage::onPasswordNotEqualException($locale),
  186.                     );
  187.                 }
  188.             }
  189.         }
  190.         if ($userLinkLoginNoUsed === null) {
  191.             if ($userLinkLoginUsed !== null) {
  192.                 $errorMessage = ResponseMessage::tryActivateAccount($locale);
  193.             }
  194.             $this->addFlash('response_message', $errorMessage);
  195.             $loginUrl = $this->pageProvider
  196.                 ->getOneByMigrationId(Pages::USER_ZONE_LOGIN)
  197.                 ->translate($locale, false)->getUrl();
  198.             return $this->redirectToRoute('front-page', ['_locale' => $locale, 'url' => $loginUrl]);
  199.         }
  200.         return $this->render(self::CHANGE_PASSWORD_PATH, $viewParams);
  201.     }
  202.     public function resetPasswordAction(Request $request, Page $page): Response
  203.     {
  204.         $token = $request->attributes->get('originalRequest')->query->get('token');
  205.         $error = '';
  206.         $locale = $request->getLocale();
  207.         $data = $request->request->all();
  208.         $viewParams = $this->createViewParams($request, $error, $page);
  209.         try {
  210.             $this->checkIfTokenExists($token);
  211.         } catch (TokenNotException $e) {
  212.             $error = ResponseMessage::onTokenExistException($locale);
  213.             $this->addFlash('response_message', $error);
  214.             $loginUrl = $this->pageProvider
  215.                 ->getOneByMigrationId(Pages::USER_ZONE_LOGIN)
  216.                 ->translate($locale, false)->getUrl();
  217.             return $this->redirectToRoute('front-page', ['_locale' => $locale, 'url' => $loginUrl]);
  218.         }
  219.         if ($request->isMethod('POST')) {
  220.             if ($data['password_1'] === $data['password_2']) {
  221.                 $data['token'] = $token;
  222.                 try {
  223.                     $user = $this->userPasswordResetProvider->getOneByToken($token)->getUser();
  224.                     return $this->changePasswordIfIsSecure($data, $user, $request);
  225.                 } catch (PasswordIsNotSecureEnoughException $e) {
  226.                     $error = ResponseMessage::onPasswordIsNotSecureEnoughException($locale);
  227.                 }
  228.             } else {
  229.                 $error = ResponseMessage::onPasswordNotEqualException($locale);
  230.             }
  231.         }
  232.         if (!empty($error)) {
  233.             $this->addFlash('response_message', $error);
  234.         }
  235.         return $this->render(self::CHANGE_PASSWORD_PATH, $viewParams);
  236.     }
  237.     public function userAccountAction(Request $request, Page $page): Response
  238.     {
  239.         $data = $request->request->all();
  240.         $locale = $request->getLocale();
  241.         $error = '';
  242.         $viewParams = $this->createViewParams($request, $error, $page);
  243.         $viewParams['user'] = $this->userProvider->getUserFromId($this->getUser());
  244.         $userLogged = $this->checkUserLogOut($request, $page);
  245.         if (false === is_null($userLogged)) {
  246.             return $userLogged;
  247.         }
  248.         if ($request->isMethod('POST')) {
  249.             try {
  250.                 $this->changePasswordAccount($request, $viewParams['user']);
  251.                 $this->addFlash('response_message', ResponseMessage::onChangeMessageResetPassword($locale));
  252.             } catch (OldPasswordNotEqualException $e) {
  253.                 $error = ResponseMessage::badOldPassword($locale);
  254.                 $viewParams['lastPasswords'] = $data['password'];
  255.             } catch (PasswordNotEqualException $e) {
  256.                 $error = ResponseMessage::onPasswordNotEqualException($locale);
  257.                 $viewParams['lastPasswords'] = $data['password'];
  258.             } catch (PasswordIsNotSecureEnoughException $e) {
  259.                 $error = ResponseMessage::onPasswordIsNotSecureEnoughException($locale);
  260.                 $viewParams['lastPasswords'] = $data['password'];
  261.             }
  262.             if (!empty($error)) {
  263.                 $this->addFlash('response_message', $error);
  264.             }
  265.         }
  266.         return $this->render(self::ACCOUNT_TEMPLATE_PATH, $viewParams);
  267.     }
  268.     public function userCompanyAction(Request $request, Page $page): Response
  269.     {
  270.         $userLogged = $this->checkUserLogOut($request, $page);
  271.         if (false === is_null($userLogged)) {
  272.             return $userLogged;
  273.         }
  274.         $error = '';
  275.         $user = $this->getUser();
  276.         $userId = $user->getId();
  277.         if ($request->isMethod('POST')) {
  278.             $company = $this->companyProvider->getEntityByUserId($userId);
  279.             if (is_null($company)) {
  280.                 $company = $this->companyFactory->createEmptyCompany($user);
  281.                 $this->companyService->create($company);
  282.             }
  283.             $this->companyFactory->updateCompanyFromRequestParams($request, $company);
  284.             $this->companyService->flush();
  285.         }
  286.         $viewParams = $this->createViewParams($request, $error, $page);
  287.         $viewParams['company'] = $this->companyProvider->getOneByUserId($userId);
  288.         return $this->render(self::COMPANY_TEMPLATE_PATH, $viewParams);
  289.     }
  290.     public function userAccountDeleteAction(Request $request, Page $page): Response
  291.     {
  292.         $userLogged = $this->checkUserLogOut($request, $page);
  293.         if (false === is_null($userLogged)) {
  294.             return $userLogged;
  295.         }
  296.         $user = $this->getUser();
  297.         $this->userService->deleteAccount($user);
  298.         return $this->logoutAction($request, $page);
  299.     }
  300.     public function userAdvertisingPackages(Request $request, Page $page): Response
  301.     {
  302.         $userLogged = $this->checkUserLogOut($request, $page);
  303.         $user = $this->getUser();
  304.         $locale = $request->getLocale();
  305.         if (false === is_null($userLogged)) {
  306.             return $userLogged;
  307.         }
  308.         $originalRequest = $request->attributes->get('originalRequest', null);
  309.         $id = $originalRequest->query->get('id', null);
  310.         $viewParams = [
  311.             'links_in_footer' => $this->footerLinkProvider->getAll(),
  312.         ];
  313.         if (is_null($id) === false) {
  314.             $userPackage = $this->userPackageProvider->getOneById($id);
  315.             $entity = $request->attributes->get('entity');
  316.             if (is_null($userPackage) === false) {
  317.                 if (
  318.                     ($userPackage->getAdditionalUser() && !$userPackage->getActive()) ||
  319.                     $userPackage->getUser() !== $user
  320.                 ) {
  321.                     $redirectUrl = $this->pageProvider->getOneByMigrationId(
  322.                         Pages::USER_ZONE_PACKAGE_ADVERTISING,
  323.                     )->translate($locale, false)->getUrl();
  324.                     return $this->redirectToRoute('front-page', ['_locale' => $locale, 'url' => $redirectUrl]);
  325.                 }
  326.                 $offers = $this->userPackageOfferProvider
  327.                     ->getAllByUserPackageOrder(
  328.                         $userPackage->getUser(),
  329.                         $userPackage->getPackage(),
  330.                         $userPackage->getOrder(),
  331.                     );
  332.                 if ($userPackage->getAdditionalUser() === false) {
  333.                     $offers = [];
  334.                     foreach (
  335.                         $this->userPackageProvider->getAllByPackageAndOrder(
  336.                             $userPackage->getPackage(),
  337.                             $userPackage->getOrder(),
  338.                         ) as $userPackageEntity
  339.                     ) {
  340.                         foreach (
  341.                             $this->userPackageOfferProvider->getAllByUserPackageOrder(
  342.                                 $userPackageEntity->getUser(),
  343.                                 $userPackageEntity->getPackage(),
  344.                                 $userPackageEntity->getOrder(),
  345.                             ) as $userPackageOffer
  346.                         ) {
  347.                             $offers[] = $userPackageOffer;
  348.                         }
  349.                     }
  350.                 }
  351.             }
  352.             $template = self::ADVERTISING_PACKAGE_SHOW_TEMPLATE_PATH;
  353.             $viewParams['offers'] = $offers ?? [];
  354.             $viewParams['entity'] = $entity;
  355.             $viewParams['userPackage'] = $this->packageFactory->createUserPackageDetailsView($request, $userPackage);
  356.             $viewParams['configuration'] = $this->createConfiguration($userPackage);
  357.         } else {
  358.             $template = self::ADVERTISING_PACKAGE_TEMPLATE_PATH;
  359.             $entity = $request->attributes->get('entity');
  360.             $viewParams['entity'] = $entity;
  361.             $viewParams['entities'] = $this->createPackagesView($user, $request);
  362.         }
  363.         return $this->render($template, $viewParams);
  364.     }
  365.     /**
  366.      * @Route("add/user/assigned/to/package", name="add-user-assigned-to-package", methods={"POST"})
  367.      */
  368.     public function addUsersAssignedToThePackage(Request $request): Response
  369.     {
  370.         $locale = $request->get('locale', 'pl');
  371.         try {
  372.             $data = $request->request->all();
  373.             $customers = $request->get('customers', []);
  374.             $entityPackage = $this->packageProvider->getOneById($data['package'] ?? '');
  375.             $entityOrder = $this->orderProvider->getOneById($data['order'] ?? '');
  376.             $emailOwner = is_null($this->getUser()) === false ? $this->getUser()->getEmail() : '';
  377.             foreach ($customers as $customer) {
  378.                 $entityUser = $this->userProvider->getUserByUsername($customer);
  379.                 if (is_null($entityPackage) || is_null($entityOrder)) {
  380.                     $response = [
  381.                         'error' => true,
  382.                         'message' => ResponseMessage::accountNoExists($locale),
  383.                     ];
  384.                     return new JsonResponse($response);
  385.                 }
  386.                 if (is_null($entityUser)) {
  387.                     $request->request->set('email', $customer);
  388.                     $request->request->set('emailOwner', $emailOwner);
  389.                     $this->userService->sharePackageCreateAccount($request);
  390.                     $entityUser = $this->userProvider->getUserByUsername($customer);
  391.                 }
  392.                 $packageUserEntity = $this->userPackageProvider
  393.                     ->getOneByUserPackageOrder(
  394.                         $entityUser,
  395.                         $entityPackage,
  396.                         $entityOrder,
  397.                     );
  398.                 if (is_null($packageUserEntity) === false) {
  399.                     $userPackageRequest = new Request();
  400.                     $userPackageRequest->request->set('id', $packageUserEntity->getId());
  401.                     $this->userPackageService->editActive($userPackageRequest, true);
  402.                     $response = [
  403.                         'error' => false,
  404.                         'message' => ResponseMessage::addUsersAssigned($locale),
  405.                     ];
  406.                     return new JsonResponse($response);
  407.                 }
  408.                 $userRequest = new Request();
  409.                 $userRequest->request->set('user', $entityUser->getId());
  410.                 $userRequest->request->set('order', $entityOrder->getId());
  411.                 $userRequest->request->set('package', $entityPackage->getId());
  412.                 $userRequest->request->set('additionalUser', true);
  413.                 $userRequest->request->set('emailOwner', $emailOwner);
  414.                 $userRequest->request->set('locale', $locale);
  415.                 $userRequest->request->set('isActive', $entityOrder->isActive());
  416.                 $this->userPackageService->create($userRequest);
  417.             }
  418.             $response = [
  419.                 'error' => false,
  420.                 'message' => ResponseMessage::addUsersAssigned($locale),
  421.             ];
  422.         } catch (Exception $e) {
  423.             $response = [
  424.                 'error' => true,
  425.                 'message' => ResponseMessage::unknownError($locale),
  426.             ];
  427.         }
  428.         return new JsonResponse($response);
  429.     }
  430.     /**
  431.      * @Route("remove/user/assigned/to/package", name="remove-user-assigned-to-package", methods={"DELETE"})
  432.      */
  433.     public function deleteUsersAssignedToThePackage(Request $request): Response
  434.     {
  435.         $locale = $request->get('locale', 'pl');
  436.         try {
  437.             $this->userPackageService->editActive($request, false);
  438.             $response = [
  439.                 'alert' => 'success',
  440.                 'message' => ResponseMessage::removeUsersAssigned($locale),
  441.             ];
  442.         } catch (Exception $e) {
  443.             $response = [
  444.                 'alert' => 'success',
  445.                 'message' => ResponseMessage::unknownError($locale),
  446.             ];
  447.         }
  448.         return new JsonResponse($response);
  449.     }
  450.     private function createConfiguration(?UserPackage $userPackage): array
  451.     {
  452.         if (
  453.             is_null($userPackage) ||
  454.             is_null($userPackage->getPackage()) ||
  455.             is_null($userPackage->getUser())
  456.         ) {
  457.             return [];
  458.         }
  459.         $orderOffer = (int)$userPackage->getOrder()->getConfiguration()['number_ads'] ?? 0;
  460.         $orderUsed = $userPackage->getOrder()->getConfiguration()['number_used_ads'] ?? 0;
  461.         if ($orderOffer === 0) {
  462.             $orderOffer = $userPackage->getPackage()->getNumberOfAds();
  463.         }
  464.         return [
  465.             'orderOffer' => $orderOffer,
  466.             'orderUsed' => is_null($orderUsed) === false ? ($orderOffer - $orderUsed) : 0,
  467.         ];
  468.     }
  469.     private function createPackagesView(null|Admin|User $user, Request $request): ?array
  470.     {
  471.         $response = [];
  472.         if (null === $user) {
  473.             return $response;
  474.         }
  475.         if (in_array('ROLE_ADMIN', $user->getRoles())) {
  476.             return $response;
  477.         }
  478.         foreach ($this->userPackageProvider->getAllByUser($user) as $entity) {
  479.             if (is_null($entity->getOrder()) === false) {
  480.                 if ($entity->getOrder()->getNeedToAccepted()) {
  481.                     continue;
  482.                 }
  483.             }
  484.             if ($entity->getAdditionalUser() && !$entity->getActive()) {
  485.                 continue;
  486.             }
  487.             $response[] = $this->packageFactory->createUserPackageListView($request, $entity);
  488.         }
  489.         return $response;
  490.     }
  491. }