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

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\Log\Package;
  9. use Shopware\Core\Framework\Uuid\Uuid;
  10. use Shopware\Core\System\User\UserEvents;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. /**
  13.  * @deprecated tag:v6.5.0 - reason:becomes-internal - EventSubscribers will become internal in v6.5.0
  14.  */
  15. #[Package('system-settings')]
  16. class UserCredentialsChangedSubscriber implements EventSubscriberInterface
  17. {
  18.     private RefreshTokenRepository $refreshTokenRepository;
  19.     private Connection $connection;
  20.     /**
  21.      * @internal
  22.      */
  23.     public function __construct(RefreshTokenRepository $refreshTokenRepositoryConnection $connection)
  24.     {
  25.         $this->refreshTokenRepository $refreshTokenRepository;
  26.         $this->connection $connection;
  27.     }
  28.     public static function getSubscribedEvents(): array
  29.     {
  30.         return [
  31.             UserEvents::USER_WRITTEN_EVENT => 'onUserWritten',
  32.             UserEvents::USER_DELETED_EVENT => 'onUserDeleted',
  33.         ];
  34.     }
  35.     public function onUserWritten(EntityWrittenEvent $event): void
  36.     {
  37.         $payloads $event->getPayloads();
  38.         foreach ($payloads as $payload) {
  39.             if ($this->userCredentialsChanged($payload)) {
  40.                 $this->refreshTokenRepository->revokeRefreshTokensForUser($payload['id']);
  41.                 $this->updateLastUpdatedPasswordTimestamp($payload['id']);
  42.             }
  43.         }
  44.     }
  45.     public function onUserDeleted(EntityDeletedEvent $event): void
  46.     {
  47.         $ids $event->getIds();
  48.         foreach ($ids as $id) {
  49.             $this->refreshTokenRepository->revokeRefreshTokensForUser($id);
  50.         }
  51.     }
  52.     /**
  53.      * @param array<string, mixed> $payload
  54.      */
  55.     private function userCredentialsChanged(array $payload): bool
  56.     {
  57.         return isset($payload['password']);
  58.     }
  59.     private function updateLastUpdatedPasswordTimestamp(string $userId): void
  60.     {
  61.         $this->connection->update('user', [
  62.             'last_updated_password_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  63.         ], [
  64.             'id' => Uuid::fromHexToBytes($userId),
  65.         ]);
  66.     }
  67. }