src/Security/Controller/SecurityController.php line 62

Open in your IDE?
  1. <?php
  2. namespace App\Security\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Security\Core\Exception\BadCredentialsException;
  5. use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
  6. use Symfony\Component\HttpFoundation\Response;
  7. //use App\Entity\SeguridadHistorialPassword;
  8. use App\Entity\SeguridadCodigoActivacion;
  9. //use Security\Interfaces\WillyUser;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\Security\Core\Security;
  12. use Symfony\Contracts\Translation\TranslatorInterface;
  13. use Symfony\Component\Mailer\MailerInterface;
  14. use Psr\Log\LoggerInterface;
  15. use Symfony\Component\Mime\Email;
  16. use App\Entity\SeguridadUsuario;
  17. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  18. use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
  19. use Symfony\Component\Security\Core\Encoder\NativePasswordEncoder;
  20. use Symfony\Component\Routing\Annotation\Route;
  21. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  22. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  23. use App\Entity\TipoSuscripcion;
  24. use App\Entity\Suscripcion;
  25. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  26. use Symfony\Component\HttpFoundation\RequestStack;
  27. use Doctrine\ORM\EntityManagerInterface;
  28. use App\Entity\SeguridadConfiguracion;
  29. /**
  30. *
  31. * Security controller.
  32. *
  33. */
  34. class SecurityController extends AbstractController
  35. {
  36.     private $session;
  37.     private $translator;
  38.     private $logger;
  39.     private $mailer;
  40.     private $encoder;
  41.     private $em;
  42.     private $request;
  43.     public function __construct(UserPasswordHasherInterface $encoderTranslatorInterface $translatorMailerInterface $mailerRequestStack $requestStackEntityManagerInterface $entityManagerLoggerInterface $logger)
  44.     {
  45.         $this->encoder $encoder;
  46.         $this->translator $translator;
  47.         $this->mailer $mailer;
  48.         $this->session $requestStack->getSession();
  49.         $this->em $entityManager;
  50.         $this->logger $logger;
  51.         $this->request $requestStack->getCurrentRequest();
  52.     }
  53.     public function login(AuthenticationUtils $authenticationUtils): Response
  54.     {
  55.         $session $this->session;
  56.         $username $authenticationUtils->getLastUsername();
  57.         $error_msj '';
  58.         $msj =  $session->get('auth_msj');
  59.         if ($msj)
  60.         {
  61.             $session->remove('auth_msj');
  62.         }
  63.         else
  64.         {
  65.             $msj='';
  66.         }
  67.         $error $authenticationUtils->getLastAuthenticationError();
  68. /*        if (!$error)
  69.         {
  70.             $error = $session->get(Security::AUTHENTICATION_ERROR);
  71.             $session->remove(Security::AUTHENTICATION_ERROR);
  72.         }*/
  73.         if ($error)
  74.         {
  75.             if ($error instanceof BadCredentialsException ||
  76.                 $error instanceof UsernameNotFoundException)
  77.             {
  78.                 $error_msj $this->translator->trans('seguridad.autenticacion.error.credenciales');
  79.             }
  80.             else
  81.             if ($error->getMessage()=='Captcha error')
  82.             {
  83.                 $error_msj $this->translator->trans('seguridad.autenticacion.error.captcha');
  84.             }
  85.             else
  86.             {
  87.                 $error_msj 'PP '.$error->getMessage();
  88.             }
  89.         }
  90.         return $this->render('Security\ingresar.html.twig',
  91.                             array('last_username' => $username'error_msj' => $error_msj'msj' => $msj));
  92.     }
  93.     /**
  94.      * @Route("/logout", name="app_logout")
  95.      */
  96.     public function logout()
  97.     {
  98.         throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
  99.     }
  100.     
  101.     public function preLogoutAction() 
  102.     {
  103.         $user $this->getUser();
  104.         if (is_object($user))
  105.         {
  106.             $user->setConectado(false);
  107.             $user->setFechaAcceso(null);
  108.             $em $this->em;
  109.             $em->persist($user);
  110.             $em->flush();
  111.         }
  112.         return $this->redirect($this->generateUrl('app_logout')); 
  113.     }    
  114.     public function pageVisitedAction()
  115.     {
  116.         $usuario $this->get('security.context')->getToken()->getUser();
  117.         if (is_object($usuario))
  118.         {
  119.             $usuario->setFechaAcceso(new \DateTime());
  120.             $em $this->em;
  121.             $em->persist($usuario);
  122.             $em->flush();
  123.         }
  124.         return new Response('');
  125.     }
  126.     
  127.     public function loginSuccess()
  128.     {
  129.         $usuario $this->getUser();
  130.         if (!$usuario->getActivo())
  131.         {
  132.             return $this->render('Security\\error.html.twig',
  133.                             array('error_cod' => 'No se puede ingresar.<br><br>El usuario está marcado como bloqueado''logout'=>true));
  134.         }
  135.         else
  136.         if ($usuario->getConectado())
  137.         {
  138.             return $this->render('Security\\error.html.twig',
  139.                             array('error_cod' => 'No se puede ingresar.<br><br>El usuario ya está conectado desde otro dispositivo''logout'=>true));
  140.         }
  141.         else
  142.         {
  143.             /**ACTIVAR PARA CONTROL DE SESION*/
  144.             $usuario->setConectado(true);
  145.             $usuario->setFechaAcceso(new \DateTime());
  146.         }
  147.         /*        $session = $this->session;
  148.         $data = $this->userCanExecuteAction(false);
  149.         if (!$data['allow'])
  150.         {
  151.             $session->getFlashBag()->set('danger', $data['msg']);
  152.             return $this->redirect($this->generateUrl('login')); 
  153.         }
  154. */        
  155.         $usuario->setIntentosFallidos(0);
  156. /*        if ($usuario->getTempSalt())
  157.         {
  158.             $usuario->setSalt($usuario->getTempSalt());
  159.             $usuario->setTempSalt(null);
  160.         }*/
  161.         $this->em->persist($usuario);
  162.         $this->em->flush();
  163.         
  164. /*        $parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
  165.         $configuracionSeguridad = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
  166.         if ($configuracionSeguridad)
  167.         {
  168.             $password = $this->request->get('_password');
  169.             if (!$configuracionSeguridad->getFortalezaPassword()->validPassword($password))
  170.             {
  171.                 return $this->redirect($this->generateUrl('usuario_cambia_password', array('idUsuario'=> $usuario->getId(), 'must'=> 'forcecambio'))); 
  172.             } 
  173.         }*/
  174.         
  175.         $fechaActual = new \DateTime();
  176.         $fechaVigenciaPassword $usuario->getFechaVigenciaPassword();
  177.         if ($fechaVigenciaPassword)
  178.         {
  179.             if ($fechaVigenciaPassword>$fechaActual)
  180.             {
  181.                 $diasVigenciaPassword $fechaVigenciaPassword->diff($fechaActual)->days;
  182.                 if ($diasVigenciaPassword<=10)
  183.                 {
  184.                     $this->session->getFlashBag()->set('warning'$translator->trans('seguridad.contrasena.vigencia', array('%dias%' => $$diasVigenciaPassword)));
  185.                 }    
  186.                 return $this->redirect($this->generateUrl('app_home'));
  187.             }
  188.             else 
  189.             {
  190.                 return $this->redirect($this->generateUrl('usuario_cambia_password', array('idUsuario'=> $usuario->getId(), 'must'=> 'forcecaducado'))); 
  191.             }
  192.         }
  193.         return $this->redirect($this->generateUrl('app_home'));
  194.             
  195.     }
  196.     public function loginFailure(Request $requestAuthenticationUtils $authenticationUtils)
  197.     {
  198.         $username $authenticationUtils->getLastUsername();
  199.         $error $authenticationUtils->getLastAuthenticationError();
  200.         if ($error)
  201.         {
  202.             if ($error instanceof BadCredentialsException || 
  203.                 $error instanceof UsernameNotFoundException)
  204.             {
  205.                 $usuario null;
  206.                 if (isset($username))
  207.                 { 
  208.                     $usuario $this->em->getRepository(SeguridadUsuario::class)->findOneBy(array('username' => $username));
  209.                 }
  210.                 if ($usuario)
  211.                 {
  212.                     $cantfallos $this->bloquearUsuario($usuario);
  213.                     if ($cantfallos <= 0)
  214.                     {
  215.                         return $this->render('Security\error.html.twig', array('error_cod'=>$this->translator->trans('seguridad.activacion.error.intentos', array())));
  216.                     }    
  217.                     else
  218.                     {
  219.                         $msj $this->translator->trans('seguridad.autenticacion.error.intentoswrongpass', array('%intentos%'=>$cantfallos));
  220.                         $this->session->set('auth_msj',$msj);
  221.                     }    
  222.                 }
  223.             }  
  224.             if ($error instanceof DisabledException)
  225.             {
  226.                 $this->session->remove(SecurityContext::AUTHENTICATION_ERROR);
  227.                 $this->session->remove(SecurityContext::LAST_USERNAME);
  228.                 return $this->render('Security\error.html.twig',
  229.                     array('error_cod' => $this->translator->trans('seguridad.autenticacion.error.bloqueado')));
  230.             }    
  231.         }    
  232.         return $this->redirect($this->generateUrl('app_login'));
  233.     }
  234.     
  235.     public function recuperaPasswordUsernameAction(Request $request)
  236.     {
  237.         $params = array('username'=>'''mail'=>'');
  238.         if ($request->getMethod() == 'POST')
  239.         {
  240.             $username $request->get('username');
  241.             $from $request->get('from');
  242.             $params['username']=$username;
  243.             $params['error_name'] = $this->translator->trans('seguridad.recuperacion.error.badinfo');
  244.             if ($from=='login')
  245.             {
  246.                 return $this->recuperaPasswordFromLogin($username$params);
  247.             }
  248.             else
  249.             {
  250.                 return $this->recuperaPasswordFromRecover($username$params$request);
  251.             }
  252.         }
  253.         else
  254.             return $this->render('Security\recuperacion_username.html.twig'$params);
  255.     }
  256.     protected function recuperaPasswordFromLogin($username$params)
  257.     {
  258.         $em $this->em;
  259.         if (isset($username))
  260.         {
  261.             $usuario $em->getRepository(SeguridadUsuario::class)->findOneBy(array('username' => $username));
  262.             if ($usuario)
  263.             {
  264.                 if ($usuario->getEliminado() || !$usuario->getActivo())
  265.                 {
  266.                     $error $this->translator->trans('seguridad.mail.error.borrado');
  267.                     $kind 'danger';
  268.                     return $this->render('Security:Security:error.html.twig', array('error_cod'=>$error'kind'=>$kind));
  269.                 }
  270.                 else
  271.                 {
  272.         $parameterActiveConfiguration $this->getParameter('SECURITY_CONF');
  273.         $configuracionSeguridad $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
  274.                     unset($params['error_name']);
  275.                     $params['mail'] = $seguridadConfiguracion->getCodigoActivacion();
  276.                     //$params['pregunta'] = $usuario->getPreguntaRecuperacion();
  277.                     return $this->render('Security\recuperacion_username.html.twig'$params);
  278.                 }
  279.             }
  280.             else
  281.             {
  282.                 $params['error_name'] = $this->translator->trans('seguridad.mail.error.borrado');
  283.             }
  284.         }
  285.         return $this->render('Security\ingresar.html.twig',
  286.                             array('last_username' => $username'error_msj' => $params['error_name'], 'msj' => ''));
  287.     }
  288.     protected function recuperaPasswordFromRecover($username$params$request)
  289.     {
  290.         $em $this->em;
  291.         if (isset($username))
  292.         {
  293.             $usuario $em->getRepository(SeguridadUsuario::class)->findOneBy(array('username' => $username));
  294.             if ($usuario)
  295.             {
  296.                 if ($usuario->getEliminado() || !$usuario->getActivo())
  297.                 {
  298.                     $error $this->translator->trans('seguridad.mail.error.borrado');
  299.                     $kind 'danger';
  300.                     return $this->render('Security:Security:error.html.twig', array('error_cod'=>$error'kind'=>$kind));
  301.                 }
  302.                 else
  303.                 {
  304.         $parameterActiveConfiguration $this->getParameter('SECURITY_CONF');
  305.         $configuracionSeguridad $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
  306.                     if ($seguridadConfiguracion->getCodigoActivacion())
  307.                     {
  308.                         $mail $request->get('mail');
  309.                         $params['mail']=$mail;
  310.                         if ($usuario->getEmail()==$mail)
  311.                         {
  312.                             $params $this->sendRecuperarPasswordMail($em$usuario);
  313.                             return $this->render('Security\ingresar.html.twig'$params);
  314.                         }
  315.                     }
  316.                     else
  317.                     {
  318.                         $respuesta $request->get('respuesta');
  319.                         $respuesta str_replace(' '''$respuesta);
  320.                         $respuesta strtoupper($respuesta);
  321.                         if ($usuario->getRespuestaRecuperacion()==$respuesta)
  322.                         {
  323.                             if (!$password $seguridadConfiguracion->getDefaultPassword())
  324.                             {
  325.                                 $password $usuario->getUserName();
  326.                             }
  327.                             $password $this->setSecurePassword($usuario$password);
  328.                             $usuario->setPassword($password);
  329.                             $usuario->setActivo(TRUE);
  330.                             $usuario->setPrimerIngreso(TRUE);
  331.                             $usuario->setCausaBloqueo(null);
  332.                             $em->persist($usuario);
  333.                             $em->flush();
  334.                             return $this->render('Security\ingresar.html.twig',
  335.                                                 array('last_username' => $username'error_msj' => '''msj' => ''));
  336.                         }
  337.                         else
  338.                         {
  339.                             $params['error_name'] = $this->translator->trans('seguridad.recuperacion.error.wronganswer');
  340.                             $params['pregunta'] = $usuario->getPreguntaRecuperacion();
  341.                         }
  342.                     }
  343.                 }
  344.             }
  345.         }
  346.         return $this->render('Security:Security:recuperacion_username.html.twig'$params);
  347.     }
  348.     protected function sendRecuperarPasswordMail($em$user)
  349.     {
  350.         $token md5(uniqid());
  351.         $fecha = new \DateTime();
  352.         $codigo = new SeguridadCodigoActivacion();
  353.         $codigo->setCodigo($token);
  354.         $codigo->setUsuario($user);
  355.         $codigo->setFechaEnvio($fecha);
  356.         $parameterActiveConfiguration $this->getParameter('SECURITY_CONF');
  357.         $configuracionSeguridad $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
  358.         
  359.         $vigenciaCodigo $configuracionSeguridad->getVigenciaCodigo();
  360.         if ($vigenciaCodigo>0)
  361.         {
  362.             $fechaMaxActivacion = clone $fecha;
  363.             $fechaMaxActivacion->add(new \DateInterval('PT'.$vigenciaCodigo.'H'));
  364.             $codigo->setFechaVigencia($fechaMaxActivacion);
  365.         }
  366.         $em->persist($codigo);
  367.         $em->flush();
  368.         $url $this->generateUrl('usuario_register_activation', array('token' => $token), UrlGeneratorInterface::ABSOLUTE_URL);
  369.         try
  370.         {
  371.             $subject $this->translator->trans('seguridad.mail.sender', array()).' - '.$this->translator->trans('seguridad.recuperacion.subject', array());
  372.             $email = new Email();
  373.             $email->from($this->getParameter('mailer_from'))
  374.                 ->to($user->getEmail())
  375.                 //->cc('[email protected]')
  376.                 //->bcc('[email protected]')
  377.                 //->replyTo('[email protected]')
  378.                 //->priority(Email::PRIORITY_HIGH)
  379.                 ->subject($subject)
  380.                 ->html($this->render('Security\email_recuperacion.html.twig',
  381.                         array('usuario' => $user'url' => $url))->getContent());
  382.             $this->mailer->send($email);
  383.             return [
  384.                 'msj' => $this->translator->trans('seguridad.recuperacion.mail'),
  385.                 'kind' => 'info',
  386.             ];
  387.         } catch (\Exception $exc)
  388.         {
  389.             return [
  390.                 'error_msj' => $this->translator->trans('seguridad.mail.error.conexion', array()).' - '.$exc->getMessage(),
  391.                 'kind' => 'danger',
  392.             ];
  393.         }
  394.     }
  395.     public function activationAction($token)
  396.     {
  397.         $em $this->em;
  398.         $token $em->getRepository(SeguridadCodigoActivacion::class)->findOneBy(array('codigo' => $token));
  399.         if(empty($token))
  400.         {
  401.            return $this->render('Security\ingresar.html.twig', array('error_msj'=>$this->translator->trans('seguridad.activacion.error.badtoken', array())));
  402.         }
  403.         /*if($token->getFechaUso())
  404.         {
  405.            return $this->render('Security\ingresar.html.twig', array('error_msj'=>$this->translator->trans('seguridad.activacion.error.usedtoken', array())));
  406.         }*/
  407.         $usuario $token->getUsuario();
  408.         $vigente true;
  409.         if ($token->getFechaVigencia())
  410.         {
  411.             $fechaActual = new \DateTime();
  412.             $vigente $token->getFechaVigencia() > $fechaActual;
  413.         }
  414.         if ($vigente)
  415.         {
  416.             $token->setFechaUso(new \DateTime());
  417.             $em->persist($token);
  418.             $usuario->setIntentosFallidos(0);
  419.             $usuario->setActivo(TRUE);
  420.             $em->persist($usuario);
  421.             $em->flush();
  422.             $this->guardaHistorialActivacion($usuariotrue$this->translator->trans('seguridad.activacion.motivo.activacion', array()));
  423.             return $this->redirect($this->generateURL('usuario_confirma_ingreso', array('usuario' => $usuario->getId())));
  424.         }
  425.         else
  426.         {
  427.             return $this->render('Security\ingresar.html.twig', array('error_msj'=>$this->translator->trans('seguridad.activacion.error.oldtoken', array())));
  428.         }
  429.     }
  430.     public function loginAsAction($userId)
  431.     {
  432.         $em $this->em;
  433.         $user $em->getRepository('StrategicbschoolBundle:SegUsuario')->find($userId);
  434.         if ($user)
  435.         {
  436.             $admin $this->get('security.context')->getToken()->getUser();
  437.             $user->setTempSalt($user->getSalt());
  438.             $user->setTempPassword($user->getPassword());
  439.             $user->setSalt($admin->getSalt());
  440.             $user->setPassword($admin->getPassword());
  441.             $em->persist($user);
  442.             $em->flush();
  443.             $request $this->getRequest();
  444.             $session $request->getSession();
  445.             $username $user->getUserName();
  446.             $session->set(SecurityContext::LAST_USERNAME$username);
  447.             return $this->redirect($this->generateUrl('login'));
  448.         }
  449.         
  450.         return new \Symfony\Component\HttpFoundation\Response('ERROR');
  451.     }
  452.     
  453.     public function setSecurePassword($usuario$password)
  454.     {
  455. //        $encoder = new MessageDigestPasswordEncoder('sha512', true, 10);
  456. //        $encoder = new NativePasswordEncoder();
  457. //        return $encoder->encodePassword($password, $usuario->getSalt());
  458.         return $this->encoder->hashPassword($usuario$password);
  459.     }
  460. //    public function isPasswordValid($encoded, $raw, $salt)
  461.     public function isPasswordValid($user$raw)
  462.     {
  463.         return $this->encoder->isPasswordValid($user$raw);
  464. //        $encoder = new MessageDigestPasswordEncoder('sha512', true, 10);
  465. //        $encoder = new NativePasswordEncoder();
  466. //        return $encoder->isPasswordValid($encoded, $raw, $salt);
  467.     }
  468.     public function confirmaIngresoAction(Request $request$usuario)
  469.     {
  470.         $em $this->em;
  471.         $error_msj='';
  472.         $usuario $em->getRepository(SeguridadUsuario::class)->find($usuario);
  473.         $params['error_msj'] ='';
  474.         $params ['usuario'] = $usuario;
  475.         $params['mensaje'] = $this->translator->trans('seguridad.activacion.datos', array());
  476.         
  477.         $parameterActiveConfiguration $this->getParameter('SECURITY_CONF');
  478.         $configuracionSeguridad $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
  479.         
  480.         $params['textoFuerzaPass'] = $this->getTextoFortalezaPassword($configuracionSeguridad->getFortalezaPassword());
  481. //        $params['recuperaPassword'] = $configuracionSeguridad->getModoRecuperacionContrasena()->getValue();
  482.         if ($request->getMethod() == 'POST')
  483.         {
  484.             $password $request->get('password');
  485.             if ($configuracionSeguridad->getFortalezaPassword()->validPassword($password))
  486.             {
  487.                 $password $this->setSecurePassword($usuario$password);
  488.                 $usuario->setPassword($password);
  489.                 if ($configuracionSeguridad->getPasswordDiasValido()>0)
  490.                 {
  491.                     $fecha = new \DateTime();
  492.                     $fecha->add(new \DateInterval('P'.$configuracionSeguridad->getPasswordDiasValido().'D'));
  493.                     $usuario->setFechaVigenciaPassword($fecha);
  494.                 }    
  495.                 $usuario->setActivo(true);
  496.                 $usuario->setPrimerIngreso(false);
  497.                 $usuario->setIntentosFallidos(0);
  498.                 $em->persist($usuario);
  499. /*                $histPass = new SeguridadHistorialPassword();
  500.                 $histPass->setUsuario($usuario);
  501.                 $histPass->setSalt($usuario->getSalt());
  502.                 $histPass->setPassword($usuario->getPassword());
  503.                 $histPass->setFechaRegistro(new \DateTime());
  504.                 $em->persist($histPass);*/
  505.                 $em->flush();
  506.                 $msj $this->translator->trans('seguridad.activacion.success');
  507.                 return $this->render('Security\ingresar.html.twig',
  508.                         array('last_username' => $usuario->getUsername(), 'msj' => $msj,'error_msj' => $error_msj,
  509.                         'idUsuario' => $usuario->getId()));
  510.             }
  511.             else
  512.             {
  513.                 $params['error_pass'] = $this->translator->trans('seguridad.contrasena.error.fortaleza');
  514.                 $params['error_msj'] =$this->translator->trans('seguridad.contrasena.error.fortaleza');
  515.             }
  516.         }
  517.         return $this->render('Security\confirma_ingreso.html.twig'$params);
  518.     }
  519.     public function guardaHistorialActivacion($usuario$activacion$descripcion)
  520.     {
  521. /*        $em = $this ->em;
  522.         $cambio = new SeguridadHistorialActivacion();
  523.         $cambio->setActivacion($activacion);
  524.         $cambio->setDescripcion($descripcion);
  525.         $cambio->setFecha(new \DateTime());
  526.         $cambio->setUsuario($usuario);
  527.         $em->persist($cambio);
  528.         $em->flush();*/
  529.     }
  530.     protected function bloquearUsuario($usuario)
  531.     {
  532.         $parameterActiveConfiguration $this->getParameter('SECURITY_CONF');
  533.         $configuracionSeguridad $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
  534.         
  535.         $cantfallos $configuracionSeguridad->getAccesosFallidosPermitidos() - $usuario->getIntentosFallidos() - 1;
  536.         if ($cantfallos <= 0)
  537.         {
  538.             $usuario->setActivo(FALSE);
  539.             $usuario->setIntentosFallidos(0);
  540.             $usuario->setCausaBloqueo('Superado el número de intentos fallidos permitidos');
  541.             $this->em->persist($usuario);
  542.             $this->em->flush();
  543.             $this->guardaHistorialActivacion($usuariofalse$this->translator->trans('seguridad.activacion.motivo.intentos', array()));
  544.             session_destroy();
  545.         }
  546.         else
  547.         {
  548.             //incrementar el número de accesos fallidos.
  549.             $usuario->setIntentosFallidos($usuario->getIntentosFallidos()+1);
  550.             $this->em->persist($usuario);
  551.             $this->em->flush();
  552.         }
  553.         return $cantfallos;
  554.     }
  555.     public function cambiaPasswordAction(Request $request$must='force')
  556.     {
  557.         $usuario $this->getUser();
  558.         if (is_object($usuario))
  559.         {
  560.             if (!$usuario->getActivo())
  561.             {
  562.                 return $this->render('Security\error.html.twig', array('error_cod'=>$this->translator->trans('seguridad.autenticacion.bloqueado', array())));
  563.             }
  564.             $params ['usuario'] = $usuario;
  565.             $params['mensaje'] = $this->translator->trans('seguridad.contrasena.cambiar', array());
  566.             $parameterActiveConfiguration $this->getParameter('SECURITY_CONF');
  567.             $configuracionSeguridad $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
  568.             
  569.             $params['textoFuerzaPass'] = $this->getTextoFortalezaPassword($configuracionSeguridad->getFortalezaPassword());
  570.             $params ['must'] = $must;
  571.             if ($must=='forcecambio')
  572.                 $params ['error_pass'] = $this->translator->trans('seguridad.contrasena.forcecambio');
  573.             if ($must=='forcecaducado')
  574.                 $params ['error_pass'] = $this->translator->trans('seguridad.contrasena.forcecaducado');
  575.             if ($request->getMethod() == 'POST')
  576.             {
  577.                 $passwordEncoded $usuario->getPassword();
  578.                 $password $request->get('password_old');
  579. //                if (!$this->isPasswordValid($passwordEncoded, $password, $usuario->getSalt()))
  580.                 if (!$this->isPasswordValid($usuario$password))
  581.                 {
  582.                     $cantfallos $this->bloquearUsuario($usuario);
  583.                     if ($cantfallos <= 0)
  584.                     {
  585.                         return $this->render('Security\error.html.twig',
  586.                                              array('error_cod'=>$this->translator->trans('seguridad.activacion.error.intentos', array())));
  587.                     }
  588.                     else
  589.                     {
  590.                         $params['error_pass'] = $this->translator->trans('seguridad.contrasena.error.intentoswrongpass', array('%intentos%'=>$cantfallos));
  591.                         return $this->render('Security\cambia_password.html.twig',$params);
  592.                     }
  593.                 }
  594.                 $password $request->get('password');
  595.                 if (!$configuracionSeguridad->getFortalezaPassword()->validPassword($password))
  596.                 {
  597.                     $params['error_pass'] = $this->translator->trans('seguridad.contrasena.error.fortaleza');
  598.                     return $this->render('Security\cambia_password.html.twig'$params);
  599.                 }
  600.                 $password $this->setSecurePassword($usuario$password);
  601.                 $usuario->setPassword($password);
  602.                 if ($configuracionSeguridad->getPasswordDiasValido()>0)
  603.                 {
  604.                     $fecha = new \DateTime();
  605.                     $fecha->add(new \DateInterval('P'.$configuracionSeguridad->getPasswordDiasValido().'D'));
  606.                     $usuario->setFechaVigenciaPassword($fecha);
  607.                 }
  608.                 $usuario->setActivo(true);
  609.                 $this->em->persist($usuario);
  610. /*                $histPass = new SeguridadHistorialPassword();
  611.                 $histPass->setUsuario($usuario);
  612.                 $histPass->setSalt($usuario->getSalt());
  613.                 $histPass->setPassword($usuario->getPassword());
  614.                 $histPass->setFechaRegistro(new \DateTime());
  615.                 $em->persist($histPass);*/
  616.                 $this->em->flush();
  617.                 $this->session->getFlashBag()->set('info'$this->translator->trans('seguridad.contrasena.success'));
  618.                 if ($must=='force')
  619.                     return $this->redirect($this->generateUrl('app_home'));
  620.                 else
  621.                     return $this->redirect($this->generateUrl('usuario_perfil'));
  622.             }
  623.             return $this->render('Security\cambia_password.html.twig'$params);
  624.         }
  625.         else
  626.             return new \Symfony\Component\HttpFoundation\Response('No hay usuario conectado');
  627.     }
  628.     public function ActivacionManualUsuarioAction($userId)
  629.     {
  630.         $em $this->em;
  631.         $texto $this->translator->trans('seguridad.activacion.manual.error');
  632.         $usuario $em->getRepository(SeguridadUsuario::class)->find($userId);
  633.         if(!$usuario->getActivo())
  634.         {
  635.             $parameterActiveConfiguration $this->getParameter('SECURITY_CONF');
  636.             $configuracionSeguridad $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
  637.             $clave$usuario->getUsername(); //substr($usuario->getUsername(),0,4);
  638.             $password $this->setSecurePassword($usuario$clave);
  639.             $usuario->setPassword($password);
  640.             if($configuracionSeguridad->getPasswordDiasValido()>0)
  641.             {
  642.                 $fecha = new \DateTime();
  643.                 $fecha->add(new \DateInterval('P'.$configuracionSeguridad->getPasswordDiasValido().'D'));
  644.                 $usuario->setFechaVigenciaPassword($fecha);
  645.             }
  646.             $usuario->setActivo(true);
  647.             $em->persist($usuario);
  648.             $histPass = new SeguridadHistorialPassword();
  649.             $histPass->setUsuario($usuario);
  650.             $histPass->setSalt($usuario->getSalt());
  651.             $histPass->setPassword($usuario->getPassword());
  652.             $histPass->setFechaRegistro(new \DateTime());
  653.             $em->persist($histPass);
  654.             $em->flush();
  655.             $texto$this->translator->trans('seguridad.activacion.manual.success').' - Password: '.$clave;
  656.         }
  657.         //$texto=$em->getRepository('App\\Entity\\SeguridadUsuario')->sendActivationLink($userId);
  658.         return new \Symfony\Component\HttpFoundation\Response($texto);
  659.     }
  660.     public function ResetPasswordUsuarioAction($userId)
  661.     {
  662.         $em $this->em;
  663.         $usuario $em->getRepository(SeguridadUsuario::class)->find($userId);
  664.         $clave$usuario->getUsername(); //substr($usuario->getUsername(),0,4);
  665.         $password $this->setSecurePassword($usuario$clave);
  666.         $usuario->setPassword($password);
  667.         $usuario->setActivo(true);
  668.         $usuario->setPrimerIngreso(true);
  669.         $em->persist($usuario);
  670.         $em->flush();
  671.         $data = new Response(json_encode(array('ok'=>true)));
  672.         $data->headers->set('Content-Type''application/json');
  673.         return $data;
  674.     }
  675.     public function showUsuarioPerfilAction()
  676.     {
  677.         $usuario $this->getUser();
  678.         if (is_object($usuario))
  679.         {
  680.             return $this->forward('App\Controller\UsuarioController:showAction', array('rol'=>'all''id'=>$usuario->getId(), 'routeClassName'=>'usuarioperfil'));
  681.         }
  682.         else
  683.         {
  684.             return $this->redirect ($this->generateUrl ('login'));
  685.         }
  686.     }
  687.     protected function getTextoFortalezaPassword($fortaleza)
  688.     {
  689.         switch ($fortaleza->getNombre())
  690.         {
  691.             case 'WEAK':
  692.                 return $this->translator->trans('seguridad.contrasena.minLong', array('%long%'=>$fortaleza->getMinLong()));
  693.                 break;
  694.             case 'AVERAGE':
  695.                 return $this->translator->trans('seguridad.contrasena.minLong', array('%long%'=>$fortaleza->getMinLong())) .
  696.                        '<br>'.$this->translator->trans('seguridad.contrasena.mayMin', array());
  697.                 break;
  698.             case 'STRONG':
  699.                 return $this->translator->trans('seguridad.contrasena.minLong', array('%long%'=>$fortaleza->getMinLong())) .
  700.                        '<br>'.$this->translator->trans('seguridad.contrasena.mayMin', array()) .
  701.                        '<br>'.$this->translator->trans('seguridad.contrasena.numeros', array());
  702.                 break;
  703.             case 'VERY_STRONG':
  704.                 return $this->translator->trans('seguridad.contrasena.minLong', array('%long%'=>$fortaleza->getMinLong())) .
  705.                        '<br>'.$this->translator->trans('seguridad.contrasena.mayMin', array()) .
  706.                        '<br>'.$this->translator->trans('seguridad.contrasena.numeros', array()) .
  707.                        '<br>'.$this->translator->trans('seguridad.contrasena.caractEspeciales', array());
  708.                 break;
  709.         }
  710.         return $this->translator->trans('seguridad.contrasena.libre', array());
  711.     }
  712.     public function registerSuscriptionAction()
  713.     {
  714.         $params = array('ok'=>false);
  715.         $request $this->getRequest();
  716.         if ($request->getMethod() == 'POST')
  717.         {
  718.             $data $request->get('suscription');
  719.             $data['tipoIdentificacion'] = (int)$data['tipoIdentificacion'];
  720.             $token $this->autenticarHazloFacil();
  721.             if ($token['ok'])
  722.             {
  723.                 $token $token['token'];
  724.                 $url $this->container->getParameter('hazlo_facil_api').'/registrarUsuario';
  725.                 $result $this->callHazloFacilAPI('post'$url$token$data);
  726.                 if ($result['ok'])
  727.                 {
  728.                     $params['identificacion'] = $data['identificacion'];
  729.                     $params['success_msj'] = 'Registro exitoso. Se le envió un correo electrónico con indicaciones para que pueda activar su suscripción.';
  730.                     return $this->render('Security/suscripcion_activar.html.twig'$params);
  731.                 }
  732.                 else
  733.                 {
  734.                     $params['ok'] = false;
  735.                     $params['data'] = $data;
  736.                     $params['error_msj'] = 'Falló la comunicación con Hazlo Fácil. Intente más tarde.<br><br>'.$result['info'];
  737.                 }
  738.             } 
  739.             else
  740.             {
  741.                 $params['ok'] = false;
  742.                 $params['data'] = $data;
  743.                 $params['error_msj'] = 'Falló la comunicación con Hazlo Fácil. Intente más tarde';
  744.             }
  745.             
  746.         }
  747.         $em $this->em;
  748.         $tiposIdentificacion $em->getRepository('StrategicbschoolBundle:NmclTipoIdentificacion')->find(1);        
  749.         $params['tiposIdentificacion'] = array($tiposIdentificacion);
  750.         return $this->render('Security/suscripcion_registrar.html.twig'$params);
  751.     }
  752.     
  753.     public function activateSuscriptionAction()
  754.     {
  755.         $params = array('ok'=>false);
  756.         $request $this->getRequest();
  757.         if ($request->getMethod() == 'POST')
  758.         {
  759.             $data $request->get('suscription');
  760.             $params['identificacion'] = $data['identificacion'];
  761.             $token $this->autenticarHazloFacil();
  762.             if ($token['ok'])
  763.             {
  764.                 $token $token['token'];
  765.                 $url $this->container->getParameter('hazlo_facil_api').'/cambiapassword';
  766.                 $result $this->callHazloFacilAPI('post'$url$token$data);
  767.                 if ($result['ok'])
  768.                 {
  769.                     $params['msj'] = 'Activación exitosa.';
  770.                     $params['last_username'] = $params['identificacion'];
  771.                     return $this->render('Security/ingresar.html.twig'$params);
  772.                 }
  773.                 else
  774.                 {
  775.                     $params['ok'] = false;
  776.                     $params['error_msj'] = $result['response'];
  777.                 }
  778.             } 
  779.             else
  780.             {
  781.                 $params['ok'] = false;
  782.                 $params['error_msj'] = 'Falló la comunicación con Hazlo Fácil. Intente más tarde';
  783.             }
  784.         }
  785.         return $this->render('Security/suscripcion_activar.html.twig'$params);
  786.     }
  787.     
  788.     protected function autenticarHazloFacil()
  789.     {
  790.         $url $this->container->getParameter('hazlo_facil_api_autenticar');
  791.         
  792.         $curl curl_init($url);
  793.         $auth_data = array(
  794.             'username' => $this->container->getParameter('hazlo_facil_api_user'),
  795.             'password' => $this->container->getParameter('hazlo_facil_api_pwd')
  796.         );
  797.         $auth_data json_encode($auth_data);
  798.         curl_setopt($curlCURLOPT_HTTPHEADER, array(
  799.                 'accept: application/json',
  800.                 'Content-Type: application/json',
  801.                 'Content-Length: ' strlen($auth_data),
  802.                 ));
  803.         curl_setopt($curlCURLOPT_RETURNTRANSFER1);
  804.         curl_setopt($curlCURLOPT_POST1);
  805.         curl_setopt($curlCURLOPT_POSTFIELDS$auth_data);
  806.         curl_setopt($curlCURLINFO_HEADER_OUT1);
  807.         $result curl_exec($curl);
  808.         $httpCode curl_getinfo($curlCURLINFO_HTTP_CODE);
  809.         $res=['ok'=>true];
  810.         if(!$result || $httpCode != 200){
  811.             $res['ok']=false;
  812.             $res['info'] = 'Error de autenticación. '.curl_error($curl);
  813.             return $res;
  814.         }
  815.         curl_close($curl);
  816.         $result json_decode($resulttrue);
  817.         $res['token'] = $result['token'];
  818.         return $res;
  819.     }
  820.     
  821.     protected function callHazloFacilAPI($method$url$token$params=null)
  822.     {
  823.         $header = [
  824.             'accept: application/json',
  825.             'Content-Type: application/json',
  826. //            'Content-Length: ' . strlen($data),
  827.             'Authorization: Bearer '.$token,
  828.         ];
  829.         if ($params && is_array($params))
  830.         {
  831.             $params json_encode($params);
  832.         }
  833.         $handle curl_init();
  834.         curl_setopt($handleCURLOPT_RETURNTRANSFERtrue);
  835.         switch (strtoupper($method))
  836.         {
  837.             case "GET":
  838.                     curl_setopt($handleCURLOPT_HTTPGETtrue);
  839.                 break;
  840.             case "POST":
  841.                     curl_setopt($handleCURLOPT_POSTtrue);
  842.                     curl_setopt($handleCURLOPT_POSTFIELDS$params);
  843. //                    $header[] = 'Content-Type: application/json';
  844.                 break;
  845.             case "PUT":
  846.                     curl_setopt($handleCURLOPT_CUSTOMREQUEST'PUT');
  847.                     curl_setopt($handleCURLOPT_POSTFIELDS$params);
  848.                 break;
  849.             case "DELETE":
  850.                     curl_setopt($handleCURLOPT_CUSTOMREQUEST'DELETE');
  851.                     if ($params)
  852.                     {
  853.                         curl_setopt($handleCURLOPT_POSTFIELDShttp_build_query($params));
  854. //                        $url = sprintf("%s?%s", $url, http_build_query($params));
  855. //                        $header[] = 'Content-Type: application/x-www-form-urlencoded';
  856.                     }
  857.                 break;
  858.         }
  859.         curl_setopt($handleCURLOPT_URL$url);
  860.         curl_setopt($handleCURLOPT_HTTPHEADER$header);
  861.         $response curl_exec($handle);
  862.         $httpCode curl_getinfo($handleCURLINFO_HTTP_CODE);
  863.         $res=['ok'=>true];
  864.         if(!$response || $httpCode != 200){
  865.             $res['ok']=false;
  866.             $res['httpCode']=$httpCode;
  867.             $res['info'] = 'Error: '.curl_error($handle);
  868.             if ($response)
  869.             {
  870.                 $response json_decode($responsetrue);
  871.                 $res['response'] = $response;
  872.             }
  873.         }
  874.         else
  875.         {
  876.             $response json_decode($responsetrue);
  877.             $res['response'] = $response;
  878.         }
  879.         return $res;
  880.     }
  881. }