src/ClientBundle/Controller/AuthController.php line 24

Open in your IDE?
  1. <?php
  2. namespace ClientBundle\Controller;
  3. use AdminBundle\Controller\BaseController;
  4. use AdminBundle\Entity\Account;
  5. use AdminBundle\Entity\Settings;
  6. use AdminBundle\Entity\User;
  7. use AdminBundle\Helpers\MandrillManager;
  8. use ClientBundle\Form\AuthType;
  9. use ClientBundle\Form\RegisterType;
  10. use FOS\UserBundle\Form\Factory\FactoryInterface;
  11. use FOS\UserBundle\Model\UserManagerInterface;
  12. use FOS\UserBundle\Util\TokenGeneratorInterface;
  13. use Symfony\Component\HttpFoundation\RedirectResponse;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  16. use Symfony\Component\Security\Core\Exception\AccountStatusException;
  17. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  18. class AuthController extends BaseController {
  19. public function loginAction(AuthenticationUtils $authenticationUtils) {
  20. $flash = $this->get('session')->getFlashBag();
  21. $error = $authenticationUtils->getLastAuthenticationError();
  22. if ($error) {
  23. $flash->add(
  24. 'danger',
  25. 'Something went wrong. '. $error->getMessage()
  26. );
  27. } else {
  28. $flash->add(
  29. 'info',
  30. '<strong>First time logging in?</strong> '.
  31. '<br/> * Use the "<b>Reset your password</b>" feature to receive a password reset link, or'.
  32. '<br/> * Use the "<b>Authentication Link</b>" feature to receive a quick-login link'.
  33. '<br/><b>Note:</b> The links expire once used.'
  34. );
  35. }
  36. $lastUsername = $authenticationUtils->getLastUsername();
  37. return $this->render('@Client/Auth/Login/login.html.twig', [
  38. 'last_username' => $lastUsername,
  39. 'error' => $error,
  40. ]);
  41. }
  42. public function resetRequestAction(Request $request) {
  43. $default = true;
  44. $flash = $this->get('session')->getFlashBag();
  45. $form = $this->createForm(
  46. AuthType::class
  47. );
  48. $form->handleRequest($request);
  49. if ($form->isSubmitted() && $form->isValid()) {
  50. $email = $form->get('email')->getData();
  51. /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
  52. $userManager = $this->get('fos_user.user_manager');
  53. $user = $userManager->findUserByUsernameOrEmail($email);
  54. if (null === $user) {
  55. $default = false;
  56. $flash->add(
  57. 'danger',
  58. 'The provided email address "<b>'. $email. '</b>" does not belong to any existing users.'
  59. );
  60. } else {
  61. $ttl = $this->getParameter('fos_user.resetting.retry_ttl');
  62. if (!$user->isPasswordRequestNonExpired($ttl)) {
  63. /** @var $tokenGenerator TokenGeneratorInterface */
  64. $tokenGenerator = $this->get('fos_user.util.token_generator');
  65. $user->setConfirmationToken(
  66. $tokenGenerator->generateToken()
  67. );
  68. $user->setPasswordRequestedAt(new \DateTime());
  69. $userManager->updateUser($user);
  70. $this->sendResettingEmail($user);
  71. $default = false;
  72. $flash->add(
  73. 'success',
  74. 'A password reset link has been sent to the provided email.<br/>
  75. Please access the link to reset your password.<br/>
  76. <b>Note:</b> You can only request a password reset link once every'.
  77. ' <b>'. ceil($ttl / 3600). '</b> hours.<br/>'.
  78. "If you didn't receive an email try checking your spam folder ".
  79. 'or try again later.'
  80. );
  81. } else {
  82. $default = false;
  83. $flash->add(
  84. 'warning',
  85. 'You can only request a password reset link once every'.
  86. ' <b>'. ceil($ttl / 3600). '</b> hours.<br/> Please try again later.'
  87. );
  88. }
  89. }
  90. }
  91. if ($default) {
  92. $flash->add(
  93. 'success',
  94. 'Please insert your email address below to receive a password reset link.'
  95. );
  96. }
  97. return $this->render('@Client/Auth/Reset/request.html.twig',[
  98. 'form' => $form->createView(),
  99. ]);
  100. }
  101. public function resetProcessAction(Request $request, $token) {
  102. $flash = $this->get('session')->getFlashBag();
  103. /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
  104. $userManager = $this->get('fos_user.user_manager');
  105. $user = $userManager->findUserByConfirmationToken($token);
  106. if (
  107. !$user ||
  108. !$user->isPasswordRequestNonExpired(
  109. $this->getParameter('fos_user.resetting.token_ttl')
  110. )
  111. ) {
  112. $flash->add(
  113. 'danger',
  114. 'The password reset link is invalid.'
  115. );
  116. $flash->add(
  117. 'info',
  118. 'Use the "<b>Reset your password</b>" feature below to receive a new reset link.'
  119. );
  120. return new RedirectResponse(
  121. $this->generateUrl('client_login')
  122. );
  123. }
  124. /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */
  125. $formFactory = $this->get('fos_user.resetting.form.factory');
  126. $form = $formFactory->createForm();
  127. $form->setData($user);
  128. $form->handleRequest($request);
  129. if ($form->isSubmitted() && $form->isValid()) {
  130. $user->setConfirmationToken(null);
  131. $user->setPasswordRequestedAt(null);
  132. $user->setEnabled(true);
  133. $message = $this->get('translator')->trans(
  134. 'resetting.flash.success',
  135. [],
  136. 'FOSUserBundle'
  137. );
  138. $flash->add('success', $message);
  139. $response = new RedirectResponse(
  140. $this->generateUrl('client_homepage')
  141. );
  142. return $this->authUser($user, $request, $response);
  143. } else {
  144. $flash->add(
  145. 'success',
  146. 'Please set and confirm your new password below.'
  147. );
  148. }
  149. return $this->render(
  150. '@Client/Auth/Reset/form.html.twig', [
  151. 'token' => $token,
  152. 'form' => $form->createView(),
  153. ]
  154. );
  155. }
  156. public function sendResettingEmail($user) {
  157. $em = $this->get('doctrine');
  158. $phone = $user->getPhone();
  159. $name = $user->getFullname();
  160. if (
  161. $client = $em->getRepository(Account::class)->findOneBy([
  162. 'user' => $user->getId(),
  163. ])
  164. ) {
  165. $phone = $client->getPhone();
  166. $name = $client->getName();
  167. }
  168. $url = $this->get('router')->generate(
  169. 'client_reset_process',[
  170. 'token' => $user->getConfirmationToken(),
  171. ], UrlGeneratorInterface::ABSOLUTE_URL
  172. );
  173. $from = $em->getRepository(Settings::class)->getOfficeEmail();
  174. $mandrillManager = $this->get('mandrill.manager');
  175. $mandrillManager->sendTemplate(
  176. MandrillManager::$TEMPLATE_EMAIL_NOTIFICATION_GENERAL,
  177. [],
  178. [
  179. 'subject' => 'Twelve Transfers - Password Reset',
  180. 'from_email' => $from,
  181. 'to' => [
  182. 'email' => $user->getEmail(),
  183. 'name' => $user->getUsername(),
  184. 'type' => 'to',
  185. ],
  186. 'global_merge_vars' => [
  187. 'request_email' => $user->getEmail(),
  188. 'subject' => 'Password Reset',
  189. "content" => $this->renderView(
  190. '@Client/Auth/Reset/email.html.twig', [
  191. 'url' => $url
  192. ]
  193. ),
  194. ],
  195. ],
  196. true
  197. );
  198. }
  199. protected function authUser($user, $request, $response) {
  200. /** @var $userManager UserManagerInterface */
  201. $userManager = $this->get('fos_user.user_manager');
  202. /** @var $loginManager \FOS\UserBundle\Security\LoginManagerInterface */
  203. $loginManager = $this->get('fos_user.security.login_manager');
  204. try {
  205. $firewallName = 'client';
  206. $loginManager->logInUser($firewallName, $user, $response);
  207. $this->get(
  208. 'authentication.handler.login_success_handler'
  209. )->onAuthenticationSuccess(
  210. $request,
  211. $this->get('security.token_storage')->getToken()
  212. );
  213. $user->setLastLogin(new \DateTime());
  214. } catch (AccountStatusException $ex) {
  215. if ($this->has('logger')) {
  216. $this->get('logger')->warning(
  217. sprintf(
  218. 'Unable to login user %d',
  219. $user->getId()
  220. )
  221. );
  222. }
  223. }
  224. $userManager->updateUser($user);
  225. return $response;
  226. }
  227. public function authProcessAction(Request $request, $token, $url) {
  228. /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
  229. $userManager = $this->get('fos_user.user_manager');
  230. $user = $userManager->findUserByConfirmationToken($token);
  231. if (!$user) {
  232. $flash = $this->get('session')->getFlashBag();
  233. $flash->add(
  234. 'danger',
  235. 'The authentication link is invalid.'
  236. );
  237. return new RedirectResponse(
  238. $this->generateUrl('client_login')
  239. );
  240. }
  241. $user->setConfirmationToken(null);
  242. if ($url) {
  243. $url = urldecode($url);
  244. } else {
  245. $url = $this->generateUrl('client_homepage');
  246. }
  247. $response = new RedirectResponse($url);
  248. return $this->authUser($user, $request, $response);
  249. }
  250. public function authLinkAction(Request $request) {
  251. $default = true;
  252. $to = $request->query->get('to');
  253. $flash = $this->get('session')->getFlashBag();
  254. $form = $this->createForm(
  255. AuthType::class
  256. );
  257. $form->handleRequest($request);
  258. if ($form->isSubmitted() && $form->isValid()) {
  259. $email = $form->get('email')->getData();
  260. /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
  261. $userManager = $this->get('fos_user.user_manager');
  262. $user = $userManager->findUserByUsernameOrEmail($email);
  263. if (null === $user) {
  264. $default = false;
  265. $flash->add(
  266. 'danger',
  267. 'The provided email address "<b>'. $email.'</b>" does not belong to any existing users.'
  268. );
  269. } else {
  270. /** @var $tokenGenerator TokenGeneratorInterface */
  271. $tokenGenerator = $this->get('fos_user.util.token_generator');
  272. $user->setConfirmationToken(
  273. $tokenGenerator->generateToken()
  274. );
  275. $userManager->updateUser($user);
  276. $this->sendAuthEmail($user, $to);
  277. $default = false;
  278. $flash->add(
  279. 'success',
  280. 'The authentication link has been sent. Please check your email.'
  281. );
  282. }
  283. }
  284. if ($default) {
  285. $flash->add(
  286. 'success',
  287. 'Please insert your email address below to receive an authentication link.'
  288. );
  289. }
  290. return $this->render(
  291. '@Client/Auth/Login/link.html.twig', [
  292. 'form' => $form->createView()
  293. ]
  294. );
  295. }
  296. public function sendAuthEmail($user, $to = null) {
  297. $url = $this->get('router') ->generate(
  298. 'client_auth_process', [
  299. 'token' => $user->getConfirmationToken(),
  300. 'url' => urlencode($to)
  301. ], UrlGeneratorInterface::ABSOLUTE_URL
  302. );
  303. $from = $this->get('doctrine')->getRepository(Settings::class)->getOfficeEmail();
  304. $mandrillManager = $this->get('mandrill.manager');
  305. $mandrillManager->sendTemplate(
  306. MandrillManager::$TEMPLATE_EMAIL_NOTIFICATION_GENERAL,
  307. [],
  308. [
  309. 'subject' => 'Twelve Transfers - Authentication Link',
  310. 'from_email' => $from,
  311. 'to' => [
  312. 'email' => $user->getEmail(),
  313. 'name' => $user->getUsername(),
  314. 'type' => 'to',
  315. ],
  316. 'global_merge_vars' => [
  317. "content" => $this->renderView(
  318. '@Client/Auth/Login/email.html.twig', [
  319. 'url' => $url
  320. ]
  321. ),
  322. 'request_email' => $user->getEmail(),
  323. 'subject' => 'Authentication Link',
  324. ],
  325. ],
  326. true
  327. );
  328. }
  329. public function signUpAction(Request $request) {
  330. $error = false;
  331. $flash = $this->get('session')->getFlashBag();
  332. $form = $this->createForm(
  333. AuthType::class
  334. );
  335. $form->handleRequest($request);
  336. if ($form->isSubmitted() && $form->isValid()) {
  337. $email = $form->get('email')->getData();
  338. /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
  339. $userManager = $this->get('fos_user.user_manager');
  340. $user = $userManager->findUserByUsernameOrEmail($email);
  341. if (null === $user) {
  342. $now = new \DateTime();
  343. $user = $userManager->createUser();
  344. $user->setUsername($email);
  345. $user->setUsernameCanonical($email);
  346. $user->setEmail($email);
  347. $user->setEmailCanonical($email);
  348. $user->setPassword(md5(uniqid()));
  349. $user->addRole('ROLE_CLIENT');
  350. $user->setCreatedAt($now);
  351. $user->setUpdatedAt($now);
  352. $user->setEnabled(true);
  353. $userManager->updateUser($user);
  354. $flash->add(
  355. 'success',
  356. 'Your account has been created!'
  357. );
  358. return new RedirectResponse(
  359. $this->generateUrl('client_login')
  360. );
  361. } else {
  362. $error = true;
  363. $flash->add(
  364. 'danger',
  365. 'This email is already being used. Use a different email address.'
  366. );
  367. }
  368. }
  369. if (!$error) {
  370. $flash->add(
  371. 'success',
  372. 'Please insert your email address below to create an account.'
  373. );
  374. }
  375. return $this->render('@Client/Auth/Register/signup.html.twig',[
  376. 'form' => $form->createView(),
  377. ]);
  378. }
  379. public function registerAction(
  380. Request $request
  381. ) {
  382. $error = false;
  383. $flash = $this->get('session')->getFlashBag();
  384. /** @var $userManager UserManagerInterface */
  385. $userManager = $this->get('fos_user.user_manager');
  386. $user = $userManager->createUser();
  387. $form = $this->createForm(
  388. RegisterType::class,
  389. $user
  390. );
  391. $form->handleRequest($request);
  392. if ($form->isSubmitted() && $form->isValid()) {
  393. $now = new \DateTime();
  394. $user = $form->getData();
  395. $email = $user->getEmail();
  396. $found = $userManager->findUserByUsernameOrEmail($email);
  397. if (null === $found) {
  398. $user->setUsername($email);
  399. $user->setUsernameCanonical($email);
  400. $user->setEmail($email);
  401. $user->setEmailCanonical($email);
  402. $user->addRole('ROLE_CLIENT');
  403. $user->setCreatedAt($now);
  404. $user->setUpdatedAt($now);
  405. $user->setEnabled(true);
  406. $userManager->updateUser($user);
  407. $flash->add(
  408. 'success',
  409. 'Your account has been created!'
  410. );
  411. $response = new RedirectResponse(
  412. $this->generateUrl('client_homepage')
  413. );
  414. return $this->authUser($user, $request, $response);
  415. } else {
  416. $error = true;
  417. $flash->add(
  418. 'danger',
  419. 'This email is already being used. Use a different email address.'
  420. );
  421. }
  422. }
  423. if (!$error) {
  424. $flash->add(
  425. 'success',
  426. 'Please fill in your details below to create an account.'
  427. );
  428. }
  429. return $this->render(
  430. '@Client/Auth/Register/register.html.twig', [
  431. 'form' => $form->createView()
  432. ]
  433. );
  434. }
  435. }