🗑️ remove(Form/Newsletter): Supprime les formulaires obsolètes de newsletter.
✨ feat(Form): Améliore les formulaires Admin, Intranet et Revendeur. 🐛 fix(Exception): Corrige les messages d'erreur pour les champs immuables. ✨ feat(Security): Ajoute la génération de mot de passe sécurisé. ✨ feat(Security): Améliore la vérification de l'utilisateur et la 2FA. ✨ feat(EventListener): Améliore la gestion de la première connexion et de la 2FA. ✨ feat(Sitemap): Ajoute les routes de l'API au sitemap.
This commit is contained in:
@@ -8,7 +8,6 @@ use App\Entity\AccountLoginRegister;
|
||||
use App\Service\Mailer\Mailer;
|
||||
use Doctrine\ORM\EntityManagerInterface;
|
||||
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
@@ -21,179 +20,160 @@ use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInt
|
||||
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
|
||||
use Twig\Environment;
|
||||
|
||||
/**
|
||||
* Listener for the Mainframe attribute.
|
||||
* This listener demonstrates how to read the Mainframe attribute
|
||||
* from a controller method or class when a request is handled,
|
||||
* and then modify the response based on the 'index' property.
|
||||
*/
|
||||
#[AsEventListener(event: KernelEvents::REQUEST)]
|
||||
#[AsEventListener(event: KernelEvents::CONTROLLER)]
|
||||
#[AsEventListener(event: KernelEvents::RESPONSE)] // Listen to the Response event as well
|
||||
#[AsEventListener(event: KernelEvents::REQUEST)] // Listen to the Response event as well
|
||||
#[AsEventListener(event: KernelEvents::RESPONSE)]
|
||||
class MainframeAttributeListener
|
||||
{
|
||||
public function __construct(private readonly Mailer $mailer,private readonly Environment $environment,private readonly TokenStorageInterface $tokenStorage,private readonly UserPasswordHasherInterface $userPasswordHasher,private readonly ?EntityManagerInterface $entityManager)
|
||||
{
|
||||
// Logger removed from constructor
|
||||
public function __construct(
|
||||
private readonly Mailer $mailer,
|
||||
private readonly Environment $twig,
|
||||
private readonly TokenStorageInterface $tokenStorage,
|
||||
private readonly UserPasswordHasherInterface $userPasswordHasher,
|
||||
private readonly ?EntityManagerInterface $entityManager = null
|
||||
) {
|
||||
}
|
||||
|
||||
public function onKernelRequest(RequestEvent $event)
|
||||
public function onKernelRequest(RequestEvent $event): void
|
||||
{
|
||||
$request = $event->getRequest();
|
||||
$pathInfo = $request->getPathInfo();
|
||||
if(str_contains($pathInfo,"/artemis")) {
|
||||
if($this->tokenStorage->getToken() instanceof UsernamePasswordToken) {
|
||||
$account = $this->tokenStorage->getToken()->getUser();
|
||||
if($account instanceof Account) {
|
||||
if($account->isFirstLogin()) {
|
||||
$response = new Response($this->environment->render('admin/first_login.twig',[
|
||||
'account' => $account,
|
||||
]));
|
||||
if($request->isMethod('POST')) {
|
||||
$password = $request->request->get('password');
|
||||
$password2 = $request->request->get('password2');
|
||||
if($password == $password2) {
|
||||
$account->setPassword($this->userPasswordHasher->hashPassword($account, $password));
|
||||
$account->setIsFirstLogin(false);
|
||||
$this->entityManager->persist($account);
|
||||
$this->entityManager->flush();
|
||||
|
||||
$redirect = new RedirectResponse("/artemis");
|
||||
$redirect->setStatusCode(302);
|
||||
$event->setResponse($redirect);
|
||||
$event->stopPropagation();
|
||||
} else {
|
||||
$response = new Response($this->environment->render('admin/first_login.twig',[
|
||||
'account' => $account,
|
||||
'error' => 'Les mot de passe ne correspondent pas.'
|
||||
]));
|
||||
}
|
||||
}
|
||||
$event->setResponse($response);
|
||||
$event->stopPropagation();
|
||||
} else {
|
||||
$session = $request->getSession();
|
||||
if(!$session->has('2fa_valid')) {
|
||||
if(!$session->has('2fa_code')) {
|
||||
$code = random_int(1000, 9999);
|
||||
$session->set('2fa_code', $code);
|
||||
$this->mailer->send($account->getEmail(), $account->getUsername(), "[Mainframe] - Double authentication", "mails/artemis/2fa.twig", [
|
||||
'code' => $code,
|
||||
'account' => $account,
|
||||
]);
|
||||
}
|
||||
$response = new Response($this->environment->render('admin/2fa.twig', [
|
||||
'account' => $account,
|
||||
]));
|
||||
$event->setResponse($response);
|
||||
$event->stopPropagation();
|
||||
if($request->isMethod('POST')) {
|
||||
$code = $request->request->get('code');
|
||||
if((int)$code == $session->get('2fa_code')) {
|
||||
$login = new AccountLoginRegister();
|
||||
$login->setAccount($account);
|
||||
$login->setLoginAt(new \DateTimeImmutable());
|
||||
$login->setIp($request->getClientIp());
|
||||
$login->setUserAgent($request->headers->get('user-agent'));
|
||||
$this->entityManager->persist($login);
|
||||
$this->entityManager->flush();
|
||||
$session->remove('2fa_code');
|
||||
$session->set('2fa_valid',true);
|
||||
$request->setSession($session);
|
||||
$redirect = new RedirectResponse("/artemis");
|
||||
$redirect->setStatusCode(302);
|
||||
$event->setResponse($redirect);
|
||||
$event->stopPropagation();
|
||||
} else {
|
||||
$response = new Response($this->environment->render('admin/2fa.twig', [
|
||||
'account' => $account,
|
||||
'error' => 'Code non valide !'
|
||||
]));
|
||||
$event->setResponse($response);
|
||||
$event->stopPropagation();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!str_contains($pathInfo, '/artemis')) {
|
||||
return;
|
||||
}
|
||||
|
||||
$token = $this->tokenStorage->getToken();
|
||||
if (!($token instanceof UsernamePasswordToken)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$account = $token->getUser();
|
||||
if (!($account instanceof Account)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Gestion première connexion : changer mot de passe
|
||||
if ($account->isFirstLogin()) {
|
||||
$response = new Response($this->twig->render('admin/first_login.twig', ['account' => $account]));
|
||||
if ($request->isMethod('POST')) {
|
||||
$password = $request->request->get('password');
|
||||
$password2 = $request->request->get('password2');
|
||||
if ($password === $password2) {
|
||||
$hashedPassword = $this->userPasswordHasher->hashPassword($account, $password);
|
||||
$account->setPassword($hashedPassword);
|
||||
$account->setIsFirstLogin(false);
|
||||
if ($this->entityManager) {
|
||||
$this->entityManager->persist($account);
|
||||
$this->entityManager->flush();
|
||||
}
|
||||
|
||||
$redirect = new RedirectResponse('/artemis');
|
||||
$event->setResponse($redirect);
|
||||
$event->stopPropagation();
|
||||
return;
|
||||
}
|
||||
$response = new Response($this->twig->render('admin/first_login.twig', ['account' => $account, 'error' => 'Les mots de passe ne correspondent pas.']));
|
||||
}
|
||||
$event->setResponse($response);
|
||||
$event->stopPropagation();
|
||||
return;
|
||||
}
|
||||
|
||||
// Gestion double authentification
|
||||
$session = $request->getSession();
|
||||
if (!$session?->has('2fa_valid')) {
|
||||
if (!$session->has('2fa_code')) {
|
||||
$code = random_int(1000, 9999);
|
||||
$session->set('2fa_code', $code);
|
||||
$this->mailer->send(
|
||||
$account->getEmail(),
|
||||
$account->getUsername(),
|
||||
'[Mainframe] - Double authentication',
|
||||
'mails/artemis/2fa.twig',
|
||||
['code' => $code, 'account' => $account]
|
||||
);
|
||||
}
|
||||
|
||||
$response = new Response($this->twig->render('admin/2fa.twig', ['account' => $account]));
|
||||
|
||||
if ($request->isMethod('POST')) {
|
||||
$codeInput = (int) $request->request->get('code');
|
||||
if ($codeInput === $session->get('2fa_code')) {
|
||||
// Création log login
|
||||
if ($this->entityManager) {
|
||||
$login = new AccountLoginRegister();
|
||||
$login->setAccount($account);
|
||||
$login->setLoginAt(new \DateTimeImmutable());
|
||||
$login->setIp($request->getClientIp());
|
||||
$login->setUserAgent($request->headers->get('user-agent'));
|
||||
$this->entityManager->persist($login);
|
||||
$this->entityManager->flush();
|
||||
}
|
||||
|
||||
$session->remove('2fa_code');
|
||||
$session->set('2fa_valid', true);
|
||||
|
||||
$redirect = new RedirectResponse('/artemis');
|
||||
$event->setResponse($redirect);
|
||||
$event->stopPropagation();
|
||||
return;
|
||||
}
|
||||
$response = new Response($this->twig->render('admin/2fa.twig', ['account' => $account, 'error' => 'Code non valide !']));
|
||||
}
|
||||
|
||||
$event->setResponse($response);
|
||||
$event->stopPropagation();
|
||||
}
|
||||
}
|
||||
|
||||
public function onKernelController(ControllerEvent $event): void
|
||||
{
|
||||
// Get the controller callable (e.g., [ControllerClass, methodName])
|
||||
$controller = $event->getController();
|
||||
$request = $event->getRequest();
|
||||
|
||||
// If the controller is not an array (e.g., a Closure), we can't easily reflect on it.
|
||||
// For simplicity, we'll only handle class-based controllers here.
|
||||
if (!is_array($controller)) {
|
||||
return;
|
||||
}
|
||||
|
||||
[$controllerObject, $methodName] = $controller;
|
||||
|
||||
// Use Reflection to get the controller class and method
|
||||
$reflectionClass = new \ReflectionClass($controllerObject);
|
||||
$reflectionMethod = $reflectionClass->getMethod($methodName);
|
||||
$refClass = new \ReflectionClass($controllerObject);
|
||||
$refMethod = $refClass->getMethod($methodName);
|
||||
|
||||
// Removed logger call: Processing controller
|
||||
$shouldNoIndex = false;
|
||||
|
||||
$shouldNoIndex = false; // Default to indexable
|
||||
|
||||
// --- Check for attribute on the method (takes precedence) ---
|
||||
$methodAttributes = $reflectionMethod->getAttributes(Mainframe::class);
|
||||
$methodAttributes = $refMethod->getAttributes(Mainframe::class);
|
||||
if (!empty($methodAttributes)) {
|
||||
/** @var Mainframe $mainframeAttribute */
|
||||
$mainframeAttribute = $methodAttributes[0]->newInstance();
|
||||
|
||||
if ($mainframeAttribute->index === false) {
|
||||
$shouldNoIndex = true;
|
||||
}
|
||||
|
||||
// Removed logger call: Mainframe attribute found on method
|
||||
} else {
|
||||
// Removed logger call: No Mainframe attribute found on method
|
||||
|
||||
// --- Check for attribute on the class if not found on method ---
|
||||
$classAttributes = $reflectionClass->getAttributes(Mainframe::class);
|
||||
// Check class attributes if method attribute not found
|
||||
$classAttributes = $refClass->getAttributes(Mainframe::class);
|
||||
if (!empty($classAttributes)) {
|
||||
/** @var Mainframe $mainframeAttribute */
|
||||
$mainframeAttribute = $classAttributes[0]->newInstance();
|
||||
|
||||
if ($mainframeAttribute->index === false) {
|
||||
$shouldNoIndex = true;
|
||||
}
|
||||
|
||||
// Removed logger call: Mainframe attribute found on class
|
||||
} else {
|
||||
// Removed logger call: No Mainframe attribute found on class
|
||||
}
|
||||
}
|
||||
|
||||
// Store the noindex decision in the request attributes for the response listener
|
||||
$request->attributes->set('_mainframe_noindex', $shouldNoIndex);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the KernelEvents::RESPONSE event.
|
||||
* This method is called after the controller has returned a Response object.
|
||||
* It checks the '_mainframe_noindex' flag from the request attributes
|
||||
* and adds the 'X-Robots-Tag: noindex' header if required.
|
||||
*
|
||||
* @param ResponseEvent $event The event object containing the Response.
|
||||
*/
|
||||
public function onKernelResponse(ResponseEvent $event): void
|
||||
{
|
||||
$request = $event->getRequest();
|
||||
$response = $event->getResponse();
|
||||
|
||||
// Retrieve the noindex decision stored in the request attributes
|
||||
$shouldNoIndex = $request->attributes->get('_mainframe_noindex', false);
|
||||
|
||||
if ($shouldNoIndex) {
|
||||
$response->headers->set('X-Robots-Tag', 'noindex');
|
||||
// Removed logger call: Added X-Robots-Tag: noindex header
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,10 @@
|
||||
|
||||
namespace App\EventListener;
|
||||
|
||||
use Presta\SitemapBundle\Event\SitemapPopulateEvent;
|
||||
use Presta\SitemapBundle\Sitemap\Url\UrlConcrete;
|
||||
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||
use Presta\SitemapBundle\Event\SitemapPopulateEvent;
|
||||
use Presta\SitemapBundle\Service\UrlContainerInterface;
|
||||
use Presta\SitemapBundle\Sitemap\Url\UrlConcrete;
|
||||
|
||||
class SitemapSubscriber implements EventSubscriberInterface
|
||||
{
|
||||
@@ -16,15 +15,22 @@ class SitemapSubscriber implements EventSubscriberInterface
|
||||
SitemapPopulateEvent::class => 'populate',
|
||||
];
|
||||
}
|
||||
public function populate(SitemapPopulateEvent $sitemapPopulateEvent): void
|
||||
|
||||
public function populate(SitemapPopulateEvent $event): void
|
||||
{
|
||||
$urlContainer = $sitemapPopulateEvent->getUrlContainer();
|
||||
$urlGenerator = $sitemapPopulateEvent->getUrlGenerator();
|
||||
$urlContainer = $event->getUrlContainer();
|
||||
$urlGenerator = $event->getUrlGenerator();
|
||||
|
||||
$urls = [
|
||||
['route' => 'app.swagger_ui', 'section' => 'api'],
|
||||
['route' => 'api_public_quote', 'section' => 'api'],
|
||||
];
|
||||
|
||||
$pathMenuItemApiDoc = new UrlConcrete($urlGenerator->generate('app.swagger_ui', [], UrlGeneratorInterface::ABSOLUTE_URL));
|
||||
$urlContainer->addUrl($pathMenuItemApiDoc,'api');
|
||||
$pathMenuItemApiDocQuote = new UrlConcrete($urlGenerator->generate('api_public_quote', [], UrlGeneratorInterface::ABSOLUTE_URL));
|
||||
$urlContainer->addUrl($pathMenuItemApiDocQuote,'api');
|
||||
foreach ($urls as $item) {
|
||||
$url = new UrlConcrete(
|
||||
$urlGenerator->generate($item['route'], [], UrlGeneratorInterface::ABSOLUTE_URL)
|
||||
);
|
||||
$urlContainer->addUrl($url, $item['section']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,8 +4,8 @@ namespace App\Exception;
|
||||
|
||||
class ImmutableDevisFieldException extends \LogicException
|
||||
{
|
||||
public function __construct(string $field)
|
||||
public function __construct(string $champ)
|
||||
{
|
||||
parent::__construct(sprintf("The '%s' field is immutable once set.", $field));
|
||||
parent::__construct(sprintf("Le champ '%s' ne peut pas être modifié après avoir été défini.", $champ));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,10 +2,12 @@
|
||||
|
||||
namespace App\Exception;
|
||||
|
||||
class ImmutableLoggerFieldException extends \LogicException
|
||||
use LogicException;
|
||||
|
||||
class ImmutableLoggerFieldException extends LogicException
|
||||
{
|
||||
public function __construct(string $field)
|
||||
public function __construct(string $champ)
|
||||
{
|
||||
parent::__construct(sprintf("The '%s' field is immutable once set.", $field));
|
||||
parent::__construct(sprintf("Le champ '%s' ne peut pas être modifié après avoir été défini.", $champ));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ namespace App\Form\Artemis\Admin;
|
||||
|
||||
use App\Entity\Account;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\EmailType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
@@ -13,28 +12,32 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class AdminFormType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder
|
||||
->add('username',TextType::class,[
|
||||
'label' => 'Nom d\'utilisateur',
|
||||
'required' => true
|
||||
->add('username', TextType::class, [
|
||||
'label' => "Nom d'utilisateur",
|
||||
'required' => true,
|
||||
])
|
||||
->add('email',EmailType::class,[
|
||||
->add('email', EmailType::class, [
|
||||
'label' => 'Email',
|
||||
'required' => true
|
||||
'required' => true,
|
||||
])
|
||||
->add('isActif',ChoiceType::class,[
|
||||
->add('isActif', ChoiceType::class, [
|
||||
'label' => 'Compte Actif',
|
||||
'choices' =>[
|
||||
'choices' => [
|
||||
'Désactiver' => false,
|
||||
'Actif' => true,
|
||||
]
|
||||
],
|
||||
'expanded' => true, // optionnel: affichage en radios
|
||||
'multiple' => false,
|
||||
]);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefault('data_class',Account::class);
|
||||
$resolver->setDefaults([
|
||||
'data_class' => Account::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,34 +4,32 @@ namespace App\Form\Artemis\Admin;
|
||||
|
||||
use App\Entity\Account;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\EmailType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class AdminPasswordType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder
|
||||
->add('password',RepeatedType::class,[
|
||||
'first_options' =>[
|
||||
'label' => 'Mot de passe'
|
||||
],
|
||||
'second_options' => [
|
||||
'label' => 'Confirmée le mot de passe'
|
||||
],
|
||||
'type' => PasswordType::class,
|
||||
'required' => true,
|
||||
]);
|
||||
$builder->add('password', RepeatedType::class, [
|
||||
'type' => PasswordType::class,
|
||||
'first_options' => [
|
||||
'label' => 'Mot de passe',
|
||||
],
|
||||
'second_options' => [
|
||||
'label' => 'Confirmer le mot de passe',
|
||||
],
|
||||
'required' => true,
|
||||
'invalid_message' => 'Les deux mots de passe doivent correspondre.',
|
||||
]);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefault('data_class',Account::class);
|
||||
$resolver->setDefaults([
|
||||
'data_class' => Account::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,22 +11,23 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class NewAdminType extends AbstractType
|
||||
{
|
||||
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder
|
||||
->add('username',TextType::class,[
|
||||
'label' => 'Nom de l\'utilisateur',
|
||||
'required' => true
|
||||
->add('username', TextType::class, [
|
||||
'label' => "Nom de l'utilisateur",
|
||||
'required' => true,
|
||||
])
|
||||
->add('email',EmailType::class,[
|
||||
->add('email', EmailType::class, [
|
||||
'label' => 'Email (xxx@siteconseil.fr)',
|
||||
'required' => true
|
||||
'required' => true,
|
||||
]);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefault('data_class',Account::class);
|
||||
$resolver->setDefaults([
|
||||
'data_class' => Account::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,36 +2,38 @@
|
||||
|
||||
namespace App\Form\Artemis\Intranet;
|
||||
|
||||
use App\Entity\Customer;
|
||||
use App\Entity\CustomerDnsEmail;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Component\Validator\Constraints\Choice;
|
||||
|
||||
class CustomerDnsEmailType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder
|
||||
->add('email',TextType::class,[
|
||||
'label' => 'Nom de la boite mail',
|
||||
->add('email', TextType::class, [
|
||||
'label' => 'Nom de la boîte mail',
|
||||
'required' => true,
|
||||
])
|
||||
->add('isBilling',ChoiceType::class,[
|
||||
'label' => 'Facturer la boite mail',
|
||||
->add('isBilling', ChoiceType::class, [
|
||||
'label' => 'Facturer la boîte mail',
|
||||
'required' => true,
|
||||
'choices' => [
|
||||
'Oui' => true,
|
||||
'Non' => false,
|
||||
]
|
||||
],
|
||||
'expanded' => true, // Pour affichage en radio boutons
|
||||
'multiple' => false,
|
||||
]);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefault('data_class',CustomerDnsEmail::class);
|
||||
$resolver->setDefaults([
|
||||
'data_class' => CustomerDnsEmail::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,83 +6,81 @@ use App\Entity\Customer;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\CountryType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\EmailType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TelType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Component\Validator\Constraints\Country;
|
||||
|
||||
class CustomerEditType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder
|
||||
->add('raisonSocial',TextType::class,[
|
||||
->add('raisonSocial', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Raison Sociale'
|
||||
'label' => 'Raison sociale',
|
||||
])
|
||||
->add('type',ChoiceType::class,[
|
||||
'label' => 'Type d\'entreprise',
|
||||
->add('type', ChoiceType::class, [
|
||||
'label' => "Type d'entreprise",
|
||||
'required' => true,
|
||||
'choices' =>[
|
||||
'choices' => [
|
||||
'Entreprise' => 'company',
|
||||
'Association' => 'association',
|
||||
'Entreprise Individuelle' => 'ei',
|
||||
'Particulier'=> 'particulier',
|
||||
'Mairie' => 'Mairie',
|
||||
'Autre' => 'autre'
|
||||
]
|
||||
'Particulier' => 'particulier',
|
||||
'Mairie' => 'mairie',
|
||||
'Autre' => 'autre',
|
||||
],
|
||||
])
|
||||
->add('siret',TextType::class,[
|
||||
->add('siret', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Siret'
|
||||
'label' => 'SIRET',
|
||||
])
|
||||
->add('ape',TextType::class,[
|
||||
->add('ape', TextType::class, [
|
||||
'required' => false,
|
||||
'label' => 'Code Naf / APE'
|
||||
'label' => 'Code NAF / APE',
|
||||
])
|
||||
->add('rcs',TextType::class,[
|
||||
->add('rcs', TextType::class, [
|
||||
'required' => false,
|
||||
'label' => 'Numéro RCS'
|
||||
'label' => 'Numéro RCS',
|
||||
])
|
||||
->add('rna',TextType::class,[
|
||||
->add('rna', TextType::class, [
|
||||
'required' => false,
|
||||
'label' => 'Numéro RNA (si association)'
|
||||
'label' => 'Numéro RNA (si association)',
|
||||
])
|
||||
->add('address',TextType::class,[
|
||||
->add('address', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Adresse'
|
||||
'label' => 'Adresse',
|
||||
])
|
||||
->add('address2',TextType::class,[
|
||||
->add('address2', TextType::class, [
|
||||
'required' => false,
|
||||
'label' => 'Adresse 2'
|
||||
'label' => 'Adresse 2',
|
||||
])
|
||||
->add('address3',TextType::class,[
|
||||
->add('address3', TextType::class, [
|
||||
'required' => false,
|
||||
'label' => 'Adresse 3'
|
||||
'label' => 'Adresse 3',
|
||||
])
|
||||
->add('zipcode',TextType::class,[
|
||||
->add('zipcode', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Code Postale'
|
||||
'label' => 'Code postal',
|
||||
])
|
||||
->add('city',TextType::class,[
|
||||
->add('city', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Ville'
|
||||
'label' => 'Ville',
|
||||
])
|
||||
->add('country',CountryType::class,[
|
||||
->add('country', CountryType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Pays'
|
||||
'label' => 'Pays',
|
||||
])
|
||||
->add('codeComptable',TextType::class,[
|
||||
->add('codeComptable', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Code Comptable'
|
||||
])
|
||||
;
|
||||
'label' => 'Code comptable',
|
||||
]);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefault('data_class',Customer::class);
|
||||
$resolver->setDefaults([
|
||||
'data_class' => Customer::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,8 +43,8 @@ class CustomerNddType extends AbstractType
|
||||
->add('isBill',ChoiceType::class,[
|
||||
'label' => 'Facturable',
|
||||
'choices' => [
|
||||
'Non' => false,
|
||||
'Oui' => true,
|
||||
'Non' => false,
|
||||
'Oui' => true,
|
||||
]
|
||||
])
|
||||
->add('apiKey',TextType::class,[
|
||||
|
||||
@@ -11,99 +11,99 @@ use Symfony\Component\Form\Extension\Core\Type\TelType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Component\Validator\Constraints\Country;
|
||||
|
||||
class CustomerType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder
|
||||
->add('raisonSocial',TextType::class,[
|
||||
->add('raisonSocial', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Raison Sociale'
|
||||
'label' => 'Raison sociale',
|
||||
])
|
||||
->add('type',ChoiceType::class,[
|
||||
'label' => 'Type d\'entreprise',
|
||||
->add('type', ChoiceType::class, [
|
||||
'label' => "Type d'entreprise",
|
||||
'required' => true,
|
||||
'choices' =>[
|
||||
'choices' => [
|
||||
'Entreprise' => 'company',
|
||||
'Association' => 'association',
|
||||
'Entreprise Individuelle' => 'ei',
|
||||
'Particulier'=> 'particulier',
|
||||
'Mairie' => 'Mairie',
|
||||
'Autre' => 'autre'
|
||||
]
|
||||
'Particulier' => 'particulier',
|
||||
'Mairie' => 'mairie',
|
||||
'Autre' => 'autre',
|
||||
],
|
||||
])
|
||||
->add('siret',TextType::class,[
|
||||
->add('siret', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Siret'
|
||||
'label' => 'SIRET',
|
||||
])
|
||||
->add('ape',TextType::class,[
|
||||
->add('ape', TextType::class, [
|
||||
'required' => false,
|
||||
'label' => 'Code Naf / APE'
|
||||
'label' => 'Code NAF / APE',
|
||||
])
|
||||
->add('rcs',TextType::class,[
|
||||
->add('rcs', TextType::class, [
|
||||
'required' => false,
|
||||
'label' => 'Numéro RCS'
|
||||
'label' => 'Numéro RCS',
|
||||
])
|
||||
->add('rna',TextType::class,[
|
||||
->add('rna', TextType::class, [
|
||||
'required' => false,
|
||||
'label' => 'Numéro RNA (si association)'
|
||||
'label' => 'Numéro RNA (si association)',
|
||||
])
|
||||
->add('address',TextType::class,[
|
||||
->add('address', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Adresse'
|
||||
'label' => 'Adresse',
|
||||
])
|
||||
->add('address2',TextType::class,[
|
||||
->add('address2', TextType::class, [
|
||||
'required' => false,
|
||||
'label' => 'Adresse 2'
|
||||
'label' => 'Adresse 2',
|
||||
])
|
||||
->add('address3',TextType::class,[
|
||||
->add('address3', TextType::class, [
|
||||
'required' => false,
|
||||
'label' => 'Adresse 3'
|
||||
'label' => 'Adresse 3',
|
||||
])
|
||||
->add('zipcode',TextType::class,[
|
||||
->add('zipcode', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Code Postale'
|
||||
'label' => 'Code postal',
|
||||
])
|
||||
->add('city',TextType::class,[
|
||||
->add('city', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Ville'
|
||||
'label' => 'Ville',
|
||||
])
|
||||
->add('country',CountryType::class,[
|
||||
->add('country', CountryType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Pays'
|
||||
'label' => 'Pays',
|
||||
])
|
||||
->add('codeComptable',TextType::class,[
|
||||
->add('codeComptable', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Code Comptable'
|
||||
'label' => 'Code comptable',
|
||||
])
|
||||
//no mapping port
|
||||
->add('contactName',TextType::class,[
|
||||
// Champs non mappés pour contact
|
||||
->add('contactName', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Nom du contact',
|
||||
'mapped' => false,
|
||||
])
|
||||
->add('contactFirstname',TextType::class,[
|
||||
->add('contactFirstname', TextType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Prénom du contact',
|
||||
'mapped' => false,
|
||||
])
|
||||
->add('contactEmail',EmailType::class,[
|
||||
->add('contactEmail', EmailType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Email du contact (utilisé pour la facturation)',
|
||||
'mapped' => false,
|
||||
])
|
||||
->add('contactPhone',TelType::class,[
|
||||
->add('contactPhone', TelType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Téléphone du contact',
|
||||
'mapped' => false,
|
||||
])
|
||||
;
|
||||
]);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefault('data_class',Customer::class);
|
||||
$resolver->setDefaults([
|
||||
'data_class' => Customer::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Form\Artemis\Newsletter;
|
||||
|
||||
use App\Entity\Newsletter\ContactLine;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\EmailType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\Form\FormInterface;
|
||||
use Symfony\Component\Form\FormView;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class ContactLineType extends AbstractType
|
||||
{
|
||||
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$builder
|
||||
->add('name',TextType::class,[
|
||||
'label' => 'Nom',
|
||||
'required' => false,
|
||||
])
|
||||
->add('email',EmailType::class,[
|
||||
'label' => 'Email',
|
||||
'required' => true,
|
||||
])
|
||||
->add('surname',TextType::class,[
|
||||
'label' => 'Nom',
|
||||
'required' => false,
|
||||
]);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$resolver->setDefault('data_class',ContactLine::class);
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Form\Artemis\Newsletter;
|
||||
use App\Entity\Newsletter\Contact;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Validator\Constraints\NotBlank;
|
||||
class ContactListType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder
|
||||
->add('name', TextType::class, [
|
||||
'label' => 'Nom de la liste',
|
||||
'constraints' => [
|
||||
new NotBlank([
|
||||
'message' => 'Le nom de la liste ne peut pas être vide.',
|
||||
]),
|
||||
],
|
||||
'attr' => [
|
||||
'placeholder' => 'Ex : Newsletter clients',
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
'data_class' => Contact::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Form\Artemis\Newsletter;
|
||||
|
||||
use App\Entity\Newsletter\Template;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\TextType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class TemplateType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$builder
|
||||
->add('name',TextType::class,[
|
||||
'label'=>'Nom',
|
||||
'required'=>true,
|
||||
])
|
||||
->add('content',HiddenType::class,[
|
||||
]);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$resolver->setDefault('data_class',Template::class);
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
namespace App\Form\Artemis\Revendeur;
|
||||
|
||||
use App\Entity\Customer;
|
||||
use App\Entity\Revendeur;
|
||||
use App\Service\Revendeur\RevendeurService;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
@@ -14,45 +13,51 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class RevendeurType extends AbstractType
|
||||
{
|
||||
public function __construct(private RevendeurService $revendeurService)
|
||||
public function __construct(private readonly RevendeurService $revendeurService)
|
||||
{
|
||||
}
|
||||
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$choices = [];
|
||||
foreach ($this->revendeurService->list() as $revendeur) {
|
||||
$choices[$revendeur->getId()] = $revendeur->getRaisonSocial();
|
||||
// La clé est ici le label visible dans le champ, la valeur est l’id en base
|
||||
$choices[$revendeur->getRaisonSocial()] = $revendeur->getId();
|
||||
}
|
||||
$builder->add('raisonSocial',TextType::class,[
|
||||
'label' => 'Raison Sociale',
|
||||
'required' => true,
|
||||
])
|
||||
->add('name',TextType::class,[
|
||||
|
||||
$builder
|
||||
->add('raisonSocial', TextType::class, [
|
||||
'label' => 'Raison Sociale',
|
||||
'required' => true,
|
||||
])
|
||||
->add('name', TextType::class, [
|
||||
'label' => 'Nom',
|
||||
'required' => true,
|
||||
])
|
||||
->add('surname',TextType::class,[
|
||||
'label' => 'Prenom',
|
||||
->add('surname', TextType::class, [
|
||||
'label' => 'Prénom',
|
||||
'required' => true,
|
||||
])
|
||||
->add('email',EmailType::class,[
|
||||
->add('email', EmailType::class, [
|
||||
'label' => 'Email',
|
||||
'required' => true,
|
||||
])
|
||||
->add('phone',TextType::class,[
|
||||
'label' => 'Telephone',
|
||||
->add('phone', TextType::class, [
|
||||
'label' => 'Téléphone',
|
||||
'required' => true,
|
||||
])
|
||||
->add('parent',ChoiceType::class,[
|
||||
->add('parent', ChoiceType::class, [
|
||||
'label' => 'Revendeur Principal',
|
||||
'choices' => $choices,
|
||||
'required' => false,
|
||||
'placeholder' => 'Sélectionnez un revendeur principal',
|
||||
]);
|
||||
|
||||
}
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefault('data_class',Revendeur::class);
|
||||
$resolver->setDefaults([
|
||||
'data_class' => Revendeur::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,9 +3,7 @@
|
||||
namespace App\Form;
|
||||
|
||||
use App\Service\ResetPassword\Event\ResetPasswordConfirmEvent;
|
||||
use App\Service\ResetPassword\Event\ResetPasswordEvent;
|
||||
use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\EmailType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
|
||||
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
@@ -13,9 +11,9 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class RequestPasswordConfirmType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder->add('password',RepeatedType::class,[
|
||||
$builder->add('password', RepeatedType::class, [
|
||||
'required' => true,
|
||||
'type' => PasswordType::class,
|
||||
'first_options' => [
|
||||
@@ -23,12 +21,15 @@ class RequestPasswordConfirmType extends AbstractType
|
||||
],
|
||||
'second_options' => [
|
||||
'label' => 'Confirmer le mot de passe',
|
||||
]
|
||||
],
|
||||
'invalid_message' => 'Les deux mots de passe doivent correspondre.',
|
||||
]);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefault('data_class',ResetPasswordConfirmEvent::class);
|
||||
$resolver->setDefaults([
|
||||
'data_class' => ResetPasswordConfirmEvent::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,16 +10,18 @@ use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class RequestPasswordRequestType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
public function buildForm(FormBuilderInterface $builder, array $options): void
|
||||
{
|
||||
$builder->add('email',EmailType::class,[
|
||||
$builder->add('email', EmailType::class, [
|
||||
'required' => true,
|
||||
'label' => 'Email de votre compte',
|
||||
]);
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
public function configureOptions(OptionsResolver $resolver): void
|
||||
{
|
||||
$resolver->setDefault('data_class',ResetPasswordEvent::class);
|
||||
$resolver->setDefaults([
|
||||
'data_class' => ResetPasswordEvent::class,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,33 +4,43 @@ namespace App\Security;
|
||||
|
||||
class PasswordGenerator
|
||||
{
|
||||
private $length;
|
||||
private $charsLower = 'abcdefghijklmnopqrstuvwxyz';
|
||||
private $charsUpper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
private $digits = '0123456789';
|
||||
private $specials = '@#_-'; // Caractères spéciaux limités
|
||||
private int $length;
|
||||
private string $charsLower = 'abcdefghijklmnopqrstuvwxyz';
|
||||
private string $charsUpper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||
private string $digits = '0123456789';
|
||||
private string $specials = '@#_-'; // Caractères spéciaux limités
|
||||
|
||||
public function __construct($length = 12)
|
||||
public function __construct(int $length = 12)
|
||||
{
|
||||
if ($length < 4) {
|
||||
throw new \InvalidArgumentException('La longueur du mot de passe doit être au moins 4.');
|
||||
}
|
||||
$this->length = $length;
|
||||
}
|
||||
|
||||
public function generate()
|
||||
public function generate(): string
|
||||
{
|
||||
$password = [];
|
||||
$password[] = $this->charsLower[random_int(0, strlen($this->charsLower) - 1)];
|
||||
$password[] = $this->charsUpper[random_int(0, strlen($this->charsUpper) - 1)];
|
||||
$password[] = $this->digits[random_int(0, strlen($this->digits) - 1)];
|
||||
$password[] = $this->specials[random_int(0, strlen($this->specials) - 1)];
|
||||
// Garantir la présence d'au moins un caractère de chaque type
|
||||
$password = [
|
||||
$this->randomChar($this->charsLower),
|
||||
$this->randomChar($this->charsUpper),
|
||||
$this->randomChar($this->digits),
|
||||
$this->randomChar($this->specials),
|
||||
];
|
||||
|
||||
$allChars = $this->charsLower . $this->charsUpper . $this->digits . $this->specials;
|
||||
|
||||
for ($i = 4; $i < $this->length; $i++) {
|
||||
$password[] = $allChars[random_int(0, strlen($allChars) - 1)];
|
||||
$password[] = $this->randomChar($allChars);
|
||||
}
|
||||
|
||||
shuffle($password);
|
||||
|
||||
return implode('', $password);
|
||||
}
|
||||
|
||||
private function randomChar(string $chars): string
|
||||
{
|
||||
return $chars[random_int(0, strlen($chars) - 1)];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,10 +3,6 @@
|
||||
namespace App\Security;
|
||||
|
||||
use App\Entity\Account;
|
||||
use App\Entity\User as AppUser;
|
||||
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
||||
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
|
||||
use Symfony\Component\Security\Core\Exception\AccountExpiredException;
|
||||
use Symfony\Component\Security\Core\Exception\CustomUserMessageAccountStatusException;
|
||||
use Symfony\Component\Security\Core\User\UserCheckerInterface;
|
||||
use Symfony\Component\Security\Core\User\UserInterface;
|
||||
@@ -15,15 +11,17 @@ class UserChecker implements UserCheckerInterface
|
||||
{
|
||||
public function checkPreAuth(UserInterface $user): void
|
||||
{
|
||||
if(!$user instanceof Account) {
|
||||
if (!$user instanceof Account) {
|
||||
return;
|
||||
}
|
||||
if(!$user->isActif()) {
|
||||
throw new CustomUserMessageAccountStatusException('Votre compte à été désactivée');
|
||||
|
||||
if (!$user->isActif()) {
|
||||
throw new CustomUserMessageAccountStatusException('Votre compte a été désactivé.');
|
||||
}
|
||||
}
|
||||
|
||||
public function checkPostAuth(UserInterface $user): void
|
||||
{
|
||||
// Pas de vérifications post-authentification pour l’instant
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user