<?php
namespace App\Security\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Exception\BadCredentialsException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\HttpFoundation\Response;
//use App\Entity\SeguridadHistorialPassword;
use App\Entity\SeguridadCodigoActivacion;
//use Security\Interfaces\WillyUser;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
use Symfony\Component\Mailer\MailerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\Mime\Email;
use App\Entity\SeguridadUsuario;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
use Symfony\Component\Security\Core\Encoder\NativePasswordEncoder;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use App\Entity\TipoSuscripcion;
use App\Entity\Suscripcion;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\SeguridadConfiguracion;
/**
*
* Security controller.
*
*/
class SecurityController extends AbstractController
{
private $session;
private $translator;
private $logger;
private $mailer;
private $encoder;
private $em;
private $request;
public function __construct(UserPasswordHasherInterface $encoder, TranslatorInterface $translator, MailerInterface $mailer, RequestStack $requestStack, EntityManagerInterface $entityManager, LoggerInterface $logger)
{
$this->encoder = $encoder;
$this->translator = $translator;
$this->mailer = $mailer;
$this->session = $requestStack->getSession();
$this->em = $entityManager;
$this->logger = $logger;
$this->request = $requestStack->getCurrentRequest();
}
public function login(AuthenticationUtils $authenticationUtils): Response
{
$session = $this->session;
$username = $authenticationUtils->getLastUsername();
$error_msj = '';
$msj = $session->get('auth_msj');
if ($msj)
{
$session->remove('auth_msj');
}
else
{
$msj='';
}
$error = $authenticationUtils->getLastAuthenticationError();
/* if (!$error)
{
$error = $session->get(Security::AUTHENTICATION_ERROR);
$session->remove(Security::AUTHENTICATION_ERROR);
}*/
if ($error)
{
if ($error instanceof BadCredentialsException ||
$error instanceof UsernameNotFoundException)
{
$error_msj = $this->translator->trans('seguridad.autenticacion.error.credenciales');
}
else
if ($error->getMessage()=='Captcha error')
{
$error_msj = $this->translator->trans('seguridad.autenticacion.error.captcha');
}
else
{
$error_msj = 'PP '.$error->getMessage();
}
}
return $this->render('Security\ingresar.html.twig',
array('last_username' => $username, 'error_msj' => $error_msj, 'msj' => $msj));
}
/**
* @Route("/logout", name="app_logout")
*/
public function logout()
{
throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
public function preLogoutAction()
{
$user = $this->getUser();
if (is_object($user))
{
$user->setConectado(false);
$user->setFechaAcceso(null);
$em = $this->em;
$em->persist($user);
$em->flush();
}
return $this->redirect($this->generateUrl('app_logout'));
}
public function pageVisitedAction()
{
$usuario = $this->get('security.context')->getToken()->getUser();
if (is_object($usuario))
{
$usuario->setFechaAcceso(new \DateTime());
$em = $this->em;
$em->persist($usuario);
$em->flush();
}
return new Response('');
}
public function loginSuccess()
{
$usuario = $this->getUser();
if (!$usuario->getActivo())
{
return $this->render('Security\\error.html.twig',
array('error_cod' => 'No se puede ingresar.<br><br>El usuario está marcado como bloqueado', 'logout'=>true));
}
else
if ($usuario->getConectado())
{
return $this->render('Security\\error.html.twig',
array('error_cod' => 'No se puede ingresar.<br><br>El usuario ya está conectado desde otro dispositivo', 'logout'=>true));
}
else
{
/**ACTIVAR PARA CONTROL DE SESION*/
$usuario->setConectado(true);
$usuario->setFechaAcceso(new \DateTime());
}
/* $session = $this->session;
$data = $this->userCanExecuteAction(false);
if (!$data['allow'])
{
$session->getFlashBag()->set('danger', $data['msg']);
return $this->redirect($this->generateUrl('login'));
}
*/
$usuario->setIntentosFallidos(0);
/* if ($usuario->getTempSalt())
{
$usuario->setSalt($usuario->getTempSalt());
$usuario->setTempSalt(null);
}*/
$this->em->persist($usuario);
$this->em->flush();
/* $parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
$configuracionSeguridad = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
if ($configuracionSeguridad)
{
$password = $this->request->get('_password');
if (!$configuracionSeguridad->getFortalezaPassword()->validPassword($password))
{
return $this->redirect($this->generateUrl('usuario_cambia_password', array('idUsuario'=> $usuario->getId(), 'must'=> 'forcecambio')));
}
}*/
$fechaActual = new \DateTime();
$fechaVigenciaPassword = $usuario->getFechaVigenciaPassword();
if ($fechaVigenciaPassword)
{
if ($fechaVigenciaPassword>$fechaActual)
{
$diasVigenciaPassword = $fechaVigenciaPassword->diff($fechaActual)->days;
if ($diasVigenciaPassword<=10)
{
$this->session->getFlashBag()->set('warning', $translator->trans('seguridad.contrasena.vigencia', array('%dias%' => $$diasVigenciaPassword)));
}
return $this->redirect($this->generateUrl('app_home'));
}
else
{
return $this->redirect($this->generateUrl('usuario_cambia_password', array('idUsuario'=> $usuario->getId(), 'must'=> 'forcecaducado')));
}
}
return $this->redirect($this->generateUrl('app_home'));
}
public function loginFailure(Request $request, AuthenticationUtils $authenticationUtils)
{
$username = $authenticationUtils->getLastUsername();
$error = $authenticationUtils->getLastAuthenticationError();
if ($error)
{
if ($error instanceof BadCredentialsException ||
$error instanceof UsernameNotFoundException)
{
$usuario = null;
if (isset($username))
{
$usuario = $this->em->getRepository(SeguridadUsuario::class)->findOneBy(array('username' => $username));
}
if ($usuario)
{
$cantfallos = $this->bloquearUsuario($usuario);
if ($cantfallos <= 0)
{
return $this->render('Security\error.html.twig', array('error_cod'=>$this->translator->trans('seguridad.activacion.error.intentos', array())));
}
else
{
$msj = $this->translator->trans('seguridad.autenticacion.error.intentoswrongpass', array('%intentos%'=>$cantfallos));
$this->session->set('auth_msj',$msj);
}
}
}
if ($error instanceof DisabledException)
{
$this->session->remove(SecurityContext::AUTHENTICATION_ERROR);
$this->session->remove(SecurityContext::LAST_USERNAME);
return $this->render('Security\error.html.twig',
array('error_cod' => $this->translator->trans('seguridad.autenticacion.error.bloqueado')));
}
}
return $this->redirect($this->generateUrl('app_login'));
}
public function recuperaPasswordUsernameAction(Request $request)
{
$params = array('username'=>'', 'mail'=>'');
if ($request->getMethod() == 'POST')
{
$username = $request->get('username');
$from = $request->get('from');
$params['username']=$username;
$params['error_name'] = $this->translator->trans('seguridad.recuperacion.error.badinfo');
if ($from=='login')
{
return $this->recuperaPasswordFromLogin($username, $params);
}
else
{
return $this->recuperaPasswordFromRecover($username, $params, $request);
}
}
else
return $this->render('Security\recuperacion_username.html.twig', $params);
}
protected function recuperaPasswordFromLogin($username, $params)
{
$em = $this->em;
if (isset($username))
{
$usuario = $em->getRepository(SeguridadUsuario::class)->findOneBy(array('username' => $username));
if ($usuario)
{
if ($usuario->getEliminado() || !$usuario->getActivo())
{
$error = $this->translator->trans('seguridad.mail.error.borrado');
$kind = 'danger';
return $this->render('Security:Security:error.html.twig', array('error_cod'=>$error, 'kind'=>$kind));
}
else
{
$parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
$configuracionSeguridad = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
unset($params['error_name']);
$params['mail'] = $seguridadConfiguracion->getCodigoActivacion();
//$params['pregunta'] = $usuario->getPreguntaRecuperacion();
return $this->render('Security\recuperacion_username.html.twig', $params);
}
}
else
{
$params['error_name'] = $this->translator->trans('seguridad.mail.error.borrado');
}
}
return $this->render('Security\ingresar.html.twig',
array('last_username' => $username, 'error_msj' => $params['error_name'], 'msj' => ''));
}
protected function recuperaPasswordFromRecover($username, $params, $request)
{
$em = $this->em;
if (isset($username))
{
$usuario = $em->getRepository(SeguridadUsuario::class)->findOneBy(array('username' => $username));
if ($usuario)
{
if ($usuario->getEliminado() || !$usuario->getActivo())
{
$error = $this->translator->trans('seguridad.mail.error.borrado');
$kind = 'danger';
return $this->render('Security:Security:error.html.twig', array('error_cod'=>$error, 'kind'=>$kind));
}
else
{
$parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
$configuracionSeguridad = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
if ($seguridadConfiguracion->getCodigoActivacion())
{
$mail = $request->get('mail');
$params['mail']=$mail;
if ($usuario->getEmail()==$mail)
{
$params = $this->sendRecuperarPasswordMail($em, $usuario);
return $this->render('Security\ingresar.html.twig', $params);
}
}
else
{
$respuesta = $request->get('respuesta');
$respuesta = str_replace(' ', '', $respuesta);
$respuesta = strtoupper($respuesta);
if ($usuario->getRespuestaRecuperacion()==$respuesta)
{
if (!$password = $seguridadConfiguracion->getDefaultPassword())
{
$password = $usuario->getUserName();
}
$password = $this->setSecurePassword($usuario, $password);
$usuario->setPassword($password);
$usuario->setActivo(TRUE);
$usuario->setPrimerIngreso(TRUE);
$usuario->setCausaBloqueo(null);
$em->persist($usuario);
$em->flush();
return $this->render('Security\ingresar.html.twig',
array('last_username' => $username, 'error_msj' => '', 'msj' => ''));
}
else
{
$params['error_name'] = $this->translator->trans('seguridad.recuperacion.error.wronganswer');
$params['pregunta'] = $usuario->getPreguntaRecuperacion();
}
}
}
}
}
return $this->render('Security:Security:recuperacion_username.html.twig', $params);
}
protected function sendRecuperarPasswordMail($em, $user)
{
$token = md5(uniqid());
$fecha = new \DateTime();
$codigo = new SeguridadCodigoActivacion();
$codigo->setCodigo($token);
$codigo->setUsuario($user);
$codigo->setFechaEnvio($fecha);
$parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
$configuracionSeguridad = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
$vigenciaCodigo = $configuracionSeguridad->getVigenciaCodigo();
if ($vigenciaCodigo>0)
{
$fechaMaxActivacion = clone $fecha;
$fechaMaxActivacion->add(new \DateInterval('PT'.$vigenciaCodigo.'H'));
$codigo->setFechaVigencia($fechaMaxActivacion);
}
$em->persist($codigo);
$em->flush();
$url = $this->generateUrl('usuario_register_activation', array('token' => $token), UrlGeneratorInterface::ABSOLUTE_URL);
try
{
$subject = $this->translator->trans('seguridad.mail.sender', array()).' - '.$this->translator->trans('seguridad.recuperacion.subject', array());
$email = new Email();
$email->from($this->getParameter('mailer_from'))
->to($user->getEmail())
//->cc('[email protected]')
//->bcc('[email protected]')
//->replyTo('[email protected]')
//->priority(Email::PRIORITY_HIGH)
->subject($subject)
->html($this->render('Security\email_recuperacion.html.twig',
array('usuario' => $user, 'url' => $url))->getContent());
$this->mailer->send($email);
return [
'msj' => $this->translator->trans('seguridad.recuperacion.mail'),
'kind' => 'info',
];
} catch (\Exception $exc)
{
return [
'error_msj' => $this->translator->trans('seguridad.mail.error.conexion', array()).' - '.$exc->getMessage(),
'kind' => 'danger',
];
}
}
public function activationAction($token)
{
$em = $this->em;
$token = $em->getRepository(SeguridadCodigoActivacion::class)->findOneBy(array('codigo' => $token));
if(empty($token))
{
return $this->render('Security\ingresar.html.twig', array('error_msj'=>$this->translator->trans('seguridad.activacion.error.badtoken', array())));
}
/*if($token->getFechaUso())
{
return $this->render('Security\ingresar.html.twig', array('error_msj'=>$this->translator->trans('seguridad.activacion.error.usedtoken', array())));
}*/
$usuario = $token->getUsuario();
$vigente = true;
if ($token->getFechaVigencia())
{
$fechaActual = new \DateTime();
$vigente = $token->getFechaVigencia() > $fechaActual;
}
if ($vigente)
{
$token->setFechaUso(new \DateTime());
$em->persist($token);
$usuario->setIntentosFallidos(0);
$usuario->setActivo(TRUE);
$em->persist($usuario);
$em->flush();
$this->guardaHistorialActivacion($usuario, true, $this->translator->trans('seguridad.activacion.motivo.activacion', array()));
return $this->redirect($this->generateURL('usuario_confirma_ingreso', array('usuario' => $usuario->getId())));
}
else
{
return $this->render('Security\ingresar.html.twig', array('error_msj'=>$this->translator->trans('seguridad.activacion.error.oldtoken', array())));
}
}
public function loginAsAction($userId)
{
$em = $this->em;
$user = $em->getRepository('StrategicbschoolBundle:SegUsuario')->find($userId);
if ($user)
{
$admin = $this->get('security.context')->getToken()->getUser();
$user->setTempSalt($user->getSalt());
$user->setTempPassword($user->getPassword());
$user->setSalt($admin->getSalt());
$user->setPassword($admin->getPassword());
$em->persist($user);
$em->flush();
$request = $this->getRequest();
$session = $request->getSession();
$username = $user->getUserName();
$session->set(SecurityContext::LAST_USERNAME, $username);
return $this->redirect($this->generateUrl('login'));
}
return new \Symfony\Component\HttpFoundation\Response('ERROR');
}
public function setSecurePassword($usuario, $password)
{
// $encoder = new MessageDigestPasswordEncoder('sha512', true, 10);
// $encoder = new NativePasswordEncoder();
// return $encoder->encodePassword($password, $usuario->getSalt());
return $this->encoder->hashPassword($usuario, $password);
}
// public function isPasswordValid($encoded, $raw, $salt)
public function isPasswordValid($user, $raw)
{
return $this->encoder->isPasswordValid($user, $raw);
// $encoder = new MessageDigestPasswordEncoder('sha512', true, 10);
// $encoder = new NativePasswordEncoder();
// return $encoder->isPasswordValid($encoded, $raw, $salt);
}
public function confirmaIngresoAction(Request $request, $usuario)
{
$em = $this->em;
$error_msj='';
$usuario = $em->getRepository(SeguridadUsuario::class)->find($usuario);
$params['error_msj'] ='';
$params ['usuario'] = $usuario;
$params['mensaje'] = $this->translator->trans('seguridad.activacion.datos', array());
$parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
$configuracionSeguridad = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
$params['textoFuerzaPass'] = $this->getTextoFortalezaPassword($configuracionSeguridad->getFortalezaPassword());
// $params['recuperaPassword'] = $configuracionSeguridad->getModoRecuperacionContrasena()->getValue();
if ($request->getMethod() == 'POST')
{
$password = $request->get('password');
if ($configuracionSeguridad->getFortalezaPassword()->validPassword($password))
{
$password = $this->setSecurePassword($usuario, $password);
$usuario->setPassword($password);
if ($configuracionSeguridad->getPasswordDiasValido()>0)
{
$fecha = new \DateTime();
$fecha->add(new \DateInterval('P'.$configuracionSeguridad->getPasswordDiasValido().'D'));
$usuario->setFechaVigenciaPassword($fecha);
}
$usuario->setActivo(true);
$usuario->setPrimerIngreso(false);
$usuario->setIntentosFallidos(0);
$em->persist($usuario);
/* $histPass = new SeguridadHistorialPassword();
$histPass->setUsuario($usuario);
$histPass->setSalt($usuario->getSalt());
$histPass->setPassword($usuario->getPassword());
$histPass->setFechaRegistro(new \DateTime());
$em->persist($histPass);*/
$em->flush();
$msj = $this->translator->trans('seguridad.activacion.success');
return $this->render('Security\ingresar.html.twig',
array('last_username' => $usuario->getUsername(), 'msj' => $msj,'error_msj' => $error_msj,
'idUsuario' => $usuario->getId()));
}
else
{
$params['error_pass'] = $this->translator->trans('seguridad.contrasena.error.fortaleza');
$params['error_msj'] =$this->translator->trans('seguridad.contrasena.error.fortaleza');
}
}
return $this->render('Security\confirma_ingreso.html.twig', $params);
}
public function guardaHistorialActivacion($usuario, $activacion, $descripcion)
{
/* $em = $this ->em;
$cambio = new SeguridadHistorialActivacion();
$cambio->setActivacion($activacion);
$cambio->setDescripcion($descripcion);
$cambio->setFecha(new \DateTime());
$cambio->setUsuario($usuario);
$em->persist($cambio);
$em->flush();*/
}
protected function bloquearUsuario($usuario)
{
$parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
$configuracionSeguridad = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
$cantfallos = $configuracionSeguridad->getAccesosFallidosPermitidos() - $usuario->getIntentosFallidos() - 1;
if ($cantfallos <= 0)
{
$usuario->setActivo(FALSE);
$usuario->setIntentosFallidos(0);
$usuario->setCausaBloqueo('Superado el número de intentos fallidos permitidos');
$this->em->persist($usuario);
$this->em->flush();
$this->guardaHistorialActivacion($usuario, false, $this->translator->trans('seguridad.activacion.motivo.intentos', array()));
session_destroy();
}
else
{
//incrementar el número de accesos fallidos.
$usuario->setIntentosFallidos($usuario->getIntentosFallidos()+1);
$this->em->persist($usuario);
$this->em->flush();
}
return $cantfallos;
}
public function cambiaPasswordAction(Request $request, $must='force')
{
$usuario = $this->getUser();
if (is_object($usuario))
{
if (!$usuario->getActivo())
{
return $this->render('Security\error.html.twig', array('error_cod'=>$this->translator->trans('seguridad.autenticacion.bloqueado', array())));
}
$params ['usuario'] = $usuario;
$params['mensaje'] = $this->translator->trans('seguridad.contrasena.cambiar', array());
$parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
$configuracionSeguridad = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
$params['textoFuerzaPass'] = $this->getTextoFortalezaPassword($configuracionSeguridad->getFortalezaPassword());
$params ['must'] = $must;
if ($must=='forcecambio')
$params ['error_pass'] = $this->translator->trans('seguridad.contrasena.forcecambio');
if ($must=='forcecaducado')
$params ['error_pass'] = $this->translator->trans('seguridad.contrasena.forcecaducado');
if ($request->getMethod() == 'POST')
{
$passwordEncoded = $usuario->getPassword();
$password = $request->get('password_old');
// if (!$this->isPasswordValid($passwordEncoded, $password, $usuario->getSalt()))
if (!$this->isPasswordValid($usuario, $password))
{
$cantfallos = $this->bloquearUsuario($usuario);
if ($cantfallos <= 0)
{
return $this->render('Security\error.html.twig',
array('error_cod'=>$this->translator->trans('seguridad.activacion.error.intentos', array())));
}
else
{
$params['error_pass'] = $this->translator->trans('seguridad.contrasena.error.intentoswrongpass', array('%intentos%'=>$cantfallos));
return $this->render('Security\cambia_password.html.twig',$params);
}
}
$password = $request->get('password');
if (!$configuracionSeguridad->getFortalezaPassword()->validPassword($password))
{
$params['error_pass'] = $this->translator->trans('seguridad.contrasena.error.fortaleza');
return $this->render('Security\cambia_password.html.twig', $params);
}
$password = $this->setSecurePassword($usuario, $password);
$usuario->setPassword($password);
if ($configuracionSeguridad->getPasswordDiasValido()>0)
{
$fecha = new \DateTime();
$fecha->add(new \DateInterval('P'.$configuracionSeguridad->getPasswordDiasValido().'D'));
$usuario->setFechaVigenciaPassword($fecha);
}
$usuario->setActivo(true);
$this->em->persist($usuario);
/* $histPass = new SeguridadHistorialPassword();
$histPass->setUsuario($usuario);
$histPass->setSalt($usuario->getSalt());
$histPass->setPassword($usuario->getPassword());
$histPass->setFechaRegistro(new \DateTime());
$em->persist($histPass);*/
$this->em->flush();
$this->session->getFlashBag()->set('info', $this->translator->trans('seguridad.contrasena.success'));
if ($must=='force')
return $this->redirect($this->generateUrl('app_home'));
else
return $this->redirect($this->generateUrl('usuario_perfil'));
}
return $this->render('Security\cambia_password.html.twig', $params);
}
else
return new \Symfony\Component\HttpFoundation\Response('No hay usuario conectado');
}
public function ActivacionManualUsuarioAction($userId)
{
$em = $this->em;
$texto = $this->translator->trans('seguridad.activacion.manual.error');
$usuario = $em->getRepository(SeguridadUsuario::class)->find($userId);
if(!$usuario->getActivo())
{
$parameterActiveConfiguration = $this->getParameter('SECURITY_CONF');
$configuracionSeguridad = $this->em->getRepository(SeguridadConfiguracion::class)->getActiveConfiguration($parameterActiveConfiguration);
$clave= $usuario->getUsername(); //substr($usuario->getUsername(),0,4);
$password = $this->setSecurePassword($usuario, $clave);
$usuario->setPassword($password);
if($configuracionSeguridad->getPasswordDiasValido()>0)
{
$fecha = new \DateTime();
$fecha->add(new \DateInterval('P'.$configuracionSeguridad->getPasswordDiasValido().'D'));
$usuario->setFechaVigenciaPassword($fecha);
}
$usuario->setActivo(true);
$em->persist($usuario);
$histPass = new SeguridadHistorialPassword();
$histPass->setUsuario($usuario);
$histPass->setSalt($usuario->getSalt());
$histPass->setPassword($usuario->getPassword());
$histPass->setFechaRegistro(new \DateTime());
$em->persist($histPass);
$em->flush();
$texto= $this->translator->trans('seguridad.activacion.manual.success').' - Password: '.$clave;
}
//$texto=$em->getRepository('App\\Entity\\SeguridadUsuario')->sendActivationLink($userId);
return new \Symfony\Component\HttpFoundation\Response($texto);
}
public function ResetPasswordUsuarioAction($userId)
{
$em = $this->em;
$usuario = $em->getRepository(SeguridadUsuario::class)->find($userId);
$clave= $usuario->getUsername(); //substr($usuario->getUsername(),0,4);
$password = $this->setSecurePassword($usuario, $clave);
$usuario->setPassword($password);
$usuario->setActivo(true);
$usuario->setPrimerIngreso(true);
$em->persist($usuario);
$em->flush();
$data = new Response(json_encode(array('ok'=>true)));
$data->headers->set('Content-Type', 'application/json');
return $data;
}
public function showUsuarioPerfilAction()
{
$usuario = $this->getUser();
if (is_object($usuario))
{
return $this->forward('App\Controller\UsuarioController:showAction', array('rol'=>'all', 'id'=>$usuario->getId(), 'routeClassName'=>'usuarioperfil'));
}
else
{
return $this->redirect ($this->generateUrl ('login'));
}
}
protected function getTextoFortalezaPassword($fortaleza)
{
switch ($fortaleza->getNombre())
{
case 'WEAK':
return $this->translator->trans('seguridad.contrasena.minLong', array('%long%'=>$fortaleza->getMinLong()));
break;
case 'AVERAGE':
return $this->translator->trans('seguridad.contrasena.minLong', array('%long%'=>$fortaleza->getMinLong())) .
'<br>'.$this->translator->trans('seguridad.contrasena.mayMin', array());
break;
case 'STRONG':
return $this->translator->trans('seguridad.contrasena.minLong', array('%long%'=>$fortaleza->getMinLong())) .
'<br>'.$this->translator->trans('seguridad.contrasena.mayMin', array()) .
'<br>'.$this->translator->trans('seguridad.contrasena.numeros', array());
break;
case 'VERY_STRONG':
return $this->translator->trans('seguridad.contrasena.minLong', array('%long%'=>$fortaleza->getMinLong())) .
'<br>'.$this->translator->trans('seguridad.contrasena.mayMin', array()) .
'<br>'.$this->translator->trans('seguridad.contrasena.numeros', array()) .
'<br>'.$this->translator->trans('seguridad.contrasena.caractEspeciales', array());
break;
}
return $this->translator->trans('seguridad.contrasena.libre', array());
}
public function registerSuscriptionAction()
{
$params = array('ok'=>false);
$request = $this->getRequest();
if ($request->getMethod() == 'POST')
{
$data = $request->get('suscription');
$data['tipoIdentificacion'] = (int)$data['tipoIdentificacion'];
$token = $this->autenticarHazloFacil();
if ($token['ok'])
{
$token = $token['token'];
$url = $this->container->getParameter('hazlo_facil_api').'/registrarUsuario';
$result = $this->callHazloFacilAPI('post', $url, $token, $data);
if ($result['ok'])
{
$params['identificacion'] = $data['identificacion'];
$params['success_msj'] = 'Registro exitoso. Se le envió un correo electrónico con indicaciones para que pueda activar su suscripción.';
return $this->render('Security/suscripcion_activar.html.twig', $params);
}
else
{
$params['ok'] = false;
$params['data'] = $data;
$params['error_msj'] = 'Falló la comunicación con Hazlo Fácil. Intente más tarde.<br><br>'.$result['info'];
}
}
else
{
$params['ok'] = false;
$params['data'] = $data;
$params['error_msj'] = 'Falló la comunicación con Hazlo Fácil. Intente más tarde';
}
}
$em = $this->em;
$tiposIdentificacion = $em->getRepository('StrategicbschoolBundle:NmclTipoIdentificacion')->find(1);
$params['tiposIdentificacion'] = array($tiposIdentificacion);
return $this->render('Security/suscripcion_registrar.html.twig', $params);
}
public function activateSuscriptionAction()
{
$params = array('ok'=>false);
$request = $this->getRequest();
if ($request->getMethod() == 'POST')
{
$data = $request->get('suscription');
$params['identificacion'] = $data['identificacion'];
$token = $this->autenticarHazloFacil();
if ($token['ok'])
{
$token = $token['token'];
$url = $this->container->getParameter('hazlo_facil_api').'/cambiapassword';
$result = $this->callHazloFacilAPI('post', $url, $token, $data);
if ($result['ok'])
{
$params['msj'] = 'Activación exitosa.';
$params['last_username'] = $params['identificacion'];
return $this->render('Security/ingresar.html.twig', $params);
}
else
{
$params['ok'] = false;
$params['error_msj'] = $result['response'];
}
}
else
{
$params['ok'] = false;
$params['error_msj'] = 'Falló la comunicación con Hazlo Fácil. Intente más tarde';
}
}
return $this->render('Security/suscripcion_activar.html.twig', $params);
}
protected function autenticarHazloFacil()
{
$url = $this->container->getParameter('hazlo_facil_api_autenticar');
$curl = curl_init($url);
$auth_data = array(
'username' => $this->container->getParameter('hazlo_facil_api_user'),
'password' => $this->container->getParameter('hazlo_facil_api_pwd')
);
$auth_data = json_encode($auth_data);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'accept: application/json',
'Content-Type: application/json',
'Content-Length: ' . strlen($auth_data),
));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $auth_data);
curl_setopt($curl, CURLINFO_HEADER_OUT, 1);
$result = curl_exec($curl);
$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$res=['ok'=>true];
if(!$result || $httpCode != 200){
$res['ok']=false;
$res['info'] = 'Error de autenticación. '.curl_error($curl);
return $res;
}
curl_close($curl);
$result = json_decode($result, true);
$res['token'] = $result['token'];
return $res;
}
protected function callHazloFacilAPI($method, $url, $token, $params=null)
{
$header = [
'accept: application/json',
'Content-Type: application/json',
// 'Content-Length: ' . strlen($data),
'Authorization: Bearer '.$token,
];
if ($params && is_array($params))
{
$params = json_encode($params);
}
$handle = curl_init();
curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
switch (strtoupper($method))
{
case "GET":
curl_setopt($handle, CURLOPT_HTTPGET, true);
break;
case "POST":
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $params);
// $header[] = 'Content-Type: application/json';
break;
case "PUT":
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($handle, CURLOPT_POSTFIELDS, $params);
break;
case "DELETE":
curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'DELETE');
if ($params)
{
curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($params));
// $url = sprintf("%s?%s", $url, http_build_query($params));
// $header[] = 'Content-Type: application/x-www-form-urlencoded';
}
break;
}
curl_setopt($handle, CURLOPT_URL, $url);
curl_setopt($handle, CURLOPT_HTTPHEADER, $header);
$response = curl_exec($handle);
$httpCode = curl_getinfo($handle, CURLINFO_HTTP_CODE);
$res=['ok'=>true];
if(!$response || $httpCode != 200){
$res['ok']=false;
$res['httpCode']=$httpCode;
$res['info'] = 'Error: '.curl_error($handle);
if ($response)
{
$response = json_decode($response, true);
$res['response'] = $response;
}
}
else
{
$response = json_decode($response, true);
$res['response'] = $response;
}
return $res;
}
}