<?php
namespace App\Controller;
use App\Service\GlobalAdmin;
use App\Service\AdministrateurService;
use App\Entity\Utilisateur;
use App\Entity\ConnexionAdministrateurs ;
use App\Form\UtilisateurType;
use App\Repository\AdministrateursRepository;
use App\Repository\NiveauRepository;
use App\Repository\EtatRepository;
use App\Repository\ConfigSmtpRepository;
use App\Repository\ConnexionAdministrateursRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;
use Doctrine\ORM\EntityManagerInterface;
use Karser\Recaptcha3Bundle\Validator\Constraints\Recaptcha3Validator;
class UtilisateurController extends AbstractController
{
public function __construct(SessionInterface $session , Container $container , EntityManagerInterface $em )
{
$this->em = $em ;
$this->session = $session ;
}
function genererCode($length){
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$string = '';
for($i=0; $i<$length; $i++){
$string .= $chars[rand(0, strlen($chars)-1)];
}
return $string;
}
private function getAdressIp(){
$ip_expediteur = '' ;
if(!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip_expediteur = $_SERVER['HTTP_CLIENT_IP'];
}elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip_expediteur = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip_expediteur = $_SERVER['REMOTE_ADDR'];
}
return $ip_expediteur ;
}
public function generate_mdp($chars)
{
$data = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcefghijklmnopqrstuvwxyz';
return substr(str_shuffle($data), 0, $chars);
}
public function setSaltMdp($mdp)
{
$salt1 ='kgH94zHr927J3zjT4VvC' ;
$salt2 = 'jA9q52MuFj4u2DxQ9m5X' ;
return sha1($salt1.$mdp.$salt2) ;
}
/**
* @Route("/", name="connexion", methods={"GET","POST"} , options={"expose"=true})
*/
public function connexion(): Response
{
return $this->render('utilisateur/connexion.html.twig');
}
/**
* @Route("/deconnexion", name="deconnexion", methods={"GET","POST"})
*/
public function deconnexion(): Response
{
$this->session->set('susrD3p9LjjY86', '');
$this->session->set('supAdT9m2XJzn4','');
return $this->redirectToRoute('connexion');
}
/**
* @Route("/login_user", name="login_user", methods={"GET","POST"}, options= {"expose"="true"})
*/
public function login_user(Request $request , AdministrateursRepository $AdministrateursRepository , GlobalAdmin $globalAdmin , Recaptcha3Validator $recaptcha3Validator ): Response
{
$user = $request->get('login');
$mdp = $request->get('pass');
$code_resp = '';
//dd($this->session->get('susrD3p9LjjY86'));
$code_resp = $globalAdmin->verifCnx($user , $mdp , $request , $AdministrateursRepository) ;
//dd($code_resp);
if($code_resp == "1" ){//Connexion réussie .
return new Response('OK');
}
else if($code_resp == "double_verif" ){//Connexion réussie .
return new Response('double_verif') ;
}
$resp = $globalAdmin->getMessage($code_resp) ;
return new Response($resp);
}
/**
* @Route("/verif_cnx", name="verif_cnx", methods={"GET","POST"}, options= {"expose"="true"})
*/
public function verif_cnx(Request $request , AdministrateursRepository $AdministrateursRepository , GlobalAdmin $globalAdmin , Recaptcha3Validator $recaptcha3Validator ): Response
{
$user = $request->get('login');
$mdp = $request->get('pass');
$code_resp = '';
//dd($this->session->get('susrD3p9LjjY86'));
if($this->session->get('susrD3p9LjjY86') == 'gA64ya3G5N'){
$code_resp = $globalAdmin->verifCnx($user , $mdp , $request , $AdministrateursRepository) ;
//echo($code_resp);
if($code_resp == "1" ){//Connexion réussie .
$this->session->set('supAdT9m2XJzn4',['nom'=> 'Admin' , 'prenom'=>'Super' ,'email'=>$request->get('login') , 'id'=>'T9m2XJzn4' ]) ;
return new Response('OK');
}
else if($code_resp == "double_verif" ){//Connexion réussie .
return new Response('double_verif') ;
}
$resp = $globalAdmin->getMessage($code_resp) ;
return new Response($resp);
}
else{
$code_resp = $globalAdmin->verifCnx($user , $mdp , $request , $AdministrateursRepository) ;
if($code_resp == "1" ){//Connexion réussie .
$admin = $AdministrateursRepository->findOneBy(['email'=>$user]);
if($admin)
{
$this->session->set('supAdT9m2XJzn4',['nom'=> $admin->getNom() , 'prenom'=>$admin->getPrenom() ,'email'=>$admin->getEmail(), 'id'=>'T9m2XJzn4' ]) ;
return new Response('OK');
}
else{
return new Response('KO');
}
}
else if($code_resp == "double_verif" ){//Connexion réussie .
return new Response('double_verif') ;
}
$resp = $globalAdmin->getMessage($code_resp) ;
return new Response($resp);
}
}
/**
* @Route("/verif_cnx1", name="verif_cnx1", methods={"GET","POST"}, options= {"expose"="true"})
*/
public function verif_cnx1(Request $request , AdministrateursRepository $AdministrateursRepository , AdministrateurService $globalAdmin , Recaptcha3Validator $recaptcha3Validator ): Response
{
$user = $request->get('login');
$mdp = $request->get('pass');
//dd($user , $mdp);
$code_resp = '';
if($this->session->get('susrD3p9LjjY86') == 'gA64ya3G5N'){
$admin = $AdministrateursRepository->findOneBy(['email'=>$user]);
if(!$admin){
return new Response('Mot de passe ou email incorrecte');
}
//dd($admin);
$code_resp = $globalAdmin->verifCnx($user , $mdp , $request , $admin) ;
//dd($code_resp);
if($code_resp == "1" ){//Connexion réussie .
$this->session->set('supAdT9m2XJzn4',['nom'=> $admin->getNom() , 'prenom'=>$admin->getPrenom() ,'email'=>$admin->getEmail(), 'id'=>'T9m2XJzn4', 'userId' => $admin->getId() ]) ;
return new Response('OK');
}
else if($code_resp == 2 ){//Connexion réussie .
return new Response('double_verif') ;
}
$resp = $globalAdmin->getMessage($code_resp) ;
return new Response($resp);
}
}
/**
* @Route("/confirm_connexion", name="confirm_connexion", methods={"GET","POST"}, options= {"expose"="true"})
*/
public function confirm_connexion(Request $request, EtatRepository $EtatRepository , AdministrateursRepository $AdministrateursRepository , GlobalAdmin $globalAdmin , ConfigSmtpRepository $ConfigSmtpRepository , ConnexionAdministrateursRepository $ConnexionAdministrateursRepository): Response
{
if(null != $request->get('email_confirm') ){
$msg= '';
$emails = $ConfigSmtpRepository->findOneBy([],['id'=>'desc']) ;
$email_arr = [];
foreach($emails->getDestinataires() as $email){
$email_arr[] = $email ;
}
foreach($emails->getDestinatairesTransaction() as $email){
$email_arr[] = $email ;
}
$email_decoupe = explode('@',$request->get('email_confirm'))[1] ;
if( ( !in_array($request->get('email_confirm'),$email_arr) ) && ($email_decoupe!="synexta.fr") && ($email_decoupe!="synexta-solutions.fr") ){
return new Response('KOO') ;
}
$etat = $EtatRepository->findOneBy(['id'=>2]) ;
$token = $this->genererCode(20) ;
$adminstrateur = $AdministrateursRepository->findOneBy(['email'=>$request->get('email_confirm') ]);
//verif si j'ai des connexion non actif
$existance_inactif_cnx = $ConnexionAdministrateursRepository->findBy(['email'=>$request->get('email_confirm'),'etat' => 2]) ;
if ($existance_inactif_cnx) {
foreach ($existance_inactif_cnx as $connexion) {
$this->em->remove($connexion);
}
$this->em->flush();
}
//Ajout connexion
$ConnexionAdministrateurs = new ConnexionAdministrateurs() ;
$ConnexionAdministrateurs->setAdresseIp($this->getAdressIp() ) ;
$ConnexionAdministrateurs->setDateConnexion( \DateTime::createFromFormat('Y-m-d H:i:s', date('Y-m-d H:i:s' ) ) );
$ConnexionAdministrateurs->setToken( $token ) ;
$ConnexionAdministrateurs->setEmail($request->get('email_confirm') ) ;
$ConnexionAdministrateurs->setEtat($etat) ;
$ConnexionAdministrateurs->setAdministrateurs($adminstrateur ) ;
$this->em->persist($ConnexionAdministrateurs) ;
$this->em->flush() ;
//nettoyage list des connexions pour gardé que les 3 derniers
$existance_cnx = $ConnexionAdministrateursRepository->findBy(['email'=>$request->get('email_confirm')],['date_connexion' => 'DESC']) ;
if (count($existance_cnx) > 3) {
$connexionsToDelete = array_slice($existance_cnx, 3);
foreach ($connexionsToDelete as $connexion) {
$this->em->remove($connexion);
}
$this->em->flush();
}
$transport = (new \Swift_SmtpTransport($emails->getHost() , $emails->getPort() , $emails->getTypeConnexion() ))
->setUsername($emails->getUser())
->setPassword($emails->getMdp())
;
$mailer = new \Swift_Mailer($transport);
$sender = $emails->getUser() ;
$message = (new \Swift_Message('Confirmation de connexion sur Dashboard mitih')) ;
$token = sha1($token.$ConnexionAdministrateurs->getId().$ConnexionAdministrateurs->getAdresseIp()) ;
$message->setFrom($sender)
->setTo( $request->get('email_confirm') )
->setBody(
$this->renderView(
// templates/emails/registration.txt.twig
'emails/confirmation_connexion.html.twig',[
'token'=>$token,
]
), 'text/html'
);
try{
$mailer->send($message);
$msg = 'OK' ;
}
catch (\Swift_TransportException $e) {
$msg = $e->getMessage() ;
}
return new Response($msg);
}
return $this->render('utilisateur/confirm_connexion.html.twig');
}
/**
* @Route("/confirm_access/{token}", name="confirm_access", methods={"GET","POST"}, options= {"expose"="true"})
*/
public function confirm_access(Request $request, EtatRepository $EtatRepository, ConnexionAdministrateursRepository $ConnexionAdministrateursRepository, AdministrateursRepository $AdministrateursRepository, GlobalAdmin $globalAdmin, ConfigSmtpRepository $ConfigSmtpRepository): Response
{
$connexion = $this->em->createQuery(
'SELECT u
FROM App\Entity\ConnexionAdministrateurs u
WHERE sha1(concat(u.token, u.id, u.adresse_ip)) = :token'
)
->setParameter('token', $request->get('token'))
->getOneOrNullResult();
$status='';
if ($connexion === null) {
$msg = 'Problème de récupération de session.';
$status='KOO';
} else {
$now = new \DateTime();
$interval = $now->diff($connexion->getDateConnexion());
// Vérifie si la différence est supérieure à 4 heures
if ($interval->h >= 4 || $interval->days > 0) {
// Supprime la connexion si elle a expiré
$this->em->remove($connexion);
$this->em->flush();
$msg = 'Lien expiré. Veuillez vous reconnecter.';
$status='KOO';
} else {
$etat = $EtatRepository->findOneBy(['id' => 1]);
$connexion->setEtat($etat);
$this->em->persist($connexion);
$this->em->flush();
$status='OK';
$msg = 'Confirmation d\'accès effectuée avec succès.';
}
}
return $this->render('utilisateur/confirm_access.html.twig', ['status'=>$status,'msg' => $msg]);
}
public function confirm_access_old(Request $request ,EtatRepository $EtatRepository, ConnexionAdministrateursRepository $ConnexionAdministrateursRepository, AdministrateursRepository $AdministrateursRepository , GlobalAdmin $globalAdmin , ConfigSmtpRepository $ConfigSmtpRepository): Response
{
$connexion = $this->em->createQuery(
'SELECT u
FROM App\Entity\ConnexionAdministrateurs u
WHERE sha1(concat(u.token, u.id,u.adresse_ip )) = \''.$request->get('token').'\'
'
)
->getOneOrNullResult() ;
if($connexion == null){
$msg = 'Problème de récupération de session .';
}
else{
$etat = $EtatRepository->findOneBy(['indice'=>'1']) ;
$connexion->setEtat($etat);
$this->em->persist($connexion);
$this->em->flush();
$msg = 'Confirmation d\'accès effecutée avec succès .';
}
return $this->render('utilisateur/confirm_access.html.twig',['msg'=>$msg]);
}
/**
* @Route("/utilisateurs", name="utilisateurs", methods={"GET","POST"}, options= {"expose"="true"})
*/
public function utilisateurs(UtilisateurRepository $utilisateurRepository , Request $request, ConfigHeaderRepository $ConfigHeaderRepository , NiveauRepository $NiveauRepository ): Response
{
if( ($this->session->get('susrD3p9LjjY86') != 'gA64ya3G5N') && ($request->hasSession()) ){
return $this->redirectToRoute('connexion');
}
$config_header = $ConfigHeaderRepository->findAll()[0];
$niveau = $NiveauRepository->findAll();
return $this->render('utilisateur/index.html.twig', [
'utilisateurs' => $utilisateurRepository->findAll(),
'config_header'=> $config_header,
'niveau'=>$niveau,
]);
}
/**
* @Route("/serverUtilisateurs", name="serverUtilisateurs", methods={"GET","POST"}, options= {"expose"="true"})
*/
public function serverUtilisateurs(UtilisateurRepository $utilisateurRepository , Request $request, ConfigHeaderRepository $ConfigHeaderRepository ): Response
{
if( ($this->session->get('susrD3p9LjjY86') != 'gA64ya3G5N') && ($request->hasSession()) ){
return new Response('disconnect');
}
$sql_where = "" ;
$limit = $request->get('length') ;
$offset = $request->get('start') ;
$array_search = array();
$columns = ['u.identifiant'] ;
$orders = [] ;
for($i=0 ; $i<count($request->get('order')) ;$i++ ){
$orders[] = $columns[ $request->get('order')[$i]['column'] ].' '.$request->get('order')[$i]['dir'] ;
}
if( count($orders)>0){
$order = " ORDER BY ".implode(' , ',$orders) ;
}
else{
$order = "" ;
}
$total_utilisateurs = $this->em->createQuery(
'SELECT u
FROM App\Entity\Utilisateur u
WHERE 1=1 '.$sql_where.'
'
)
->getResult() ;
$I_nbResultatsTotal = count( $total_utilisateurs ) ;
$utilisateurs = $this->em->createQuery(
'SELECT u
FROM App\Entity\Utilisateur u
WHERE 1=1 '.$sql_where.' '.$order.'
'
)
->setMaxResults($limit)
->setFirstResult($offset)
->getResult() ;
$output = [] ;
foreach($utilisateurs as $utilisateur){
if($utilisateur->getVerif()=='1'){
$verif="Actif";
}else{
$verif="Désactif";
}
$output[] = [
'id'=>$utilisateur->getId() ,
'nom'=>$utilisateur->getNom().' '.$utilisateur->getPrenom() ,
'date'=>date_format( $utilisateur->getCreatedAt() , 'd/m/Y'),
'email'=>$utilisateur->getEmail(),
'niveau'=>$utilisateur->getNiveau()->getNiveau(),
'id_crypte'=>sha1($utilisateur->getId().$utilisateur->getToken()),
'verif'=>$verif,
];
}
$JSON = json_encode($output);
$JSON = '{"draw": '.$request->get('draw').',"recordsTotal":'.$I_nbResultatsTotal.',"recordsFiltered":'.$I_nbResultatsTotal.',"data":'.$JSON.'}';
$response = new Response($JSON, 200, ['Content-Type' => 'application/json']);
return $response;
}
/**
* @Route("/utilisateur_new", name="utilisateur_new", methods={"GET","POST"}, options= {"expose"="true"})
*/
public function utilisateur_new(UtilisateurRepository $utilisateurRepository , NiveauRepository $NiveauRepository , Request $request, ConfigHeaderRepository $ConfigHeaderRepository ): Response
{
if( ($this->session->get('susrD3p9LjjY86') != 'gA64ya3G5N') && ($request->hasSession()) ){
return $this->redirectToRoute('connexion');
}
$existance_user = $utilisateurRepository->findOneBy(["email"=>$request->get('email_n') ]) ;
if($existance_user!=null && $existance_user->getEtat() == 0 ){
return new Response('KO');
}
$mdp = $this->setSaltMdp($request->get('mdp_n'));
$token = $this->genererCode(20) ;
$niveau = $NiveauRepository->find($request->get('niveau_n'));
$etat = $EtatRepository->findOneBy(['indice'=>'1']) ;
$utilisateur = new Utilisateur();
$utilisateur->setCreatedAt( \DateTime::createFromFormat('d-m-Y H:i', date('d-m-Y H:i')) ) ;
$utilisateur->setConnexion( \DateTime::createFromFormat('d-m-Y H:i', date('d-m-Y H:i')) ) ;
$utilisateur->setNom($request->get('nom_n'));
$utilisateur->setPrenom($request->get('prenom_n'));
$utilisateur->setEmail($request->get('email_n'));
$utilisateur->setIdentifiant($request->get('identifiant_n'));
$utilisateur->setToken($token);
$utilisateur->setPassword($mdp);
$utilisateur->setEtat($etat);
$utilisateur->setNiveau($niveau);
$utilisateur->setVerif($request->get('verif_n'));
$this->em->persist($utilisateur) ;
$this->em->flush() ;
return new Response('OK');
}
/**
* @Route("/getOneUtilisateur", name="getOneUtilisateur", options = {"expose" = true})
*/
public function getOneUtilisateur(UtilisateurRepository $utilisateurRepository , NiveauRepository $NiveauRepository , Request $request, ConfigHeaderRepository $ConfigHeaderRepository ): Response
{
if($request->get('id')!=null){
$utilisateur = $utilisateurRepository->findOneBy(['id'=>$request->get('id')]) ;
}
$output = [
'id'=>$utilisateur->getId() ,
'nom'=>$utilisateur->getNom(),
'prenom'=>$utilisateur->getPrenom(),
'date'=>date_format( $utilisateur->getCreatedAt() , 'd/m/Y'),
'email'=>$utilisateur->getEmail(),
'verif'=>$utilisateur->getVerif(),
'identifiant'=>$utilisateur->getIdentifiant(),
'niveau'=>$utilisateur->getNiveau()->getId(),
];
$JSON = json_encode($output);
$response = new Response($JSON, 200, ['Content-Type' => 'application/json']);
return $response;
}
/**
* @Route("/utilisateur_edit", name="utilisateur_edit", methods={"GET","POST"}, options= {"expose"="true"})
*/
public function utilisateur_edit(UtilisateurRepository $utilisateurRepository , NiveauRepository $NiveauRepository , Request $request, ConfigHeaderRepository $ConfigHeaderRepository ): Response
{
if( ($this->session->get('susrD3p9LjjY86') != 'gA64ya3G5N') && ($request->hasSession()) ){
return $this->redirectToRoute('connexion');
}
$existance_user = $utilisateurRepository->findOneBy(["email"=>$request->get('email_n') ]) ;
if($existance_user!=null && $existance_user->getEtat() == 0 ){
return new Response('KO');
}
$mdp = $this->setSaltMdp($request->get('mdp_n'));
$token = $this->genererCode(20) ;
$niveau = $NiveauRepository->find($request->get('niveau_n'));
$etat = $EtatRepository->findOneBy(['indice'=>'1']) ;
$utilisateur = new Utilisateur();
$utilisateur->setCreatedAt( \DateTime::createFromFormat('d-m-Y H:i', date('d-m-Y H:i')) ) ;
$utilisateur->setConnexion( \DateTime::createFromFormat('d-m-Y H:i', date('d-m-Y H:i')) ) ;
$utilisateur->setNom($request->get('nom_n'));
$utilisateur->setPrenom($request->get('prenom_n'));
$utilisateur->setEmail($request->get('email_n'));
$utilisateur->setIdentifiant($request->get('identifiant_n'));
$utilisateur->setToken($token);
$utilisateur->setPassword($mdp);
$utilisateur->setEtat($etat);
$utilisateur->setNiveau($niveau);
$utilisateur->setVerif($request->get('verif_n'));
$this->em->persist($utilisateur) ;
$this->em->flush() ;
return new Response('OK');
}
}