vendor/shopware/core/Framework/Api/EventListener/Authentication/UserCredentialsChangedSubscriber.php line 43

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\Api\EventListener\Authentication;
  3. use Doctrine\DBAL\Connection;
  4. use Shopware\Core\Defaults;
  5. use Shopware\Core\Framework\Api\OAuth\RefreshTokenRepository;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityDeletedEvent;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  8. use Shopware\Core\Framework\Uuid\Uuid;
  9. use Shopware\Core\System\User\UserEvents;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. class UserCredentialsChangedSubscriber implements EventSubscriberInterface
  12. {
  13.     /**
  14.      * @var RefreshTokenRepository
  15.      */
  16.     private $refreshTokenRepository;
  17.     /**
  18.      * @var Connection
  19.      */
  20.     private $connection;
  21.     /**
  22.      * @internal
  23.      */
  24.     public function __construct(RefreshTokenRepository $refreshTokenRepositoryConnection $connection)
  25.     {
  26.         $this->refreshTokenRepository $refreshTokenRepository;
  27.         $this->connection $connection;
  28.     }
  29.     public static function getSubscribedEvents(): array
  30.     {
  31.         return [
  32.             UserEvents::USER_WRITTEN_EVENT => 'onUserWritten',
  33.             UserEvents::USER_DELETED_EVENT => 'onUserDeleted',
  34.         ];
  35.     }
  36.     public function onUserWritten(EntityWrittenEvent $event): void
  37.     {
  38.         $payloads $event->getPayloads();
  39.         foreach ($payloads as $payload) {
  40.             if ($this->userCredentialsChanged($payload)) {
  41.                 $this->refreshTokenRepository->revokeRefreshTokensForUser($payload['id']);
  42.                 $this->updateLastUpdatedPasswordTimestamp($payload['id']);
  43.             }
  44.         }
  45.     }
  46.     public function onUserDeleted(EntityDeletedEvent $event): void
  47.     {
  48.         $ids $event->getIds();
  49.         foreach ($ids as $id) {
  50.             $this->refreshTokenRepository->revokeRefreshTokensForUser($id);
  51.         }
  52.     }
  53.     private function userCredentialsChanged(array $payload): bool
  54.     {
  55.         return isset($payload['password']);
  56.     }
  57.     private function updateLastUpdatedPasswordTimestamp(string $userId): void
  58.     {
  59.         $this->connection->update('user', [
  60.             'last_updated_password_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  61.         ], [
  62.             'id' => Uuid::fromHexToBytes($userId),
  63.         ]);
  64.     }
  65. }