2022-07-21 16:15:47 +02:00
< ? php
namespace App\Controller ;
2022-09-23 16:14:15 +02:00
use App\Entity\Registration ;
use App\Entity\User ;
use App\Form\RegistrationType as Form ;
use App\Form\ResetpwdType ;
use App\Service\MailService ;
use Doctrine\Persistence\ManagerRegistry ;
use Ramsey\Uuid\Uuid ;
2022-07-21 16:15:47 +02:00
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController ;
2022-09-23 16:14:15 +02:00
use Symfony\Component\Form\FormError ;
use Symfony\Component\HttpFoundation\JsonResponse ;
2022-07-21 16:15:47 +02:00
use Symfony\Component\HttpFoundation\Request ;
use Symfony\Component\HttpFoundation\Response ;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface ;
class RegistrationController extends AbstractController
{
2022-09-23 16:14:15 +02:00
private $data = 'registration' ;
private $entity = " App \ Entity \R egistration " ;
private $twig = 'Registration/' ;
private $route = 'app_admin_registration' ;
2022-07-21 16:15:47 +02:00
private $mail ;
2022-09-23 16:14:15 +02:00
public function __construct ( MailService $mail )
{
2022-07-21 16:15:47 +02:00
$this -> mail = $mail ;
}
public function list ( $access )
{
2022-09-23 16:14:15 +02:00
$appmoderegistration = $this -> getParameter ( 'appModeregistration' );
$appMasteridentity = $this -> getParameter ( 'appMasteridentity' );
if ( 'none' == $appmoderegistration || 'SQL' != $appMasteridentity ) {
2022-07-21 16:15:47 +02:00
throw $this -> createAccessDeniedException ( 'Permission denied' );
2022-09-23 16:14:15 +02:00
}
2022-07-21 16:15:47 +02:00
2022-09-23 16:14:15 +02:00
return $this -> render ( $this -> twig . 'list.html.twig' , [
'useheader' => true ,
'usemenu' => false ,
'usesidebar' => true ,
'access' => $access ,
2022-07-21 16:15:47 +02:00
]);
}
2022-09-23 16:14:15 +02:00
public function tablelist ( $access , Request $request , ManagerRegistry $em ) : Response
2022-07-21 16:15:47 +02:00
{
2022-09-23 16:14:15 +02:00
$query = $request -> query -> all ();
$start = $query [ 'start' ];
$length = $query [ 'length' ];
$search = $query [ 'search' ];
$draw = $query [ 'draw' ];
$ordercolumn = $query [ 'order' ][ 0 ][ 'column' ];
$orderdir = $query [ 'order' ][ 0 ][ 'dir' ];
$usermodo = null ;
2022-07-21 16:15:47 +02:00
// Nombre total d'enregistrement
2022-09-23 16:14:15 +02:00
if ( 'admin' == $access ) {
$total = $em -> getManager () -> createQueryBuilder () -> select ( 'COUNT(entity)' ) -> from ( $this -> entity , 'entity' ) -> getQuery () -> getSingleScalarResult ();
} else {
$usermodo = $this -> getUser ();
2022-07-21 16:15:47 +02:00
$total = $em -> getManager () -> createQueryBuilder ()
-> select ( 'COUNT(entity)' )
2022-09-23 16:14:15 +02:00
-> from ( $this -> entity , 'entity' )
-> from ( 'App:UserModo' , 'usermodo' )
-> where ( 'usermodo.niveau01 = entity.niveau01' )
-> andWhere ( 'usermodo.user = :user' )
-> setParameter ( 'user' , $usermodo )
-> getQuery () -> getSingleScalarResult ();
2022-07-21 16:15:47 +02:00
}
// Nombre d'enregistrement filtré
2022-09-23 16:14:15 +02:00
if ( '' == $search [ 'value' ]) {
2022-07-21 16:15:47 +02:00
$totalf = $total ;
2022-09-23 16:14:15 +02:00
} else {
if ( 'admin' == $access ) {
$totalf = $em -> getManager () -> createQueryBuilder ()
2022-07-21 16:15:47 +02:00
-> select ( 'COUNT(entity)' )
2022-09-23 16:14:15 +02:00
-> from ( $this -> entity , 'entity' )
2022-07-21 16:15:47 +02:00
-> where ( 'entity.username LIKE :value' )
-> orWhere ( 'entity.email LIKE :value' )
2022-09-23 16:14:15 +02:00
-> setParameter ( 'value' , '%' . $search [ 'value' ] . '%' )
2022-07-21 16:15:47 +02:00
-> getQuery ()
-> getSingleScalarResult ();
2022-09-23 16:14:15 +02:00
} else {
$totalf = $em -> getManager () -> createQueryBuilder ()
2022-07-21 16:15:47 +02:00
-> select ( 'COUNT(entity)' )
2022-09-23 16:14:15 +02:00
-> from ( $this -> entity , 'entity' )
-> from ( 'App:UserModo' , 'usermodo' )
2022-07-21 16:15:47 +02:00
-> where ( 'entity.username LIKE :value OR entity.email LIKE :value' )
2022-09-23 16:14:15 +02:00
-> andWhere ( 'usermodo.niveau01 = entity.niveau01' )
-> andWhere ( 'usermodo.user = :user' )
-> setParameter ( 'value' , '%' . $search [ 'value' ] . '%' )
-> setParameter ( 'user' , $usermodo )
2022-07-21 16:15:47 +02:00
-> getQuery ()
2022-09-23 16:14:15 +02:00
-> getSingleScalarResult ();
}
2022-07-21 16:15:47 +02:00
}
// Construction du tableau de retour
2022-09-23 16:14:15 +02:00
$output = [
2022-07-21 16:15:47 +02:00
'draw' => $draw ,
'recordsFiltered' => $totalf ,
'recordsTotal' => $total ,
2022-09-23 16:14:15 +02:00
'data' => [],
];
2022-07-21 16:15:47 +02:00
// Parcours des Enregistrement
$qb = $em -> getManager () -> createQueryBuilder ();
2022-09-23 16:14:15 +02:00
if ( $this -> isGranted ( 'ROLE_ADMIN' )) {
$qb -> select ( 'entity' ) -> from ( $this -> entity , 'entity' ) -> from ( 'App:Niveau01' , 'niveau01' );
2022-07-21 16:15:47 +02:00
$qb -> where ( 'entity.niveau01=niveau01.id' );
2022-09-23 16:14:15 +02:00
} else {
$qb -> select ( 'entity' ) -> from ( $this -> entity , 'entity' ) -> from ( 'App:Niveau01' , 'niveau01' ) -> from ( 'App:UserModo' , 'usermodo' );
2022-07-21 16:15:47 +02:00
$qb -> where ( 'entity.niveau01=niveau01.id' )
2022-09-23 16:14:15 +02:00
-> andWhere ( 'usermodo.niveau01 = entity.niveau01' )
-> andWhere ( 'usermodo.user = :user' )
-> setParameter ( 'user' , $usermodo );
2022-07-21 16:15:47 +02:00
}
2022-09-23 16:14:15 +02:00
if ( '' != $search [ 'value' ]) {
$qb -> andWhere ( 'entity.username LIKE :value OR entity.email LIKE :value OR niveau01.label LIKE :value' )
-> setParameter ( 'value' , '%' . $search [ 'value' ] . '%' );
2022-07-21 16:15:47 +02:00
}
2022-09-23 16:14:15 +02:00
switch ( $ordercolumn ) {
case 1 :
$qb -> orderBy ( 'entity.username' , $orderdir );
break ;
case 2 :
$qb -> orderBy ( 'entity.email' , $orderdir );
break ;
case 3 :
$qb -> orderBy ( 'entity.label' , $orderdir );
break ;
case 4 :
$qb -> orderBy ( 'entity.statut' , $orderdir );
break ;
case 5 :
$qb -> orderBy ( 'entity.keyexpire' , $orderdir );
break ;
2022-07-21 16:15:47 +02:00
}
2022-09-23 16:14:15 +02:00
$datas = $qb -> setFirstResult ( $start ) -> setMaxResults ( $length ) -> getQuery () -> getResult ();
2022-07-21 16:15:47 +02:00
2022-09-23 16:14:15 +02:00
foreach ( $datas as $data ) {
$action = '' ;
2022-07-21 16:15:47 +02:00
// Si inscription non périmée
2022-09-23 16:14:15 +02:00
if ( $data -> getStatut () <= 2 ) {
$action .= " <a href=' " . $this -> generateUrl ( 'app_' . $access . '_registration_update' , [ 'id' => $data -> getId ()]) . " '><i class='fa fa-envelope fa-2x fa-fw'></i></a> " ;
2022-07-21 16:15:47 +02:00
}
2022-09-23 16:14:15 +02:00
$statut = '' ;
switch ( $data -> getStatut ()) {
case 1 : $statut = 'En attente validation Administration' ;
break ;
case 2 : $statut = 'En attente validation Utilisateur' ;
break ;
case 3 : $statut = 'Inscription expirée' ;
break ;
2022-07-21 16:15:47 +02:00
}
2022-09-23 16:14:15 +02:00
array_push ( $output [ 'data' ], [
2022-07-21 16:15:47 +02:00
$action ,
$data -> getUsername (),
$data -> getEmail (),
$data -> getNiveau01 () -> getLabel (),
$statut ,
2022-09-23 16:14:15 +02:00
is_null ( $data -> getKeyexpire ()) ? '' : $data -> getKeyexpire () -> format ( 'd/m/Y H:i:s' ),
]);
2022-07-21 16:15:47 +02:00
}
// Retour
return new JsonResponse ( $output );
}
2022-09-23 16:14:15 +02:00
public function submit ( Request $request , ManagerRegistry $em ) : Response
2022-07-21 16:15:47 +02:00
{
2022-09-23 16:14:15 +02:00
$appmoderegistration = $this -> getParameter ( 'appModeregistration' );
$appMasteridentity = $this -> getParameter ( 'appMasteridentity' );
2022-07-21 16:15:47 +02:00
2022-09-23 16:14:15 +02:00
if ( 'none' == $appmoderegistration || 'SQL' != $appMasteridentity ) {
2022-07-21 16:15:47 +02:00
throw $this -> createAccessDeniedException ( 'Permission denied' );
2022-09-23 16:14:15 +02:00
}
2022-07-21 16:15:47 +02:00
$data = new Registration ();
$data -> setIsvisible ( true );
// Création du formulaire
2022-09-23 16:14:15 +02:00
$form = $this -> createForm ( Form :: class , $data , [
'mode' => 'submit' ,
'access' => 'user' ,
'userid' => null ,
'appMasteridentity' => $this -> GetParameter ( 'appMasteridentity' ),
'appNiveau01label' => $this -> GetParameter ( 'appNiveau01label' ),
'appNiveau02label' => $this -> GetParameter ( 'appNiveau02label' ),
]);
2022-07-21 16:15:47 +02:00
// Récupération des data du formulaire
$form -> handleRequest ( $request );
2022-07-22 14:06:35 +00:00
// si mode de registration BYUSER
2022-09-23 16:14:15 +02:00
if ( 'BYUSER' == $appmoderegistration ) {
$idstatut = 2 ;
} else {
2022-07-21 16:15:47 +02:00
// On recherche le domaine du mail dans la liste blanche
2022-09-23 16:14:15 +02:00
$email = explode ( '@' , $data -> getEmail ());
$domaine = end ( $email );
$whitelist = $em -> getRepository ( " App \ Entity \ Whitelist " ) -> findBy ([ 'label' => $domaine ]);
$idstatut = ( ! $whitelist ? 1 : 2 );
2022-07-21 16:15:47 +02:00
}
$data -> setStatut ( $idstatut );
// Sur erreur
2022-09-23 16:14:15 +02:00
$this -> getErrorForm ( null , $form , $request , $data , 'submit' , $idstatut , $em );
2022-07-21 16:15:47 +02:00
// Sur validation
if ( $form -> get ( 'submit' ) -> isClicked () && $form -> isValid ()) {
$data = $form -> getData ();
$appname = $request -> getSession () -> get ( 'appname' );
$noreply = $this -> getParameter ( 'appMailnoreply' );
$appModeregistrationterme = $this -> getParameter ( 'appModeregistrationterme' );
2022-09-23 16:14:15 +02:00
2022-07-21 16:15:47 +02:00
// si non : validation par administrateur
2022-09-23 16:14:15 +02:00
if ( 1 == $idstatut ) {
2022-07-21 16:15:47 +02:00
// Email à destination de l'inscript pour le prévenir qu'un administrateur doit valider
2022-09-23 16:14:15 +02:00
$subject = $appname . ' : Inscription en cours de validation' ;
$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' ;
$info = $body ;
2022-07-21 16:15:47 +02:00
$to = $data -> getEmail ();
2022-09-23 16:14:15 +02:00
$from = $noreply ;
2022-07-21 16:15:47 +02:00
$fromName = $appname ;
2022-09-23 16:14:15 +02:00
$this -> mail -> sendEmail ( $subject , $body , $to , $from , $fromName );
2022-07-21 16:15:47 +02:00
// Email à l'ensemble administrateurs pour les prévenir qu'il y a une personne à valider
$url = $this -> generateUrl ( 'app_admin_registration' , [], UrlGeneratorInterface :: ABSOLUTE_URL );
2022-09-23 16:14:15 +02:00
$to = [];
$from = $noreply ;
$fromName = $appname ;
$subject = $appname . ' : Inscription à valider' ;
$motivation = 'Login = ' . $data -> getUsername () . '<br>' ;
$motivation .= 'Nom = ' . $data -> getLastname () . '<br>' ;
$motivation .= 'Prénom = ' . $data -> getFirstname () . '<br>' ;
$motivation .= 'Mail = ' . $data -> getEmail () . '<br>' ;
$motivation .= $this -> getParameter ( 'appNiveau01label' ) . ' = ' . $data -> getNiveau01 () -> getLabel ();
$motivation .= $data -> getMotivation ();
$body = 'Un utilisateur dont le mail n’ est pas en liste blanche souhaite s’ inscrire à ' . $appname . " . \n Merci 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> " . $motivation ;
$emailadmins = $em -> getManager () -> createQueryBuilder ()
2022-07-21 16:15:47 +02:00
-> select ( 'table.email' )
2022-09-23 16:14:15 +02:00
-> from ( 'App:User' , 'table' )
2022-07-21 16:15:47 +02:00
-> where ( 'table.roles LIKE :value' )
2022-09-23 16:14:15 +02:00
-> setParameter ( 'value' , '%ROLE_ADMIN%' )
2022-07-21 16:15:47 +02:00
-> getQuery ()
-> getResult ( \Doctrine\ORM\Query :: HYDRATE_SCALAR );
2022-09-23 16:14:15 +02:00
foreach ( $emailadmins as $emailadmin ) {
array_push ( $to , $emailadmin [ 'email' ]);
2022-07-21 16:15:47 +02:00
}
2022-09-23 16:14:15 +02:00
$this -> mail -> sendEmail ( $subject , $body , $to , $from , $fromName );
2022-07-21 16:15:47 +02:00
// Email à l'ensemble des modérateurs du service pour les prévenir qu'il y a une personne à valider
2022-09-23 16:14:15 +02:00
$niveau01id = $data -> getNiveau01 () -> getId ();
2022-07-21 16:15:47 +02:00
$url = $this -> generateUrl ( 'app_modo_registration' , [], UrlGeneratorInterface :: ABSOLUTE_URL );
2022-09-23 16:14:15 +02:00
$to = [];
$from = $noreply ;
$fromName = $appname ;
$subject = $appname . ' : Inscription à valider' ;
$motivation = 'Login = ' . $data -> getUsername () . '<br>' ;
$motivation .= 'Nom = ' . $data -> getLastname () . '<br>' ;
$motivation .= 'Prénom = ' . $data -> getFirstname () . '<br>' ;
$motivation .= 'Mail = ' . $data -> getEmail () . '<br>' ;
$motivation .= $this -> getParameter ( 'appNiveau01label' ) . ' = ' . $data -> getNiveau01 () -> getLabel ();
$motivation .= $data -> getMotivation ();
$body = 'Un utilisateur dont le mail n’ est pas en liste blanche souhaite s’ inscrire à ' . $appname . " . \n Merci 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> " . $motivation ;
$emailmodos = $em -> getManager () -> createQueryBuilder ()
2022-07-21 16:15:47 +02:00
-> select ( 'user.email' )
2022-09-23 16:14:15 +02:00
-> from ( 'App:UserModo' , 'usermodo' )
-> from ( 'App:User' , 'user' )
-> where ( 'usermodo.niveau01 = :niveau01id' )
-> andWhere ( 'user.id = usermodo.user' )
2022-07-21 16:15:47 +02:00
-> andWhere ( 'user.roles LIKE :value' )
2022-09-23 16:14:15 +02:00
-> setParameter ( 'niveau01id' , $niveau01id )
-> setParameter ( 'value' , '%ROLE_MODO%' )
2022-07-21 16:15:47 +02:00
-> getQuery ()
-> getResult ( \Doctrine\ORM\Query :: HYDRATE_SCALAR );
2022-09-23 16:14:15 +02:00
foreach ( $emailmodos as $emailmodo ) {
array_push ( $to , $emailmodo [ 'email' ]);
2022-07-21 16:15:47 +02:00
}
2022-09-23 16:14:15 +02:00
$this -> mail -> sendEmail ( $subject , $body , $to , $from , $fromName );
2022-07-21 16:15:47 +02:00
}
// si oui : Domaine de confiance : email de validation d'inscription directement à l'utilisateur
else {
// Génération de la date de fin de validité de la clé
2022-09-23 16:14:15 +02:00
$keyexpire = new \DateTime ();
2022-07-21 16:15:47 +02:00
$keyexpire -> add ( new \DateInterval ( 'PT' . $appModeregistrationterme . 'H' ));
// Enregistrement des valeurs
$data -> setKeyvalue ( Uuid :: uuid4 ());
$data -> setKeyexpire ( $keyexpire );
// Email à l'utilisateur
2022-09-23 16:14:15 +02:00
$url = $this -> generateUrl ( 'app_registration_validation' , [ 'key' => $data -> getKeyvalue ()], UrlGeneratorInterface :: ABSOLUTE_URL );
$subject = $appname . ' : confirmation de validation' ;
$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>' ;
$info = 'Vous allez recevoir un mail de confirmation pour finaliser votre inscription' ;
2022-07-21 16:15:47 +02:00
$to = $data -> getEmail ();
2022-09-23 16:14:15 +02:00
$from = $noreply ;
2022-07-21 16:15:47 +02:00
$fromName = $appname ;
2022-09-23 16:14:15 +02:00
$this -> mail -> sendEmail ( $subject , $body , $to , $from , $fromName );
2022-07-21 16:15:47 +02:00
}
// Sauvegarde
$em -> getManager () -> persist ( $data );
$em -> getManager () -> flush ();
2022-09-23 16:14:15 +02:00
2022-07-21 16:15:47 +02:00
// A voir retour sur un écran d'info indiquant si validation par admion ou s'il doit matter ses email
$request -> getSession () -> set ( 'registrationinfo' , $info );
2022-09-23 16:14:15 +02:00
$request -> getSession () -> set ( 'registrationmode' , 'info' );
2022-07-21 16:15:47 +02:00
$request -> getSession () -> set ( 'registrationredirectto' , null );
return $this -> redirectToRoute ( 'app_registration_info' );
2022-09-23 16:14:15 +02:00
} else {
2022-07-21 16:15:47 +02:00
return $this -> render ( $this -> twig . 'edit.html.twig' , [
2022-09-23 16:14:15 +02:00
'useheader' => true ,
'usemenu' => false ,
'usesidebar' => false ,
'maxsize' => 1200 ,
$this -> data => $data ,
'mode' => 'submit' ,
'form' => $form -> createView (),
2022-07-21 16:15:47 +02:00
]);
}
}
2022-09-23 16:14:15 +02:00
2022-07-21 16:15:47 +02:00
public function info ( Request $request )
{
$info = $request -> getSession () -> get ( 'registrationinfo' );
$mode = $request -> getSession () -> get ( 'registrationmode' );
$redirectto = $request -> getSession () -> get ( 'registrationredirectto' );
return $this -> render ( $this -> twig . 'info.html.twig' , [
2022-09-23 16:14:15 +02:00
'useheader' => true ,
'usemenu' => false ,
'usesidebar' => false ,
'maxwidth' => true ,
'info' => $info ,
'mode' => $mode ,
'redirectto' => $redirectto ,
2022-07-21 16:15:47 +02:00
]);
}
2022-09-23 16:14:15 +02:00
public function update ( $id , $access , Request $request , ManagerRegistry $em ) : Response
2022-07-21 16:15:47 +02:00
{
$appname = $request -> getSession () -> get ( 'appname' );
$noreply = $this -> getParameter ( 'appMailnoreply' );
$appModeregistrationterme = $this -> getParameter ( 'appModeregistrationterme' );
2022-09-23 16:14:15 +02:00
$appMasteridentity = $this -> getParameter ( 'appMasteridentity' );
2022-07-21 16:15:47 +02:00
2022-09-23 16:14:15 +02:00
if ( 'none' == $appModeregistrationterme || 'SQL' != $appMasteridentity ) {
2022-07-21 16:15:47 +02:00
throw $this -> createAccessDeniedException ( 'Permission denied' );
2022-09-23 16:14:15 +02:00
}
2022-07-21 16:15:47 +02:00
// Initialisation de l'enregistrement
2022-09-23 16:14:15 +02:00
$data = $em -> getRepository ( $this -> entity ) -> find ( $id );
if ( ! $data ) {
throw $this -> createNotFoundException ( 'Unable to find entity.' );
}
2022-07-21 16:15:47 +02:00
// Controler les permissions
2022-09-23 16:14:15 +02:00
$this -> canupdate ( $access , $data , $em );
2022-07-21 16:15:47 +02:00
// Création du formulaire
2022-09-23 16:14:15 +02:00
$form = $this -> createForm ( Form :: class , $data , [
'mode' => 'update' ,
'access' => $access ,
'userid' => $this -> getUser () -> getId (),
'appMasteridentity' => $this -> GetParameter ( 'appMasteridentity' ),
'appNiveau01label' => $this -> GetParameter ( 'appNiveau01label' ),
'appNiveau02label' => $this -> GetParameter ( 'appNiveau02label' ),
]);
2022-07-21 16:15:47 +02:00
// Récupération des data du formulaire
$form -> handleRequest ( $request );
2022-09-23 16:14:15 +02:00
2022-07-21 16:15:47 +02:00
// Sur validation
if ( $form -> get ( 'save' ) -> isClicked () && $form -> isValid ()) {
$data = $form -> getData ();
// Sauvegarde
$em -> getManager () -> flush ();
// Retour à la liste
2022-09-23 16:14:15 +02:00
return $this -> redirectToRoute ( str_replace ( '_admin_' , '_' . $access . '_' , $this -> route ));
2022-07-21 16:15:47 +02:00
}
2022-09-23 16:14:15 +02:00
2022-07-21 16:15:47 +02:00
// Sur validation
if ( $form -> get ( 'submit' ) -> isClicked () && $form -> isValid ()) {
$data = $form -> getData ();
2022-09-23 16:14:15 +02:00
2022-07-21 16:15:47 +02:00
$appname = $request -> getSession () -> get ( 'appname' );
$noreply = $this -> getParameter ( 'appMailnoreply' );
$appModeregistrationterme = $this -> getParameter ( 'appModeregistrationterme' );
2022-09-23 16:14:15 +02:00
2022-07-21 16:15:47 +02:00
// Génération de la date de fin de validité de la clé
2022-09-23 16:14:15 +02:00
$keyexpire = new \DateTime ();
2022-07-21 16:15:47 +02:00
$keyexpire -> add ( new \DateInterval ( 'PT' . $appModeregistrationterme . 'H' ));
// Enregistrement des valeurs
$data -> setKeyvalue ( Uuid :: uuid4 ());
$data -> setKeyexpire ( $keyexpire );
// Statut en attente validation utilisateur
$data -> setStatut ( 2 );
// Email à l'utilisateur
2022-09-23 16:14:15 +02:00
$url = $this -> generateUrl ( 'app_registration_validation' , [ 'key' => $data -> getKeyvalue ()], UrlGeneratorInterface :: ABSOLUTE_URL );
$subject = $appname . ' : confirmation de validation' ;
$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>' ;
2022-07-21 16:15:47 +02:00
$to = $data -> getEmail ();
2022-09-23 16:14:15 +02:00
$from = $noreply ;
2022-07-21 16:15:47 +02:00
$fromName = $appname ;
$this -> mail -> sendEmail ( $subject , $body , $to , $from , $fromName );
// Sauvegarde
$em -> getManager () -> flush ();
// Retour à la liste
2022-09-23 16:14:15 +02:00
return $this -> redirectToRoute ( str_replace ( '_admin_' , '_' . $access . '_' , $this -> route ));
2022-07-21 16:15:47 +02:00
}
// Affichage du formulaire
return $this -> render ( $this -> twig . 'edit.html.twig' , [
2022-09-23 16:14:15 +02:00
'useheader' => true ,
'usemenu' => false ,
'usesidebar' => true ,
$this -> data => $data ,
'mode' => 'update' ,
'access' => $access ,
'form' => $form -> createView (),
]);
2022-07-21 16:15:47 +02:00
}
2022-09-23 16:14:15 +02:00
public function validation ( $key , Request $request , ManagerRegistry $em )
2022-07-21 16:15:47 +02:00
{
2022-09-23 16:14:15 +02:00
$appmoderegistration = $this -> getParameter ( 'appModeregistration' );
$appMasteridentity = $this -> getParameter ( 'appMasteridentity' );
2022-07-21 16:15:47 +02:00
2022-09-23 16:14:15 +02:00
if ( 'none' == $appmoderegistration || 'SQL' != $appMasteridentity ) {
2022-07-21 16:15:47 +02:00
throw $this -> createAccessDeniedException ( 'Permission denied' );
2022-09-23 16:14:15 +02:00
}
$now = new \DateTime ();
2022-07-21 16:15:47 +02:00
2022-09-23 16:14:15 +02:00
$data = $em -> getManager () -> createQueryBuilder ()
2022-07-21 16:15:47 +02:00
-> select ( 'entity' )
2022-09-23 16:14:15 +02:00
-> from ( $this -> entity , 'entity' )
2022-07-21 16:15:47 +02:00
-> where ( 'entity.keyvalue= :key' )
-> andWhere ( 'entity.keyexpire >= :date' )
2022-09-23 16:14:15 +02:00
-> setParameter ( 'key' , $key )
-> setParameter ( 'date' , $now )
2022-07-21 16:15:47 +02:00
-> getQuery ()
-> getSingleResult ();
2022-09-23 16:14:15 +02:00
if ( ! $data ) {
$info = 'Clé de validation invalide' ;
$mode = 'danger' ;
2022-07-21 16:15:47 +02:00
$request -> getSession () -> set ( 'registrationinfo' , $info );
2022-09-23 16:14:15 +02:00
$request -> getSession () -> set ( 'registrationmode' , $mode );
$request -> getSession () -> set ( 'registrationredirectto' , null );
} else {
$url = $this -> generateUrl ( 'app_login' );
$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> " ;
$mode = 'success' ;
2022-07-21 16:15:47 +02:00
$request -> getSession () -> set ( 'registrationinfo' , $info );
2022-09-23 16:14:15 +02:00
$request -> getSession () -> set ( 'registrationmode' , $mode );
2022-07-21 16:15:47 +02:00
// Initialisation de l'enregistrement
$user = new User ();
2022-09-23 16:14:15 +02:00
$user -> setAvatar ( 'noavatar.png' );
2022-07-21 16:15:47 +02:00
$user -> setUsername ( $data -> getUsername ());
$user -> setEmail ( $data -> getEmail ());
$user -> setLastname ( $data -> getLastname ());
$user -> setFirstname ( $data -> getFirstname ());
$user -> setSalt ( $data -> getSalt ());
$user -> setPasswordDirect ( $data -> getPassword ());
$user -> setIsvisible ( $data -> isIsvisible ());
$user -> setMotivation ( $data -> getMotivation ());
$user -> setNote ( $data -> getNote ());
$user -> setApikey ( Uuid :: uuid4 ());
$user -> setNiveau01 ( $data -> getNiveau01 ());
$user -> setNiveau02 ( $data -> getNiveau02 ());
$user -> setTelephonenumber ( $data -> getTelephonenumber ());
$user -> setPostaladress ( $data -> getPostaladress ());
$user -> setJob ( $data -> getJob ());
$user -> setPosition ( $data -> getPosition ());
2022-09-23 16:14:15 +02:00
$user -> setRoles ([ 'ROLE_USER' ]);
2022-07-21 16:15:47 +02:00
// Sauvegarde
$em -> getManager () -> persist ( $user );
$em -> getManager () -> flush ();
// Suppression inscription
$em -> getManager () -> remove ( $data );
$em -> getManager () -> flush ();
}
2022-09-23 16:14:15 +02:00
2022-07-21 16:15:47 +02:00
return $this -> redirectToRoute ( 'app_registration_info' );
}
2022-09-23 16:14:15 +02:00
public function delete ( $id , $access , Request $request , ManagerRegistry $em )
2022-07-21 16:15:47 +02:00
{
// Récupération de l'enregistrement courant
2022-09-23 16:14:15 +02:00
$data = $em -> getRepository ( $this -> entity ) -> find ( $id );
if ( ! $data ) {
throw $this -> createNotFoundException ( 'Unable to find entity.' );
}
2022-07-21 16:15:47 +02:00
// Controler les permissions
2022-09-23 16:14:15 +02:00
$this -> candelete ( $access , $data , $em );
2022-07-21 16:15:47 +02:00
// Tentative de suppression
2022-09-23 16:14:15 +02:00
try {
2022-07-21 16:15:47 +02:00
$em -> getManager () -> remove ( $data );
$em -> getManager () -> flush ();
2022-09-23 16:14:15 +02:00
} catch ( \Exception $e ) {
$request -> getSession () -> getFlashBag () -> add ( 'error' , $e -> getMessage ());
return $this -> redirectToRoute ( str_replace ( '_admin_' , '_' . $access . '_' , $this -> route ) . '_update' , [ 'id' => $id ]);
2022-07-21 16:15:47 +02:00
}
2022-09-23 16:14:15 +02:00
return $this -> redirectToRoute ( str_replace ( '_admin_' , '_' . $access . '_' , $this -> route ));
2022-07-21 16:15:47 +02:00
}
2022-09-23 16:14:15 +02:00
public function resetpwd01 ( Request $request , ManagerRegistry $em )
2022-07-21 16:15:47 +02:00
{
2022-09-23 16:14:15 +02:00
$appmoderegistration = $this -> getParameter ( 'appModeregistration' );
$appMasteridentity = $this -> getParameter ( 'appMasteridentity' );
if ( 'SQL' != $appMasteridentity ) {
2022-07-21 16:15:47 +02:00
throw $this -> createAccessDeniedException ( 'Permission denied' );
2022-09-23 16:14:15 +02:00
}
2022-07-21 16:15:47 +02:00
// Création du formulaire
2022-09-23 16:14:15 +02:00
$form = $this -> createForm ( ResetpwdType :: class , null , [ 'mode' => 'resetpwd01' ]);
2022-07-21 16:15:47 +02:00
// Récupération des data du formulaire
$form -> handleRequest ( $request );
$data = $form -> getData ();
if ( $form -> get ( 'submit' ) -> isClicked ()) {
2022-09-23 16:14:15 +02:00
$user = $em -> getRepository ( " App \ Entity \ User " ) -> findOneby ([ 'email' => $data -> getEmail ()]);
2022-07-21 16:15:47 +02:00
// On s'assure que le mail existe dans la base des utilisateurs
2022-09-23 16:14:15 +02:00
if ( ! $user ) {
$request -> getSession () -> getFlashBag () -> add ( 'error' , 'Mail inconnu' );
2022-07-21 16:15:47 +02:00
// Affichage du formulaire
2022-09-23 16:14:15 +02:00
dump ( 'here' );
2022-07-21 16:15:47 +02:00
return $this -> render ( $this -> twig . 'resetpwd01.html.twig' , [
2022-09-23 16:14:15 +02:00
'useheader' => true ,
'usemenu' => false ,
'usesidebar' => false ,
'maxsize' => 1200 ,
'form' => $form -> createView (),
]);
2022-07-21 16:15:47 +02:00
}
}
// Sur validation
if ( $form -> get ( 'submit' ) -> isClicked ()) {
2022-09-23 16:14:15 +02:00
$user = $em -> getRepository ( " App \ Entity \ User " ) -> findOneby ([ 'email' => $data -> getEmail ()]);
2022-07-21 16:15:47 +02:00
$appname = $request -> getSession () -> get ( 'appname' );
$noreply = $this -> getParameter ( 'appMailnoreply' );
$appModeregistrationterme = $this -> getParameter ( 'appModeregistrationterme' );
// Génération de la date de fin de validité de la clé
2022-09-23 16:14:15 +02:00
$keyexpire = new \DateTime ();
2022-07-21 16:15:47 +02:00
$keyexpire -> add ( new \DateInterval ( 'PT' . $appModeregistrationterme . 'H' ));
// Enregistrement des valeurs
$user -> setKeyvalue ( Uuid :: uuid4 ());
$user -> setKeyexpire ( $keyexpire );
// Sauvegarde
$em -> getManager () -> flush ();
// Email au user
2022-09-23 16:14:15 +02:00
$url = $this -> generateUrl ( 'app_resetpwd02' , [ 'key' => $user -> getKeyvalue ()], UrlGeneratorInterface :: ABSOLUTE_URL );
$subject = $appname . ' : réinitialisation mot de passe' ;
$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 ' . $appModeregistrationterme . ' heures pour le faire.</p><p>Vous pourrez par la suite vous connecter avec votre login : ' . $user -> getUsername () . '</p>' ;
2022-07-21 16:15:47 +02:00
$to = $user -> getEmail ();
2022-09-23 16:14:15 +02:00
$from = $noreply ;
2022-07-21 16:15:47 +02:00
$fromName = $appname ;
$this -> mail -> sendEmail ( $subject , $body , $to , $from , $fromName );
2022-09-23 16:14:15 +02:00
2022-07-21 16:15:47 +02:00
// Info
2022-09-23 16:14:15 +02:00
$info = 'Vous allez recevoir un mail avec lien qui vous permettra de réinitialiser votre mot de passe' ;
$mode = 'info' ;
2022-07-21 16:15:47 +02:00
$request -> getSession () -> set ( 'registrationinfo' , $info );
2022-09-23 16:14:15 +02:00
$request -> getSession () -> set ( 'registrationmode' , $mode );
$request -> getSession () -> set ( 'registrationredirectto' , null );
2022-07-21 16:15:47 +02:00
return $this -> redirectToRoute ( 'app_registration_info' );
}
// Affichage du formulaire
return $this -> render ( $this -> twig . 'resetpwd01.html.twig' , [
2022-09-23 16:14:15 +02:00
'useheader' => true ,
'usemenu' => false ,
'usesidebar' => false ,
'maxsize' => 1200 ,
'form' => $form -> createView (),
2022-07-21 16:15:47 +02:00
]);
}
2022-09-23 16:14:15 +02:00
public function resetpwd02 ( $key , Request $request , ManagerRegistry $em )
2022-07-21 16:15:47 +02:00
{
$appMasteridentity = $this -> getParameter ( 'appMasteridentity' );
2022-09-23 16:14:15 +02:00
if ( 'SQL' != $appMasteridentity ) {
2022-07-21 16:15:47 +02:00
throw $this -> createAccessDeniedException ( 'Permission denied' );
2022-09-23 16:14:15 +02:00
}
$now = new \DateTime ();
$user = $em -> getManager () -> createQueryBuilder ()
2022-07-21 16:15:47 +02:00
-> select ( 'table' )
2022-09-23 16:14:15 +02:00
-> from ( 'App:User' , 'table' )
2022-07-21 16:15:47 +02:00
-> where ( 'table.keyvalue= :key' )
-> andWhere ( 'table.keyexpire >= :date' )
2022-09-23 16:14:15 +02:00
-> setParameter ( 'key' , $key )
-> setParameter ( 'date' , $now )
2022-07-21 16:15:47 +02:00
-> getQuery ()
-> getSingleResult ();
2022-09-23 16:14:15 +02:00
if ( ! $user ) {
$info = 'Clé de validation invalide' ;
$mode = 'danger' ;
2022-07-21 16:15:47 +02:00
$request -> getSession () -> set ( 'registrationinfo' , $info );
2022-09-23 16:14:15 +02:00
$request -> getSession () -> set ( 'registrationmode' , $mode );
$request -> getSession () -> set ( 'registrationredirectto' , null );
2022-07-21 16:15:47 +02:00
return $this -> redirectToRoute ( 'app_registration_info' );
2022-09-23 16:14:15 +02:00
} else {
2022-07-21 16:15:47 +02:00
// Création du formulaire
2022-09-23 16:14:15 +02:00
$form = $this -> createForm ( ResetpwdType :: class , $user , [ 'mode' => 'resetpwd02' ]);
2022-07-21 16:15:47 +02:00
// Récupération des data du formulaire
$form -> handleRequest ( $request );
2022-09-23 16:14:15 +02:00
2022-07-21 16:15:47 +02:00
if ( $form -> get ( 'submit' ) -> isClicked () && $form -> isValid ()) {
$data = $form -> getData ();
$user -> setKeyvalue ( null );
$user -> setKeyexpire ( null );
$user -> setPassword ( $data -> getPassword ());
// Sauvegarde
2022-09-23 16:14:15 +02:00
$em -> getManager () -> flush ();
2022-07-21 16:15:47 +02:00
2022-09-23 16:14:15 +02:00
$url = $this -> generateUrl ( 'app_login' );
$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> " ;
$mode = 'success' ;
2022-07-21 16:15:47 +02:00
$request -> getSession () -> set ( 'registrationinfo' , $info );
2022-09-23 16:14:15 +02:00
$request -> getSession () -> set ( 'registrationmode' , $mode );
$request -> getSession () -> set ( 'registrationredirectto' , null );
2022-07-21 16:15:47 +02:00
return $this -> redirectToRoute ( 'app_registration_info' );
}
// Affichage du formulaire
return $this -> render ( $this -> twig . 'resetpwd02.html.twig' , [
2022-09-23 16:14:15 +02:00
'useheader' => true ,
'usemenu' => false ,
'usesidebar' => false ,
'maxsize' => 1200 ,
'form' => $form -> createView (),
]);
2022-07-21 16:15:47 +02:00
}
}
2022-09-23 16:14:15 +02:00
private function canupdate ( $access , $entity , $em )
{
switch ( $access ) {
case 'admin' : return true ;
break ;
case 'modo' :
$usermodo = $em -> getRepository ( " App \ Entity \ UserModo " ) -> findOneBy ([ 'user' => $this -> getUser (), 'niveau01' => $entity -> getNiveau01 ()]);
if ( ! $usermodo ) {
throw $this -> createAccessDeniedException ( 'Permission denied' );
}
2022-07-21 16:15:47 +02:00
return true ;
2022-09-23 16:14:15 +02:00
break ;
2022-07-21 16:15:47 +02:00
}
throw $this -> createAccessDeniedException ( 'Permission denied' );
2022-09-23 16:14:15 +02:00
}
private function candelete ( $access , $entity , $em )
{
switch ( $access ) {
case 'admin' : return true ;
break ;
case 'modo' :
$usermodo = $em -> getRepository ( " App \ Entity \ UserModo " ) -> findOneBy ([ 'user' => $this -> getUser (), 'niveau01' => $entity -> getNiveau01 ()]);
if ( ! $usermodo ) {
throw $this -> createAccessDeniedException ( 'Permission denied' );
}
2022-07-21 16:15:47 +02:00
return true ;
2022-09-23 16:14:15 +02:00
break ;
2022-07-21 16:15:47 +02:00
}
throw $this -> createAccessDeniedException ( 'Permission denied' );
2022-09-23 16:14:15 +02:00
}
2022-07-21 16:15:47 +02:00
2022-09-23 16:14:15 +02:00
protected function getErrorForm ( $id , $form , $request , $data , $mode , $idstatut , $em )
{
if ( $form -> get ( 'submit' ) -> isClicked () && 'submit' == $mode ) {
2022-07-21 16:15:47 +02:00
// Si validation par administrateur demander une motivation
$appmoderegistration = $this -> getParameter ( 'appModeregistration' );
2022-09-23 16:14:15 +02:00
if ( is_null ( $data -> getMotivation ()) && 'BYADMIN' == $appmoderegistration ) {
2022-07-21 16:15:47 +02:00
// On recherche le domaine du mail dans la liste blanche
2022-09-23 16:14:15 +02:00
$email = explode ( '@' , $data -> getEmail ());
$domaine = end ( $email );
$whitelist = $em -> getManager () -> getRepository ( " App \ Entity \ Whitelist " ) -> findBy ([ 'label' => $domaine ]);
if ( ! $whitelist ) {
$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' ));
}
2022-07-21 16:15:47 +02:00
}
}
if ( $form -> get ( 'submit' ) -> isClicked () && ! $form -> isValid ()) {
$errors = $form -> getErrors ();
2022-09-23 16:14:15 +02:00
foreach ( $errors as $error ) {
$request -> getSession () -> getFlashBag () -> add ( 'error' , $error -> getMessage ());
$request -> getSession () -> getFlashBag () -> add ( 'error' , $error -> getMessage ());
2022-07-21 16:15:47 +02:00
}
}
}
}