vendor/sylius/sylius/src/Sylius/Bundle/UserBundle/EventListener/UserDeleteListener.php line 39

  1. <?php
  2. /*
  3.  * This file is part of the Sylius package.
  4.  *
  5.  * (c) Paweł Jędrzejewski
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace Sylius\Bundle\UserBundle\EventListener;
  12. use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
  13. use Sylius\Component\Resource\Model\ResourceInterface;
  14. use Sylius\Component\User\Model\UserInterface;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
  18. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  19. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  20. use Symfony\Component\Security\Core\User\UserInterface as SymfonyUserInterface;
  21. use Webmozart\Assert\Assert;
  22. final class UserDeleteListener
  23. {
  24.     public function __construct(private TokenStorageInterface $tokenStorage, private SessionInterface|RequestStack $requestStackOrSession)
  25.     {
  26.         if ($requestStackOrSession instanceof SessionInterface) {
  27.             trigger_deprecation('sylius/user-bundle''1.12'sprintf('Passing an instance of %s as constructor argument for %s is deprecated as of Sylius 1.12 and will be removed in 2.0. Pass an instance of %s instead.'SessionInterface::class, self::class, RequestStack::class));
  28.         }
  29.     }
  30.     /**
  31.      * @throws \InvalidArgumentException
  32.      */
  33.     public function deleteUser(ResourceControllerEvent $event): void
  34.     {
  35.         $user $event->getSubject();
  36.         Assert::isInstanceOf($userUserInterface::class);
  37.         if ($this->isTryingToDeleteLoggedInUser($user)) {
  38.             $event->stopPropagation();
  39.             $event->setErrorCode(Response::HTTP_UNPROCESSABLE_ENTITY);
  40.             $event->setMessage('Cannot remove currently logged in user.');
  41.             if ($this->requestStackOrSession instanceof SessionInterface) {
  42.                 $session $this->requestStackOrSession;
  43.             } else {
  44.                 $session $this->requestStackOrSession->getSession();
  45.             }
  46.             /** @var FlashBagInterface $flashBag */
  47.             $flashBag $session->getBag('flashes');
  48.             $flashBag->add('error''Cannot remove currently logged in user.');
  49.         }
  50.     }
  51.     private function isTryingToDeleteLoggedInUser(UserInterface $user): bool
  52.     {
  53.         Assert::isInstanceOf($userResourceInterface::class);
  54.         Assert::isInstanceOf($userSymfonyUserInterface::class);
  55.         $token $this->tokenStorage->getToken();
  56.         if (!$token) {
  57.             return false;
  58.         }
  59.         $loggedUser $token->getUser();
  60.         if ($loggedUser === null) {
  61.             return false;
  62.         }
  63.         Assert::isInstanceOf($loggedUserResourceInterface::class);
  64.         return $loggedUser->getId() === $user->getId() && $loggedUser->getRoles() === $user->getRoles();
  65.     }
  66. }