src/Controller/RegistrationController.php line 184

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\Form\FormError;
  8. use Ramsey\Uuid\Uuid;
  9. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  10. use Doctrine\Persistence\ManagerRegistry;
  11. use App\Service\MessageService;
  12. use App\Service\MailService;
  13. use App\Entity\User;
  14. use App\Entity\Usergroup;
  15. use App\Entity\Registration;
  16. use App\Form\RegistrationType;
  17. use App\Form\ResetpwdType;
  18. class RegistrationController extends AbstractController
  19. {
  20.     private $nameentity  'Registration';
  21.     private $labelentity 'App\Entity\Registration';
  22.     private $labelroute  'app_core_config_registration';
  23.     private $labeldata   'registration';
  24.     private $labeldatas  'registrations';
  25.     private $wss;
  26.     private $mail;
  27.     
  28.     public function __construct(messageService $wss,mailService $mail)
  29.     {
  30.         $this->wss $wss;
  31.         $this->mail $mail;
  32.     }
  33.     public function list()
  34.     {
  35.         $moderegistration   $this->getParameter('moderegistration');
  36.         $masteridentity     $this->getParameter('masteridentity');
  37.         if($moderegistration=="none"||$masteridentity!="SQL")
  38.             throw $this->createNotFoundException('Permission denied');
  39.         return $this->render($this->nameentity.'\list.html.twig',[
  40.             'useheader'         => true,
  41.             'usemenu'           => false,
  42.             'usesidebar'        => true,               
  43.         ]);
  44.     }
  45.     public function ajaxlist(Request $requestManagerRegistry $em)
  46.     {
  47.         // S'assurer que c'est un appel ajax
  48.         if (!$request->isXmlHttpRequest()) {
  49.             return new JsonResponse(array('message' => 'Interdit'), 400);
  50.         }
  51.         
  52.         $start=$request->query->get('start');
  53.         $length$request->query->get('length');
  54.         $search$request->query->get('search');
  55.         $draw$request->query->get('draw');
  56.         $order$request->query->get('order');
  57.       
  58.         // Nombre total d'enregistrement
  59.         if($this->isGranted('ROLE_ADMIN'))
  60.             $total $em->getManager()->createQueryBuilder()->select('COUNT(registration)')->from($this->labelentity,'registration')->getQuery()->getSingleScalarResult();
  61.         else {
  62.                 $usermodo=$this->getUser()->getId();
  63.                 $total $em->getManager()->createQueryBuilder()
  64.                             ->select('COUNT(registration)')
  65.                             ->from($this->labelentity,'registration')
  66.                             ->from("App\Entity\UserModo",'usermodo')
  67.                             ->where("usermodo.niveau01 = registration.niveau01")
  68.                             ->andWhere("usermodo.user = :userid")
  69.                             ->setParameter("userid"$usermodo)
  70.                             ->getQuery()->getSingleScalarResult();                
  71.             }
  72.         // Nombre d'enregistrement filtré
  73.         if($search["value"]=="")
  74.             $totalf $total;
  75.         else {
  76.             if($this->isGranted('ROLE_ADMIN'))
  77.                 $totalf$em->getManager()->createQueryBuilder()
  78.                             ->select('COUNT(registration)')
  79.                             ->from($this->labelentity,'registration')
  80.                             ->where('registration.username LIKE :value')
  81.                             ->orWhere('registration.email LIKE :value')
  82.                             ->setParameter("value""%".$search["value"]."%")
  83.                             ->getQuery()
  84.                             ->getSingleScalarResult();
  85.             else
  86.                 $totalf$em->getManager()->createQueryBuilder()
  87.                             ->select('COUNT(registration)')
  88.                             ->from($this->labelentity,'registration')
  89.                             ->from("App\Entity\UserModo",'usermodo')
  90.                             ->where('registration.username LIKE :value OR registration.email LIKE :value')
  91.                             ->andWhere("usermodo.niveau01 = registration.niveau01")
  92.                             ->andWhere("usermodo.user = :userid")                            
  93.                             ->setParameter("value""%".$search["value"]."%")
  94.                             ->setParameter("userid"$usermodo)
  95.                             ->getQuery()
  96.                             ->getSingleScalarResult();   
  97.         }
  98.         // Construction du tableau de retour
  99.         $output = array(
  100.             'draw' => $draw,
  101.             'recordsFiltered' => $totalf,
  102.             'recordsTotal' => $total,
  103.             'data' => array(),
  104.         );
  105.         // Parcours des Enregistrement
  106.         $qb $em->getManager()->createQueryBuilder();
  107.         if($this->isGranted('ROLE_ADMIN')) {
  108.             $qb->select('registration')->from($this->labelentity,'registration')->from('App\Entity\Niveau01','niveau01');
  109.             $qb->where('registration.niveau01=niveau01.id');
  110.         }
  111.         else{
  112.             $qb->select('registration')->from($this->labelentity,'registration')->from('App\Entity\Niveau01','niveau01')->from("App\Entity\UserModo",'usermodo');
  113.             $qb->where('registration.niveau01=niveau01.id')
  114.                ->andWhere("usermodo.niveau01 = registration.niveau01")
  115.                ->andWhere("usermodo.user = :userid")                            
  116.                ->setParameter("userid"$usermodo);            
  117.         }
  118.         if($search["value"]!="") {
  119.             $qb ->andWhere('registration.username LIKE :value OR registration.email LIKE :value OR niveau01.label LIKE :value')
  120.                 ->setParameter("value""%".$search["value"]."%");
  121.         }
  122.         switch($order[0]["column"]) {
  123.             case 
  124.             $qb->orderBy('registration.username',$order[0]["dir"]);
  125.             break;
  126.             case 
  127.             $qb->orderBy('registration.email',$order[0]["dir"]);
  128.             break;
  129.             case 
  130.             $qb->orderBy('niveau01.label',$order[0]["dir"]);
  131.             break;
  132.             
  133.             case 
  134.             $qb->orderBy('registration.statut',$order[0]["dir"]);
  135.             break;
  136.             case 
  137.             $qb->orderBy('registration.keyexpire',$order[0]["dir"]);
  138.             break;            
  139.         }
  140.         $datas=$qb->setFirstResult($start)->setMaxResults($length)->getQuery()->getResult();
  141.         foreach($datas as $data) {
  142.             $action ="";
  143.             // Si inscription non périmée
  144.             if($data->getStatut()->getId()<=2) {
  145.                 $action.="<a href='".$this->generateUrl('app_core_config_registration_send', array('id'=>$data->getId()))."' title='Modifier'><i class='fa fa-file fa-fw fa-2x'></i></a>";    
  146.             }
  147.             $action.="<a href='".$this->generateUrl('app_core_config_registration_delete', array('id'=>$data->getId()))."' title='Supprimer'><i class='fa fa-trash fa-fw fa-2x'></i></a>";
  148.             array_push($output["data"],array(
  149.                 $action,
  150.                 $data->getUsername(),
  151.                 $data->getEmail(),
  152.                 $data->getNiveau01()->getLabel()."<br>".$data->getNiveau01other(),
  153.                 $data->getStatut()->getLabel(),
  154.                 (is_null($data->getKeyexpire())?"":$data->getKeyexpire()->format('d/m/Y H:i:s'))
  155.             ));
  156.         }
  157.         // Retour
  158.         return new Response(json_encode($output), 200);
  159.     }
  160.     public function submit(Request $requestManagerRegistry $em)
  161.     {
  162.         $moderegistration   $this->getParameter('moderegistration');
  163.         $masteridentity     $this->getParameter('masteridentity');
  164.         $groupid            $request->query->get('group');
  165.         if($moderegistration=="none"||$masteridentity!="SQL")
  166.             throw $this->createNotFoundException('Permission denied');
  167.         $data = new Registration();
  168.         $data->setVisible(true);
  169.         $data->setIfad(($this->getParameter("ldap_type")=="AD"));
  170.         $data->setRedirect($request->query->get('redirect'));
  171.         $config=$em->getRepository('App\Entity\Config')->find("datauser");
  172.         $fields=$config->getValue();
  173.         $fields=json_decode($fields,true);
  174.         // Création du formulaire
  175.         $form $this->createForm(RegistrationType::class,$data,array("mode"=>"submit","fields"=>$fields));
  176.         // Récupération des data du formulaire
  177.         $form->handleRequest($request);
  178.         // si mode de registration byuser
  179.         if($moderegistration=="byuser") {
  180.             $idstatut=2;
  181.         }
  182.         else { 
  183.             // On recherche le domaine du mail dans la liste blanche
  184.             $email=explode("@",$data->getEmail());
  185.             $domaine=end($email);
  186.             $whitelist $em->getRepository("App\Entity\Whitelist")->findBy(["label"=>$domaine]);
  187.             $idstatut=(!$whitelist?1:2);
  188.         }
  189.         $statut $em->getRepository("App\Entity\Statut")->find($idstatut);
  190.         $data->setStatut($statut);
  191.         // Sur erreur
  192.         $this->getErrorForm($em,null,$form,$request,$data,"submit",$idstatut);
  193.         // Sur validation
  194.         if ($form->get('submit')->isClicked() && $form->isValid()) {
  195.             
  196.             $data $form->getData();
  197.             // On enregistre l'invitation à un groupe dans l'inscription
  198.             $data->setGroupid($groupid);
  199.             $appname $request->getSession()->get('appname');
  200.             $noreply $this->getParameter('noreply');
  201.             $keyterm $this->getParameter('keyterm');
  202.             // si non : validation par administrateur
  203.             if($idstatut==1) {
  204.                 $niveau01id=$data->getNiveau01()->getId();
  205.                 // Email à destination de l'inscript pour le prévenir qu'un administrateur doit valider
  206.                 $subject=$appname." : Inscription en cours de validation";
  207.                 $body="Votre inscription a bien été enregistrée.<br>Cependant, un administrateur doit encore valider votre inscription avant que celle-ci ne devienne effective.<br><br>Vous recevrez un mail quand votre inscription sera validée";
  208.                 $to $data->getEmail();
  209.                 $from =  $noreply;
  210.                 $fromName $appname;
  211.                 $this->mail->sendEmail($subject$body$to$from$fromName); 
  212.                 $info=$body;
  213.                 // Email à l'ensemble administrateurs pour les prévenir qu'il y a une personne à valider
  214.                 $emailadmins$em->getManager()->createQueryBuilder()
  215.                                  ->select('table.email')
  216.                                  ->from("App\Entity\User",'table')
  217.                                  ->where('table.role = :value')
  218.                                  ->setParameter("value""ROLE_ADMIN")
  219.                                  ->getQuery()
  220.                                  ->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR);
  221.                 $to=array();
  222.                 $from $noreply;
  223.                 $fromName $appname;                
  224.                 foreach($emailadmins as $emailadmin) {
  225.                     array_push($to,$emailadmin["email"]);
  226.                 }
  227.                 // Email à l'ensemble des modérateurs du service pour les prévenir qu'il y a une personne à valider
  228.                 $emailmodos$em->getManager()->createQueryBuilder()
  229.                                  ->select('user.email')
  230.                                  ->from("App\Entity\UserModo",'usermodo')
  231.                                  ->from("App\Entity\User",'user')
  232.                                  ->where("usermodo.niveau01 = :niveau01id")
  233.                                  ->andWhere("user.id = usermodo.user")
  234.                                  ->andWhere('user.role = :value')
  235.                                  ->setParameter("niveau01id"$niveau01id)
  236.                                  ->setParameter("value""ROLE_MODO")
  237.                                  ->getQuery()
  238.                                  ->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR);
  239.                 $from =  $noreply;
  240.                 $fromName $appname;                
  241.                 foreach($emailmodos as $emailmodo) {
  242.                     array_push($to,$emailmodo["email"]);
  243.                 }
  244.                 
  245.                 $url $this->generateUrl('app_core_config_registration', [], UrlGeneratorInterface::ABSOLUTE_URL);
  246.                 $motivation "Login = ".$data->getUsername()."\n";
  247.                 $motivation.= "Nom = ".$data->getLastname()."\n";
  248.                 $motivation.= "Prénom = ".$data->getFirstname()."\n";
  249.                 $motivation.= "Mail = ".$data->getEmail()."\n";
  250.                 $motivation.= $this->getParameter("labelniveau01")." = ".$data->getNiveau01()->getLabel()." ".$data->getNiveau01other()."\n\n";
  251.                 $motivation.= $data->getMotivation();
  252.                 $subject=$appname." : Inscription à valider";
  253.                 $body="Un utilisateur dont le mail n’est pas en liste blanche souhaite s’inscrire au ".$appname.".\nMerci d’approuver son inscription pour finaliser celle-ci.<br><br>Veuillez vérifier cette inscription à cette adresse:<br><a href='$url'>$url</a><br><br>".nl2br($motivation);
  254.                 $this->mail->sendEmail($subject$body$to$from$fromName); 
  255.             }
  256.             // si oui : Domaine de confiance : email de validation d'inscription directement à l'utilisateur
  257.             else {
  258.                 // Génération d'une clé de validation
  259.                 $key Uuid::uuid4();
  260.                 // Génération de la date de fin de validité de la clé
  261.                 $keyexpire=new \DateTime();
  262.                 $keyexpire->add(new \DateInterval('PT'.$keyterm.'H'));
  263.                 // Enregistrement des valeurs
  264.                 $data->setKeyvalue($key->toString());
  265.                 $data->setKeyexpire($keyexpire);
  266.                 // Email à l'utilisateur
  267.                 $url $this->generateUrl('app_core_registration_validation', array("key"=>$key->toString()), UrlGeneratorInterface::ABSOLUTE_URL);
  268.                 $subject=$appname." : confirmation de validation";
  269.                 $body="<p>Merci de confirmer votre inscription en cliquant sur le lien suivant</p><p><a href='".$url."'>".$url."</a></p><br><p>Attention vous disposez d’un délai de 8 heures pour le faire. Passé ce délai, vous devrez vous réinscrire.</p>";
  270.                 $info="Vous allez recevoir un mail de confirmation pour finaliser votre inscription";
  271.                 $to $data->getEmail();
  272.                 $from =  $noreply;
  273.                 $fromName $appname;
  274.                 $this->mail->sendEmail($subject$body$to$from$fromName);              
  275.             }
  276.             // Sauvegarde
  277.             $em->getManager()->persist($data);
  278.             $em->getManager()->flush();
  279.                        
  280.             // A voir retour sur un écran d'info indiquant si validation par admion ou s'il doit matter ses email
  281.             $request->getSession()->set('registrationinfo'$info);
  282.             $request->getSession()->set('registrationmode'"info");
  283.             $request->getSession()->set('registrationredirectto'null);
  284.             return $this->redirectToRoute('app_core_registration_info');
  285.         }
  286.         else {
  287.             return $this->render($this->nameentity.'\edit.html.twig', [
  288.                 'useheader'         => true,
  289.                 'usemenu'           => false,
  290.                 'usesidebar'        => false,               
  291.                 $this->labeldata    => $data,
  292.                 'mode'              => 'submit',
  293.                 'form'              => $form->createView(),
  294.                 'redirect'          => $request->query->get('redirect'),
  295.             ]);
  296.         }
  297.     }
  298.     public function info(Request $requestManagerRegistry $em)
  299.     {
  300.         $info $request->getSession()->get('registrationinfo');
  301.         $mode $request->getSession()->get('registrationmode');
  302.         $redirectto $request->getSession()->get('registrationredirectto');
  303.         return $this->render($this->nameentity.'\info.html.twig', [
  304.             'useheader'         => true,
  305.             'usemenu'           => false,
  306.             'usesidebar'        => false,                   
  307.             'info'              => $info,
  308.             'mode'              => $mode,
  309.             'redirectto'         => $redirectto,
  310.         ]);
  311.     }
  312.     public function send($id,Request $requestManagerRegistry $em)
  313.     {
  314.         $moderegistration   $this->getParameter('moderegistration');
  315.         $masteridentity     $this->getParameter('masteridentity');
  316.         if($moderegistration=="none"||$masteridentity!="SQL")
  317.             throw $this->createNotFoundException('Permission denied');
  318.         // Récupération de l'enregistrement courant 
  319.         $data=$this->getData($em,$id);
  320.         $config=$em->getRepository('App\Entity\Config')->find("datauser");
  321.         $fields=$config->getValue();
  322.         $fields=json_decode($fields,true);
  323.         
  324.         // Vérifier que cet enregistrement est modifiable
  325.                                     
  326.         // Création du formulaire
  327.         $form $this->createForm(RegistrationType::class,$data,array("mode"=>"send","fields"=>$fields));
  328.         // Récupération des data du formulaire
  329.         $form->handleRequest($request);
  330.     
  331.         // Sur erreur
  332.         $this->getErrorForm($em,$id,$form,$request,$data,"send",null);
  333.         // Sur validation
  334.         if ($form->get('save')->isClicked() && $form->isValid()) {
  335.             $data $form->getData();
  336.             // Sauvegarde
  337.             $em->getManager()->flush();
  338.             return $this->redirectToRoute('app_core_config_registration');
  339.         }
  340.         
  341.         // Sur validation
  342.         if ($form->get('submit')->isClicked() && $form->isValid()) {
  343.             $data $form->getData();
  344.             
  345.             $appname $request->getSession()->get('appname');
  346.             $noreply $this->getParameter('noreply');
  347.             $keyterm $this->getParameter('keyterm');
  348.             
  349.             // Génération d'une clé de validation
  350.             $key Uuid::uuid4();
  351.             // Génération de la date de fin de validité de la clé
  352.             $keyexpire=new \DateTime();
  353.             $keyexpire->add(new \DateInterval('PT'.$keyterm.'H'));
  354.             // Enregistrement des valeurs
  355.             $data->setKeyvalue($key->toString());
  356.             $data->setKeyexpire($keyexpire);
  357.             // Statut en attente validation utilisateur
  358.             $data->setStatut($em->getRepository("App\Entity\Statut")->find(2));
  359.             // Email à l'utilisateur
  360.             $url $this->generateUrl('app_core_registration_validation', array("key"=>$key->toString()), UrlGeneratorInterface::ABSOLUTE_URL);
  361.             $subject=$appname." : confirmation de validation";
  362.             $body="<p>Merci de confirmer votre inscription en cliquant sur le lien suivant</p><p><a href='".$url."'>".$url."</a></p><br><p>Attention vous disposez d’un délai de 8 heures pour le faire. Passé ce délai, vous devrez vous réinscrire.</p>";
  363.             $info="Vous allez recevoir un mail de confirmation pour finaliser votre inscription";
  364.             $to $data->getEmail();
  365.             $from =  $noreply;
  366.             $fromName $appname;
  367.             $this->mail->sendEmail($subject$body$to$from$fromName);
  368.             // Sauvegarde
  369.             $em->getManager()->flush();
  370.             return $this->redirectToRoute('app_core_config_registration');
  371.         }
  372.         // Affichage du formulaire
  373.         return $this->render($this->nameentity.'\edit.html.twig', [
  374.             'useheader'         => true,
  375.             'usemenu'           => false,
  376.             'usesidebar'        => true,              
  377.             $this->labeldata    => $data,
  378.             'mode'              => 'send',
  379.             'form'              => $form->createView()
  380.         ]);       
  381.     }
  382.     public function validation($key,Request $requestManagerRegistry $em)
  383.     {
  384.         $moderegistration   $this->getParameter('moderegistration');
  385.         $masteridentity     $this->getParameter('masteridentity');
  386.         if($moderegistration=="none"||$masteridentity!="SQL")
  387.             throw $this->createNotFoundException('Permission denied');
  388.         $now=new \DateTime();
  389.         
  390.         $data $em->getManager()->createQueryBuilder()
  391.                     ->select('table')
  392.                     ->from($this->labelentity,'table')
  393.                     ->where('table.keyvalue= :key')
  394.                     ->andWhere('table.keyexpire >= :date')
  395.                     ->setParameter("key"$key)
  396.                     ->setParameter("date"$now)
  397.                     ->getQuery()
  398.                     ->getResult();
  399.         if(!$data) {
  400.             $info="Clé de validation invalide";
  401.             $mode="danger";
  402.             $request->getSession()->set('registrationinfo'$info);
  403.             $request->getSession()->set('registrationmode'$mode); 
  404.             $request->getSession()->set('registrationredirectto'null); 
  405.         }
  406.         else {
  407.             $url=$this->getUrlLogin();
  408.             $info="<p>Votre compte est à présent activé</p><p>Vous allez être redirigé vers la mire de connexion</p><p><a href='".$url."'>Connexion</a>";
  409.             $mode="success";
  410.             $request->getSession()->set('registrationinfo'$info);
  411.             $request->getSession()->set('registrationmode'$mode);  
  412.             // Initialisation de l'enregistrement
  413.             $user = new User();
  414.             $user->setAvatar("noavatar.png");
  415.             $user->setUsername($data[0]->getUsername());
  416.             $user->setApikey(Uuid::uuid4());
  417.             $user->setEmail($data[0]->getEmail());
  418.             $user->setLastname($data[0]->getLastname());
  419.             $user->setFirstname($data[0]->getFirstname());
  420.             $user->setSalt($data[0]->getSalt());
  421.             $user->setPasswordDirect($data[0]->getPassword());
  422.             $user->setVisible($data[0]->getVisible());
  423.             $user->setMotivation($data[0]->getMotivation());
  424.             $user->setNote($data[0]->getNote());
  425.             $user->setNiveau01($data[0]->getNiveau01());
  426.             $user->setSiren($data[0]->getNiveau01()->getSiren());
  427.             $user->setNiveau01other($data[0]->getNiveau01other());
  428.             $user->setNiveau02($data[0]->getNiveau02());
  429.             if($data[0]->getNiveau02()!==null$user->setSiret($data[0]->getNiveau02()->getSiret());
  430.             $user->setUsualname($data[0]->getUsualname());
  431.             $user->setTelephonenumber($data[0]->getTelephonenumber());
  432.             $user->setPostaladress($data[0]->getPostaladress());
  433.             $user->setGivensname($data[0]->getGivensname());
  434.             $user->setBirthdate($data[0]->getBirthdate());
  435.             $user->setGender($data[0]->getGender());
  436.             $user->setJob($data[0]->getJob());
  437.             $user->setPosition($data[0]->getPosition());
  438.             $user->setBirthcountry($data[0]->getBirthcountry());
  439.             $user->setBirthplace($data[0]->getBirthplace());
  440.             $user->setRole("ROLE_USER");
  441.             $user->setAuthlevel("simple");
  442.             $user->setBelongingpopulation("agent");
  443.             // Sauvegarde
  444.             $em->getManager()->persist($user);
  445.             $em->getManager()->flush();
  446.             // Si invitation à un groupe : on le rattache directement à ce groupe
  447.             $groupid=$data[0]->getGroupid();
  448.             $userid=$user->getId();
  449.             if($groupid) {
  450.                 $group=$em->getRepository("App\Entity\Group")->find($groupid);
  451.                 if($group) {
  452.                     $idpage =$group->getPages()->first()->getId();
  453.                     $url $this->generateUrl('app_core_redirect', ["route"=>"app_core_home","id"=>$idpage], UrlGeneratorInterface::ABSOLUTE_URL);
  454.                     $info="<p>Votre compte est à présent activé</p><p>Vous allez être redirigé vers la mire de connexion puis vers votre groupe de travail</p><p><a href='".$url."'>Connexion</a>";
  455.                     $request->getSession()->set('registrationinfo'$info);                    
  456.                     $request->getSession()->set('registrationredirectto'$url);
  457.                     $key Uuid::uuid4();
  458.                     $usergroup=new UserGroup();
  459.                     $user=$em->getRepository("App\Entity\User")->find($userid);
  460.                     $usergroup->setUser($user);
  461.                     $usergroup->setGroup($group);
  462.                     $usergroup->setKeyvalue($key);
  463.                     $usergroup->setRolegroup(0);
  464.                     $em->getManager()->persist($usergroup);
  465.                     $em->getManager()->flush();
  466.             
  467.                     // Notification message
  468.                     $message="Inscription de l'utilisateur<br>".$user->getLastname()." ".$user->getFirstname()."<br>Inscription via invitation";
  469.                     $this->wss->addMessage($user->getApikey(),$groupid,$message);
  470.                 }
  471.             }
  472.             else $request->getSession()->set('registrationredirectto'$data[0]->getRedirect());
  473.             
  474.             $em->getManager()->remove($data[0]);
  475.             $em->getManager()->flush();
  476.         }
  477.         
  478.         return $this->redirectToRoute('app_core_registration_info');
  479.     }
  480.     public function delete($id,Request $requestManagerRegistry $em)
  481.     {
  482.         $moderegistration   $this->getParameter('moderegistration');
  483.         $masteridentity     $this->getParameter('masteridentity');
  484.         if($moderegistration=="none"||$masteridentity!="SQL")
  485.             throw $this->createNotFoundException('Permission denied');
  486.         // Récupération de l'enregistrement courant
  487.         $data=$this->getData($em,$id);
  488.         $config=$em->getRepository('App\Entity\Config')->find("datauser");
  489.         $fields=$config->getValue();
  490.         $fields=json_decode($fields,true);
  491.         // Vérifier que cet enregistrement est supprimable
  492.         // Création du formulaire
  493.         $form $this->createForm(RegistrationType::class,$data,array("mode"=>"delete","fields"=>$fields));
  494.         // Récupération des data du formulaire
  495.         $form->handleRequest($request);
  496.         // Sur erreur
  497.         $this->getErrorForm($em,$id,$form,$request,$data,"delete",null);
  498.         // Sur validation
  499.         if ($form->get('submit')->isClicked() && $form->isValid()) {
  500.             $em->getManager()->remove($data);
  501.             $em->getManager()->flush();
  502.             return $this->redirectToRoute('app_core_config_registration');
  503.         }
  504.         // Affichage du formulaire
  505.         return $this->render($this->nameentity.'\edit.html.twig', [
  506.             'useheader'         => true,
  507.             'usemenu'           => false,
  508.             'usesidebar'        => true,               
  509.             $this->labeldata    => $data,
  510.             'mode'              => 'delete',
  511.             'form'              => $form->createView()
  512.         ]);
  513.     }
  514.     public function resetpwd01(Request $requestManagerRegistry $em)
  515.     {
  516.         $moderegistration   $this->getParameter('moderegistration');
  517.         $masteridentity     $this->getParameter('masteridentity');
  518.         if($masteridentity!="SQL")
  519.             throw $this->createNotFoundException('Permission denied');
  520.         // Création du formulaire
  521.         $form $this->createForm(ResetpwdType::class,null,array("mode"=>"resetpwd01"));
  522.         // Récupération des data du formulaire
  523.         $form->handleRequest($request);
  524.         $data $form->getData();
  525.         // Sur erreur
  526.         if ($form->get('submit')->isClicked()) {
  527.             // On s'assure que le mail existe dans la base des utilisateurs
  528.             $user=$this->getUserBy($em,"email",$data["email"]);
  529.             if(!$user) {
  530.                 $form->addError(new FormError('Mail inconnu'));
  531.     
  532.                 $errors $form->getErrors();
  533.                 foreach( $errors as $error ) {
  534.                     $request->getSession()->getFlashBag()->add("error"$error->getMessage());
  535.                 }                
  536.             }
  537.         }
  538.         // Sur validation
  539.         if ($form->get('submit')->isClicked() && $form->isValid()) {
  540.             $appname $request->getSession()->get('appname');
  541.             $noreply $this->getParameter('noreply');
  542.             $keyterm $this->getParameter('keyterm');
  543.             // Génération d'une clé de validation
  544.             $key Uuid::uuid4();
  545.             // Génération de la date de fin de validité de la clé
  546.             $keyexpire=new \DateTime();
  547.             $keyexpire->add(new \DateInterval('PT'.$keyterm.'H'));
  548.             // Enregistrement des valeurs
  549.             $user[0]->setKeyvalue($key->toString());
  550.             $user[0]->setKeyexpire($keyexpire);
  551.             // Sauvegarde
  552.             $em->getManager()->flush();
  553.             // Email au user
  554.             $url $this->generateUrl('app_core_resetpwd02', array("key"=>$key->toString()), UrlGeneratorInterface::ABSOLUTE_URL);
  555.             $subject=$appname." : réinitialisation mot de passe";
  556.             $body="<p>Merci de réinitialiser votre mot de passe en cliquant sur le lien suivant</p><p><a href='".$url."'>".$url."</a></p><br><p>Attention vous disposez d’un délai de 8 heures pour le faire.</p><p>Vous pourrez par la suite vous connecter avec votre login : ".$user[0]->getUsername()."</p>";
  557.             $to $user[0]->getEmail();
  558.             $from =  $noreply;
  559.             $fromName $appname;
  560.             $this->mail->sendEmail($subject$body$to$from$fromName);
  561.             
  562.             // Info
  563.             $info="Vous allez recevoir un mail avec lien qui vous permettra de réinitialiser votre mot de passe";
  564.             $mode="info";
  565.             $request->getSession()->set('registrationinfo'$info);
  566.             $request->getSession()->set('registrationmode'$mode);  
  567.             $request->getSession()->set('registrationredirectto'null); 
  568.             return $this->redirectToRoute('app_core_registration_info');
  569.         }
  570.         // Affichage du formulaire
  571.         return $this->render($this->nameentity.'\resetpwd01.html.twig', [
  572.             'useheader'         => true,
  573.             'usemenu'           => false,
  574.             'usesidebar'        => false,               
  575.             'form'              => $form->createView()
  576.         ]);
  577.     }
  578.     public function resetpwd02($key,Request $requestManagerRegistry $em)
  579.     {
  580.         $masteridentity     $this->getParameter('masteridentity');
  581.         if($masteridentity!="SQL")
  582.             throw $this->createNotFoundException('Permission denied');
  583.                     
  584.         $now=new \DateTime();
  585.         
  586.         $user $em->getManager()->createQueryBuilder()
  587.                     ->select('table')
  588.                     ->from("App\Entity\User",'table')
  589.                     ->where('table.keyvalue= :key')
  590.                     ->andWhere('table.keyexpire >= :date')
  591.                     ->setParameter("key"$key)
  592.                     ->setParameter("date"$now)
  593.                     ->getQuery()
  594.                     ->getResult();
  595.         if(!$user) {
  596.             $info="Clé de validation invalide";
  597.             $mode="danger";
  598.             $request->getSession()->set('registrationinfo'$info);
  599.             $request->getSession()->set('registrationmode'$mode);  
  600.             $request->getSession()->set('registrationredirectto'null);  
  601.             return $this->redirectToRoute('app_core_registration_info');
  602.         }
  603.         else {
  604.             // Création du formulaire
  605.             $form $this->createForm(ResetpwdType::class,null,array("mode"=>"resetpwd02"));
  606.             // Récupération des data du formulaire
  607.             $form->handleRequest($request);
  608.             $data $form->getData();
  609.             if($form->get('submit')) {
  610.                 $password=$data["password"];
  611.                 $message="";
  612.                 if(!empty($password)) {
  613.                     if (strlen($password) < $this->getParameter("minpassword")) {
  614.                         $message "Votre mot de passe doit contenir au minimum ".$this->getParameter("minpassword")." caractères, constitué de chiffres, de lettres et caractères spéciaux";
  615.                     }
  616.                     elseif(!preg_match("#[0-9]+#",$password)) {
  617.                         $message "Votre mot de passe doit contenir au minimum ".$this->getParameter("minpassword")." caractères, constitué de chiffres, de lettres et caractères spéciaux";
  618.                     }
  619.                     elseif(!preg_match("#[a-zA-Z]+#",$password)) {
  620.                         $message "Votre mot de passe doit contenir au minimum ".$this->getParameter("minpassword")." caractères, constitué de chiffres, de lettres et caractères spéciaux";
  621.                     }
  622.                     elseif(!preg_match("/[|!@#$%&*\/=?,;.:\-_+~^\\\]/",$password)) {
  623.                         $message "Votre mot de passe doit contenir au minimum ".$this->getParameter("minpassword")." caractères, constitué de chiffres, de lettres et caractères spéciaux";
  624.                     }
  625.                 }           
  626.                 
  627.                 if($message!="") {
  628.                     $form->addError(new FormError($message));
  629.                     $errors $form->getErrors();
  630.                     foreach( $errors as $error ) {
  631.                         $request->getSession()->getFlashBag()->add("error"$error->getMessage());
  632.                     }                
  633.                 }
  634.             }
  635.             
  636.             if ($form->get('submit')->isClicked() && $form->isValid()) {
  637.                 $user[0]->setPassword($data["password"]);
  638.                 $user[0]->setKeyvalue(null);
  639.                 $user[0]->setKeyexpire(null);
  640.                 // Sauvegarde
  641.                 $em->getManager()->flush();  
  642.                 $url=$this->getUrlLogin();
  643.                 $info="<p>Nouveau mot de passe prise en compte</p><p>Vous allez être redirigé vers la mire de connexion</p><p><a href='".$url."'>Connexion</a>";
  644.                 $mode="success";
  645.                 $request->getSession()->set('registrationinfo'$info);
  646.                 $request->getSession()->set('registrationmode'$mode);  
  647.                 $request->getSession()->set('registrationredirectto'null);  
  648.                 return $this->redirectToRoute('app_core_registration_info');
  649.             }
  650.             // Affichage du formulaire
  651.             return $this->render($this->nameentity.'\resetpwd02.html.twig', [
  652.                 'useheader'         => true,
  653.                 'usemenu'           => false,
  654.                 'usesidebar'        => false,                   
  655.                 'form'              => $form->createView()
  656.             ]);            
  657.         }
  658.     }
  659.     protected function getUrlLogin()
  660.     {
  661.         $url $this->generateUrl('app_core_login');
  662.         return $url;
  663.     }
  664.     protected function getDatas($em)
  665.     {
  666.         $datas $em->getRepository($this->labelentity)->findAll();
  667.         return $datas;
  668.     }
  669.     protected function getData($em,$id)
  670.     {
  671.         $data $em->getRepository($this->labelentity)->find($id);
  672.         if (!$data) {
  673.             throw $this->createNotFoundException('Unable to find '.$this->labeldata);
  674.         }
  675.         return $data;
  676.     }
  677.     protected function getUserBy($em,$key,$value)
  678.     {
  679.         $datas $em->getManager()->createQueryBuilder()
  680.                       ->select('u')
  681.                       ->from('App\Entity\User',  'u')
  682.                       ->where('u.'.$key.'=:value')
  683.                       ->getQuery()->setParameter("value"$value)
  684.                       ->getResult();
  685.         if (!$datas) return false;
  686.         else return $datas;
  687.     }
  688.     protected function getErrorForm($em,$id,$form,$request,$data,$mode,$idstatut) {
  689.         if ($form->get('submit')->isClicked()&&$mode=="delete") {
  690.         }
  691.         if ($form->get('submit')->isClicked() && $mode=="submit") {
  692.             // Taille du login > 5
  693.             if (is_null($data->getUsername()) || strlen($data->getUsername()) < '5') {
  694.                 $form->addError(new FormError('Taille minimum du login 5 caractères'));
  695.             }
  696.             // On s'assure que le username ne contient pas des caractères speciaux
  697.             $string preg_replace('~[^@a-zA-Z0-9._-]~'''$data->getUsername());
  698.             if($string!=$data->getUsername())
  699.             {
  700.                 $form->addError(new FormError('Caractères interdit dans votre login'));
  701.             }
  702.             
  703.             // On s'assure que le username et le mail n'existe pas dans la table des users
  704.             if($this->getUserBy($em,"username",$data->getUsername())||$this->getUserBy($em,"email",$data->getEmail())) {
  705.                 $form->addError(new FormError('Un utilisateur utilise déjà ce login ou cet email'));
  706.             }
  707.             // Si niveau01 commence par autre = niveau01other obligatoire
  708.             $niveau01=strtolower($data->getNiveau01()->getLabel());
  709.             if(stripos($niveau01,"autre")===0) {
  710.                 if(!$data->getNiveau01other()) {
  711.                     $form->addError(new FormError("Merci de compléter le champ 'Autre ".$this->getParameter("labelniveau01")."'")); 
  712.                 }
  713.             }
  714.             // Si validation par administrateur demander une motivation
  715.             $moderegistration   $this->getParameter('moderegistration');
  716.             if(is_null($data->getMotivation())&&$moderegistration=="byadmin") {
  717.                 // On recherche le domaine du mail dans la liste blanche
  718.                 $email=explode("@",$data->getEmail());
  719.                 $domaine=end($email);
  720.                 $whitelist $em->getRepository("App\Entity\Whitelist")->findBy(["label"=>$domaine]);
  721.                 if(!$whitelist)
  722.                     $form->addError(new FormError("Attention, le suffixe de votre adresse mail n’est pas dans la liste des administrations autorisées, merci de bien vouloir privilégier votre adresse professionnelle si vous en avez une.<br>Si ce n’est pas le cas, il faut que vous renseigniez la case motivation de votre demande")); 
  723.             }
  724.         }
  725.         if ($form->get('submit')->isClicked() && !$form->isValid()) {
  726.             $errors $form->getErrors();
  727.             foreach( $errors as $error ) {
  728.                 $request->getSession()->getFlashBag()->add("error"$error->getMessage());
  729.             }
  730.         }
  731.     }
  732. }