<?php
namespace App\Controller;
use Symfony\Component\Mime\Email;
use App\Repository\ContactsRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
public function login(AuthenticationUtils $authenticationUtils): Response
{
// if ($this->getUser()) {
// return $this->redirectToRoute('target_path');
// }
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
}
public function login_api(SessionInterface $session, ContactsRepository $repoContacts): Response
{
$user = $this->getUser();
//si user est archivé
$contact = $repoContacts->findOneBy(['mail' => $user->getUserIdentifier()]);
return $this->json(
$user,
200,
[],
['groups' => 'affichageContact']
);
}
public function connexion1(
Request $request,
ContactsRepository $repoContacts,
EntityManagerInterface $manager,
MailerInterface $mailer,
ContainerInterface $container
): Response {
//recupération du json envoyer par le client
$jsonRecu = $request->getContent();
//recupération du mail
$obj = json_decode($jsonRecu);
$mailRecu = $obj->{'mail'};
//est ce que le mail est bien au format mail
//si le mail est valide on recherche le contact correspondant
$nouvelUtilisateur = $repoContacts->findOneBy(['mail' => $mailRecu]);
if (empty($nouvelUtilisateur)) {
//si il n'y a pas de contact avec le mail envoyé
//retourne un json avec un message d'erreur
return $this->json([
'status' => 401,
'message' => "L'email est invalide"
], 401);
} else {
//si il y a un contact avec le mail
//verifi si c'est bien la 1er connexion
if ($nouvelUtilisateur->getPassword() == '12345') {
//genere un mot de passe aleatoire
$caracteres = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$longueurMax = strlen($caracteres);
$chaineAleatoire = '';
for ($i = 0; $i < 6; $i++) {
$chaineAleatoire .= $caracteres[rand(0, $longueurMax - 1)];
}
//hash le mot de passe
$passwordHasher = $container->get("security.password_encoder");
$password = $passwordHasher->encodePassword($nouvelUtilisateur, $chaineAleatoire);
//l'enregistre en base
$nouvelUtilisateur->setPassword($password);
$manager->persist($nouvelUtilisateur);
$manager->flush();
//envoi du mail au contact
$email = (new Email())
->from($_ENV["APP_MAIL_PROD"] === "0" ? 'nicolas@cco-info.fr' : 'noreply@cco-cloud.fr') // il faut voir la configuration du smtp !!!!!
->to($mailRecu)
->subject('Votre mot de passe CCO')
->html("<p>Votre mot de passe est : " . $chaineAleatoire . "</p>");
$mailer->send($email);
//retourne un json avec un message comme quoi le mot de passe a été envoyé par mail
return $this->json([
'status' => 200,
'message' => "Le mot de passe vous a été envoyé par mail"
], 200);
} else {
//retourne un json avec un message d'erreur
return $this->json([
'status' => 401,
'message' => "Ceci n'est pas votre première connexion"
], 401);
}
}
}
/**
* Route("/logout", name="app_logout")
*/
public function logout()
{
return $this->json("");
// throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
}
/**
* getRoles Retourne la liste de tous les roles
*
* @param ContainerInterface $container
*
* @return [type]
*/
public function getRoles(ContainerInterface $container)
{
$roles = [];
foreach ($container->getParameter('security.role_hierarchy.roles') as $name => $value) {
$roles[] = $name;
}
return $this->json($roles, 201);
}
public function changePassword(
Request $request,
ContactsRepository $repoContacts,
EntityManagerInterface $manager,
ContainerInterface $container
) {
$jsonRecu = json_decode($request->getContent());
$newPassword = $jsonRecu->newPassword;
$idUser = $jsonRecu->idUser;
$user = $repoContacts->findOneBy(['mail' => $this->getUser()->getUserIdentifier()]);
if ($user->getId() !== $idUser)
return $this->json([
'status' => 410,
'message' => "Vous n'avez pas les droits"
], 410);
$passwordHasher = $container->get("security.password_encoder");
$newPassword = $passwordHasher->encodePassword($user, $newPassword);
$user->setPassword($newPassword);
$manager->persist($user);
$manager->flush();
return $this->json(true, 200);
}
/**
* @IsGranted("ROLE_COMMERCIAL")
*/
public function sendNewPassword($id, ContactsRepository $repoContacts, EntityManagerInterface $manager, MailerInterface $mailer, ContainerInterface $container): Response
{
//si le mail est valide on recherche le contact correspondant
$nouvelUtilisateur = $repoContacts->findOneBy(['id' => $id]);
if (empty($nouvelUtilisateur)) {
return $this->json([
'status' => 401,
'message' => "Il n'y a pas d'utilisateur pour l'identifiant spécifié"
], 401);
} else {
$caracteres = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$longueurMax = strlen($caracteres);
$chaineAleatoire = '';
for ($i = 0; $i < 6; $i++) {
$chaineAleatoire .= $caracteres[rand(0, $longueurMax - 1)];
}
$passwordHasher = $container->get("security.password_encoder");
$password = $passwordHasher->encodePassword($nouvelUtilisateur, $chaineAleatoire);
$nouvelUtilisateur->setPassword($password);
$manager->persist($nouvelUtilisateur);
$manager->flush();
//envoi du mail au contact
$email = (new Email())
->from($_ENV["APP_MAIL_PROD"] === "0" ? 'nicolas@cco-info.fr' : 'noreply@cco-cloud.fr') // il faut voir la configuration du smtp !!!!!
->to($nouvelUtilisateur->getMail())
->subject('Votre mot de passe CCO')
->html("<p>Votre mot de passe est : " . $chaineAleatoire . "</p>");
$mailer->send($email);
//retourne un json avec un message comme quoi le mot de passe a été envoyé par mail
return $this->json([
'status' => 200,
'message' => "Le mot de passe a été envoyé par mail"
], 200);
}
}
}