src/AdminBundle/Controller/AuthController.php line 21

Open in your IDE?
  1. <?php
  2. namespace AdminBundle\Controller;
  3. use AdminBundle\Controller\BaseController;
  4. use AdminBundle\Entity\Settings;
  5. use AdminBundle\Entity\User;
  6. use AdminBundle\Form\AuthType;
  7. use AdminBundle\Helpers\MandrillManager;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Symfony\Component\Security\Core\Exception\AccountStatusException;
  12. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  13. class AuthController extends BaseController {
  14. public function resetRequestAction(Request $request) {
  15. $default = true;
  16. $flash = $this->get('session')->getFlashBag();
  17. $form = $this->createForm(
  18. AuthType::class
  19. );
  20. $form->handleRequest($request);
  21. if ($form->isSubmitted() && $form->isValid()) {
  22. $email = $form->get('email')->getData();
  23. $userManager = $this->get('sonata.user.user_manager');
  24. $user = $userManager->findUserByUsernameOrEmail($email);
  25. if (null === $user) {
  26. $default = false;
  27. $flash->add(
  28. 'danger',
  29. 'The provided email address "<b>'. $email. '</b>" does not belong to any existing users.'
  30. );
  31. } else {
  32. $ttl = $this->getParameter('fos_user.resetting.retry_ttl');
  33. if (!$user->isPasswordRequestNonExpired($ttl)) {
  34. $tokenGenerator = $this->get('fos_user.util.token_generator');
  35. $user->setConfirmationToken(
  36. $tokenGenerator->generateToken()
  37. );
  38. $user->setPasswordRequestedAt(new \DateTime());
  39. $userManager->save($user);
  40. $this->sendResettingEmail($user);
  41. $default = false;
  42. $flash->add(
  43. 'success',
  44. 'A password reset link has been sent to the provided email.<br/>
  45. Please access the link to reset your password.<br/>
  46. <b>Note:</b> You can only request a password reset link once every'.
  47. ' <b>'. ceil($ttl / 3600). '</b> hours.<br/>'.
  48. "If you didn't receive an email try checking your spam folder ".
  49. 'or try again later.'
  50. );
  51. } else {
  52. $default = false;
  53. $flash->add(
  54. 'warning',
  55. 'You can only request a password reset link once every'.
  56. ' <b>'. ceil($ttl / 3600). '</b> hours.<br/> Please try again later.'
  57. );
  58. }
  59. }
  60. }
  61. if ($default) {
  62. $flash->add(
  63. 'success',
  64. 'Please insert your email address below to receive a password reset link.'
  65. );
  66. }
  67. return $this->render('@Admin/Auth/Reset/request.html.twig',[
  68. 'form' => $form->createView(),
  69. ]);
  70. }
  71. public function resetProcessAction(Request $request, $token) {
  72. $flash = $this->get('session')->getFlashBag();
  73. $userManager = $this->get('sonata.user.user_manager');
  74. $user = $userManager->findUserByConfirmationToken($token);
  75. if (
  76. !$user ||
  77. !$user->isPasswordRequestNonExpired(
  78. $this->getParameter('fos_user.resetting.token_ttl')
  79. )
  80. ) {
  81. $flash->add(
  82. 'danger',
  83. 'The password reset link is invalid.'
  84. );
  85. $flash->add(
  86. 'info',
  87. 'Use the "<b>Reset your password</b>" feature below to receive a new reset link.'
  88. );
  89. return new RedirectResponse(
  90. $this->generateUrl('sonata_user_admin_security_login')
  91. );
  92. }
  93. $formFactory = $this->get('fos_user.resetting.form.factory');
  94. $form = $formFactory->createForm();
  95. $form->setData($user);
  96. $form->handleRequest($request);
  97. if ($form->isSubmitted() && $form->isValid()) {
  98. $user->setConfirmationToken(null);
  99. $user->setPasswordRequestedAt(null);
  100. $user->setEnabled(true);
  101. $message = $this->get('translator')->trans(
  102. 'resetting.flash.success',
  103. [],
  104. 'FOSUserBundle'
  105. );
  106. $flash->add('success', $message);
  107. $response = new RedirectResponse(
  108. $this->generateUrl('admin_homepage')
  109. );
  110. return $this->authUser($user, $request, $response);
  111. } else {
  112. $flash->add(
  113. 'success',
  114. 'Please set and confirm your new password below.'
  115. );
  116. }
  117. return $this->render(
  118. '@Admin/Auth/Reset/form.html.twig', [
  119. 'token' => $token,
  120. 'form' => $form->createView(),
  121. ]
  122. );
  123. }
  124. public function sendResettingEmail($user) {
  125. $em = $this->get('doctrine');
  126. $url = $this->get('router')->generate(
  127. 'admin_reset_process',[
  128. 'token' => $user->getConfirmationToken(),
  129. ], UrlGeneratorInterface::ABSOLUTE_URL
  130. );
  131. $from = $this->get('settings_repo')->getOfficeEmail();
  132. $mandrillManager = $this->get('mandrill.manager');
  133. $mandrillManager->sendTemplate(
  134. MandrillManager::$TEMPLATE_EMAIL_NOTIFICATION_GENERAL,
  135. [],
  136. [
  137. 'subject' => 'Twelve Transfers - Password Reset',
  138. 'from_email' => $from,
  139. 'to' => [
  140. 'email' => $user->getEmail(),
  141. 'name' => $user->getUsername(),
  142. 'type' => 'to',
  143. ],
  144. 'global_merge_vars' => [
  145. 'request_email' => $user->getEmail(),
  146. 'subject' => 'Password Reset',
  147. "content" => $this->renderView(
  148. '@Admin/Auth/Reset/email.html.twig', [
  149. 'url' => $url
  150. ]
  151. ),
  152. ],
  153. ],
  154. true
  155. );
  156. }
  157. protected function authUser($user, $request, $response) {
  158. $userManager = $this->get('sonata.user.user_manager');
  159. $loginManager = $this->get('login.manager');
  160. try {
  161. $firewallName = 'admin';
  162. $loginManager->logInUser($firewallName, $user, $response);
  163. $this->get(
  164. 'authentication.handler.login_success_handler'
  165. )->onAuthenticationSuccess(
  166. $request,
  167. $this->get('security.token_storage')->getToken()
  168. );
  169. $user->setLastLogin(new \DateTime());
  170. } catch (AccountStatusException $ex) {
  171. if ($this->has('logger')) {
  172. $this->get('logger')->warning(
  173. sprintf(
  174. 'Unable to login user %d',
  175. $user->getId()
  176. )
  177. );
  178. }
  179. }
  180. $userManager->save($user);
  181. return $response;
  182. }
  183. }