vendor/roothirsch/core-bundle/EventSubscriber/UserReadSubscriber.php line 47

Open in your IDE?
  1. <?php
  2. namespace Roothirsch\CoreBundle\EventSubscriber;
  3. use ApiPlatform\Core\EventListener\EventPriorities;
  4. use ApiPlatform\Core\Exception\ItemNotFoundException;
  5. use Roothirsch\CoreBundle\Entity\User;
  6. use Roothirsch\CoreBundle\Security\UserManager;
  7. use Roothirsch\CoreBundle\Repository\UserRepository;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  11. final class UserReadSubscriber implements EventSubscriberInterface
  12. {
  13. /**
  14. * @var UserRepository
  15. */
  16. private $userRepository;
  17. /**
  18. * @var UserManager
  19. */
  20. private $userManager;
  21. /**
  22. * @var TokenStorageInterface
  23. */
  24. private $tokenStorage;
  25. public function __construct(
  26. UserRepository $userRepository,
  27. UserManager $userManager,
  28. TokenStorageInterface $tokenStorage
  29. ) {
  30. $this->userRepository = $userRepository;
  31. $this->userManager = $userManager;
  32. $this->tokenStorage = $tokenStorage;
  33. }
  34. public static function getSubscribedEvents()
  35. {
  36. return [
  37. KernelEvents::REQUEST => ['load', EventPriorities::PRE_READ],
  38. ];
  39. }
  40. public function load(\Symfony\Component\HttpKernel\Event\RequestEvent $event)
  41. {
  42. if (strpos($event->getRequest()->getPathInfo(), '/api/users') !== 0) {
  43. return;
  44. }
  45. if ($event->getRequest()->attributes->get('_api_item_operation_name') === 'reset-password') {
  46. $this->loadUserFromEmail($event);
  47. }
  48. if ($event->getRequest()->get('id') === 'current'
  49. || $event->getRequest()->get('id') === 'me'
  50. || $event->getRequest()->attributes->get('_route') === 'api_users_current_item') {
  51. $this->loadUserFromSession($event);
  52. } elseif (strlen($event->getRequest()->get('id')) > 10) {
  53. $this->loadUserFromToken($event);
  54. }
  55. }
  56. /**
  57. * @param \Roothirsch\CoreBundle\EventSubscriber\Api\GetResponseEvent $event
  58. */
  59. private function loadUserFromEmail(\Symfony\Component\HttpKernel\Event\RequestEvent $event)
  60. {
  61. $payload = json_decode($event->getRequest()->getContent(), true);
  62. $user = $this->userRepository->findOneBy(
  63. [
  64. 'email' => $payload['email'],
  65. ]
  66. );
  67. $event->getRequest()->attributes->set('locale', $payload['language']);
  68. if (!$user instanceof User) {
  69. throw new ItemNotFoundException('Not found');
  70. }
  71. $event->getRequest()->attributes->set('id', $user->getId());
  72. }
  73. /**
  74. * @param \Roothirsch\CoreBundle\EventSubscriber\Api\GetResponseEvent $event
  75. */
  76. private function loadUserFromSession(\Symfony\Component\HttpKernel\Event\RequestEvent $event)
  77. {
  78. $user = $this->tokenStorage->getToken()->getUser();
  79. if (!$user instanceof User) {
  80. return;
  81. }
  82. $event->getRequest()->attributes->set('id', $user->getId());
  83. }
  84. /**
  85. * @param \Roothirsch\CoreBundle\EventSubscriber\Api\GetResponseEvent $event
  86. */
  87. private function loadUserFromToken(\Symfony\Component\HttpKernel\Event\RequestEvent $event)
  88. {
  89. $user = $this->userRepository->findOneBy(
  90. [
  91. 'registrationToken' => $event->getRequest()->get('id'),
  92. 'active' => false,
  93. ]
  94. );
  95. if (!$user instanceof User) {
  96. $user = $this->userRepository->findOneBy(
  97. [
  98. 'securityToken' => $event->getRequest()->get('id'),
  99. 'active' => true,
  100. ]
  101. );
  102. }
  103. if (!$user instanceof User) {
  104. throw new ItemNotFoundException('Not found');
  105. }
  106. if ($user->getUpdated() < (time() - 60 * 60 * 24)) {
  107. $user->setRegistrationToken('');
  108. $this->userManager->persist($user);
  109. throw new ItemNotFoundException('token invalid');
  110. }
  111. if (!$user instanceof User) {
  112. return;
  113. }
  114. $event->getRequest()->attributes->set('token', $event->getRequest()->get('id'));
  115. $event->getRequest()->attributes->set('id', $user->getId());
  116. }
  117. }