Advertisement
Guest User

Untitled

a guest
Feb 8th, 2016
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.40 KB | None | 0 0
  1. <?php
  2.  
  3.  
  4.  
  5. namespace MyUserBundleController;
  6.  
  7. use FOSUserBundleControllerResettingController as FOSResettingController;
  8. use FOSUserBundleFOSUserEvents;
  9. use FOSUserBundleEventFormEvent;
  10. use FOSUserBundleEventGetResponseUserEvent;
  11. use FOSUserBundleEventFilterUserResponseEvent;
  12. use FOSUserBundleModelUserInterface;
  13. use SymfonyBundleFrameworkBundleControllerController;
  14. use SymfonyComponentHttpFoundationRequest;
  15. use SymfonyComponentHttpFoundationRedirectResponse;
  16. use SymfonyComponentHttpKernelExceptionNotFoundHttpException;
  17. use MyUserBundleEntityUser;
  18. use SensioBundleFrameworkExtraBundleConfigurationRoute;
  19. use MyUserBundleUserEvents;
  20.  
  21. /**
  22. * Controller managing the resetting of the password
  23. *
  24. * @author Thibault Duplessis <thibault.duplessis@gmail.com>
  25. * @author Christophe Coevoet <stof@notk.org>
  26. */
  27. class ResettingController extends FOSResettingController
  28. {
  29.  
  30.  
  31. /**
  32. * Request reset user password: submit form and send email
  33. */
  34. public function sendEmailAction(Request $request)
  35. {
  36. $username = $request->request->get('username');
  37.  
  38. /** @var $user UserInterface */
  39. $user = $this->get('fos_user.user_manager')->findUserByUsernameOrEmail($username);
  40.  
  41. if (null === $user) {
  42. return $this->render('FOSUserBundle:Resetting:request.html.twig', array(
  43. 'invalid_username' => $username
  44. ));
  45. }
  46.  
  47. if ($user->isPasswordRequestNonExpired($this->container->getParameter('fos_user.resetting.token_ttl'))) {
  48. return $this->render('FOSUserBundle:Resetting:passwordAlreadyRequested.html.twig');
  49. }
  50.  
  51. if (null === $user->getConfirmationToken()) {
  52. /** @var $tokenGenerator FOSUserBundleUtilTokenGeneratorInterface */
  53. $tokenGenerator = $this->get('fos_user.util.token_generator');
  54. $user->setConfirmationToken($tokenGenerator->generateToken());
  55. }
  56.  
  57. $this->get('fos_user.mailer')->sendResettingEmailMessage($user);
  58. $user->setPasswordRequestedAt(new DateTime());
  59. $user->setPasswordRequestedClicked(false);
  60. $this->get('fos_user.user_manager')->updateUser($user);
  61.  
  62. $_SESSION['views'] = 1;
  63.  
  64. return new RedirectResponse($this->generateUrl('fos_user_resetting_check_email',
  65. array('email' => $this->getObfuscatedEmail($user))
  66. ));
  67. }
  68.  
  69.  
  70. /**
  71. * Reset user password
  72. */
  73. public function resetAction(Request $request, $token)
  74. {
  75. /** @var $formFactory FOSUserBundleFormFactoryFactoryInterface */
  76. $formFactory = $this->get('fos_user.resetting.form.factory');
  77. /** @var $userManager FOSUserBundleModelUserManagerInterface */
  78. $userManager = $this->get('fos_user.user_manager');
  79. /** @var $dispatcher SymfonyComponentEventDispatcherEventDispatcherInterface */
  80. $dispatcher = $this->get('event_dispatcher');
  81.  
  82. $user = $userManager->findUserByConfirmationToken($token);
  83.  
  84.  
  85. //Here there is a reaction for using expired token (column confirmation token === null) - redirection to page with possibility of sending another one.
  86. if (null === $user) {
  87. return $this->redirectToRoute('fos_user_invalid_token_click');
  88.  
  89. }
  90.  
  91.  
  92.  
  93. if ($_SESSION['views'] == 1){
  94. $event = new GetResponseUserEvent($user, $request);
  95. $dispatcher->dispatch(UserEvents::RESETTING_RESET_CLICK_CHECK, $event);
  96.  
  97. if (null !== $event->getResponse()) {
  98. return $event->getResponse();
  99. } else {
  100. $user->setPasswordRequestedClicked(true);
  101. $userManager->updateUser($user);
  102. $_SESSION['views']++;
  103. $_SESSION['views']++;
  104. }
  105. } else {
  106. $_SESSION['views']++;
  107. }
  108.  
  109. if ($_SESSION['views'] == 5){
  110. $event = new GetResponseUserEvent($user, $request);
  111. $dispatcher->dispatch(UserEvents::RESETTING_RESET_CLICK_CHECK, $event);
  112.  
  113. if (null !== $event->getResponse()) {
  114. return $event->getResponse();
  115. }
  116. }
  117.  
  118.  
  119.  
  120. $event = new GetResponseUserEvent($user, $request);
  121. $dispatcher->dispatch(FOSUserEvents::RESETTING_RESET_INITIALIZE, $event);
  122.  
  123. if (null !== $event->getResponse()) {
  124. return $event->getResponse();
  125. }
  126.  
  127.  
  128.  
  129. $form = $formFactory->createForm();
  130. $form->setData($user);
  131.  
  132.  
  133.  
  134.  
  135. $form->handleRequest($request);
  136.  
  137.  
  138. if ($form->isValid()) {
  139. $event = new FormEvent($form, $request);
  140. $dispatcher->dispatch(FOSUserEvents::RESETTING_RESET_SUCCESS, $event);
  141.  
  142.  
  143. $userManager->updateUser($user);
  144.  
  145. if (null === $response = $event->getResponse()) {
  146. $url = $this->generateUrl('fos_user_profile_show');
  147. $response = new RedirectResponse($url);
  148. }
  149.  
  150. $dispatcher->dispatch(FOSUserEvents::RESETTING_RESET_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
  151.  
  152. return $response;
  153. }
  154.  
  155. $userManager->updateUser($user);
  156. return $this->render('FOSUserBundle:Resetting:reset.html.twig', array(
  157. 'token' => $token,
  158. 'form' => $form->createView(),
  159. ));
  160. }
  161.  
  162.  
  163.  
  164. public function InvalidTokenTtlMessageAction() {
  165. return $this->render('UserBundle:Resetting:invalidTokenTtlRes.html.twig');
  166. }
  167.  
  168. public function InvalidTokenClickMessageAction() {
  169. return $this->render('UserBundle:Resetting:invalidTokenClickRes.html.twig');
  170. }
  171.  
  172.  
  173. }
  174.  
  175. <?php
  176.  
  177.  
  178.  
  179. namespace MyUserBundleEventListener;
  180.  
  181. use FOSUserBundleEventListenerResettingListener as FOSResettingListener;
  182. use FOSUserBundleFOSUserEvents;
  183. use MyUserBundleUserEvents;
  184. use FOSUserBundleEventFormEvent;
  185. use FOSUserBundleEventGetResponseUserEvent;
  186. use SymfonyComponentEventDispatcherEventSubscriberInterface;
  187. use SymfonyComponentHttpFoundationRedirectResponse;
  188. use SymfonyComponentRoutingGeneratorUrlGeneratorInterface;
  189. use MyUserBundleEntityUser;
  190.  
  191. class ResettingListener extends FOSResettingListener
  192. {
  193. private $router;
  194. private $tokenTtl;
  195.  
  196. public function __construct(UrlGeneratorInterface $router, $tokenTtl)
  197. {
  198. $this->router = $router;
  199. $this->tokenTtl = $tokenTtl;
  200. }
  201.  
  202. public static function getSubscribedEvents()
  203. {
  204. return array(
  205. UserEvents::RESETTING_RESET_CLICK_CHECK => 'onResettingClickCheck',
  206. FOSUserEvents::RESETTING_RESET_INITIALIZE => 'onResettingResetInitialize',
  207. FOSUserEvents::RESETTING_RESET_SUCCESS => 'onResettingResetSuccess',
  208.  
  209. );
  210. }
  211.  
  212. public function onResettingClickCheck(GetResponseUserEvent $event){
  213. //checking if link hasn't expired due to its usage
  214. if ($event->getUser()->isPasswordRequestedClicked() === true){
  215. $event->setResponse(new RedirectResponse($this->router->generate('fos_user_invalid_token_click')));
  216. }
  217. }
  218.  
  219. public function onResettingResetInitialize(GetResponseUserEvent $event)
  220. {
  221. //checking if link hasn't expired due to exceeding token Ttl
  222. if (!$event->getUser()->isPasswordRequestNonExpired($this->tokenTtl)) {
  223. $event->setResponse(new RedirectResponse($this->router->generate('fos_user_invalid_token_ttl')));
  224. }
  225.  
  226. }
  227.  
  228. public function onResettingResetSuccess(FormEvent $event)
  229. {
  230.  
  231. /** @var $user FOSUserBundleModelUserInterface */
  232. $user = $event->getForm()->getData();
  233.  
  234. $user->setConfirmationToken(null);
  235. $user->setPasswordRequestedAt(null);
  236. $user->setEnabled(true);
  237.  
  238.  
  239.  
  240. }
  241. }
  242.  
  243. <?php
  244.  
  245. namespace MyUserBundleEntity;
  246.  
  247. use DoctrineORMMapping as ORM;
  248. use FOSUserBundleModelUser as BaseUser;
  249. use MyBackendBundleEntity;
  250. use GedmoMappingAnnotation as Gedmo;
  251. use SymfonyComponentSecurityCoreUserUserInterface;
  252. use DoctrineCommonCollectionsArrayCollection;
  253.  
  254.  
  255. /**
  256. * User
  257. *
  258. * @ORMTable(name="user")
  259. * @ORMEntity(repositoryClass="MyUserBundleRepositoryUserRepository")
  260. */
  261. class User extends BaseUser
  262. {
  263. /**
  264. * @var int
  265. *
  266. * @ORMColumn(name="id", type="integer", nullable = false)
  267. * @ORMId
  268. * @ORMGeneratedValue(strategy="AUTO")
  269. */
  270. protected $id;
  271.  
  272.  
  273. /**
  274. * @GedmoSlug(fields={"username"})
  275. * @ORMColumn(length=128, unique=true)
  276. */
  277. private $slug;
  278.  
  279.  
  280. /**
  281. *
  282. * @ORMManyToMany(targetEntity="MyBackendBundleEntityEvent", mappedBy="users")
  283. * @ORMJoinColumn(name="id", referencedColumnName="id", nullable=false)
  284. * @ORMOrderBy({"date"="ASC"})
  285. *
  286. */
  287. protected $events;
  288.  
  289.  
  290.  
  291. /**
  292. * @var DoctrineCommonCollectionsArrayCollection $event_org
  293. * @ORMOneToMany(targetEntity="MyBackendBundleEntityEvent", mappedBy="user_org", cascade={"all"})
  294. */
  295. protected $event_org;
  296.  
  297.  
  298.  
  299. /**
  300. * @var DateTime
  301. * @ORMColumn(name="confirmation_token_requested_at", type="datetime")
  302. */
  303. protected $confirmationTokenRequestedAt;
  304.  
  305.  
  306. /**
  307. * @var boolean
  308. * @ORMColumn(name="password_requested_clicked", type="boolean", nullable=true)
  309. */
  310. protected $passwordRequestedClicked;
  311.  
  312.  
  313.  
  314.  
  315.  
  316. public function __toString()
  317. {
  318. return $this->getUsername();
  319. }
  320.  
  321.  
  322. /**
  323. * Get id
  324. *
  325. * @return int
  326. */
  327. public function getId()
  328. {
  329. return $this->id;
  330. }
  331.  
  332. public function __construct()
  333. {
  334. parent::__construct();
  335. $this->event_org = new DoctrineCommonCollectionsArrayCollection();
  336.  
  337.  
  338. }
  339.  
  340. /**
  341. * Add event
  342. *
  343. * @param MyBackendBundleEntityEvent $event
  344. *
  345. * @return User
  346. */
  347. public function addEvent(MyBackendBundleEntityEvent $event)
  348. {
  349. $this->events[] = $event;
  350. $event->addUser($this);
  351.  
  352. return $this;
  353. }
  354.  
  355. /**
  356. * Remove event
  357. *
  358. * @param MyBackendBundleEntityEvent $event
  359. */
  360. public function removeEvent(MyBackendBundleEntityEvent $event)
  361. {
  362. $this->events->removeElement($event);
  363. }
  364.  
  365. /**
  366. * Get events
  367. *
  368. * @return DoctrineCommonCollectionsCollection
  369. */
  370. public function getEvents()
  371. {
  372. return $this->events;
  373. }
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380. /**
  381. * Set slug
  382. *
  383. * @param string $slug
  384. *
  385. * @return User
  386. */
  387. public function setSlug($slug)
  388. {
  389. $this->slug = $slug;
  390.  
  391. return $this;
  392. }
  393.  
  394. /**
  395. * Get slug
  396. *
  397. * @return string
  398. */
  399. public function getSlug()
  400. {
  401. return $this->slug;
  402. }
  403.  
  404. /**
  405. * Add eventOrg
  406. *
  407. * @param MyBackendBundleEntityEvent $eventOrg
  408. *
  409. * @return User
  410. */
  411. public function addEventOrg(MyBackendBundleEntityEvent $eventOrg)
  412. {
  413. $this->event_org[] = $eventOrg;
  414.  
  415. return $this;
  416. }
  417.  
  418. /**
  419. * Remove eventOrg
  420. *
  421. * @param MyBackendBundleEntityEvent $eventOrg
  422. */
  423. public function removeEventOrg(MyBackendBundleEntityEvent $eventOrg)
  424. {
  425. $this->event_org->removeElement($eventOrg);
  426. }
  427.  
  428. /**
  429. * Get eventOrg
  430. *
  431. * @return DoctrineCommonCollectionsCollection
  432. */
  433. public function getEventOrg()
  434. {
  435. return $this->event_org;
  436. }
  437.  
  438. /**
  439. * Set confirmationTokenRequestedAt
  440. *
  441. * @param DateTime $confirmationTokenRequestedAt
  442. *
  443. * @return User
  444. */
  445. public function setConfirmationTokenRequestedAt(DateTime $date = null)
  446. {
  447. $this->confirmationTokenRequestedAt = $date;
  448.  
  449. return $this;
  450. }
  451.  
  452. /**
  453. * Gets the timestamp that the user requested a confirmation_token.
  454. *
  455. * @return null|DateTime
  456. */
  457. public function getConfirmationTokenRequestedAt()
  458. {
  459. return $this->confirmationTokenRequestedAt;
  460. }
  461.  
  462. public function isConfirmationTokenNonExpired($ttl)
  463. {
  464.  
  465. return $this->getConfirmationTokenRequestedAt() instanceof DateTime &&
  466. $this->getConfirmationTokenRequestedAt()->getTimestamp() + $ttl > time();
  467. }
  468.  
  469. /**
  470. * Set passwordRequestedClicked
  471. *
  472. * @param boolean $passwordRequestedClicked
  473. *
  474. * @return User
  475. */
  476. public function setPasswordRequestedClicked($boolean)
  477. {
  478. $this->passwordRequestedClicked = (Boolean) $boolean;
  479.  
  480. return $this;
  481. }
  482.  
  483. /**
  484. * Get passwordRequestedClicked
  485. *
  486. * @return boolean
  487. */
  488. public function getPasswordRequestedClicked()
  489. {
  490. return $this->passwordRequestedClicked;
  491. }
  492.  
  493. /**
  494. * Checks whether the user has used password request.
  495. *
  496. *
  497. * @return Boolean true if the user is enabled, false otherwise
  498. */
  499. public function isPasswordRequestedClicked() {
  500. return $this->passwordRequestedClicked;
  501. }
  502. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement