src/Controller/SecurityController.php line 157

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Master\Company;
  4. use App\Entity\Slave\User;
  5. use App\Form\Security\LoginCompanyType;
  6. use App\Form\Security\PasswordCreationType;
  7. use App\Form\Security\PasswordRecoveryType;
  8. use App\Service\CompanyService;
  9. use App\Service\ValidationService;
  10. use Doctrine\Persistence\ManagerRegistry;
  11. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  12. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  13. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  14. use Symfony\Component\Form\FormError;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Mailer\MailerInterface;
  18. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  19. use Symfony\Component\Routing\Annotation\Route;
  20. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  21. use Symfony\Contracts\Translation\TranslatorInterface;
  22. use Symfony\Component\Validator\Validator\ValidatorInterface;
  23. class SecurityController extends AbstractController
  24.     protected $mr;
  25.     private $params;
  26.     public function __construct(ManagerRegistry $managerRegistryParameterBagInterface $params)
  27.     {
  28.         $this->mr $managerRegistry;
  29.         $this->params $params;
  30.     }
  31.     /**
  32.      * @Route("/accedi-reindirizza", name="login_redirect")
  33.      */
  34.     public function loginRedirect(Request $requestValidatorInterface $validator): Response
  35.     {
  36.         $emMaster $this->mr->getManager('master');
  37.         $session $request->getSession();
  38.         $company = new Company();
  39.         $form $this->createForm(LoginCompanyType::class, $company);
  40.         $form->handleRequest($request);
  41.         if($form->isSubmitted()){
  42.             $valid true;
  43.             if($valid$valid ValidationService::validateNotBlank($validator$form->get('companyCode'));
  44.             $company $emMaster->getRepository('App\Entity\Master\Company')->findOneBy(array('code' => $form->get('companyCode')->getData()));
  45.             if($company == null){
  46.                 $valid false;
  47.                 $form->get('companyCode')->addError(new FormError("Nessuna azienda trovata con questo codice!"));
  48.             }
  49.             if($valid && $form->isValid()){
  50.                 $session->set('companyId'$company->getId());
  51.                 return $this->redirectToRoute('login', array('companyCode' => $company->getCode()));
  52.             }
  53.         }
  54.         return $this->render('security/login_redirect.html.twig', array(
  55.             'form' => $form->createView()
  56.         ));
  57.     }
  58.     /**
  59.      * @Route("/accedi", name="login_old")
  60.      */
  61.     public function loginOld(Request $request
  62.     {   
  63.         if(isset($_COOKIE["eposm_company_code"]))
  64.             return $this->redirectToRoute("user_index");
  65.         return $this->redirectToRoute("login_redirect");
  66.     }
  67.     
  68.     /**
  69.      * @Route("/accedi/{companyCode}", name="login")
  70.      */
  71.     public function login($companyCodeRequest $requestValidatorInterface $validatorMailerInterface $mailerAuthenticationUtils $authenticationUtils): Response
  72.     {
  73.         $emMaster $this->mr->getManager('master');
  74.         $session $request->getSession();
  75.         $company $emMaster->getRepository('App\Entity\Master\Company')->findOneBy(array('code' => $companyCode));
  76.         $em CompanyService::getSlaveManagerByCompany($this->mr$this->params$company);
  77.         $error $authenticationUtils->getLastAuthenticationError();
  78.         $lastUsername $authenticationUtils->getLastUsername();
  79.         $pswUser = new User();
  80.         $form $this->createForm(PasswordRecoveryType::class, $pswUser);
  81.         $form->handleRequest($request);
  82.         if($form->isSubmitted()){
  83.             $valid true;
  84.             $path 'https://www.google.com/recaptcha/api/siteverify?secret=6Lf8cfEpAAAAAIGg748C0wPad5YSPs68DyXEl8eM&response='.$request->request->get("g-recaptcha-response");
  85.             $ch curl_init();
  86.             curl_setopt($chCURLOPT_HTTPHEADER, array('Content-Type: application/json''Accept: application/json'));
  87.             curl_setopt($chCURLOPT_URL,$path);
  88.             curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
  89.             curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  90.             curl_setopt($chCURLOPT_CUSTOMREQUEST"GET");
  91.             $result curl_exec($ch);
  92.             curl_close($ch);
  93.             $res json_decode($resulttrue);
  94.             
  95.             if(!$res["success"]){
  96.                 $valid false;
  97.                 $form->get('recaptcha')->addError(new FormError("Convalidare prima di inviare la richiesta"));
  98.                 $this->addFlash('notice_warning'"Prima di inviare la richiesta, provare di non essere un robot.");
  99.             }
  100.             if($valid$valid ValidationService::validateNotBlank($validator$form->get('email'));
  101.             if($valid$valid ValidationService::validateEmail($validator$form->get('email'));
  102.             if($valid && $form->isValid()){
  103.                 
  104.                 $user $em->getRepository("App\Entity\Slave\User")->findOneByEmail($pswUser->getEmail());
  105.                 if($user){
  106.                     $now = new \DateTime();
  107.                     $user->setOneTimeCode(md5(uniqid()));
  108.                     $user->setExpirationOneTimeCode(date_modify($now"+3 hours"));
  109.                     $em->flush();
  110.                     $message = (new TemplatedEmail())
  111.                         ->subject($this->params->get('subject_recover_password'))
  112.                         ->from($this->params->get('email_noreply'))
  113.                         ->to($user->getEmail())
  114.                         ->htmlTemplate('email/password_recovery.html.twig')
  115.                         ->context(['user' => $user'company' => $company]);
  116.                     $mailer->send($message);
  117.                 }
  118.                 
  119.                 $this->addFlash('notice_success'"La richiesta è stata ricevuta correttamente.<br>Se l'account esiste, verrà inviato un messaggio di posta elettronica all'indirizzo corrispondente.");
  120.                 return $this->redirectToRoute('login', array('companyCode' => $companyCode));
  121.             }
  122.             else{
  123.                 $session->set('openModalRecover'true);
  124.                 $this->addFlash('notice_warning'"Controlla le informazioni inserite nel form di recupero password.");
  125.             }
  126.         }
  127.         return $this->render('security/login.html.twig', array(
  128.             'company' => $company,
  129.             'last_username' => $lastUsername,
  130.             'error' => $error,
  131.             'form' => $form->createView()
  132.         ));
  133.     }
  134.     /**
  135.      * @Route("/accedi-controllo", name="login_check")
  136.      */
  137.     public function loginCheck() {}
  138.     /**
  139.      * @Route("/disconnetti", name="logout")
  140.      */
  141.     public function logout(Response $response
  142.     {        
  143.         $response->headers->clearCookie('eposm_company_code''/''.'.$this->params->get('cookies_domain'));
  144.     }
  145.     /**
  146.      * @Route("/crea-password/{oneTimeCode}/{companyCode}", name="password_creation", requirements={"oneTimeCode" = "[\w\d]{32}"})
  147.      */
  148.     public function passwordCreation(Request $request$oneTimeCode$companyCodeValidatorInterface $validatorUserPasswordHasherInterface $passwordHasher)
  149.     {
  150.         //DISCONNETTO L'UTENTE SE CONNESSO
  151.         $this->get('security.token_storage')->setToken(null);
  152.         $session $request->getSession();
  153.         $emMaster $this->mr->getManager('master');
  154.         $company $emMaster->getRepository('App\Entity\Master\Company')->findOneByCode($companyCode);
  155.         $session->set("companyId"$company->getId());
  156.         $em CompanyService::getSlaveManagerByCompany($this->mr$this->params$company);
  157.         
  158.         $user $em->getRepository('App\Entity\Slave\User')->findOneByOneTimeCode($oneTimeCode);
  159.         $now = new \DateTime('now');
  160.         if($user != null && $user->getExpirationOneTimeCode() != null){
  161.             date_modify($user->getExpirationOneTimeCode(), '+3 hours');
  162.             if($now->format("YmdHis") < $user->getExpirationOneTimeCode()->format("YmdHis")){
  163.                 $form $this->createForm(PasswordCreationType::class, $user);
  164.                 $form->handleRequest($request);
  165.                 if($form->isSubmitted()){
  166.                     $valid true;
  167.                     $valid ValidationService::validateNotBlank($validator$form->get('password'));
  168.                     if($valid){
  169.                         $psw $form->get('password')->getData();
  170.                         $count 0;
  171.                         if(preg_match('/[0-9]/'$psw)) $count++;
  172.                         if(preg_match('/[a-z]/'$psw)) $count++;
  173.                         if(preg_match('/[A-Z]/'$psw)) $count++;
  174.                         if(preg_match('/[\!\#\$\&\(\)\.\+\-_]/'$psw)) $count++;
  175.                         if($count 3)
  176.                         {
  177.                             $this->addFlash('notice_warning'"La password inserita non è sufficientemente forte.");
  178.                             $valid false;
  179.                         }
  180.                     }
  181.                     if($valid && $form->isValid()){
  182.                         $password $passwordHasher->hashPassword($user$form->get("password")->getData());
  183.                         $user->setPassword($password);
  184.                         $user->setActive(1);
  185.                         $em->flush();
  186.                     
  187.                         $this->addFlash('notice_success'"La nuova password è stata creata correttamente; prima di poter accedere controllare se l'account è attivato.");
  188.                         return $this->redirectToRoute("login", array('companyCode' => $companyCode));
  189.                     }
  190.                 }
  191.                 
  192.                 return $this->render('security/password_create.html.twig', array(
  193.                     'oneTimeCode' => $oneTimeCode,
  194.                     'company' => $company,
  195.                     'form' => $form->createView()
  196.                 ));
  197.             }
  198.             else{
  199.                 $this->addFlash('notice_warning'"Il codice per la generazione della password è scaduto.<br>La password deve essere creata entro 3 ore dalla richiesta di attivazione.<br>Per poter proseguire è necessario richiedere un nuovo codice.");
  200.                 return $this->redirectToRoute("login", array('companyCode' => $companyCode));
  201.             }
  202.         }
  203.         else{
  204.             $this->addFlash('notice_warning'"Non è stato trovato nessun utente abbinato al codice inserito, nel caso sia stato fatto copia/incolla dall'e-mail ricevuta, verificare che non siano stati riportati degli spazi o caratteri aggiuntivi.");
  205.             return $this->redirectToRoute("login", array('companyCode' => $companyCode));
  206.         }
  207.     }
  208. }