<?php
namespace App\Security;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
use Symfony\Component\Security\Http\Util\TargetPathTrait;
use App\Services\user\LoginManager;
use App\Types\param\TypeParametre;
use App\Types\user\TypeCodeProfil;
use App\Types\user\TypeEtat;
use App\Entity\user\Connexion;
use App\Entity\user\Utilisateur;
use App\ControllerModel\user\paramUtilTrait;
use App\Repository\user\UtilisateurRepository;
use App\Repository\param\ParamRepository;
use App\Repository\user\AbonneRepository;
use App\Repository\stock\ProduitRepository;
Use App\ControllerModel\stock\TypeManager;
Use App\Types\user\TypeTable;
use App\Services\param\ParametreManager;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class AppAuthenticator extends AbstractLoginFormAuthenticator
{
use TargetPathTrait;
public const LOGIN_ROUTE = 'app_login';
private UrlGeneratorInterface $urlGenerator;
public function __construct(UrlGeneratorInterface $urlGenerator, UtilisateurRepository $reposiUtil, LoginManager $loginManager , ParamRepository $paramRepository , ParametreManager $parametreManager , AbonneRepository $abonneRepository,
EntityManagerInterface $em, ProduitRepository $produitRepository, TypeManager $typeManager, UserPasswordHasherInterface $passwordHasher,Security $security,
ParamRepository $paramRepositor )
{
$this->urlGenerator = $urlGenerator;
$this->reposiUtil = $reposiUtil ;
$this->loginManager = $loginManager ;
$this->paramRepository = $paramRepository ;
$this->parametreManager = $parametreManager ;
$this->abonneRepository = $abonneRepository;
$this->em =$em;
$this->produitRepository = $produitRepository;
$this->typeManager = $typeManager;
$this->passwordHasher = $passwordHasher;
$this->security = $security;
}
public function authenticate(Request $request): Passport
{
$username = $request->request->get('username', '');
$password = $request->request->get('password', '');
return new Passport(
new UserBadge($username),
new PasswordCredentials($request->request->get('password', '')),
[
new CsrfTokenBadge('authenticate', $request->request->get('_csrf_token')),
]
);
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
{
if ($targetPath = $this->getTargetPath($request->getSession(), $firewallName)) {
return new RedirectResponse($targetPath);
}
$objectUser = new Utilisateur();
$username = $request->request->get('username', '');
$password = $request->request->get('password', '');
//Traitement
$maxAttempt = $this->loginManager ->getMaxAttempt($this->paramRepository );
$longueurTel = $this->loginManager ->getLengthTel($this->paramRepository );
$adresseWeb = $request->getHost();
$objetAbonne = $this->abonneRepository ->findOneBy(['adresseWeb'=>$adresseWeb]);
//$objetAbonne = $this->em->getRepository($this->userBundle . 'Abonne')->find(10);
if($objetAbonne == null )
$abonneId= 0;
else
$abonneId= $objetAbonne->getId();
//$listeProduit = $produitRepository->getAllProduitAccueil($abonneId);
// $listeAgent = $this->em->getRepository($this->stockBundle . 'Fournisseur')->findBy(["abonne"=>$objetAbonne, "typeFournisseur"=>1, "etatFournisseur"=>1]);
// $listeAgent = $fournisseurRepository->getAllFournisseur(1, $abonneId); //findBy(["abonne"=>$objetAbonne, "typeFournisseur"=>1, "etatFournisseur"=>1]);
// var_dump($request->request->get('password', ''));exit;
$maxAttempt = $this->loginManager ->getMaxAttempt($this->paramRepository );
$request->getSession()->set(Security::LAST_USERNAME, $username);
if (($username != NULL) && ($password != NULL) ) {
// formulaire rempli
$user = $this->security->getUser();
if ($user == NULL) { // utilisateur introuvable avec le email et l password saisie
//$this->logMessage .=' [ USER INTROUVABLE AVEC PASS ET TEL ] ';
// on cherche l'utilisateur avec l emaol seulement
$user = $this->reposiUtil->getOneUserOnLoginForAttempt($username);
if ($user != NULL) { // L'utilisateur existe ds la db,il y a erreur de saisie de password
// $this->logMessage .=' [ USER TROUVE AVEC TEL UNIQUEMENT ] ';
if ($user->getAttempt() >= $maxAttempt ) { // user deja bloque
//$this->logMessage .= ' [ USER ( ' . $username . ' ) TENTATIF DE CONNEXION COMPTE ANNEXE ] ';
//$this->get('session')->getFlashBag()->add('login.form.ivalide', 'Votre compte est bloqué');
//$this->loginManager ->writeLogMessage($this->logMessage);
//return $this->redirect($this->generateUrl('app_admin_user_login'));
return new RedirectResponse($this->urlGenerator->generate('app_login'));
}
// si ce n'est pas l'administrateur
$profil = $user->getProfil();
if ($profil->getCode() != TypeCodeProfil::MAINTENANCE) {
$user->setAttempt($user->getAttempt() + 1);
}
if ($user->getAttempt() >= $maxAttempt) { // nombre de tentatives > 3
$user->setEtat(TypeEtat::BLOQUE);
//$this->logMessage .= ' [ USER ( ' . $username . ' ) BLOQUE ] ';
//$this->get('session')->getFlashBag()->add('login.user.lock', 'Votre compte est bloqué');
// $this->loginManager ->writeLogMessage($this->logMessage);
//return $this->redirect($this->generateUrl('app_admin_user_login'));
return new RedirectResponse($this->urlGenerator->generate('app_login'));
}
$this->em->flush();
//$this->get('session')->getFlashBag()->add('login.form.ivalide', 'Email et/ou mot de passe invalides');
} else {
//$this->get('session')->getFlashBag()->add('login.form.ivalide', 'Email et/ou mot de passe invalides');
}
//$this->logMessage .=' [ USER INTROUVABLE AVEC EMAIl UNIQUEMENT ] ';
//$this->loginManager ->writeLogMessage($this->logMessage);
} else { // utilisateur trouve avec tel et password saisie
if (($user->getAttempt() >= $maxAttempt) || ($user->getEtat() == TypeEtat::BLOQUE)) {
// $this->logMessage .= ' [ USER ( ' . $username . ' ) BLOQUE TENTE DE SE CONNECTER ] ';
// $this->get('session')->getFlashBag()->add('login.user.lock', 'Votre compte est bloqué');
//$this->loginManager ->writeLogMessage($this->logMessage);
//return $this->redirect($this->generateUrl('app_admin_user_login'));
return new RedirectResponse($this->urlGenerator->generate('app_login'));
}
if (($user->getProfil()->getEtat() == TypeEtat::INACTIF) || ($user->getEtat() == TypeEtat::INACTIF)) {
//$this->get('session')->getFlashBag()->add('login.user.lock', 'Votre compte est désactivé');
//return $this->redirect($this->generateUrl('app_admin_user_login'));
return new RedirectResponse($this->urlGenerator->generate('app_login'));
}
if($user->getTypeProdUser() !=3 ){
if($user->getTypeProdUser() != $request->request->get('prod') ){
//var_dump($user->getTypeProdUser(),$request->request->get('prod'));exit;
//$this->logMessage .= ' [ USER ( ' . $username . ' ) BLOQUE TENTE DE SE CONNECTE ] ';
// $this->get('session')->getFlashBag()->add('login.user.prod.erreur', 'Vous ne pouvez pas accéder à cet espace. Revoir le produit choisi');
// $this->loginManager ->writeLogMessage($this->logMessage);
// return $this->redirect($this->generateUrl('app_admin_user_login'));
return new RedirectResponse($this->urlGenerator->generate('app_login'));
}
}
if($objetAbonne !=null){
if ($user->getAbonne()->getId() != $abonneId) { // utilisateur d'abonne different
//$this->logMessage .= ' [ USER ( ' . $username . ' ) BLOQUE TENTE DE SE CONNECTE ] ';
// $this->get('session')->getFlashBag()->add('login.form.ivalide', 'Email et/ou mot de passe invalides');
// $this->loginManager ->writeLogMessage($this->logMessage);
// return $this->redirect($this->generateUrl('app_admin_user_login'));
return new RedirectResponse($this->urlGenerator->generate('app_login'));
}
}
$adresseIp = $_SERVER['REMOTE_ADDR'];
$user->setAdresseIp($adresseIp);
$con = new Connexion($adresseIp);
$con->setUtilisateur($user);
$con->setAdresseIp($adresseIp);
$user->addConnexion($con);
$this->em->persist($con);
$this->em->flush();
$sessionData = $this->createSessionDataUser($user, $con->getId(),$request->request->get('prod'), $this->typeManager, $this->produitRepository);
$this->loginManager ->setSessionData(LoginManager::SESSION_DATA_NAME, $sessionData);
$user->setAttempt(0);
$user->setEtatConnecte(TRUE);
if($user->getPassword() == '$2y$13$ZBF2sG0b8HDTU1acB0TMU.feRTtZsbYyruBmZxuuEyr542kVosedG') {
// $this->get('session')->getFlashBag()->add('login.user.securite', 'Vous utilisez votre mot de passe par défaut, Pour votre sécurité changer le ! ');
// return $this->redirect($this->generateUrl('app_admin_user_modifier_my_password'));
return new RedirectResponse($this->urlGenerator->generate('app_admin_user_modifier_my_password'));
}
$this->em->flush();
//$this->logMessage .= ' [ CONNEXION RÉUSSIE ] ';
// if (($restoreUrl != NULL) && (!empty($restoreUrl)) && (strlen($restoreUrl) > 0)) {
//return $this->redirect($restoreUrl);
//}
// var_dump(1);exit;
// if($user->getCaisse()!= null)
//return $this->redirect($this->generateUrl('admin_vente_evoluee'));
// else
// return $this->redirect($this->generateUrl('app_admin_user_home'));
}
}
// For example:
return new RedirectResponse($this->urlGenerator->generate('app_admin_user_home'));
// throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);
}
protected function getLoginUrl(Request $request): string
{
return $this->urlGenerator->generate(self::LOGIN_ROUTE);
}
/*
* Création des variables de sessions
*
* @param Utilisateur $user
* @param type $idConnexion
* @return type
*/
private function createSessionDataUser(Utilisateur $user, $idConnexion,$prod, TypeManager $typeManager,ProduitRepository $produitRepository) {
if($prod == "")
$prod = 0;
$rep = array();
$rep['isUser'] = TRUE;
$rep['isAbonne'] = FALSE;
$rep['nomTableConnecte'] = TypeTable::UTILISATEUR;
$rep['id'] = $user->getId();
$rep['prenoms'] = $user->getPrenoms();
$rep['nom'] = $user->getNom();
$rep['ip'] = $user->getAdresseIp();
$prix = $produitRepository->find($prod);
$listeDepassement = array();//$this->em->getRepository($this->stockBundle . 'Depassement')->findBy(array("profil"=>$user->getProfil(),'etatDepassement'=> TypeEtat::APRODUIRE));
$i = 0;
$rep['nbreDepassement'] = count($listeDepassement);
foreach ($listeDepassement as $unDepassement) {
$rep['depassement'][$i]['idfour'] = $unDepassement->getFournisseur()->getId();
$rep['depassement'][$i]['nomfour'] = $unDepassement->getFournisseur()->getNomFournisseur();
$rep['depassement'][$i]['id'] = $unDepassement->getId();
$rep['depassement'][$i]['montant'] = $unDepassement->getDepassementFournisseur();
$i++;
}
//var_dump(1);exit;
$tabConfiguration = $user->getAbonne()->getConfiguration();
//var_dump($tabConfiguration);
$tabConfiguration = (array)json_decode($tabConfiguration);
//var_dump($tabConfiguration);//exit;
if($tabConfiguration != NULL){
//$tabConfiguration = json_decode($configuration);
if(array_key_exists("stock_departemental", $tabConfiguration))
$rep['stockDepartemental'] = $tabConfiguration['stock_departemental'];
else
$rep['stockDepartemental'] = 0;
if(array_key_exists("impression_thermique", $tabConfiguration))
$rep['impressionThermique'] = $tabConfiguration['impression_thermique'];
else
$rep['impressionThermique'] = 0;
}else{
$rep['stockDepartemental'] = 0;
$rep['impressionThermique'] = 0;
}
//var_dump($rep);exit;
if($prix !=null){
$prixProduit = $prix->getMontantHtVente();
$nomProduit = $prix->getNomProduit();
}else{
$prixProduit = 0;
$nomProduit ="Tout";
}
$rep['prixCacao'] = $prixProduit ;
$rep['abonneId'] = $user->getAbonne()->getId();
$rep['nomTypeAbonne'] = $user->getAbonne()->getTypeAbonne()->getNom();
$rep['TypeAbonneId'] = $user->getAbonne()->getTypeAbonne()->getId();
$rep['typePresentation'] = $user->getAbonne()->getTypePresentation();
if($user->getAbonne()->getSiPrincipale() == 0 && $user->getAbonne()->getPartenaire() !=null)
$rep['tsiPrincipale'] = 2;
else
$rep['tsiPrincipale'] = $user->getAbonne()->getSiPrincipale();
$rep['siExploitation'] = $user->getAbonne()->getSiExploitation();
if($user->getAbonne()->getPays() == null)
$rep['paysId'] = 1;
else
$rep['paysId'] = $user->getAbonne()->getPays()->getId();
$rep['siPrincipale'] = $user->getAbonne()->getSiPrincipale();
if($user->getAbonne()->getTemplate() != null)
$rep['templateId'] = $user->getAbonne()->getTemplate()->getId();
else
$rep['templateId'] = 0;
$rep['idTypeAbonne'] = $user->getAbonne()->getTypeAbonne()->getId();
$rep['descriptionTypeAbonne'] = $user->getAbonne()->getTypeAbonne()->getDescription();
$rep['tel1'] = $user->getTel1();
$rep['produit_id'] = $prod;
$rep['nomProduit'] = $nomProduit ;
$rep['idConnexion'] = $idConnexion;
$rep['sexe'] = $typeManager->convertTypeSexe($user->getSexe());
$rep['username'] = $user->getUsername();
$rep['idProfil'] = $user->getProfil()->getId();
$rep['nbMessageNonLu'] = 0;
//$this->em->getRepository($this->messagerieBundle . 'Envoi')->getNbMessageNonLu(FALSE, $user->getId());
$rep['libelleProfil'] = $user->getProfil()->getNom();
$rep['codeProfil'] = $user->getProfil()->getCode();
$rep['tabIdActions'] = $user->getProfil()->getTabIdActions();
$rep['homeUrl'] = "";//$this->generateUrl('app_admin_user_index');
$limiteSuperficie = $this->parametreManager->getValeurParametre(TypeParametre::LIMITE_SUPERFICIE_SAISON,1,$this->paramRepository);
if($limiteSuperficie != null)
$rep['limiteSuperficie'] = $limiteSuperficie;
else
$rep['limiteSuperficie'] = 5;
$limiteProducteur = $this->parametreManager->getValeurParametre(TypeParametre::LIMITE_PRODUCTEUR,1,$this->paramRepository);
if($limiteProducteur != null)
$rep['limiteProducteur'] = $limiteProducteur;
else
$rep['limiteSuperficie'] = 2000;
//var_dump($rep);exit;
return $rep;
}
}