<?php
namespace App\Controller;
use App\Services\SetPasswordService;
use Pimcore\Controller\FrontendController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Symfony\Component\Routing\Annotation\Route;
use CustomerManagementFrameworkBundle\CustomerProvider\CustomerProviderInterface;
use CustomerManagementFrameworkBundle\CustomerSaveValidator\Exception\DuplicateCustomerException;
use CustomerManagementFrameworkBundle\Security\Authentication\LoginManagerInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use App\Model\DataObject\Customer;
use App\Services\PasswordRecoveryService;
use Pimcore\Translation\Translator;
#use Pimcore\Model\DataObject\Customer;
use App\Form\RegistrationFormHandler;
use App\Form\RegistrationFormType;
use App\Form\LoginFormType;
class AccountController extends FrontendController
{
/**
* @Template
*
* @param Request $request
* @param CustomerProviderInterface $customerProvider
* @param RegistrationFormHandler $registrationFormHandler
* @param RegistrationFormType $registrationFormType
*
* @return array
*/
public function registerAction(
Request $request,
CustomerProviderInterface $customerProvider,
LoginManagerInterface $loginManager,
RegistrationFormHandler $registrationFormHandler,
) {
$errors = [];
$success = false;
$customer = $customerProvider->create();
$formData = $registrationFormHandler->buildFormData($customer);
$form = $this->createForm(RegistrationFormType::class, $formData, ['hidePassword' => false]);
$form->handleRequest($request);
// Try to create user from valid submitted form
if ($form->isSubmitted() && $form->isValid()) {
$fields = $form->getData();
$registrationFormHandler->updateCustomerFromForm($customer, $form);
$customer->setActive(true);
try {
$customer->save();
$success = true;
} catch (DuplicateCustomerException $e) {
// FIXME: error melding met link naar pass reset pagina
$errors[] = 'Er bestaat al een account op dit e-mailadres'; /*$translator->trans(
'account.customer-already-exists',
[
$customer->getEmail(),
$urlGenerator->generate('account-password-send-recovery', ['email' => $customer->getEmail()])
]
);*/
} catch (\Exception $e) {
$errors[] = $e->getMessage();
}
}
// Return errors if form is invalid
if ($form->isSubmitted() && !$form->isValid()) {
foreach ($form->getErrors() as $error) {
$errors[] = $error->getMessage();
}
}
// Just return the template if it is specified
return $this->render('register.html.twig', [
'form' => $form->createView(),
'success' => $success,
'errors' => $errors
]);
}
/**
* @Route("/account/login", name="account-login")
*
* @param AuthenticationUtils $authenticationUtils
* @param Request $request
* @param UserInterface|null $user
*
* @return Response|RedirectResponse
*/
public function loginAction(
AuthenticationUtils $authenticationUtils,
Request $request,
UserInterface $user = null
) {
//redirect user to index page if logged in
if ($user && $this->isGranted('ROLE_USER')) {
return $this->redirectToRoute('account-index');
}
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
$formData = [
'_username' => $lastUsername
];
$form = $this->createForm(LoginFormType::class, $formData, [
'action' => $this->generateUrl('account-login'),
]);
//store referer in session to get redirected after login
if (!$request->get('no-referer-redirect')) {
$request->getSession()->set('_security.main.target_path', $request->headers->get('referer'));
}
return $this->render('login.html.twig', [
'form' => $form->createView(),
'error' => $error,
'hideBreadcrumbs' => true
]);
}
/**
* @Route("/account/send-password-recovery", name="account-password-send-recovery")
*
* @param Request $request
* @param PasswordRecoveryService $service
* @param Translator $translator
*
* @return Response
*
* @throws \Exception
*/
public function sendPasswordRecoveryMailAction(Request $request, PasswordRecoveryService $service, Translator $translator)
{
if ($request->isMethod(Request::METHOD_POST)) {
try {
$customer = $service->sendRecoveryMail($request->get('email', ''), $this->document->getProperty('password_reset_mail'));
if (!$customer instanceof Customer) {
throw new \Exception('Invalid Customer');
}
$this->addFlash('success', $translator->trans('account.reset-mail-sent-when-possible'));
} catch (\Exception $e) {
$this->addFlash('danger', $e->getMessage());
}
return $this->redirectToRoute('account-login', ['no-referer-redirect' => true]);
}
return $this->render('account/send_password_recovery_mail.html.twig', [
'emailPrefill' => $request->get('email')
]);
}
/**
* @Route("/account/reset-password", name="account-reset-password")
*
* @param Request $request
* @param PasswordRecoveryService $service
* @param Translator $translator
*
* @return Response|RedirectResponse
*/
public function resetPasswordAction(Request $request, PasswordRecoveryService $service, Translator $translator)
{
$token = $request->get('token');
$customer = $service->getCustomerByToken($token);
$error = '';
if (!$customer) {
//TODO render error page
throw new NotFoundHttpException('Invalid token');
}
if ($request->isMethod(Request::METHOD_POST)) {
$newPassword = $request->get('password');
if (strlen($newPassword) < 8){
$error = $translator->trans('account.password-length-error');
return $this->render('account/reset_password.html.twig', [
'hideBreadcrumbs' => true,
'token' => $token,
'email' => $customer->getEmail(),
'error' => $error
]);
}
$service->setPassword($token, $newPassword);
$this->addFlash('success', $translator->trans('account.password-reset-successful'));
return $this->redirectToRoute('account-login', ['no-referer-redirect' => true]);
}
return $this->render('account/reset_password.html.twig', [
'hideBreadcrumbs' => true,
'token' => $token,
'email' => $customer->getEmail(),
'error' => $error
]);
}
/**
* @Route("/account/set-password", name="account-set-password")
*
* @param Request $request
* @param SetPasswordService $service
* @param Translator $translator
*
* @return Response|RedirectResponse
*/
public function setPasswordAction(Request $request, SetPasswordService $setPasswordService, Translator $translator)
{
$token = $request->get('token');
$customer = $setPasswordService->getCustomerByToken($token);
$error = '';
if (!$customer) {
//TODO render error page
throw new NotFoundHttpException('Invalid token');
}
if ($request->isMethod(Request::METHOD_POST)){
$newPassword = $request->get('password');
if (strlen($newPassword) < 8){
$error = $translator->trans('account.password-length-error');
return $this->render('account/set_password.html.twig', [
'hideBreadcrumbs' => true,
'token' => $token,
'email' => $customer->getEmail(),
'error' => $error
]);
}
$setPasswordService->setPassword($token, $newPassword);
return $this->redirectToRoute('account-login', ['no-referer-redirect' => true]);
}
return $this->render('account/set_password.html.twig', [
'hideBreadcrumbs' => true,
'token' => $token,
'email' => $customer->getEmail(),
'error' => $error
]);
}
/**
* @Route("/account/change-password", name="account-change-password")
* @Security("is_granted('ROLE_USER')")
* @param Request $request
* @return void
*/
public function changePasswordAction(Request $request, SetPasswordService $setPasswordService, Translator $translator)
{
$user = $this->getUser();
$error = '';
if ($request->isMethod(Request::METHOD_POST)){
$newPassword = $request->get('password');
if (strlen($newPassword) < 8){
$error = $translator->trans('account.password-length-error');
return $this->render('account/change_password.html.twig', [
'hideBreadcrumbs' => true,
'error' => $error
]);
}
$setPasswordService->changePassword($user, $newPassword);
return $this->redirectToRoute('account-index', ['no-referer-redirect' => true]);
}
return $this->render('account/change_password.html.twig', [
'hideBreadcrumbs' => true,
'error' => $error
]);
}
}