<?php
namespace App\Controller;
use App\Entity\Company\Brand;
use App\Entity\Mail;
use App\Entity\User;
use App\Form\User\ForgottenPasswordType;
use App\Form\User\UserResetPasswordType;
use App\Service\MailerService;
use App\Service\SecurityService;
use Doctrine\ORM\EntityManagerInterface;
use KnpU\OAuth2ClientBundle\Client\ClientRegistry;
use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
use League\OAuth2\Client\Provider\Google;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController as Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends Controller
{
/**
* @Route("/connexion", name="login")
*/
public function loginAction(AuthenticationUtils $authUtils)
{
$error = $authUtils->getLastAuthenticationError();
$lastUsername = $authUtils->getLastUsername();
return $this->render('Security/login.html.twig', array(
'last_username' => $lastUsername,
'error' => $error,
));
}
/**
* @Route("/logout", name="logout")
*/
public function logoutAction()
{
}
/**
* @Route(
* "/enregistrer",
* name="user_register"
* )
*/
public function register()
{
return $this->render('Security/login.html.twig', array(
'last_username' => null,
'error' => null,
));
}
/**
* @Route(
* "/mot-de-passe-oublie/changement/{tokenUrl}",
* requirements={"tokenUrl"=".*"},
* name="forgotten_password_confirmation"
* )
*/
public function reinitPasswordConfirmation(
Request $request,
EntityManagerInterface $em,
SecurityService $securityService,
$tokenUrl
){
$token = $securityService->encode(Brand::class, $tokenUrl);
/** @var $user User */
$user = $em->getRepository(User::class)->findOneByUserToken($token);
if (null === $user || $user->getUserTokenType() !== User::RESETPWD) {
throw new NotFoundHttpException('app.error.404');
}
$form = $this->createForm(UserResetPasswordType::class);
if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
$data = $form->getData();
$password = $securityService->encode(User::class, $data->getPassword());
$user->setIsActive(true);
$user->setPassword($password);
$em->persist($user);
$em->flush();
$request->getSession()->getFlashBag()->add('success', 'app.reinit_pwd.confirmation');
return $this->redirectToRoute('login');
}
return $this->render('Security/forgottenPasswordReset.html.twig', array('form' => $form->createView(),));
}
/**
* @Route(
* "/mot-de-passe-oublie/{type}",
* defaults={"type"="forgotten"},
* requirements={"type"=".*"},
* name="forgotten_password"
* )
* @Route(
* "/premiere-connexion/{type}",
* defaults={"type"="first"},
* requirements={"type"=".*"},
* name="first_connexion"
* )
*/
public function forgottenPasswordAction(
Request $request,
EntityManagerInterface $em,
SecurityService $securityService,
MailerService $mailerService,
$type
){
$form = $this->createForm(ForgottenPasswordType::class);
if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) {
$data = $form->getData();
/** @var $user User */
$user = $em->getRepository(User::class)->findOneByEmail($data['email']);
if (null !== $user) {
$token = $securityService->createToken();
$user->setUserToken($token['encoded']);
$user->setUserTokenType(User::RESETPWD);
$em->persist($user);
$em->flush();
$data = $form->getData();
$vars = ['user' => $user, 'email' => $data['email'], 'token' => $token['url']];
$mail = $em->getRepository(Mail::class)->getOneBySlug('reintialisation-de-mot-de-passe');
$mailerService->sendGenericMail($mail, $vars);
}
$request->getSession()->getFlashBag()->add('success', 'app.reinit_pwd.success');
return $this->redirectToRoute('index');
}
return $this->render('Security/forgottenPassword.html.twig', ['form' => $form->createView(), 'type' => $type]);
}
/**
* @Route("/connexion/google/check", name="connect_google_check")
* @Route("/connexion/facebook/check", name="connect_facebook_check")
* @Route("/connexion/amazon/check", name="connect_amazon_check")
*/
public function connectNetworkCheck()
{
return $this->redirectToRoute('index');
}
/**
* @Route(
* "/connexion/social/{network}",
* requirements={"network"=".*"},
* name="connect_network_start"
* )
*/
public function connectNeworkStart(ClientRegistry $clientRegistry, $network)
{
if ($network === 'amazon') {
$scope = ['profile'];
} else {
$scope = ['email'];
}
return $clientRegistry
->getClient($network.'_main')
->redirect($scope,[]);
}
/**
* @Route("/connexion/facebook/check2", name="connect_facebook_check2")
*/
public function connectCheckFacebook2(Request $request, EntityManagerInterface $em, ClientRegistry $clientRegistry)
{
/** @var \KnpU\OAuth2ClientBundle\Client\Provider\FacebookClient $client */
$client = $clientRegistry->getClient('facebook_main');
try {
// the exact class depends on which provider you're using
/** @var \League\OAuth2\Client\Provider\FacebookUser $facebookUser */
$facebookUser = $client->fetchUser();
//$facebookUser->getId(),
//$facebookUser->getName(),
//$facebookUser->getEmail(),
//$facebookUser->getPictureUrl()
$user = $em->getRepository(User::class)->findOneBy(['email' => $facebookUser->getEmail()]);
if (null === $user) {
}
die;
} catch (IdentityProviderException $e) {
// something went wrong!
// probably you should return the reason to the user
dump('oups',$e->getMessage()); die;
}
}
/**
* @Route("/connexion/google/check2", name="connect_google_check2")
*/
public function connectCheckGoogle(Request $request, EntityManagerInterface $em, ClientRegistry $clientRegistry)
{
/** @var \KnpU\OAuth2ClientBundle\Client\Provider\GoogleClient $client */
$client = $clientRegistry->getClient('google_main');
try {
// the exact class depends on which provider you're using
/** @var \League\OAuth2\Client\Provider\GoogleUser $googleUser */
$googleUser = $client->fetchUser();
//$googleUser->getId(),
//$googleUser->getName(),
//$googleUser->getEmail(),
//$googleUser->getAvatar()
$user = $em->getRepository(User::class)->findOneBy(['email' => $googleUser->getEmail()]);
if (null === $user) {
}
} catch (IdentityProviderException $e) {
// something went wrong!
// probably you should return the reason to the user
dump('oups',$e->getMessage()); die;
}
return $this->redirectToRoute('index');
}
}