vendor/roothirsch/core-bundle/EventSubscriber/UserWriteSubscriber.php line 46

Open in your IDE?
  1. <?php
  2. namespace Roothirsch\CoreBundle\EventSubscriber;
  3. use ApiPlatform\Core\EventListener\EventPriorities;
  4. use Roothirsch\CoreBundle\Entity\User;
  5. use Roothirsch\CoreBundle\Messaging\MessagingService;
  6. use Roothirsch\CoreBundle\Security\UserManager;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  10. final class UserWriteSubscriber implements EventSubscriberInterface
  11. {
  12.     /**
  13.      * @var UserManager
  14.      */
  15.     private $userManager;
  16.     /**
  17.      * @var TokenStorageInterface
  18.      */
  19.     private $tokenStorage;
  20.     /**
  21.      * @var MessagingService
  22.      */
  23.     private $messagingService;
  24.     public function __construct(
  25.         UserManager $userManager,
  26.         TokenStorageInterface $tokenStorage,
  27.         MessagingService $messagingService
  28.     ) {
  29.         $this->userManager $userManager;
  30.         $this->tokenStorage $tokenStorage;
  31.         $this->messagingService $messagingService;
  32.     }
  33.     public static function getSubscribedEvents()
  34.     {
  35.         return [
  36.             KernelEvents::VIEW => ['validate'EventPriorities::POST_VALIDATE],
  37.         ];
  38.     }
  39.     public function validate(\Symfony\Component\HttpKernel\Event\ViewEvent $event)
  40.     {
  41.         if ($event->getRequest()->attributes->get('_route') === 'api_users_register_item') {
  42.             $this->register($event);
  43.         }
  44.         if ($event->getRequest()->attributes->get('_api_item_operation_name') === 'reset-password') {
  45.             $this->resetPassword($event);
  46.         }
  47.         if ($event->getRequest()->attributes->get('_api_item_operation_name') === 'change-password') {
  48.             $this->changePassword($event);
  49.         }
  50.         if (
  51.             $event->getRequest()->attributes->get('_api_resource_class') == User::class
  52.             && (
  53.                 $event->getRequest()->attributes->get('_api_item_operation_name') === 'put'
  54.                 || $event->getRequest()->attributes->get('_api_collection_operation_name') === 'post'
  55.             )
  56.         ) {
  57.             if (in_array('ROLE_ADMIN'$this->tokenStorage->getToken()->getUser()->getRoles())) {
  58.                 /** @var User $user */
  59.                 $user $event->getControllerResult();
  60.                 if ($user instanceof User) {
  61.                     $this->userManager->encodePassword($user$event->getRequest()->get('plaintextPassword'));
  62.                 }
  63.             }
  64.         }
  65.     }
  66.     /**
  67.      * @param \Roothirsch\CoreBundle\EventSubscriber\Api\GetResponseForControllerResultEvent $event
  68.      *
  69.      * @return User
  70.      */
  71.     private function register(\Symfony\Component\HttpKernel\Event\ViewEvent $event)
  72.     {
  73.         /** @var User $user */
  74.         $user $event->getControllerResult();
  75.         if ($event->getRequest()->attributes->has('token')) {
  76.             $user->setRegistrationToken(null);
  77.             $user->setActive(true);
  78.             $this->messagingService->sendRegistrationNotification($user$event->getRequest()->getLocale());
  79.             $this->userManager->encodePassword($user$event->getRequest()->get('plaintextPassword'));
  80.         }
  81.     }
  82.     /**
  83.      * @param \Roothirsch\CoreBundle\EventSubscriber\Api\GetResponseForControllerResultEvent $event
  84.      *
  85.      * @return User
  86.      */
  87.     private function resetPassword(\Symfony\Component\HttpKernel\Event\ViewEvent $event)
  88.     {
  89.         /** @var User $user */
  90.         $user $event->getControllerResult();
  91.         $this->userManager->sendPasswordResetEmail($user->getEmail(), $event->getRequest()->attributes->get('locale'));
  92.     }
  93.     /**
  94.      * @param \Roothirsch\CoreBundle\EventSubscriber\Api\GetResponseForControllerResultEvent $event
  95.      */
  96.     private function changePassword(\Symfony\Component\HttpKernel\Event\ViewEvent $event)
  97.     {
  98.         /** @var User $user */
  99.         $user $event->getControllerResult();
  100.         if (empty($event->getRequest()->get('token'))
  101.             && (
  102.                 empty($event->getRequest()->get('currentPassword'))
  103.                 || $this->userManager->isPasswordValid($user$event->getRequest()->get('currentPassword')) !== true
  104.             )) {
  105.             throw new \Exception('wrong password');
  106.         }
  107.         $user->setSecurityToken(null);
  108.         $this->userManager->encodePassword($user$event->getRequest()->get('plaintextPassword'));
  109.     }
  110. }