<?php
namespace App\Controller\Security;
use App\Controller\Abstract\MainController;
use App\Entity\User;
use App\Form\ChangePasswordForm;
use App\Form\SignUpForm;
use App\Service\Email\AccountActivate;
use App\Service\Email\ResetPassword;
use App\Service\Utils\PasswordChecker;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Validator\ValidatorInterface;
class SecurityController extends MainController
{
/**
* @Route("/login", name="app_login")
*/
public function login(
Request $request,
AuthenticationUtils $authenticationUtils
): Response {
if ($this->isLogged()) {
return $this->redirectToRoute('index');
}
return $this->response($request, 'main\\website\\login.html.twig', [
'last_username' => $authenticationUtils->getLastUsername(),
'error' => $authenticationUtils->getLastAuthenticationError(),
]);
}
/**
* @Route("/reset-password", name="reset_password")
*/
public function resetPassword(
Request $request,
ResetPassword $resetPassword,
ValidatorInterface $validator
): Response {
if ($this->isLogged()) {
return $this->redirectToRoute('index');
}
$form = $this->createFormBuilder(null)
->add(
'email',
EmailType::class,
[
'label' => 'Adresa de email',
'attr' => [
'autofocus' => true,
],
'constraints' => [
new Email(['message' => '"{{ value }}" nu este o adresa de email valida']),
],
]
)
->add(
'send',
SubmitType::class,
[
'label' => 'Trimite link-ul de resetare parola',
]
)
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted()) {
$errors = $validator->validate($form);
if ($errors) {
foreach ($errors as $error) {
return new JsonResponse(
[
'success' => false,
'message' => $error->getMessage()
]
);
}
}
if ($form->isValid() === false) {
return new JsonResponse(
[
'success' => false,
'message' => 'Eroare neasteptata!'
]
);
}
$data = $form->getData();
$userRep = $this->em->getRepository(User::CLASS);
$user = $userRep->findOneBy(
[
'email' => $data['email']
]
);
if ($user) {
$resetPassword->send($user);
return new JsonResponse(
[
'success' => true,
'message' => sprintf('Ok! Am trimis un link pentru schimbarea parolei pe "%s"', $user->getEmail())
]
);
} else {
return new JsonResponse(
[
'success' => false,
'message' => sprintf('Nu am gasit un cont cu adresa de email "%s"', $data['email'])
]
);
}
}
return $this->response($request, 'main\\website\\resetPassword.html.twig', [
'message' => false,
'form' => $form->createView(),
]);
}
/**
* @Route("/resend-activation-code", name="resend_activation_code")
*/
public function resendActivationCode(
Request $request,
AccountActivate $accountActivate,
ValidatorInterface $validator
): Response {
if ($this->isLogged()) {
return $this->redirectToRoute('index');
}
$form = $this->createFormBuilder(null)
->add(
'email',
EmailType::class,
[
'label' => 'Adresa de email',
'attr' => [
'autofocus' => true,
],
'constraints' => [
new Email(['message' => '{{ value }} nu este o adresa de email valida'])
]
]
)
->add(
'send',
SubmitType::class,
[
'label' => 'Trimite link-ul de activare a contului',
]
)
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted()) {
$errors = $validator->validate($form);
if ($errors) {
foreach ($errors as $error) {
return new JsonResponse(
[
'success' => false,
'message' => $error->getMessage()
]
);
}
}
if ($form->isValid() === false) {
return new JsonResponse(
[
'success' => false,
'message' => 'Eroare neasteptata!'
]
);
}
$data = $form->getData();
$userRep = $this->em->getRepository(User::CLASS);
$user = $userRep->findOneBy(
[
'email' => $data['email']
]
);
if ($user && $user->getStatusId() === User::STATUS_NOT_ACTIVATED) {
$accountActivate->send($user);
return new JsonResponse(
[
'success' => true,
'message' => sprintf('Ok! Am trimis un link de activare pe adresa de email "%s"', $user->getEmail())
]
);
} else {
return new JsonResponse(
[
'success' => false,
'message' => sprintf('Nu am gasit un cont neactivat cu adresa de email "%s"', $data['email'])
]
);
}
}
return $this->response($request, 'main\\website\\resendActivationCode.html.twig', [
'message' => false,
'form' => $form->createView(),
]);
}
/**
* @Route("/logout", name="app_logout")
*/
public function logout(): void
{
}
/**
* @Route("/change-password", name="change_password", methods={"POST"})
*/
public function changePassword(
Request $request,
UserPasswordHasherInterface $hasher,
ValidatorInterface $validator,
PasswordChecker $passwordChecker
): Response {
$form = $this->createForm(ChangePasswordForm::class);
$form->handleRequest($request);
if ($form->isSubmitted()) {
$data = $form->getData();
$errors = $validator->validate($form);
if ($errors) {
foreach ($errors as $error) {
return new JsonResponse(
[
'success' => false,
'message' => $error->getMessage()
]
);
}
}
if ($form->isValid() === false) {
return new JsonResponse(
[
'success' => false,
'message' => 'Eroare neasteptata!'
]
);
}
if (!$hasher->isPasswordValid($this->getUser(), $data['oldPassword'])) {
return new JsonResponse(['success' => false, 'message' => 'Parola curenta nu este valida!']);
} elseif (($lastError = $passwordChecker->check($data['newPassword'], $data['newPassword2'])) !== true) {
return new JsonResponse(['success' => false, 'message' => $lastError]);
}
$user = $this->getUser();
$user->setPassword($hasher->hashPassword($user, $data['newPassword']));
$this->em->persist($user);
$this->em->flush();
return new JsonResponse(['success' => true, 'message' => 'Parola a fost schimbata!']);
}
return $this->response(
$request,
'main\\user\\account\\changePassword.html.twig',
[
'form' => $form->createView(),
],
[
'swalClass' => 'smallSize',
]
);
}
/**
* @Route("/inrolare", name="sign_up")
*/
public function signUp(
Request $request,
ValidatorInterface $validator
): Response {
$form = $this->createForm(SignUpForm::class);
$form->handleRequest($request);
if ($form->isSubmitted()) {
$data = $form->getData();
$errors = $validator->validate($form);
if ($errors) {
foreach ($errors as $error) {
return new JsonResponse(
[
'success' => false,
'message' => $error->getMessage()
]
);
}
}
if ($form->isValid() === false) {
return new JsonResponse(
[
'success' => false,
'message' => 'Eroare neasteptata!'
]
);
}
return new JsonResponse(['success' => true, 'message' => 'Parola a fost schimbata!']);
}
return $this->response(
$request,
'main\\website\\signUp.html.twig',
[
'form' => $form->createView(),
],
[
'swalClass' => 'smallSize',
]
);
}
}