src/Controller/AuthenticationController.php line 227

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\Controller;//A voir
  4. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;//A voir
  5. use Symfony\Component\HttpFoundation\Cookie;//A voir
  6. use Symfony\Component\HttpFoundation\Response;//A voir
  7. use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;//A voir
  8. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;//A voir
  9. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;//A voir
  10. use Symfony\Component\HttpFoundation\JsonResponse;//A voir
  11. use App\Entity\Utilisateur;
  12. use App\Entity\Service;
  13. use App\Entity\Parametre;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;//A voir
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. use Symfony\Component\EventDispatcher\EventDispatcher;
  18. use App\Repository\ATBGRepository;
  19. use App\Repository\AbbreviationLangueRepository;
  20. use App\Repository\AbbreviationRepository;
  21. use App\Repository\ActualiteRepository;
  22. use App\Repository\AntibiotiqueRepository;
  23. use App\Repository\CasCliniquesCategorieRepository;
  24. use App\Repository\CasCliniquesQuestionRepository;
  25. use App\Repository\CasCliniquesReponseRepository;
  26. use App\Repository\CasCliniquesReponseUtilisateurRepository;
  27. use App\Repository\CelluleRepository;
  28. use App\Repository\CelluleTitreCompletRepository;
  29. use App\Repository\CoAntibiotiqueCalculRepository;
  30. use App\Repository\ContenuRepository;
  31. use App\Repository\EtablissementRepository;
  32. use App\Repository\FamilleAntibiotiqueRepository;
  33. use App\Repository\FavorisRepository;
  34. use App\Repository\InformationHopitalRepository;
  35. use App\Repository\InformationReferenceRepository;
  36. use App\Repository\InformationRepository;
  37. use App\Repository\IntervenantSessioneppRepository;
  38. use App\Repository\LangueRepository;
  39. use App\Repository\MicroorganismeRepository;
  40. use App\Repository\NoteRepository;
  41. use App\Repository\ParametreRepository;
  42. use App\Repository\PaysRepository;
  43. use App\Repository\PersonnalisationRepository;
  44. use App\Repository\PersonnalisationSpectreRepository;
  45. use App\Repository\QualiteRepository;
  46. use App\Repository\ReferenceHopitalRepository;
  47. use App\Repository\ReferenceRepository;
  48. use App\Repository\SessioneppRepository;
  49. use App\Repository\SessioneppUrlRepository;
  50. use App\Repository\SpecialiteRepository;
  51. use App\Repository\ServiceRepository;
  52. use App\Repository\SessionConnexionRepository;
  53. use App\Repository\SpectreRepository;
  54. use App\Repository\TicketPatientRepository;
  55. use App\Repository\TypeInformationRepository;
  56. use App\Repository\UtilisateurRepository;
  57. use App\Repository\VersionRepository;
  58. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  59. use App\Service\InformationsComtpeService;
  60. use App\Service\ContentHandler;
  61. use App\Service\EncryptionService;
  62. use Symfony\Component\Mailer\MailerInterface;
  63. use Symfony\Bridge\Twig\Mime\TemplatedEmail;
  64. use Symfony\Component\Mime\Address;
  65. use AuthenticationBundle\Security\User\WebserviceUser;
  66. use \DateTime;
  67. class AuthenticationController extends ATBGController
  68. {
  69.     private $dispatcher;    
  70.     private $mailer;
  71.     public function __construct(
  72.         private AbbreviationLangueRepository $abbreviationLangueRepo,
  73.         private AbbreviationRepository $abbreviationRepo,
  74.         private ActualiteRepository $actualiteRepo,
  75.         private AntibiotiqueRepository $antibiotiqueRepo,
  76.         private CasCliniquesCategorieRepository $casCliniquesCategorieRepo,
  77.         private CasCliniquesQuestionRepository $casCliniquesQuestionRepo,
  78.         private CasCliniquesReponseRepository $casCliniquesReponseRepo,
  79.         private CasCliniquesReponseUtilisateurRepository $casCliniquesReponseUtilisateurRepo,
  80.         private CelluleRepository $celluleRepo,
  81.         private CelluleTitreCompletRepository $celluleTitreCompletRepo,
  82.         private CoAntibiotiqueCalculRepository $coAntibiotiqueCalculRepo,
  83.         private ContenuRepository $contenuRepo,
  84.         private EtablissementRepository $etablissementRepo,
  85.         private FamilleAntibiotiqueRepository $familleAntibiotiqueRepository,
  86.         private FavorisRepository $favorisRepo,
  87.         private InformationHopitalRepository $informationHopitalRepo,
  88.         private InformationReferenceRepository $informationReferenceRepo,
  89.         private InformationRepository $informationRepo,
  90.         private IntervenantSessioneppRepository $intervenantSessioneppRepo,
  91.         private LangueRepository $langueRepo,
  92.         private MicroorganismeRepository $microorganismeRepo,
  93.         private NoteRepository $noteRepo,
  94.         private ParametreRepository $parametreRepo,
  95.         private PaysRepository $paysRepo,
  96.         private PersonnalisationRepository $personnalisationRepo,
  97.         private PersonnalisationSpectreRepository $personnalisationSpectreRepo,
  98.         private QualiteRepository $qualiteRepo,
  99.         private ReferenceHopitalRepository $referenceHopitalRepo,
  100.         private ReferenceRepository $referenceRepo,
  101.         private ServiceRepository $serviceRepo,
  102.         private SessionConnexionRepository $sessionConnexionRepo,
  103.         private SessioneppRepository $sessioneppRepo,
  104.         private SessioneppUrlRepository $sessioneppUrlRepo,
  105.         private SpecialiteRepository $specialiteRepo,
  106.         private SpectreRepository $spectreRepo,
  107.         private TicketPatientRepository $ticketPatientRepo,
  108.         private TypeInformationRepository $typeInformationRepo,
  109.         private UtilisateurRepository $utilisateurRepo,
  110.         private VersionRepository $versionRepo,
  111.         private TranslatorInterface $translator,
  112.         private EncryptionService $encryptService,
  113.         private LangController $langService,
  114.         MailerInterface $mailer
  115.     ){
  116.         $this->dispatcher = new EventDispatcher();
  117.         $this->mailer $mailer;
  118.     }
  119.     
  120.     private function logUserAndRedirect($username$rolesRequest $request)
  121.     {
  122.         $firewall 'main';
  123.         
  124.         $token = new UsernamePasswordToken($usernamenull$firewall$roles);
  125.         
  126.         $this->get("security.token_storage")->setToken($token);
  127.         $event = new InteractiveLoginEvent($request$token);
  128.         //$this->dispatcher->dispatch("security.interactive_login", $event);
  129.         $this->dispatcher->dispatch($event);
  130.         if ($request->getSession()->get('_security.main.target_path'))
  131.         {
  132.             return $this->redirect($request->getSession()->get('_security.main.target_path'));
  133.         }
  134.         else
  135.         {
  136.             $returned parent::suppression_parametres_get($request);
  137.             if ($returned != null
  138.             {
  139.                 return $returned;
  140.             }
  141.             else
  142.             {
  143.                 return $this->redirectToRoute('actualites_home');
  144.             }
  145.         }
  146.     }
  147.     // les connexions ADADA et BOUTIQUE ne sont pas incluses dans les entités. Les connexions webedition et webhopital font appels à du code SQL natif sans entityRepository
  148.     private function connexionWebHopital(Request $request, &$error, &$warning$vidal false)
  149.     {
  150.         $roles = array('ROLE_AUTHENTICATED');
  151.         $session $request->getSession();
  152.         $ip_client $request->getClientIp();
  153.         $connexionReferer false;
  154.         $referer $request->headers->get('referer');
  155.         
  156.         if ($referer && !preg_match("/".str_replace("/""\/"$request->getHttpHost())."/"$referer))
  157.         {
  158.             $ip_client $referer;
  159.             $connexionReferer true;
  160.             $url_referer $request->getSession()->get('_security.main.target_path');
  161.             $session->invalidate(3600);
  162.             $session->set('_security.main.target_path',$url_referer);
  163.         }
  164.         // echo $ip_client;
  165.         while ($ip_client != null
  166.         {
  167.             $adada_connection $this->get('doctrine')->getConnection('adada');
  168.             $sql "" .
  169.                 "SELECT count(client_ip_ip) as nbips, client_vidal_token,client_vidal, client_nom, client_id, client_date_fin_installation, client_ref_nom, client_ref_prenom,client_cbip
  170.                  FROM ADADA_CLIENT 
  171.                  LEFT JOIN ADADA_CLIENT_IP on ADADA_CLIENT.client_id=ADADA_CLIENT_IP.client_ip_id_client 
  172.                  WHERE (ADADA_CLIENT_IP.client_ip_ip = :client_ip1 
  173.                  OR  IF(REPLACE(ADADA_CLIENT_IP.client_ip_ip, '.*', '') <> ADADA_CLIENT_IP.client_ip_ip,:client_ip2 like CONCAT(REPLACE(ADADA_CLIENT_IP.client_ip_ip, '.*', ''), '%'),''))
  174.                  AND client_produit like '%hopital_web%'";
  175.             if ($vidal && !$request->query->get('code'))
  176.             {
  177.                 $error[] = $this->translator->trans("authentification_lien_vidal_non_valide");
  178.                 $ip_client null;
  179.             }
  180.             else
  181.             {
  182.                 if ($vidal)
  183.                 {
  184.                     $current_time = new \DateTime();
  185.                     $vidal_code_1 $current_time->format('dmYH');
  186.                     $current_time->sub(new \DateInterval('P1H'));
  187.                     $vidal_code_2 $current_time->format('dmYH');
  188.                     $current_time->add(new \DateInterval('P2H'));
  189.                     $vidal_code_3 $current_time->format('dmYH');
  190.                     $sql .= ' and client_vidal = 1 and (md5(concat(client_vidal_token, :vidal_code_1)) = :code1 or md5(concat(client_vidal_token, :vidal_code_2)) = :code2 or md5(concat(client_vidal_token, :vidal_code_3)) = :code3)';
  191.                 }
  192.                 $stmt $adada_connection->prepare($sql);
  193.                 $stmt->bindValue('client_ip1'$ip_client);
  194.                 $stmt->bindValue('client_ip2'$ip_client);
  195.                 if ($vidal)
  196.                 {
  197.                     $stmt->bindValue('vidal_code_1'$vidal_code_1);
  198.                     $stmt->bindValue('code1'$request->query->get('code'));
  199.                     $stmt->bindValue('vidal_code_2'$vidal_code_2);
  200.                     $stmt->bindValue('code2'$request->query->get('code'));
  201.                     $stmt->bindValue('vidal_code_3'$vidal_code_3);
  202.                     $stmt->bindValue('code3'$request->query->get('code'));
  203.                 }
  204.                 $stmt->execute();
  205.                 // dump($stmt);
  206.                 // dd($users);
  207.                 $users $stmt->execute()->fetchAll();
  208.                 $user $users[0];
  209.                 $nbips $user['nbips'];
  210.             
  211.                 $pays_code $this->parametreRepo->findParametrePaysCode($user['client_id']);
  212.                 if($pays_code != null && $pays_code != ""$this->langService->setLocale($requeststrtolower(substr($pays_code02)));
  213.                 else $this->langService->setLocale($request'fr');
  214.                 if($nbips>0)
  215.                 {
  216.                     //Une seule adresse IP, on redirige sans vérifier la clef
  217.                     if($nbips==1)
  218.                     { 
  219.                         $session->set('titre_hopital',    $user['client_nom']);
  220.                         $session->set('client_id_adada',  $user['client_id']);
  221.                         $session->set('client_vidal',  $user['client_vidal']);
  222.                         $session->set('client_vidal_token',  $user['client_vidal_token']);
  223.                         $session->set('client_cbip',  $user['client_cbip']);
  224.                         $this->checkExpirationDateWebHopital($user['client_date_fin_installation'], $error$warning);
  225.                         $this->checkCodeFiness($user['client_id'], $error$warning$request);
  226.                         $ip_client null;
  227.                     }
  228.                     else
  229.                     {
  230.                         //aucune clef passée dans l'URL
  231.                         if (!$request->query->get('cle_url') && !$session->get('cle_url'))
  232.                         {
  233.                             $error[] = $this->translator->trans("authentification_cle_authentification_pas_presente");
  234.                             $ip_client null;
  235.                         }
  236.                         else
  237.                         {
  238.                             $cle_url "aaaaaaaaaaaaaaaaaa";
  239.                             if (!$request->query->get('cle_url')) 
  240.                             {
  241.                                 $cle_url $session->get('cle_url');
  242.                             }
  243.                             else
  244.                             {
  245.                                 $cle_url $request->query->get('cle_url');
  246.                             }
  247.                             $sql "SELECT count(client_ip_ip) as nbips, client_vidal_token, client_vidal, client_nom, client_id, client_date_fin_installation, client_ref_nom, client_ref_prenom,client_cbip
  248.                                 FROM ADADA_CLIENT
  249.                                 LEFT JOIN ADADA_CLIENT_IP on ADADA_CLIENT.client_id=ADADA_CLIENT_IP.client_ip_id_client AND (ADADA_CLIENT_IP.client_ip_ip = :ip_client1 OR :ip_client2 like CONCAT(REPLACE(ADADA_CLIENT_IP.client_ip_ip, '.*', ''), '%'))
  250.                                 WHERE ADADA_CLIENT.client_cle_url = :cle_url
  251.                                 AND client_produit like '%hopital_web%'";
  252.                             $stmt $adada_connection->prepare($sql);
  253.                             $stmt->bindValue('ip_client1'$ip_client);
  254.                             $stmt->bindValue('ip_client2'$ip_client);
  255.                             $stmt->bindValue('cle_url'$cle_url);
  256.                             $stmt->execute();
  257.                             $users $stmt->fetchAll();
  258.                             $row $users[0];
  259.                             $nbips $row['nbips'];
  260.                             if( $nbips 0)
  261.                             {
  262.                                 //Clef url vérifiée
  263.                                 if($nbips == 1)
  264.                                 { 
  265.                                     $session->set('titre_hopital'$row['client_nom']);
  266.                                     $session->set('client_id_adada'$row['client_id']);
  267.                                     $session->set('client_vidal'$row['client_vidal']);
  268.                                     $session->set('client_vidal_token'$row['client_vidal_token']);
  269.                                     $session->set('client_cbip'$user['client_cbip']);
  270.                                     $session->set('cle_url'$cle_url);
  271.                                     $this->checkExpirationDateWebHopital($row['client_date_fin_installation'], $error$warning);
  272.                                     $this->checkCodeFiness$row['client_id'], $error$warning$request);
  273.                                     $ip_client null;
  274.                                 }
  275.                                 else
  276.                                 {
  277.                                     $error[] = $this->translator->trans("authentification_cle_authentification_deja_connectee");
  278.                                     $ip_client null;
  279.                                 }
  280.                             }
  281.                             else
  282.                             {
  283.                                 $error[] = $this->translator->trans("authentification_cle_authentification_pas_valide");
  284.                                 $ip_client null;
  285.                             }
  286.                         }
  287.                     }
  288.                 }
  289.                 else
  290.                 {
  291.                     if ($connexionReferer === true
  292.                     {
  293.                         $ip_client $request->getClientIp();
  294.                         $connexionReferer false;
  295.                     }
  296.                     else
  297.                     {
  298.                         $ip_client null;
  299.                         $error[] = $this->translator->trans("authentification_ip_non_reconnue");
  300.                     }
  301.                 }
  302.             }
  303.         }
  304.         return $roles;
  305.     }
  306.     private function checkExpirationDateWebHopital($date, &$error, &$warning)
  307.     {
  308.         // si date de fin d'installation < maintenant, on bloque. Si moins de X jours on avertie
  309.         $date_expiration \DateTime::createFromFormat("Y-m-d"$date);
  310.         $current_date = new \DateTime();
  311.         if ($date_expiration $current_date)
  312.         {
  313.             $error[] = $this->translator->trans("authentification_abonnement_expire");
  314.         }
  315.         else
  316.         {
  317.             // avertissement 30 jours avant
  318.             $current_date->add(new \DateInterval('P1M'));
  319.             if ($date_expiration $current_date)
  320.             {
  321.                 $warning[] = $this->translator->trans("authentification_abonnement_bientot_expirer");
  322.             }
  323.         }
  324.     }
  325.     private function checkCodeFiness($idAdada, &$error, &$warningRequest $request)
  326.     {
  327.         $session $request->getSession();
  328.         $em $this->getDoctrine()->getManager();
  329.         $etablissements $this->etablissementRepo->findby(array('clientIdAdada' => $idAdada));
  330.         if (count($etablissements) > 1
  331.         {
  332.             if (!$request->query->get('finess') && !$session->get('finess'))
  333.             {
  334.                 $error[] = $this->translator->trans("authentification_code_finess_pas_present");
  335.             }
  336.             else
  337.             {
  338.                 $finess "aaaaaaaaaaaaaaaaaa";
  339.                 $nom_finess "";
  340.                 $id_etablissement "";
  341.                 $finessOK false;
  342.                 if (!$request->query->get('finess')) 
  343.                 {
  344.                     $finess $session->get('finess');
  345.                 }
  346.                 else
  347.                 {
  348.                     $finess $request->query->get('finess');
  349.                 }
  350.                 foreach ($etablissements as $etablissement
  351.                 {
  352.                     if ($etablissement->getCodeFiness() == $finess
  353.                     {
  354.                        $finess $etablissement->getCodeFiness();
  355.                        $nom_finess $etablissement->getNomEtablissement();
  356.                        $id_etablissement $etablissement->getIdEtablissement();
  357.                        $finessOK true;
  358.                     }
  359.                 }
  360.                 if ($finessOK
  361.                 {
  362.                      $session->set('finess',  $finess);
  363.                      $session->set('nom_finess',  $nom_finess);
  364.                      $session->set('id_etablissement',  $id_etablissement);
  365.                      $session->set('multi_finess',  1);
  366.                 }
  367.                 else
  368.                 {
  369.                     $error[] = $this->translator->trans("authentification_code_finess_pas_trouve");
  370.                 }
  371.             }
  372.         }
  373.         else if (count($etablissements) == 1
  374.         {
  375.             $session->set('nom_finess',  $etablissements[0]->getNomEtablissement());
  376.             $session->set('id_etablissement',  $etablissements[0]->getIdEtablissement());
  377.             $session->set('multi_finess',  0);
  378.         }
  379.         else
  380.         {
  381.             //Pas de Code FINESS enregistrer pour ce client
  382.             $error[] = $this->translator->trans("authentification_code_finess_non_rattache");
  383.         }
  384.     }
  385.     private function certification($certificat,&$client_identifiant, &$client_date_fin, &$client_idadada, &$client_ip, &$errors)
  386.     {
  387.         $tmp openssl_decrypt($certificat->getValeur() ,'AES-128-CBC'$this->getParameter('nom_hopital_intranet'), 0'AETUOSFHKMµXVN.');
  388.         $tmp explode("||",$tmp);
  389.         $client_idadada $tmp[0];
  390.         $client_identifiant $tmp[1];
  391.         $client_ip $tmp[2];
  392.         $client_date_fin $tmp[3];
  393.     }
  394.     public function informationsKey(&$client_identifiant, &$client_date_fin, &$client_idadada, &$client_ip, &$errors)
  395.     {
  396.         $em $this->getDoctrine()->getManager();
  397.         $path_to_web $this->getParameter('kernel.project_dir');
  398.         if (file_exists($path_to_web '/antibiogarde.key'))
  399.         {
  400.             $certificat $this->parametreRepo->findCertificat($this->getParameter('client_id_adada_intranet'));
  401.             if ($certificat != null)
  402.             {
  403.                 $this->certification($certificat,$client_identifiant,$client_date_fin,$client_idadada,$client_ip,$errors);
  404.                 return true;
  405.             }
  406.             else
  407.             {
  408.                 $server_addr '';
  409.                 if (isset($_SERVER['SERVER_ADDR']) && $_SERVER['SERVER_ADDR'] <> ''
  410.                 { 
  411.                     $server_addr $_SERVER['SERVER_ADDR']; 
  412.                 } else { 
  413.                     $server_addr gethostbyname($_SERVER['SERVER_NAME']); 
  414.                 }
  415.                 $key_filefile_get_contents($path_to_web '/antibiogarde.key');
  416.                 $request curl_init();
  417.                 curl_setopt($requestCURLOPT_URL$this->getParameter('url_certification_intranet'));
  418.                 curl_setopt($request,CURLOPT_POSTFIELDS"key=".$key_file."&ip=".$server_addr."&nomhopital=".$this->getParameter('nom_hopital_intranet'));
  419.                 curl_setopt($requestCURLOPT_RETURNTRANSFER1);
  420.                 $datas json_decode(curl_exec($request));
  421.                 if ($datas->responseCode == 0
  422.                 {
  423.                     $certificat = new Parametre();
  424.                     $certificat->setClientIdAdada($this->getParameter('client_id_adada_intranet'));
  425.                     $certificat->setClef("certificat_authenticite");
  426.                     $certificat->setValeur($datas->certificat);
  427.                     $certificat->setOrdre(0);
  428.                     $em->persist($certificat);
  429.                     $em->flush();
  430.                     $this->certification($certificat,$client_identifiant,$client_date_fin,$client_idadada,$client_ip,$errors);
  431.                     return true;
  432.                 }
  433.                 else
  434.                 {
  435.                     $errors[] = $this->translator->trans("authentification_erreur")." ".$datas->responseCode." : ".$this->translator->trans("authentification_clef_antibiogarde_non_valide_ou_expiree");
  436.                     return false;
  437.                 }
  438.             }
  439.         }
  440.         else
  441.         {
  442.             $certificat $this->parametreRepo->findCertificat($this->getParameter('client_id_adada_intranet'));
  443.             if ($certificat != null)
  444.             {
  445.                 $em->remove($certificat);
  446.                 $em->flush();
  447.             }
  448.             $errors[] = $this->translator->trans("authentification_clef_antibiogarde_non_installe");
  449.             return false;
  450.         }
  451.     }
  452.     private function connexionIntranet(Request $request, &$errors, &$warnings)
  453.     {
  454.         $roles = array('ROLE_AUTHENTICATED');
  455.         $session $request->getSession();
  456.         $recupOK $this->informationsKey($client_identifiant,$client_date_fin,$client_idadada,$client_ip,$errors);
  457.         if ($recupOK
  458.         {
  459.             $server_addr '';
  460.             if (isset($_SERVER['SERVER_ADDR']) && $_SERVER['SERVER_ADDR'] <> ''
  461.             { 
  462.                 $server_addr $_SERVER['SERVER_ADDR']; 
  463.             } else { 
  464.                 $server_addr gethostbyname($_SERVER['SERVER_NAME']); 
  465.             }
  466.             $clefOK = (md5($client_identifiant) == md5($this->getParameter('client_clef_intranet')));
  467.             $dateOK = (date("Y-m-d") < $client_date_fin);
  468.             $ipOK = ($server_addr == $client_ip);
  469.             $idOK = ($this->getParameter('client_id_adada_intranet') == $client_idadada);
  470.             if(!$clefOK || !$dateOK || !$ipOK || !$idOK )
  471.             {
  472.                 $codeError "";
  473.                 $codeError .= ($idOK) ? "0" "1" ;
  474.                 $codeError .= ($ipOK) ? "0" "1" ;
  475.                 $codeError .= ($dateOK) ? "0" "1" ;
  476.                 $codeError .= ($clefOK) ? "0" "1" ;
  477.                 $errors[] = $this->translator->trans("authentification_erreur")." ".$codeError." : ".$this->translator->trans("authentification_clef_antibiogarde_non_valide_ou_expiree");
  478.                 return array();
  479.             }
  480.             else
  481.             {
  482.                 $session->set('titre_hopital',          $this->getParameter('nom_hopital_intranet'));
  483.                 $session->set('client_id_adada',        $this->getParameter('client_id_adada_intranet'));
  484.                 $session->set('client_vidal',           $this->getParameter('activation_interfacage_vidal'));
  485.                 $session->set('client_vidal_token',     $this->getParameter('token_interfacage_vidal'));
  486.                 $session->set('client_cbip',            $this->getParameter('activation_interfacage_cbip'));
  487.                 $em $this->getDoctrine()->getManager();
  488.                 $etablissements $this->etablissementRepo->findby(array('clientIdAdada' => $client_idadada));
  489.                 $session->set('nom_finess',  $etablissements[0]->getNomEtablissement());
  490.                 $session->set('id_etablissement',  $etablissements[0]->getIdEtablissement());
  491.                 $session->set('multi_finess',  0);
  492.                 return $roles;
  493.             }
  494.         }
  495.         
  496.         return array();
  497.     }
  498.     public function login(Request $request)
  499.     {
  500.         parse_str(parse_url($request->getSession()->get('_security.main.target_path'), PHP_URL_QUERY), $output);
  501.         if (array_key_exists("finess"$output)) 
  502.         {
  503.            $request->query->set('finess'$output['finess']);
  504.         }
  505.         if (array_key_exists("cle_url"$output)) 
  506.         {
  507.            $request->query->set('cle_url'$output['cle_url']);
  508.         }
  509.         if ($this->get('security.authorization_checker')->isGranted('ROLE_AUTHENTICATED') && !$request->query->get('cle_url') && !$request->query->get('finess'))
  510.         {
  511.             $returned parent::suppression_parametres_get($request);
  512.             if ($returned != null
  513.             {
  514.                 return $returned;
  515.             }
  516.             else
  517.             {
  518.                 return $this->redirectToRoute('actualites_home');
  519.             }
  520.         }
  521.     
  522.         $version_antibiogarde $this->getParameter('version_antibiogarde');
  523.         $errors = array();
  524.         $warning = array();
  525.         $roles = array();
  526.         switch($version_antibiogarde)
  527.         {
  528.             case "web_edition":
  529.                 $errors[] = $this->translator->trans("authentification_authentifie_pour_utiliser");
  530.                 break;
  531.             case "web_hopital":
  532.                 $roles $this->connexionWebHopital($request$errors$warning);
  533.                 break;
  534.             case "intranet":
  535.                 $roles $this->connexionIntranet($request$errors$warning);
  536.                 break;
  537.             default:
  538.                 $errors[] = $this->translator->trans("authentification_erreur_survenue");
  539.                 break;
  540.         }
  541.         if (count($errors) > 0)
  542.         {
  543.             if ($request->getSession()->get('login_errors') == null
  544.             {
  545.                 foreach ($errors as $error) {
  546.                     $request->getSession()->set('login_errors'$error);
  547.                 }
  548.             }
  549.             else{
  550.                 if($request->getSession()->get('login_errors') == $this->getParameter('lien_modification_mdp_impose_webedition')) {
  551.                     $mail $request->getSession()->get('_security.last_username');
  552.                     $request->getSession()->invalidate();
  553.                     return $this->redirect($this->getParameter('lien_modification_mdp_impose_webedition').'?mail='.$mail);
  554.                 }
  555.             }
  556.             return $this->render('Authentication/login.html.twig');
  557.         }
  558.         else
  559.         {
  560.             $request->getSession()->set('login_warnings'$warning);
  561.             return $this->logUserAndRedirect($version_antibiogarde$roles$request);
  562.         }
  563.     }
  564.     public function loginMessage()
  565.     {
  566.         return $this->render('Authentication/login.html.twig');
  567.     }
  568.     public function loginCheck()
  569.     {
  570.     }
  571.     public function loginForm(Request $request)
  572.     {
  573.         $errors $request->getSession()->get('login_errors');
  574.         $request->getSession()->remove('login_errors');
  575.         return $this->render('Authentication/login-form.html.twig', array('errors' => $errors));
  576.     }
  577.     public function inscriptionEPP(InformationsComtpeService $infoCptService)
  578.     {
  579.         $errorsCompte = array();
  580.         $formDatasCompte = array();
  581.         $messageCompte "";
  582.         $donneesFormulaire $infoCptService->getDonneesFormulaire();
  583.         return $this->render('Authentication/mon-compte.html.twig', array('utilisateur' => null'errorsCompte' => $errorsCompte,'formDatasCompte' => $formDatasCompte,'messageCompte' => $messageCompte,'donneesFormulaire' => $donneesFormulaire ));
  584.     }
  585.     public function mot_de_passe_perdu_epp(InformationsComtpeService $infoCptService)
  586.     {
  587.         $error '';
  588.         $formDatasPassword = array();
  589.         $message '';
  590.         $donneesFormulaire $infoCptService->getDonneesFormulaire();
  591.         return $this->render('Authentication/password-lost-form.html.twig',array('message' => $message'error' => $error,'formDatasPassword' => $formDatasPassword));
  592.     }
  593. /********************************************************************************************************************************************/
  594. /****************************************************   MON COMPTE   ************************************************************************/
  595. /********************************************************************************************************************************************/
  596.     /**
  597.      * Require ROLE_USER only for this action
  598.      * 
  599.      * @IsGranted("ROLE_USER")
  600.      */
  601.     public function mes_parametres($path)
  602.     {
  603.         return $this->render('Authentication/gestion-parametre-compte.html.twig', array('path' => $path'errorsCompte' => array(), 'errorsInfos' => ''));
  604.     }
  605.     public function conditions_utlisation()
  606.     {
  607.         return new JsonResponse( array ( 
  608.                 'responseCode' => 0,
  609.                 'content' => $this->render('Authentication/conditions-utilisation.html.twig')->getContent()
  610.             ));
  611.     }
  612.     public function mon_compte_form(Request $requestInformationsComtpeService $infoCptService)
  613.     {
  614.         $session $request->getSession();
  615.         $em $this->getDoctrine()->getManager();
  616.         $errorsCompte = array();
  617.         $messageCompte "";
  618.         $messageInfo "";
  619.         $content '';
  620.         $formDatasCompte = array();
  621.         $conditionsOK false;
  622.         $new false;
  623.         $utilisateur null;
  624.         if ($request->isMethod('POST')) 
  625.         {
  626.             $id_utilisateur $session->get('id_utilisateur');
  627.             $client_id_adada $session->get('client_id_adada');
  628.             $id_etablissement $session->get('id_etablissement');
  629.             
  630.             if ($id_utilisateur == null || empty($id_utilisateur)) 
  631.             {
  632.                $utilisateur = new Utilisateur();
  633.                $utilisateur->setClientIdAdada($client_id_adada);
  634.                $utilisateur->setActif(1);
  635.                $new true;
  636.             }
  637.             else
  638.             {
  639.                 $utilisateur $this->utilisateurRepo->findOneby(array(
  640.                             'clientIdAdada' => $client_id_adada,
  641.                             'idUtilisateur' => $id_utilisateur
  642.                             ));
  643.             }
  644.             $utilisateur->setEtablissement($this->etablissementRepo->findOneBy(array('clientIdAdada' => $client_id_adada,'idEtablissement' => $id_etablissement)));
  645.             $isOK true;
  646.             $new_pass '';
  647.             $new_pass_isOK true;
  648.             foreach ($request->request as $key => $value
  649.             {
  650.                 $formDatasCompte[$key] = trim($value);
  651.                 switch ($key
  652.                 {
  653.                     case 'qualite':
  654.                         if ($value != -
  655.                         {
  656.                             $utilisateur->setQualite($this->qualiteRepo->findOneby(array('idQualite' => $value)));
  657.                         }
  658.                         else
  659.                         {
  660.                             $utilisateur->setQualite(null);
  661.                         }
  662.                         break;
  663.                     case 'login':
  664.                         if (trim($value) != '' && strlen(trim($value)) <= 255
  665.                         {
  666.                             $utilisateur->setUsername(trim($value));              
  667.                             $copieUser $this->utilisateurRepo->findUtilisateurCopie($utilisateur->getUsername(),null,$id_utilisateur,$client_id_adada);
  668.                             if ($copieUser != null
  669.                             {
  670.                                $isOK false;
  671.                                $errorsCompte["login"] = "- ".$this->translator->trans("authentification_erreur_login_utilise");
  672.                             }
  673.                         }
  674.                         else
  675.                         {
  676.                             $isOK false;
  677.                             $errorsCompte["login"] = "- ".$this->translator->trans("authentification_erreur_saisir_login");
  678.                         }
  679.                         break;
  680.                     case 'nom':
  681.                         if (trim($value) != '' && strlen(trim($value)) <= 255
  682.                         {
  683.                             $utilisateur->setNom(trim($value));
  684.                         }
  685.                         else
  686.                         {
  687.                             $isOK false;
  688.                             $errorsCompte["nom"] = "- ".$this->translator->trans("authentification_erreur_saisir_nom");
  689.                         }
  690.                         break;
  691.                     case 'prenom':
  692.                         if (trim($value) != '' && strlen(trim($value)) <= 255
  693.                         {
  694.                             $utilisateur->setPrenom(trim($value));
  695.                         }
  696.                         else
  697.                         {
  698.                             $isOK false;
  699.                             $errorsCompte["prenom"] = "- ".$this->translator->trans("authentification_erreur_saisir_prneom");
  700.                         }
  701.                         break;
  702.                     case 'email':
  703.                         if (trim($value) != '' && strlen(trim($value)) <= 500
  704.                         {
  705.                             if (filter_var(trim($value), FILTER_VALIDATE_EMAIL)) 
  706.                             {
  707.                                 $utilisateur->setEmail(trim($value));
  708.                                 $copieUser $this->utilisateurRepo->findUtilisateurCopie(null,$utilisateur->getEmail(),$id_utilisateur,$client_id_adada);
  709.                                 if ($copieUser != null
  710.                                 {
  711.                                    $isOK false;
  712.                                    $errorsCompte["email"] = "- ".$this->translator->trans("authentification_email_deja_utilise");
  713.                                 }
  714.                             }
  715.                             else
  716.                             {
  717.                                 $isOK false;
  718.                                 $errorsCompte["email"] = "- ".$this->translator->trans("authentification_email_saisi_non_valide");
  719.                             }
  720.                         }
  721.                         else
  722.                         {
  723.                             $isOK false;
  724.                             $errorsCompte["email"] = "- ".$this->translator->trans("authentification_saisir_email");
  725.                         }
  726.                         break;
  727.                     case 'telephone':
  728.                         if (trim($value) != '' && strlen(trim($value)) <= 20 && preg_match("/^0\d(?:[ ]\d{2}){4}$/"trim($value)) == 1
  729.                         {
  730.                             $utilisateur->setTelephone(trim($value));
  731.                         }
  732.                         else
  733.                         {
  734.                             if (trim($value) == ''
  735.                             {
  736.                                $utilisateur->setTelephone(null);
  737.                             }
  738.                             else
  739.                             {
  740.                                 $isOK false;
  741.                                 $errorsCompte["telephone"] = "- ".$this->translator->trans("authentification_telephone_non_valide");
  742.                             }
  743.                         }
  744.                         break;
  745.                     case 'rpps':
  746.                         if (trim($value) == ''
  747.                         {
  748.                             $utilisateur->setNumeroRpps(null);
  749.                         }
  750.                         else
  751.                         {
  752.                             $utilisateur->setNumeroRpps(trim($value));
  753.                         }
  754.                         // if (trim($value) != '' && strlen(trim($value)) <= 20 && preg_match("/^\d{11}$/", trim($value)) == 1) 
  755.                         // {
  756.                         //     $utilisateur->setNumeroRpps(trim($value));
  757.                         // }
  758.                         // else
  759.                         // {
  760.                         //     if (trim($value) == '') 
  761.                         //     {
  762.                         //         $utilisateur->setNumeroRpps(null);
  763.                         //     }
  764.                         //     else
  765.                         //     {
  766.                         //         $isOK = false;
  767.                         //         $errorsCompte["rpps"] = "- Votre numéros RPPS saisi n'est pas valide. Il doit être sous la forme de 11 chiffres sans espace.";
  768.                         //     }
  769.                         // }
  770.                         break;
  771.                      case 'specialite':
  772.                         if ($value != -
  773.                         {
  774.                             $utilisateur->setSpecialite($this->specialiteRepo->findOneby(array('idSpecialite' => $value)));
  775.                         }
  776.                         else
  777.                         {
  778.                             $utilisateur->setSpecialite(null);
  779.                         }
  780.                         break;
  781.                      case 'serviceList':
  782.                         if ($value != -
  783.                         {
  784.                             $utilisateur->setService($this->serviceRepo->findOneby(array('idService' => $value)));
  785.                         }
  786.                         else
  787.                         {
  788.                             $utilisateur->setService(null);
  789.                         }
  790.                         break;
  791.                     case 'serviceInput':
  792.                         if (trim($value) != '' && strlen(trim($value)) <= 255 && strlen(trim($value)) >= 1
  793.                         {
  794.                             $service = new Service();
  795.                             $service->setNomService(trim($value));
  796.                             $service->setClientIdAdada($client_id_adada);
  797.                             $em->persist($service);
  798.                             $utilisateur->setService($service);
  799.                         }
  800.                         else
  801.                         {
  802.                             $isOK false;
  803.                             $errorsCompte["service"] = "- ".$this->translator->trans("authentification_service_non_valide");
  804.                         }
  805.                         break;
  806.                     case 'new_pwd':
  807.                         if ($value != '' && strlen($value) <= 255
  808.                         {
  809.                             $new_pass $value;
  810.                         }
  811.                         break;
  812.                     case 'rep_new_pwd':
  813.                         if ($new_pass != '' || $value != ''
  814.                         {
  815.                             if ( 
  816.                                 strlen($new_pass) >= 12 && strlen($value) >= 12 &&
  817.                                 preg_match('/[A-Z]/'$value) &&
  818.                                 preg_match('/[a-z]/'$value) && 
  819.                                 preg_match('/[0-9]/'$value) && 
  820.                                 preg_match('/[!@#$%^&*()_+\\-=\\[\\]{};:\'",.<>?]/'$value) &&
  821.                                 !password_verify($value$utilisateur->getPassword())
  822.                             ) {
  823.                                 if ($value == $new_pass
  824.                                 {
  825.                                     $utilisateur->setPassword(password_hash($new_passPASSWORD_BCRYPT));
  826.                                 }
  827.                                 else
  828.                                 {
  829.                                     $isOK false;
  830.                                     $errorsCompte["newPass"] = "- ".$this->translator->trans("authentification_mdp_differents");
  831.                                 }
  832.                             }
  833.                             else
  834.                             {
  835.                                 $isOK false;
  836.                                 $errorsCompte["newPass"] = "- ".$this->translator->trans("authentification_mdp_non_valide");
  837.                             }
  838.                         }
  839.                         else if($new)
  840.                         {
  841.                             $isOK false;
  842.                             $errorsCompte["newPass"] = "- ".$this->translator->trans("authentification_saisir_mdp");
  843.                         }
  844.                         break;
  845.                     case 'conditions':
  846.                             $conditionsOK true;
  847.                         break;
  848.                     default:
  849.                         # code...
  850.                         break;
  851.                 }
  852.             }
  853.             if ($new && !$conditionsOK
  854.             {
  855.                 $isOK false;
  856.                 $errorsCompte["conditions"] = "- ".$this->translator->trans("authentification_accepter_conditions");
  857.             }
  858.             if ($isOK == true
  859.             {
  860.                 if ($new
  861.                 {
  862.                     $messageCompte $this->translator->trans("authentification_compte_enregistre");
  863.                 }
  864.                 else
  865.                 {
  866.                     $messageCompte $this->translator->trans("authentification_modifications_ok");
  867.                 }
  868.                 $formDatasCompte = array();
  869.                 $em->persist($utilisateur);
  870.                 $em->flush();
  871.             }
  872.             else
  873.             {
  874.                 $em->clear();
  875.             }
  876.         }
  877.         $infos $infoCptService->getInfoCompte();
  878.         $donneesFormulaire $infoCptService->getDonneesFormulaire();
  879.         if ($new && $isOK)
  880.         {
  881.             // Création de l'e-mail : nous créons une instance du mailer symfony
  882.             $message = (new TemplatedEmail())
  883.                 ->subject($this->translator->trans("authentification_email_confirmation_inscription"))
  884.                 ->from(new Address("contact@antibiogarde.org" "Antibiogarde"))
  885.                 ->to($utilisateur->getEmail())
  886.                 ->htmlTemplate('Asset/Courriers/confirmation-inscription.html.twig');                    
  887.             // Retour au service mailer, nous utilisons sa méthode « send() » pour envoyer notre $message
  888.             $this->mailer->send($message);
  889.             $content =  $this->render('Authentication/mon-compte.html.twig'
  890.                 array('utilisateur' => null'errorsCompte' => $errorsCompte,'formDatasCompte' => $formDatasCompte,'messageCompte' => $messageCompte,'donneesFormulaire' => $donneesFormulaire )
  891.             )->getContent();
  892.         }
  893.         else
  894.         {
  895.             $content $this->render('Authentication/mes-parametres.html.twig', array(  'infos' => $infos
  896.                                                                                                                 'donneesFormulaire' => $donneesFormulaire,
  897.                                                                                                                 'errorsCompte' => $errorsCompte,
  898.                                                                                                                 'formDatasCompte' => $formDatasCompte,
  899.                                                                                                                 'messageInfo' => null,
  900.                                                                                                                 'messageCompte' => $messageCompte))->getContent();
  901.         }
  902.         return new JsonResponse( array ( 
  903.                 'responseCode' => 0,
  904.                 'content' => $content
  905.             ));
  906.     }
  907.     /**
  908.      * Require ROLE_REFERENT only for this action
  909.      * 
  910.      * @IsGranted("ROLE_REFERENT")
  911.      */
  912.     public function mes_informations_form(Request $requestInformationsComtpeService $infoCptService)
  913.     {
  914.         $session $request->getSession();
  915.         $em $this->getDoctrine()->getManager();
  916.         $client_id_adada $session->get('client_id_adada');
  917.         $messageInfo "";
  918.         $messageCompte "";
  919.         $errorsCompte = array();
  920.         $formDatasCompte = array();
  921.         if ($request->isMethod('POST')) 
  922.         {
  923.             $boutique_connection $this->container->get('doctrine')->getConnection('adada');
  924.                 $stmt $boutique_connection->prepare("update ADADA_CLIENT set client_vidal = :vidal, client_vidal_token = :vidal_token, client_cbip = :cbip  WHERE client_id = :client_id");
  925.                 $stmt->bindValue('vidal'$request->request->getAlnum('interfacageVidal'));
  926.                 $stmt->bindValue('vidal_token'$request->request->getAlnum('tokenVidal'));
  927.                 $stmt->bindValue('cbip'$request->request->getAlnum('interfacageCbip'));
  928.                 $stmt->bindValue('client_id'$client_id_adada);
  929.                 $stmt->execute();
  930.             $session->set('client_vidal',   $request->request->getAlnum('interfacageVidal'));
  931.             $session->set('client_vidal_token',   $request->request->getAlnum('tokenVidal'));
  932.             $session->set('client_cbip',   $request->request->getAlnum('interfacageCbip'));
  933.             $personnalisations $this->parametreRepo->findParametreAffichagePersonnalisations($client_id_adada);
  934.             $personnalisations->setValeur($request->request->getAlnum('affichage_personnalisation'));
  935.             $em->persist($personnalisations);
  936.             $em->flush();
  937.             foreach ($request->request as $key => $value
  938.             {
  939.                 $formDatasCompte[$key] = trim($value);
  940.             }
  941.         }
  942.         $infos $infoCptService->getInfoCompte();
  943.         $donneesFormulaire $infoCptService->getDonneesFormulaire();
  944.         $messageInfo $this->translator->trans("authentification_modifications_ok");
  945.         $content $this->render('Authentication/mes-parametres.html.twig', array(  'infos' => $infos
  946.                                                                                                                 'donneesFormulaire' => $donneesFormulaire,
  947.                                                                                                                 'errorsCompte' => $errorsCompte,
  948.                                                                                                                 'formDatasCompte' => $formDatasCompte,
  949.                                                                                                                 'messageInfo' => $messageInfo,
  950.                                                                                                                 'messageCompte' => $messageCompte));
  951.         if ($request->isMethod('POST')) $content $content->getContent();
  952.         return new JsonResponse( array ( 
  953.                 'responseCode' => 0,
  954.                 'content' => $content
  955.             ));
  956.     }
  957.     /**
  958.      * Require ROLE_USER only for this action
  959.      * 
  960.      * @IsGranted("ROLE_USER")
  961.      */
  962.     public function load_mes_informations(Request $requestInformationsComtpeService $infoCptService)
  963.     {
  964.         if ($request->isXmlHttpRequest())
  965.         {
  966.             $infos $infoCptService->getInfoCompte();
  967.             $donneesFormulaire $infoCptService->getDonneesFormulaire();
  968.             $errorsCompte = array();
  969.             $messageCompte "";
  970.             $messageInfo "";
  971.             $formDatasCompte = array();
  972.             $content $this->render('Authentication/mes-parametres.html.twig', array(  'infos' => $infos
  973.                                                                                                                     'donneesFormulaire' => $donneesFormulaire,
  974.                                                                                                                     'errorsCompte' => $errorsCompte,
  975.                                                                                                                     'formDatasCompte' => $formDatasCompte,
  976.                                                                                                                     'messageInfo' => $messageInfo,
  977.                                                                                                                     'messageCompte' => $messageCompte))->getContent();
  978.             return new JsonResponse( array ( 
  979.                 'responseCode' => 0,
  980.                 'content' => $content
  981.             ));
  982.         } else throw $this->createNotFoundException();
  983.     }
  984.     /**
  985.      * Require ROLE_USER only for this action
  986.      * 
  987.      * @IsGranted("ROLE_USER")
  988.      */
  989.     public function load_parrainages(Request $request)
  990.     {
  991.         if ($request->isXmlHttpRequest())
  992.         {
  993.             $content '';
  994.             $errorsParrainages = array();
  995.             $formDatasParrainages = array();
  996.             $message "";
  997.             $allEmailsVide false;
  998.             if ($this->getParameter('version_antibiogarde') == 'web_edition'
  999.             {
  1000.                 $content $this->render('Authentication/parrainages.html.twig',array('formDatasParrainages' => $formDatasParrainages,
  1001.                                                                                                                 'errorsParrainages' => $errorsParrainages,
  1002.                                                                                                                 'message' => $message,
  1003.                                                                                                                 'allEmailsVide' => $allEmailsVide))->getContent();
  1004.             }
  1005.             return new JsonResponse( array ( 
  1006.                 'responseCode' => 0,
  1007.                 'content' => $content
  1008.             ));
  1009.         } else throw $this->createNotFoundException();
  1010.     }
  1011.     
  1012.     /**
  1013.      * Require ROLE_USER only for this action
  1014.      * 
  1015.      * @IsGranted("ROLE_USER")
  1016.      */
  1017.     public function parrainages_form(Request $request)
  1018.     {
  1019.         $session $request->getSession();
  1020.         $em $this->getDoctrine()->getManager();
  1021.         $emails = array();
  1022.         $errorsParrainages = array();
  1023.         $formDatasParrainages = array();
  1024.         $content "";
  1025.         $allEmailsOK true;
  1026.         $allEmailsVide true;
  1027.         $message "";
  1028.         $boutique_connection $this->container->get('doctrine')->getConnection('boutique');
  1029.         if ($request->isMethod('POST')) 
  1030.         {
  1031.             foreach ($request->request as $key => $value
  1032.             {
  1033.                 if (!filter_var(trim($value), FILTER_VALIDATE_EMAIL) and trim($value) != ""
  1034.                 {
  1035.                     $allEmailsOK false;
  1036.                     $allEmailsVide false;
  1037.                     $errorsParrainages[] = "has-error";
  1038.                 }
  1039.                 else
  1040.                 {
  1041.                     if (trim($value) != ""
  1042.                     {
  1043.                         $allEmailsVide false;
  1044.                         $errorsParrainages[] = "has-success";
  1045.                         $emails[] = trim($value);
  1046.                     }
  1047.                     else
  1048.                     {
  1049.                         $errorsParrainages[] = "";
  1050.                     }
  1051.                 }
  1052.                 $formDatasParrainages[$key] = trim($value);
  1053.             }
  1054.         }
  1055.         if ($allEmailsOK && !$allEmailsVide
  1056.         {
  1057.             $stmt $boutique_connection->prepare("SELECT * FROM BOU_PARAMETRE where clef = 'gainTempsFilleul'");
  1058.             $stmt $stmt->execute();
  1059.             $data $stmt->fetch();
  1060.             $joursMois $data['valeur']." ".$this->translator->trans("authentification_jours");
  1061.             if (($data['valeur']*1/30) >= 1
  1062.             {
  1063.                 $joursMois = (int)($data['valeur']*1/30)." ".$this->translator->trans("authentification_mois");
  1064.             }
  1065.             // Récupération du service
  1066.             //$mailer = $this->container->get('mailer');
  1067.             // Création de l'e-mail : nous créons une instance du mailer symfony
  1068.             $message = (new TemplatedEmail())
  1069.                 ->subject($session->get('nom_auteur_utilisateur')." ".$this->translator->trans("authentification_decouvrir_antibiogarde"))
  1070.                 ->from(new Address("contact@antibiogarde.org" "Antibiogarde"))
  1071.                 ->to(...$emails)
  1072.                 ->htmlTemplate('Asset/Courriers/invitation-parrainage.html.twig')
  1073.                 ->context([
  1074.                     'nomParrain' => $session->get('nom_auteur_utilisateur'),
  1075.                     'emailParrain' => $session->get('email_auteur_utilisateur'),
  1076.                     'moisGratuitFilleul' => $joursMois
  1077.                 ]);
  1078.             // Retour au service mailer, nous utilisons sa méthode « send() » pour envoyer notre $message
  1079.             $this->mailer->send($message);
  1080.             $message $this->translator->trans("authentification_demande_parrainage_ok");
  1081.         }
  1082.         $content $this->render('Authentication/parrainages.html.twig',array('formDatasParrainages' => $formDatasParrainages,
  1083.                                                                                 'errorsParrainages' => $errorsParrainages,
  1084.                                                                                 'message' => $message
  1085.                                                                                 'allEmailsVide' => $allEmailsVide))->getContent();
  1086.         return new JsonResponse( array ( 
  1087.                 'responseCode' => 0,
  1088.                 'content' => $content
  1089.             ));
  1090.     }
  1091.     /**
  1092.      * Require ROLE_USER only for this action
  1093.      * 
  1094.      * @IsGranted("ROLE_USER")
  1095.      */
  1096.     public function load_appareil(Request $request)
  1097.     {
  1098.         $session $request->getSession();
  1099.         if ($request->isXmlHttpRequest())
  1100.         {
  1101.             $content '';
  1102.             $message '';
  1103.             $error '';
  1104.             $udid '';
  1105.             if ($this->getParameter('version_antibiogarde') == 'web_edition'
  1106.             {
  1107.                 $boutique_connection $this->container->get('doctrine')->getConnection('boutique');
  1108.                 $stmt $boutique_connection->prepare("SELECT udidDevice FROM BOU_APPAREIL_CONNECTE where numUtilisateur = :numUtilisateur  and (numProduit = 1 or numProduit = 3)");
  1109.                 $stmt->bindValue('numUtilisateur'$session->get('webedition_id_utilisateur_boutique'));
  1110.                 $stmt $stmt->execute();
  1111.                 if (count($stmt->fetchAll()) > 0
  1112.                 {
  1113.                     $data $stmt->fetch();
  1114.                     $udid $data["udidDevice"];
  1115.                 }
  1116.                 $content $this->render('Authentication/appareil.html.twig',array('udid' => $udid,'message' => $message,'error'=>$error))->getContent();
  1117.             }
  1118.             return new JsonResponse( array ( 
  1119.                 'responseCode' => 0,
  1120.                 'content' => $content
  1121.             ));
  1122.         } else throw $this->createNotFoundException();
  1123.     }
  1124.     /**
  1125.      * Require ROLE_USER only for this action
  1126.      * 
  1127.      * @IsGranted("ROLE_USER")
  1128.      */
  1129.     public function appareil_form(Request $request)
  1130.     {
  1131.         $session $request->getSession();
  1132.         $error '';
  1133.         $message '';
  1134.         if ($request->isXmlHttpRequest())
  1135.         {
  1136.             $udid $request->request->all()['device'];
  1137.             $boutique_connection $this->container->get('doctrine')->getConnection('boutique');
  1138.             $stmt $boutique_connection->prepare("DELETE FROM BOU_APPAREIL_CONNECTE where numUtilisateur = :numUtilisateur and (numProduit = 1 or numProduit = 3) and udidDevice = :udid");
  1139.             $stmt->bindValue('numUtilisateur'$session->get('webedition_id_utilisateur_boutique'));
  1140.             $stmt->bindValue('udid'$udid);
  1141.             $stmt->execute();
  1142.             $stmt $boutique_connection->prepare("SELECT udidDevice FROM BOU_APPAREIL_CONNECTE where numUtilisateur = :numUtilisateur  and (numProduit = 1 or numProduit = 3) ");
  1143.             $stmt->bindValue('numUtilisateur'$session->get('webedition_id_utilisateur_boutique'));
  1144.             $stmtExec $stmt->execute();
  1145.             if (count($stmtExec->fetchAll()) > 0
  1146.             {
  1147.                 $data $stmtExec->fetch();
  1148.                 $udid $data["udidDevice"];
  1149.                 $error $this->translator->trans("authentification_erreur_suppression");
  1150.             }
  1151.             else
  1152.             {
  1153.                 $udid '';
  1154.                 $message $this->translator->trans("authentification_suppression_ok");
  1155.             }
  1156.             $content $this->render('Authentication/appareil.html.twig',array('udid' => $udid,'message' => $message'error' => $error));
  1157.             return new JsonResponse( array ( 
  1158.                     'responseCode' => 0,
  1159.                     'content' => $content
  1160.                 ));
  1161.         } else throw $this->createNotFoundException();
  1162.     }
  1163.     public function mot_de_passe_perdu_form(Request $request)
  1164.     {
  1165.         $session $request->getSession();
  1166.         $em $this->getDoctrine()->getManager();
  1167.         $error '';
  1168.         $message '';
  1169.         $formDatasPassword = array();
  1170.         if ($request->isMethod('POST')) 
  1171.         {
  1172.             $client_id_adada $session->get('client_id_adada');
  1173.             foreach ($request->request as $key => $value
  1174.             {
  1175.                 $formDatasPassword[$key] = trim($value);
  1176.                 switch ($key
  1177.                 {
  1178.                     case 'password_mail':
  1179.                         if (filter_var(trim($value), FILTER_VALIDATE_EMAIL)) 
  1180.                         {
  1181.                             $utilisateur $this->utilisateurRepo->findOneby(array(
  1182.                                 'clientIdAdada' => $client_id_adada,
  1183.                                 'email' => trim($value)
  1184.                                 ));
  1185.                             if ($utilisateur == null
  1186.                             {
  1187.                                 $error $this->translator->trans("authentification_email_non_trouve");
  1188.                             }
  1189.                             else
  1190.                             {
  1191.                                 $nomPrenom = ($utilisateur->getQualite() != null) ? $utilisateur->getQualite()->getSlugFR()." " "" ;
  1192.                                 $nomPrenom .= $utilisateur->getNom()." ".$utilisateur->getPrenom();
  1193.                                 $newPassword $this->generatePassword();
  1194.                                 //Set du nouveau password
  1195.                                 $utilisateur->setPassword(password_hash($newPasswordPASSWORD_BCRYPT));
  1196.                                 $em->persist($utilisateur);
  1197.                                 $em->flush();
  1198.                                 // Création de l'e-mail : nous créons une instance du mailer symfony                                
  1199.                                 $message = (new TemplatedEmail())
  1200.                                     ->subject($this->translator->trans("authentification_identifiants_antibiogarde"))
  1201.                                     ->from(new Address("contact@antibiogarde.org" "Antibiogarde"))
  1202.                                     ->to($utilisateur->getEmail())
  1203.                                     ->htmlTemplate('Asset/Courriers/password-lost.html.twig')
  1204.                                     ->context([
  1205.                                         'username' => $utilisateur->getUsername(),
  1206.                                         'password' => $newPassword,
  1207.                                         'nomPrenom' => $nomPrenom
  1208.                                     ]);
  1209.                                 // Retour au service mailer, nous utilisons sa méthode « send() » pour envoyer notre $message
  1210.                                 $this->mailer->send($message);
  1211.                                 $message $this->translator->trans("authentification_identifiants_envoyes");
  1212.                                 $formDatasPassword = array();
  1213.                             }
  1214.                         }
  1215.                         else
  1216.                         {
  1217.                             $error $this->translator->trans("authentification_email_saisi_non_valide");
  1218.                         }
  1219.                         break;
  1220.                     default:
  1221.                         # code...
  1222.                         break;
  1223.                 }
  1224.             }
  1225.         }
  1226.         $content $this->render('Authentication/password-lost-form.html.twig',array('message' => $message'error' => $error'formDatasPassword' => $formDatasPassword));
  1227.         return new JsonResponse( array ( 
  1228.                 'responseCode' => 0,
  1229.                 'content' => $content->getContent()
  1230.             ));
  1231.     }
  1232.     public function auto_connexion(Request $request)
  1233.     {
  1234.         $session $request->getSession();
  1235.         $login $session->get('email_auteur_utilisateur');
  1236.         $pwd $session->get('pwd_auteur_utilisateur');
  1237.         return $this->render('Authentication/auto-connexion.html.twig',array('login' => $login'pwd' => $pwd));
  1238.     }
  1239.     public function auto_connexion_edition(Request $request$hash)
  1240.     {
  1241.         // dd($this->get("security.token_storage")->getToken());
  1242.         // dd(($this->encryptService->encryptData('doudou03|aurelien@agence-ie.com')));
  1243.         $decodeHash $this->encryptService->decryptData($hash);
  1244.         $decodeHash explode('|'$decodeHash);
  1245.         $session $request->getSession();
  1246.         $login $decodeHash[1];
  1247.         $pwd $decodeHash[0];
  1248.         $udid $decodeHash[2];
  1249.         if(count($decodeHash) > 3) {
  1250.             $categ $decodeHash[3];
  1251.             $id $decodeHash[4];
  1252.             $session->set('parametre-mobile-spectre'$categ.(($id!=null)?'/'.$id:''));
  1253.             if(count($decodeHash) > 5) {
  1254.                 $session->set('parametre-mobile-spectre'$categ.(($id!=null)?'/'.$id:'').'/'.$decodeHash[5]);
  1255.             }
  1256.         }
  1257.         $boutique_connection $this->container->get('doctrine')->getConnection('boutique');
  1258.         if($login == '(null)' && $pwd == '(null)') {
  1259.             $stmt $boutique_connection->prepare("SELECT bu.EMAIL, bu.PWD 
  1260.                                                     FROM BOU_UTILISATEUR bu
  1261.                                                     INNER JOIN BOU_ACCEDE ba on ba.NUMUTILISATEUR = bu.NUMUTILISATEUR
  1262.                                                     INNER JOIN BOU_NOTIFICATION_EMAIL_DEVICE bned ON bned.email = bu.EMAIL
  1263.                                                     INNER JOIN BOU_NOTIFICATION_DEVICE bnd ON bnd.id_device = bned.id_device
  1264.                                                     WHERE bnd.deviceIdentifier = :udid
  1265.                                                     AND (ba.numProduit = 1 or ba.numProduit = 3) 
  1266.                                                     LIMIT 1");
  1267.             $stmt->bindValue('udid'$udid);
  1268.             $result $stmt->execute();
  1269.             $data $result->fetchAll();
  1270.             if (count($data) >= 1){
  1271.                 $login $data[0]['EMAIL'];
  1272.                 $pwd $data[0]['PWD'];
  1273.             }
  1274.             else throw $this->createNotFoundException();
  1275.         }
  1276.         else {
  1277.             $login $this->getParameter('utilisateur_login_mobile_spectre');
  1278.             $pwd $this->getParameter('utilisateur_pwd_mobile_spectre');
  1279.         }
  1280.         
  1281.         $stmt $boutique_connection->prepare("SELECT bu.NUMUTILISATEUR, bu.password as PWD
  1282.                                                 FROM BOU_UTILISATEUR bu
  1283.                                                 LEFT JOIN BOU_ACCEDE ba on ba.NUMUTILISATEUR = bu.NUMUTILISATEUR and (ba.NUMPRODUIT = 1 or ba.NUMPRODUIT = 3)
  1284.                                                 WHERE EMAIL = :username
  1285.                                                 ORDER BY ba.DATEVALIDITE DESC
  1286.                                                 LIMIT 1");
  1287.         $stmt->bindValue('username'$login);
  1288.         
  1289.         $result $stmt->execute();
  1290.         $data $result->fetchAll();
  1291.         
  1292.         if (count($data) >= && password_verify($pwd$data[0]['PWD']) )
  1293.         {
  1294.             $sessionCo $this->sessionConnexionRepo->findOneByIdUtilisateurBoutique($data[0]['NUMUTILISATEUR']);
  1295.             if ($sessionCo) {
  1296.                 $em $this->getDoctrine()->getManager();
  1297.                 $em->remove($sessionCo);
  1298.                 $em->flush();
  1299.             }
  1300.         }
  1301.         $session->set('mobile-spectre'true);
  1302.         return $this->render('Authentication/auto-connexion-edition.html.twig',array('_username' => $login'_password' => $pwd));
  1303.     }
  1304.     public function ramsay_connexion(Request $request$hash){        
  1305.         $session $request->getSession();
  1306.         $em $this->getDoctrine()->getManager();
  1307.         // On recupere la cle privé pour décryter le hash
  1308.         $privateKeyPath $this->getParameter('kernel.project_dir') . '/public/build/certificat/ramsay/private.key';
  1309.         // On remplace les caractere speciaux du hash d'abord et ensuite, on decode base 64 le hash
  1310.         $hash_final base64_decode(strtr($hash'._-''+/='));
  1311.         // Option openSSL necessaire pour le décryptage
  1312.         $key openssl_pkey_new([
  1313.           'digest_alg' => 'sha512',
  1314.           'private_key_bits' => 1024,
  1315.           'private_key_type' => OPENSSL_KEYTYPE_RSA,
  1316.         ]);
  1317.         // Recupere la cle sous format PEM 
  1318.         openssl_pkey_export($key$privateKey);
  1319.         // On vérifie que le fichier provateKey existe 
  1320.         if (!file_exists($privateKeyPath)) {
  1321.           file_put_contents($privateKeyPath$privateKey);
  1322.         }
  1323.         // $publicKeyPath = $this->getParameter('kernel.project_dir') . '/public/build/certificat/ramsay/public.key';
  1324.         // $publicKey = openssl_pkey_get_details($key);
  1325.         // if (!file_exists($publicKeyPath)) {
  1326.         //   file_put_contents($publicKeyPath, $publicKey['key']);
  1327.         // }
  1328.         // $expirationDate = new \DateTime('now +2hours');
  1329.         // $data = json_encode([
  1330.         //   'RPPS' => 'test_feelandclic',
  1331.         //   'expired_at' => $expirationDate->format('Y-m-d H:i:s'),
  1332.         // ]);
  1333.         // var_dump("Donnee envoyé : <br/>".$data);
  1334.         // openssl_public_encrypt($data, $encryptedData, file_get_contents($publicKeyPath));
  1335.         // // replace ambiguous characters
  1336.         // var_dump('Transmis crypté :<br/>: '.$encryptedData);
  1337.         // var_dump('Transmis crypté et encodé base 64 :<br/>'.base64_encode($encryptedData));
  1338.         // var_dump('Transmis dans URL :<br/>'.strtr(base64_encode($encryptedData), '+/=', '._-'));
  1339.         // die();
  1340.         // ON decrypte le hash passer dans l'url avec notre clef privée
  1341.         $decryptOk openssl_private_decrypt($hash_final$decryptedDatafile_get_contents($privateKeyPath));
  1342.         if ($decryptOk) {
  1343.             // on decode le json pour manipuler les données envoyés
  1344.             $data json_decode($decryptedData);
  1345.             // On prepare les dates pour vérifier si le lien est expiré ou non
  1346.             $date_expiration = new DateTime($data->expired_at);
  1347.             $date_expiration $date_expiration->format('YmdHis');
  1348.             $now = new DateTime(date('Y-m-d H:i:s'));
  1349.             $now $now->format('YmdHis');
  1350.             //Si le lien est expiré, on set en session une variable qui permet d'affiché une modal avec une erreur
  1351.             if ($now $date_expiration){              
  1352.                 $session->set('connexion_ramsay''ramsay_connexion_ko_lien_expire');
  1353.             }
  1354.             // Sinon, on tente de connecter un utilisateur temporaire
  1355.             else {
  1356.                 $session->set('connexion_ramsay''ramsay_connexion_ok');
  1357.                 $sql "INSERT INTO BOU_RAMSAY_CONNEXION (rpps,date_connexion) VALUES (?,?)";
  1358.                 $this->insertupdateDeleteQueryBoutique($sql, array($data->RPPS,$now));
  1359.                 $login $this->parametreRepo->findOneByClef($this->getParameter('ramsay_code_login'));
  1360.                 $pwd $this->parametreRepo->findOneByClef($this->getParameter('ramsay_code_pwd'));
  1361.                 return $this->render('Authentication/auto-connexion-ramsay.html.twig',array('login' => $login->getValeur(), 'pwd' => $pwd->getValeur()));
  1362.             }        
  1363.         }
  1364.         else {
  1365.             // Si on arrive jusqu'ici, c'est que le decryptage de la chaine passé en url est en erreur
  1366.             $session->set('connexion_ramsay''ramsay_connexion_ko_decryptage');
  1367.         }        
  1368.                 
  1369.         return $this->redirectToRoute('actualites_home');
  1370.     }
  1371.     public function ramsay_deconnexion(Request $request){
  1372.         if ($this->container->get('security.token_storage')->getToken())
  1373.         {
  1374.             $user $this->container->get('security.token_storage')->getToken()->getUser();
  1375.             $version_antibiogarde $this->getParameter('version_antibiogarde');
  1376.             // pour web_edition, on supprime une connexion PC pour débloquer l'utilisateur
  1377.             $em $this->container->get('doctrine')->getManager();
  1378.             $session $this->sessionConnexionRepo->findOneByIdUtilisateurBoutique($user->getUniqueID());
  1379.             if ($session)
  1380.             {
  1381.                 $em->remove($session);
  1382.                 $em->flush();
  1383.             }            
  1384.         }
  1385.         $referer_url $request->headers->get('referer');
  1386.         $currentSession =  $request->getSession(); 
  1387.         if (!$currentSession->get('cle_url') && !$currentSession->get('finess')) 
  1388.         {
  1389.             $currentSession->invalidate();
  1390.         }
  1391.         else
  1392.         {
  1393.             $cle_url null;
  1394.             $finess null;
  1395.             $nom_finess null;
  1396.             $id_etablissement null;
  1397.             if ($currentSession->get('cle_url')) 
  1398.             {
  1399.                $cle_url $currentSession->get('cle_url');
  1400.             }
  1401.             if ($currentSession->get('finess')) 
  1402.             {
  1403.                $finess $currentSession->get('finess');
  1404.                $nom_finess $currentSession->get('nom_finess');
  1405.                $id_etablissement $currentSession->get('id_etablissement');
  1406.             }
  1407.             
  1408.             $currentSession->invalidate();
  1409.             
  1410.             if ($cle_url != null
  1411.             {
  1412.                 $currentSession->set('cle_url',$cle_url);
  1413.             }
  1414.             if ($finess != null
  1415.             {
  1416.                 $currentSession->set('finess',$finess);
  1417.                 $currentSession->set('nom_finess',$nom_finess);
  1418.                 $currentSession->set('id_etablissement',$id_etablissement);
  1419.             }
  1420.         }
  1421.         return new JsonResponse(true);
  1422.     }
  1423.     private function insertupdateDeleteQueryBoutique($sql$params=null){
  1424.         $em $this->get('doctrine')->getConnection('boutique');
  1425.         $query $em->prepare($sql);
  1426.         if($params != null){
  1427.             if(is_array($params)){
  1428.                 foreach ($params as $key => $value) {
  1429.                     $i=$key+1;
  1430.                     $query->bindValue($i$value);
  1431.                 }
  1432.             }
  1433.         }
  1434.         return $query->execute();
  1435.     }
  1436.     private function generatePassword($length 12) {
  1437.         $uppercase 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  1438.         $lowercase 'abcdefghijklmnopqrstuvwxyz';
  1439.         $digits '0123456789';
  1440.         $specialChars '*-+.!?$';
  1441.         // On s'assure d'avoir au moins un de chaque catégorie
  1442.         $password $uppercase[random_int(0strlen($uppercase) - 1)] .
  1443.                     $lowercase[random_int(0strlen($lowercase) - 1)] .
  1444.                     $digits[random_int(0strlen($digits) - 1)] .
  1445.                     $specialChars[random_int(0strlen($specialChars) - 1)];
  1446.         // Ajouter des caractères aléatoires pour atteindre la longueur demandée
  1447.         $allChars $uppercase $lowercase $digits $specialChars;
  1448.         for ($i 4$i $length$i++) {
  1449.             $password .= $allChars[random_int(0strlen($allChars) - 1)];
  1450.         }
  1451.         // Mélanger pour éviter un schéma prévisible
  1452.         return str_shuffle($password);
  1453.     }
  1454. }