src/Controller/UsuarioController.php line 286

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Painel\LogSenha;
  4. use App\Entity\Painel\Usuario;
  5. use App\Helper\StringHelper;
  6. use App\Repository\Painel\LogSenhaRepository;
  7. use App\Repository\Painel\UsuarioRepository;
  8. use App\Service\Email;
  9. use App\Service\S3Service;
  10. use App\Service\QrCodeService;
  11. use DateTime;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  14. use Symfony\Component\HttpFoundation\File\File;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  18. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  19. use Symfony\Component\Security\Core\User\UserInterface;
  20. class UsuarioController extends AbstractController
  21. {
  22.     private $usuario;
  23.     private $encoder;
  24.     private $mailer;
  25.     private $perfil;
  26.     private $em;
  27.     private $logSenha;
  28.     private $s3;
  29.     public function __construct(
  30.         UsuarioRepository $usuarioRepository,
  31.         UserPasswordEncoderInterface $encoder,
  32.         EntityManagerInterface $em,
  33.         LogSenhaRepository $logSenhaRepository,
  34.         S3Service $s3Service,
  35.         QrCodeService $qrCodeService
  36.     ) {
  37.         $this->usuario $usuarioRepository;
  38.         $this->logSenha $logSenhaRepository;
  39.         $this->encoder $encoder;
  40.         $this->em $em;
  41.         $this->s3 $s3Service;
  42.         $this->qrCodeService $qrCodeService;
  43.     }
  44.     /**
  45.      * @Route("/user/recuperar-senha", name="usuario_recuperar_senha")
  46.      */
  47.     public function recuperarSenha(Request $requestEmail $email)
  48.     {
  49.         $dados $request->request->all();
  50.         $usuario $this->usuario->findOneBy(['email' => $dados['email']]);
  51.         if (empty($usuario)) {
  52.             $request->getSession()->getFlashBag()->add('success''Caso o usuário exista, um e-mail de recuperação de senha foi enviado.');
  53.         } else {
  54.             $senhaNova StringHelper::geraSenha(7);
  55.             $data_atual = new \DateTime();
  56.             $params = [
  57.                 'name' => $usuario->getNome(),
  58.                 'subject' => "Recuperar Senha 2IM Analytics - {$data_atual->format('d/m/Y H:i:s')}",
  59.                 'nome' => $usuario->getNome(),
  60.                 'login' => $usuario->getLogin(),
  61.                 'to' => $usuario->getEmail(),
  62.                 'id' => $usuario->getId_usuario(),
  63.                 'template' => 'email/recuperar-senha.html.twig',
  64.                 'novaSenha' => $senhaNova,
  65.             ];
  66.             $testeEnvio $email->enviar($params);
  67.             if ( $testeEnvio['status'] > ) {
  68.                 $usuario->setForce_update(true);
  69.                 $usuario->setSenha($this->encoder->encodePassword($usuario$senhaNova));
  70.                 $this->em->flush();
  71.                 $request->getSession()->getFlashBag()->add('success''Email de recuperação de senha enviado!');
  72.             } else {
  73.                 $request->getSession()->getFlashBag()->add('error''Erro ao enviar email para recuperação de senha!');
  74.             }
  75.         }
  76.         return $this->redirectToRoute('app_login');
  77.     }
  78.     /**
  79.      * @Route("/user/recuperar-qrcode/{loginUser}", name="usuario_recuperar_qrcode")
  80.      */
  81.     public function recuperarQrCode($loginUserEmail $emailRequest $request)
  82.     {
  83.         $usuario $this->usuario->findOneBy(['login' => $loginUser]);
  84.         if (empty($usuario)) {
  85.             $request->getSession()->getFlashBag()->add('erro''Erro ao enviar email para recuperação de senha!');
  86.         } else {
  87.             $qrCode $this->qrCodeService->generateQrCode($usuario);
  88.             $params = [
  89.                 'name' => $usuario->getNome(),
  90.                 'subject' => 'Recuperar QrCode 2IM Analytics',
  91.                 'nome' => $usuario->getNome(),
  92.                 'login' => $usuario->getLogin(),
  93.                 'to' => $usuario->getEmail(),
  94.                 'id' => $usuario->getId_usuario(),
  95.                 'qrCode' => $qrCode,
  96.                 'template' => 'email/recuperar-qrcode.html.twig',
  97.             ];
  98.             $testeEnvio $email->enviar($params);
  99.             if ($testeEnvio['status'] > 0) {
  100.                 $request->getSession()->getFlashBag()->add('sucess''Email de recuperação de QrCode enviado!');
  101.             } else {
  102.                 $request->getSession()->getFlashBag()->add('erro''Erro ao enviar email para recuperação de QrCode!');
  103.             }
  104.         }
  105.         return $this->redirectToRoute('app_login');
  106.     }
  107.     /**
  108.      * @Route("/user/redefinir-senha", name="usuario_redefinir_senha")
  109.      */
  110.     public function redefinirSenha(Request $requestUserInterface $usuario nullEmail $email)
  111.     {
  112.         if (!$usuario) {
  113.             $this->addFlash('error''Erro em parametros do usuario');
  114.             return $this->redirectToRoute('app_login');
  115.         }
  116.         $this->em->beginTransaction();
  117.         try {
  118.             if ($request->isMethod('POST')) {
  119.                 
  120.                 $dados $request->request->all();
  121.                 if (!$this->validPassword($dados['senha'], $dados['repete_senha'], $usuario)) {
  122.                     return $this->redirectToRoute('usuario_redefinir_senha');
  123.                 }
  124.                 // Enviar e-mail informando a redefinição de senha.
  125.                 $data_atual = new DateTime('America/Sao_Paulo');
  126.                 /*$enviado = $email->redefinirSenha(
  127.                     $usuario->getEmail(),
  128.                     $usuario->getNome(),
  129.                     $request->getClientIp(),
  130.                     $data_atual->format('d/m/Y H:i:s'),
  131.                     $this->generateUrl('app_login', [], UrlGeneratorInterface::ABSOLUTE_URL)
  132.                 );/** */
  133.                 //if ( $enviado ) {
  134.                     $senha $this->encoder->encodePassword($usuario$dados['senha']);
  135.                     $usuario->setSenha($senha);
  136.                     $usuario->setSenha_update($data_atual->format('d/m/Y H:i:s'));
  137.                     $usuario->setForce_update(false);
  138.                     $logSenha = new LogSenha();
  139.                     $logSenha->setUsuario($usuario)
  140.                         ->setSenha($senha)
  141.                     ;
  142.                     $this->em->persist($logSenha);
  143.                     $this->em->flush();
  144.                     $this->em->commit();
  145.                 //    $this->addFlash('sucess', 'Email de redefinição de senha enviado!');
  146.                 //} else {
  147.                     $this->addFlash('error''Erro ao enviar email para redefinição de senha!');
  148.                 //}
  149.                 $this->addFlash('sucess''Sua senha foi atualizada!');
  150.                 return $this->redirectToRoute('app_logout');
  151.             }
  152.         } catch (\Throwable $e) {
  153.             $this->em->rollBack();
  154.             if (12 === $e->getCode()) {
  155.                 $this->addFlash('error'$e->getMessage());
  156.                 return $this->redirectToRoute('usuario_redefinir_senha');
  157.             }
  158.             throw $e;
  159.         }
  160.         
  161.         return $this->render(
  162.             'usuario-update-senha.twig',
  163.             [
  164.                 'page' => 'page-visoes',
  165.             ]
  166.         );
  167.     }
  168.     /**
  169.      * @Route("/user/meus-dados", name="usuario_meus_dados")
  170.      */
  171.     public function meusDadosAction(Request $requestUserInterface $usuarioLogged)
  172.     {
  173.         try {
  174.             $dados $request->request->all();
  175.             if ($request->isMethod('POST')) {
  176.                 $this->em->beginTransaction();
  177.                 $arquivo $request->files->get('foto');
  178.                 if ($arquivo) {
  179.                     $file = new File($arquivo);
  180.                     // Upload data.
  181.                     $filePath "foto_{$usuarioLogged->getId_usuario()}.{$arquivo->guessClientExtension()}";
  182.                     $object = [
  183.                         'Bucket' => $_ENV['AWS_S3_BUCKET'],
  184.                         'Key' => "painel/usuarios/foto/{$filePath}",
  185.                         'SourceFile' => $file,
  186.                         'ACL' => 'public-read',
  187.                         'ContentType' => $arquivo->getMimeType(),
  188.                         'Tagging' => "usuari_{$usuarioLogged->getId_usuario()}",
  189.                     ];
  190.                     $resposta $this->s3->upload($object);
  191.                     if (true == $resposta['status']) {
  192.                         $usuarioLogged->setFoto($filePath);
  193.                         $this->addFlash('sucess'$resposta['message']);
  194.                     } else {
  195.                         $this->addFlash('error'$resposta['message']);
  196.                     }
  197.                     // seta a imagem do usario
  198.                     $foto $this->s3->download($_ENV['AWS_S3_BUCKET'], "painel/usuarios/foto/{$filePath}");
  199.                     if ($foto) {
  200.                         $request->getSession()->set('foto'$foto['@metadata']['effectiveUri']);
  201.                     }
  202.                 }
  203.                 $usuarioLogged->setEmail($dados['email'])
  204.                     ->setLogin($dados['login'])
  205.                     ->setNome($dados['nome'])
  206.                 ;
  207.                 if (isset($dados['senha'])) {
  208.                     $this->validPassword($dados['senha'], $dados['repete_senha'], $usuarioLogged);
  209.                     $usuarioLogged->setSenha($this->encoder->encodePassword($usuarioLogged$dados['senha']));
  210.                 }
  211.                 $this->em->flush();
  212.                 $this->em->commit();
  213.                 $this->addFlash('sucess''Dados editados.');
  214.             }
  215.         } catch (\Throwable $e) {
  216.             dd($e);
  217.             $code = (== $e->getCode()) ? 500 $e->getCode();
  218.             $mensagens 500 == $code ? ['Ocorreu um erro, estamos resolvendo!'] : explode(','$e->getMessage());
  219.             foreach ($mensagens as $mensagem) {
  220.                 $this->addFlash('error'$mensagem);
  221.             }
  222.             $this->em->rollback();
  223.         }
  224.         return $this->render(
  225.             'usuario-meus-dados.html.twig',
  226.             [
  227.                 'page' => 'page-green',
  228.                 'usuario' => $usuarioLogged,
  229.             ]
  230.         );
  231.     }
  232.     /**
  233.      * @Route("/user/foto", name="foto")
  234.      */
  235.     public function foto(Request $requestUserInterface $usuario null)
  236.     {
  237.         return $this->render('usuario-foto.html.twig');
  238.     }
  239.     private function validPassword($senha$repeteSenha false$usuario): bool
  240.     {
  241.         // testa se senhas são iguais
  242.         if ($repeteSenha) {
  243.             if ($senha != $repeteSenha) {
  244.                 $this->addFlash('error''Senhas devem ser iguais!');
  245.                 return false;
  246.             }
  247.         }
  248.         // testa caracteres da senha
  249.         if (strlen($senha) < || !preg_match('/ *[0-9].*[A-Z].*[@$!%*#?&.,=+-\/(\/):;\/^\/~\/|"]| *[0-9].*[@$!%*#?&.,=+-\/(\/):;\/^\/~\/|"].*[A-Z]| *[A-Z].*[0-9].*[@$!%*#?&.,=+-\/(\/):;\/^\/~\/|"]| *[A-Z].*[@$!%*#?&.,=+-\/(\/):;\/^\/~\/|"].*[0-9]| *[@$!%*#?&.,=+-\/(\/):;\/^\/~\/|"].*[A-Z].*[0-9]| *[@$!%*#?&.,=+-\/(\/):;\/^\/~\/|"].*[0-9].*[A-Z]/'$senha)) {
  250.             $this->addFlash('error''Os campos senha deve ter no mínimo 8 caracters com LETRAS(pelo menos uma maiúscula) e NÚMEROS e CARACTERES ESPECIAIS!');
  251.             return false;
  252.         }
  253.         // testa se senha contem algum dado cadastrado
  254.         // $nomeDividido = explode(' ', $usuario->getNome());
  255.         // $nomeInteiro = preg_match('/'.strtolower(str_replace(' ', '', $usuario->getNome())).'/', strtolower($senha));
  256.         // foreach ($nomeDividido as $parteNome) {
  257.         //     $testeNome = preg_match('/'.strtolower($parteNome).'/', strtolower($senha));
  258.         //     if ($testeNome) {
  259.         //         break;
  260.         //     }
  261.         // }
  262.         // $login = $usuario->getLogin();
  263.         // $loginTeste = preg_match('/'.$login.'/', $senha);
  264.         
  265.         // if ($nomeInteiro || $loginTeste || $testeNome) {
  266.         //     $this->addFlash('error', 'Senha não pode conter nenhum de seus dados pessoais!');
  267.         //     return false;
  268.         // }
  269.         // testa senhas sequenciais
  270.         $letras '/abcdefghijklmnopqrstuvxzwy/';
  271.         $letrasInvertido '/ywzxvutsrqponmlkjihgfedcba/';
  272.         $numeros '/0123456789/';
  273.         $numerosInvertido '/9876543210/';
  274.         $seqLetrasInvertido false;
  275.         $seqNumerosInvertido false;
  276.         $seqLetras false;
  277.         $seqNumeros false;
  278.         $countSenha strlen($senha);
  279.         for ($i 0$i $countSenha; ++$i) {
  280.             if ($i $countSenha) {
  281.                 $teste $senha[$i].$senha[$i 1].$senha[$i 2];
  282.                 $seqLetras strstr($letrasstrtolower($teste));
  283.                 $seqLetrasInvertido strstr($letrasInvertidostrtolower($teste));
  284.                 $seqNumeros strstr($numeros$teste);
  285.                 $seqNumerosInvertido strstr($numerosInvertido$teste);
  286.                 if ($seqLetras || $seqNumeros || $seqLetrasInvertido || $seqNumerosInvertido) {
  287.                     $this->addFlash('error''Senha não pode conter sequencia de letras ou numeros!');
  288.                     return false;
  289.                 }
  290.             }
  291.         }
  292.         // verifica se senha ja foi usada
  293.         $logSenhas $this->logSenha->findBy(['usuario' => $usuario]);
  294.         $verificaSenha false;
  295.         foreach ($logSenhas as $logSenha) {
  296.             $user = new Usuario();
  297.             $user->setSenha($logSenha->getSenha());
  298.             $verificaSenha $this->encoder->isPasswordValid($user$senha);
  299.             if ($verificaSenha) {
  300.                 $user '';
  301.                 break;
  302.             }
  303.         }
  304.         if ($verificaSenha) {
  305.             $this->addFlash('error''Esta senha já foi utilizada anteriormente. Por favor, escolha uma senha nova.');
  306.             return false;
  307.         }
  308.         return true;
  309.     }
  310. }