vendor/ibexa/core/src/bundle/Core/EventSubscriber/TrustedHeaderClientIpEventSubscriber.php line 35

Open in your IDE?
  1. <?php
  2. /**
  3. * @copyright Copyright (C) Ibexa AS. All rights reserved.
  4. * @license For full copyright and license information view LICENSE file distributed with this source code.
  5. */
  6. declare(strict_types=1);
  7. namespace Ibexa\Bundle\Core\EventSubscriber;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpKernel\Event\RequestEvent;
  11. use Symfony\Component\HttpKernel\KernelEvents;
  12. final class TrustedHeaderClientIpEventSubscriber implements EventSubscriberInterface
  13. {
  14. private const PLATFORM_SH_TRUSTED_HEADER_CLIENT_IP = 'X-Client-IP';
  15. private ?string $trustedHeaderName;
  16. public function __construct(
  17. ?string $trustedHeaderName
  18. ) {
  19. $this->trustedHeaderName = $trustedHeaderName;
  20. }
  21. public static function getSubscribedEvents(): array
  22. {
  23. return [
  24. KernelEvents::REQUEST => ['onKernelRequest', PHP_INT_MAX],
  25. ];
  26. }
  27. public function onKernelRequest(RequestEvent $event): void
  28. {
  29. $request = $event->getRequest();
  30. $trustedProxies = Request::getTrustedProxies();
  31. $trustedHeaderSet = Request::getTrustedHeaderSet();
  32. $trustedHeaderName = $this->trustedHeaderName;
  33. if (null === $trustedHeaderName && $this->isPlatformShProxy($request)) {
  34. $trustedHeaderName = self::PLATFORM_SH_TRUSTED_HEADER_CLIENT_IP;
  35. }
  36. if (null === $trustedHeaderName) {
  37. return;
  38. }
  39. $trustedClientIp = $request->headers->get($trustedHeaderName);
  40. if (null !== $trustedClientIp) {
  41. if ($trustedHeaderSet !== -1) {
  42. $trustedHeaderSet |= Request::HEADER_X_FORWARDED_FOR;
  43. }
  44. $request->headers->set('X_FORWARDED_FOR', $trustedClientIp);
  45. }
  46. Request::setTrustedProxies($trustedProxies, $trustedHeaderSet);
  47. }
  48. private function isPlatformShProxy(Request $request): bool
  49. {
  50. return null !== $request->server->get('PLATFORM_RELATIONSHIPS');
  51. }
  52. }