<?php
namespace ClientBundle\Controller;
use AdminBundle\Controller\BaseController;
use AdminBundle\Entity\Account;
use AdminBundle\Entity\Settings;
use AdminBundle\Entity\User;
use AdminBundle\Helpers\MandrillManager;
use ClientBundle\Form\AuthType;
use ClientBundle\Form\RegisterType;
use FOS\UserBundle\Form\Factory\FactoryInterface;
use FOS\UserBundle\Model\UserManagerInterface;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Exception\AccountStatusException;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class AuthController extends BaseController {
public function loginAction(AuthenticationUtils $authenticationUtils) {
$flash = $this->get('session')->getFlashBag();
$error = $authenticationUtils->getLastAuthenticationError();
if ($error) {
$flash->add(
'danger',
'Something went wrong. '. $error->getMessage()
);
} else {
$flash->add(
'info',
'<strong>First time logging in?</strong> '.
'<br/> * Use the "<b>Reset your password</b>" feature to receive a password reset link, or'.
'<br/> * Use the "<b>Authentication Link</b>" feature to receive a quick-login link'.
'<br/><b>Note:</b> The links expire once used.'
);
}
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('@Client/Auth/Login/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
]);
}
public function resetRequestAction(Request $request) {
$default = true;
$flash = $this->get('session')->getFlashBag();
$form = $this->createForm(
AuthType::class
);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->get('email')->getData();
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
$user = $userManager->findUserByUsernameOrEmail($email);
if (null === $user) {
$default = false;
$flash->add(
'danger',
'The provided email address "<b>'. $email. '</b>" does not belong to any existing users.'
);
} else {
$ttl = $this->getParameter('fos_user.resetting.retry_ttl');
if (!$user->isPasswordRequestNonExpired($ttl)) {
/** @var $tokenGenerator TokenGeneratorInterface */
$tokenGenerator = $this->get('fos_user.util.token_generator');
$user->setConfirmationToken(
$tokenGenerator->generateToken()
);
$user->setPasswordRequestedAt(new \DateTime());
$userManager->updateUser($user);
$this->sendResettingEmail($user);
$default = false;
$flash->add(
'success',
'A password reset link has been sent to the provided email.<br/>
Please access the link to reset your password.<br/>
<b>Note:</b> You can only request a password reset link once every'.
' <b>'. ceil($ttl / 3600). '</b> hours.<br/>'.
"If you didn't receive an email try checking your spam folder ".
'or try again later.'
);
} else {
$default = false;
$flash->add(
'warning',
'You can only request a password reset link once every'.
' <b>'. ceil($ttl / 3600). '</b> hours.<br/> Please try again later.'
);
}
}
}
if ($default) {
$flash->add(
'success',
'Please insert your email address below to receive a password reset link.'
);
}
return $this->render('@Client/Auth/Reset/request.html.twig',[
'form' => $form->createView(),
]);
}
public function resetProcessAction(Request $request, $token) {
$flash = $this->get('session')->getFlashBag();
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
$user = $userManager->findUserByConfirmationToken($token);
if (
!$user ||
!$user->isPasswordRequestNonExpired(
$this->getParameter('fos_user.resetting.token_ttl')
)
) {
$flash->add(
'danger',
'The password reset link is invalid.'
);
$flash->add(
'info',
'Use the "<b>Reset your password</b>" feature below to receive a new reset link.'
);
return new RedirectResponse(
$this->generateUrl('client_login')
);
}
/** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
$formFactory = $this->get('fos_user.resetting.form.factory');
$form = $formFactory->createForm();
$form->setData($user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$user->setConfirmationToken(null);
$user->setPasswordRequestedAt(null);
$user->setEnabled(true);
$message = $this->get('translator')->trans(
'resetting.flash.success',
[],
'FOSUserBundle'
);
$flash->add('success', $message);
$response = new RedirectResponse(
$this->generateUrl('client_homepage')
);
return $this->authUser($user, $request, $response);
} else {
$flash->add(
'success',
'Please set and confirm your new password below.'
);
}
return $this->render(
'@Client/Auth/Reset/form.html.twig', [
'token' => $token,
'form' => $form->createView(),
]
);
}
public function sendResettingEmail($user) {
$em = $this->get('doctrine');
$phone = $user->getPhone();
$name = $user->getFullname();
if (
$client = $em->getRepository(Account::class)->findOneBy([
'user' => $user->getId(),
])
) {
$phone = $client->getPhone();
$name = $client->getName();
}
$url = $this->get('router')->generate(
'client_reset_process',[
'token' => $user->getConfirmationToken(),
], UrlGeneratorInterface::ABSOLUTE_URL
);
$from = $em->getRepository(Settings::class)->getOfficeEmail();
$mandrillManager = $this->get('mandrill.manager');
$mandrillManager->sendTemplate(
MandrillManager::$TEMPLATE_EMAIL_NOTIFICATION_GENERAL,
[],
[
'subject' => 'Twelve Transfers - Password Reset',
'from_email' => $from,
'to' => [
'email' => $user->getEmail(),
'name' => $user->getUsername(),
'type' => 'to',
],
'global_merge_vars' => [
'request_email' => $user->getEmail(),
'subject' => 'Password Reset',
"content" => $this->renderView(
'@Client/Auth/Reset/email.html.twig', [
'url' => $url
]
),
],
],
true
);
}
protected function authUser($user, $request, $response) {
/** @var $userManager UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
/** @var $loginManager \FOS\UserBundle\Security\LoginManagerInterface */
$loginManager = $this->get('fos_user.security.login_manager');
try {
$firewallName = 'client';
$loginManager->logInUser($firewallName, $user, $response);
$this->get(
'authentication.handler.login_success_handler'
)->onAuthenticationSuccess(
$request,
$this->get('security.token_storage')->getToken()
);
$user->setLastLogin(new \DateTime());
} catch (AccountStatusException $ex) {
if ($this->has('logger')) {
$this->get('logger')->warning(
sprintf(
'Unable to login user %d',
$user->getId()
)
);
}
}
$userManager->updateUser($user);
return $response;
}
public function authProcessAction(Request $request, $token, $url) {
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
$user = $userManager->findUserByConfirmationToken($token);
if (!$user) {
$flash = $this->get('session')->getFlashBag();
$flash->add(
'danger',
'The authentication link is invalid.'
);
return new RedirectResponse(
$this->generateUrl('client_login')
);
}
$user->setConfirmationToken(null);
if ($url) {
$url = urldecode($url);
} else {
$url = $this->generateUrl('client_homepage');
}
$response = new RedirectResponse($url);
return $this->authUser($user, $request, $response);
}
public function authLinkAction(Request $request) {
$default = true;
$to = $request->query->get('to');
$flash = $this->get('session')->getFlashBag();
$form = $this->createForm(
AuthType::class
);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->get('email')->getData();
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
$user = $userManager->findUserByUsernameOrEmail($email);
if (null === $user) {
$default = false;
$flash->add(
'danger',
'The provided email address "<b>'. $email.'</b>" does not belong to any existing users.'
);
} else {
/** @var $tokenGenerator TokenGeneratorInterface */
$tokenGenerator = $this->get('fos_user.util.token_generator');
$user->setConfirmationToken(
$tokenGenerator->generateToken()
);
$userManager->updateUser($user);
$this->sendAuthEmail($user, $to);
$default = false;
$flash->add(
'success',
'The authentication link has been sent. Please check your email.'
);
}
}
if ($default) {
$flash->add(
'success',
'Please insert your email address below to receive an authentication link.'
);
}
return $this->render(
'@Client/Auth/Login/link.html.twig', [
'form' => $form->createView()
]
);
}
public function sendAuthEmail($user, $to = null) {
$url = $this->get('router') ->generate(
'client_auth_process', [
'token' => $user->getConfirmationToken(),
'url' => urlencode($to)
], UrlGeneratorInterface::ABSOLUTE_URL
);
$from = $this->get('doctrine')->getRepository(Settings::class)->getOfficeEmail();
$mandrillManager = $this->get('mandrill.manager');
$mandrillManager->sendTemplate(
MandrillManager::$TEMPLATE_EMAIL_NOTIFICATION_GENERAL,
[],
[
'subject' => 'Twelve Transfers - Authentication Link',
'from_email' => $from,
'to' => [
'email' => $user->getEmail(),
'name' => $user->getUsername(),
'type' => 'to',
],
'global_merge_vars' => [
"content" => $this->renderView(
'@Client/Auth/Login/email.html.twig', [
'url' => $url
]
),
'request_email' => $user->getEmail(),
'subject' => 'Authentication Link',
],
],
true
);
}
public function signUpAction(Request $request) {
$error = false;
$flash = $this->get('session')->getFlashBag();
$form = $this->createForm(
AuthType::class
);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$email = $form->get('email')->getData();
/** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
$user = $userManager->findUserByUsernameOrEmail($email);
if (null === $user) {
$now = new \DateTime();
$user = $userManager->createUser();
$user->setUsername($email);
$user->setUsernameCanonical($email);
$user->setEmail($email);
$user->setEmailCanonical($email);
$user->setPassword(md5(uniqid()));
$user->addRole('ROLE_CLIENT');
$user->setCreatedAt($now);
$user->setUpdatedAt($now);
$user->setEnabled(true);
$userManager->updateUser($user);
$flash->add(
'success',
'Your account has been created!'
);
return new RedirectResponse(
$this->generateUrl('client_login')
);
} else {
$error = true;
$flash->add(
'danger',
'This email is already being used. Use a different email address.'
);
}
}
if (!$error) {
$flash->add(
'success',
'Please insert your email address below to create an account.'
);
}
return $this->render('@Client/Auth/Register/signup.html.twig',[
'form' => $form->createView(),
]);
}
public function registerAction(
Request $request
) {
$error = false;
$flash = $this->get('session')->getFlashBag();
/** @var $userManager UserManagerInterface */
$userManager = $this->get('fos_user.user_manager');
$user = $userManager->createUser();
$form = $this->createForm(
RegisterType::class,
$user
);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$now = new \DateTime();
$user = $form->getData();
$email = $user->getEmail();
$found = $userManager->findUserByUsernameOrEmail($email);
if (null === $found) {
$user->setUsername($email);
$user->setUsernameCanonical($email);
$user->setEmail($email);
$user->setEmailCanonical($email);
$user->addRole('ROLE_CLIENT');
$user->setCreatedAt($now);
$user->setUpdatedAt($now);
$user->setEnabled(true);
$userManager->updateUser($user);
$flash->add(
'success',
'Your account has been created!'
);
$response = new RedirectResponse(
$this->generateUrl('client_homepage')
);
return $this->authUser($user, $request, $response);
} else {
$error = true;
$flash->add(
'danger',
'This email is already being used. Use a different email address.'
);
}
}
if (!$error) {
$flash->add(
'success',
'Please fill in your details below to create an account.'
);
}
return $this->render(
'@Client/Auth/Register/register.html.twig', [
'form' => $form->createView()
]
);
}
}