<?php
namespace App\Controller;
use App\Entity\Painel\Passwordless;
use App\Entity\Painel\Usuario;
use App\Entity\Painel\UsuarioAcesso;
use App\Helper\StringHelper;
use App\Repository\Cliente\Acesso\UsuarioAcessoRepository;
use App\Repository\Painel\ClienteRepository;
use App\Repository\Painel\PasswordlessRepository;
use App\Repository\Painel\UsuarioRepository;
use App\Service\Email;
use DateTime;
use DateTimeZone;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
private $email;
private $usuarioAcesso;
private $managerRegistry;
private $usuarioRepository;
private $clienteRepository;
private $passwordlessRepository;
public function __construct(
Email $email,
ManagerRegistry $managerRegistry,
UsuarioRepository $usuarioRepository,
ClienteRepository $clienteRepository,
PasswordlessRepository $passwordlessRepository,
UsuarioAcessoRepository $usuarioAcessoRepository
) {
$this->email = $email;
$this->managerRegistry = $managerRegistry;
$this->usuarioRepository = $usuarioRepository;
$this->clienteRepository = $clienteRepository;
$this->usuarioAcesso = $usuarioAcessoRepository;
$this->passwordlessRepository = $passwordlessRepository;
}
/**
* @Route("/login", name="app_login")
*/
public function login(Request $request, AuthenticationUtils $authenticationUtils): Response
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
// ip
$ip = $this->container->get('request_stack')->getCurrentRequest()->getClientIp();
// default
$testeForce = [
'status' => NULL
,'tempo' => NULL
,'segundos' => NULL
];
if ( $error ) {
$em = $this->managerRegistry->getManager('default');
$usuario = new UsuarioAcesso();
$usuario->setLogin(StringHelper::limpa($lastUsername, true));
$usuario->setIp($ip);
$usuario->setErrorMsg($error->getMessage());
$em->persist($usuario);
$em->flush();
$em->clear();
$testeForce = $this->usuarioAcesso->findLastMinutes($lastUsername, $ip);
}
return $this->render('security/login.html.twig', [
'page' => 'page-login'
,'last_username' => $lastUsername
,'error' => $error
,'testa_force' => $testeForce
,'step' => $request->request->get('step', 'email')
]);
}
/**
* @Route("/login/check", name="app_login_check", methods={"POST"})
*/
public function check(Request $request)
{
// get the login link query parameters
$email = $request->request->get('email');
$user = null;
if ( $email ) {
$user = $this->usuarioRepository->findOneBy(['email' => $email]);
}
$testeForce = [
'status' => NULL
,'tempo' => NULL
,'segundos' => NULL
];
$params = [
'page' => 'page-login'
,'last_username' => $lastUsername ?? null
,'error' => $error ?? null
,'testa_force' => $testeForce
];
if ($user instanceof Usuario) {
if ( !$user->isPasswordlessEnabled() ) {
return $this->render('security/login.html.twig', [
'step' => 'senha',
'email' => $request->request->get('email')
] + $params);
} else {
$token = StringHelper::geraSenha(6, $maiusculas = true, $minusculas = true, $numeros = true);
$data_atual = new DateTime('now', new DateTimeZone('Etc/GMT+3'));
$passwordlessObject = $this->passwordlessRepository->findOneBy(['id_usuario' => $user->getId_usuario()], ['data_criacao' => 'DESC']);
if(!is_null($passwordlessObject)){
$passwordlessObject->setAtivo(false);
$this->passwordlessRepository->add($passwordlessObject, true);
}
$data_limite = clone $data_atual;
$passwordlessObject = new Passwordless();
$passwordlessObject->setIdUsuario($user->getId_usuario())
->setToken($token)
->setDataCriacao($data_atual)
->setDataLimite($data_limite->modify('+10 minutes'))
->setAtivo(true);
//Envio do token por email
$paramsEmail = [
'nome' => $user->getNome(),
'projeto' => '2iM Analytics',
'login' => $user->getLogin(),
'to' => $user->getLogin(),
'token' => $token,
'subject' => "Seu acesso ao 2iM Analytics - {$data_atual->format('d/m/Y H:i:s')}",
'template' => 'email/login-token.html.twig',
];
$response = $this->email->enviar($paramsEmail);
if ($response['status'] <= 0) {
$this->addFlash(
"error",
"Erro ao enviar token de acesso!"
);
return $this->redirectToRoute("app_login");
}
$this->passwordlessRepository->add($passwordlessObject, true);
$this->addFlash(
"success",
"Se os dados informados estiverem corretos, o token será enviado para o e-mail cadastrado! Caso não encontre-o, verifique a caixa de spam."
);
return $this->render('security/login.html.twig', [
'step' => 'token'
] + $params);
}
}
return $this->render('security/login.html.twig', [
'step' => 'senha',
'email' => $request->request->get('email')
] + $params);
}
/**
* @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.');
}
/**
* @Route("/2fa", name="2fa_login")
*/
public function login_2fa(Request $request)
{
$user = $this->getUser();
return $this->render('security/2fa_login.html.twig',[
'page' => 'page-clientes',
'nomeUser' => $user->getNome()
]);
}
/**
* @Route("/modal-codigo", name="modal_codigo")
*/
public function modal_2fa()
{
$user = $this->getUser();
return $this->render('security/modal-codigo.html.twig',[
'nomeUser' => $user->getNome(),
'loginUser' => $user->getLogin()
]);
}
}