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