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

  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.  * @internal
  14.  */
  15. #[Package('core')]
  16. class UserCredentialsChangedSubscriber implements EventSubscriberInterface
  17. {
  18.     /**
  19.      * @internal
  20.      */
  21.     public function __construct(private readonly RefreshTokenRepository $refreshTokenRepository, private readonly Connection $connection)
  22.     {
  23.     }
  24.     public static function getSubscribedEvents(): array
  25.     {
  26.         return [
  27.             UserEvents::USER_WRITTEN_EVENT => 'onUserWritten',
  28.             UserEvents::USER_DELETED_EVENT => 'onUserDeleted',
  29.         ];
  30.     }
  31.     public function onUserWritten(EntityWrittenEvent $event): void
  32.     {
  33.         $payloads $event->getPayloads();
  34.         foreach ($payloads as $payload) {
  35.             if ($this->userCredentialsChanged($payload)) {
  36.                 $this->refreshTokenRepository->revokeRefreshTokensForUser($payload['id']);
  37.                 $this->updateLastUpdatedPasswordTimestamp($payload['id']);
  38.             }
  39.         }
  40.     }
  41.     public function onUserDeleted(EntityDeletedEvent $event): void
  42.     {
  43.         $ids $event->getIds();
  44.         foreach ($ids as $id) {
  45.             $this->refreshTokenRepository->revokeRefreshTokensForUser($id);
  46.         }
  47.     }
  48.     /**
  49.      * @param array<string, mixed> $payload
  50.      */
  51.     private function userCredentialsChanged(array $payload): bool
  52.     {
  53.         return isset($payload['password']);
  54.     }
  55.     private function updateLastUpdatedPasswordTimestamp(string $userId): void
  56.     {
  57.         $this->connection->update('user', [
  58.             'last_updated_password_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_TIME_FORMAT),
  59.         ], [
  60.             'id' => Uuid::fromHexToBytes($userId),
  61.         ]);
  62.     }
  63. }