src/ClientBundle/Controller/AuthController.php line 259

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