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. }