<?php
namespace AdminBundle\Controller;
use AdminBundle\Controller\BaseController;
use AdminBundle\Entity\Settings;
use AdminBundle\Entity\User;
use AdminBundle\Form\AuthType;
use AdminBundle\Helpers\MandrillManager;
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 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();
$userManager = $this->get('sonata.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)) {
$tokenGenerator = $this->get('fos_user.util.token_generator');
$user->setConfirmationToken(
$tokenGenerator->generateToken()
);
$user->setPasswordRequestedAt(new \DateTime());
$userManager->save($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('@Admin/Auth/Reset/request.html.twig',[
'form' => $form->createView(),
]);
}
public function resetProcessAction(Request $request, $token) {
$flash = $this->get('session')->getFlashBag();
$userManager = $this->get('sonata.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('sonata_user_admin_security_login')
);
}
$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('admin_homepage')
);
return $this->authUser($user, $request, $response);
} else {
$flash->add(
'success',
'Please set and confirm your new password below.'
);
}
return $this->render(
'@Admin/Auth/Reset/form.html.twig', [
'token' => $token,
'form' => $form->createView(),
]
);
}
public function sendResettingEmail($user) {
$em = $this->get('doctrine');
$url = $this->get('router')->generate(
'admin_reset_process',[
'token' => $user->getConfirmationToken(),
], UrlGeneratorInterface::ABSOLUTE_URL
);
$from = $this->get('settings_repo')->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(
'@Admin/Auth/Reset/email.html.twig', [
'url' => $url
]
),
],
],
true
);
}
protected function authUser($user, $request, $response) {
$userManager = $this->get('sonata.user.user_manager');
$loginManager = $this->get('login.manager');
try {
$firewallName = 'admin';
$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->save($user);
return $response;
}
}