vendor/pimcore/pimcore/lib/Http/RequestHelper.php line 114

Open in your IDE?
  1. <?php
  2. /**
  3.  * Pimcore
  4.  *
  5.  * This source file is available under two different licenses:
  6.  * - GNU General Public License version 3 (GPLv3)
  7.  * - Pimcore Commercial License (PCL)
  8.  * Full copyright and license information is available in
  9.  * LICENSE.md which is distributed with this source code.
  10.  *
  11.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  12.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  13.  */
  14. namespace Pimcore\Http;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\RequestStack;
  17. use Symfony\Component\Routing\RequestContext;
  18. class RequestHelper
  19. {
  20.     const ATTRIBUTE_FRONTEND_REQUEST '_pimcore_frontend_request';
  21.     /**
  22.      * @var RequestStack
  23.      */
  24.     protected $requestStack;
  25.     /**
  26.      * @var requestContext
  27.      */
  28.     protected $requestContext;
  29.     /**
  30.      * @param RequestStack $requestStack
  31.      * @param RequestContext $requestContext
  32.      */
  33.     public function __construct(RequestStack $requestStackRequestContext $requestContext)
  34.     {
  35.         $this->requestStack $requestStack;
  36.         $this->requestContext $requestContext;
  37.     }
  38.     /**
  39.      * @return bool
  40.      */
  41.     public function hasCurrentRequest(): bool
  42.     {
  43.         return null !== $this->requestStack->getCurrentRequest();
  44.     }
  45.     /**
  46.      * @return Request
  47.      */
  48.     public function getCurrentRequest(): Request
  49.     {
  50.         if (!$this->requestStack->getCurrentRequest()) {
  51.             throw new \LogicException('A Request must be available.');
  52.         }
  53.         return $this->requestStack->getCurrentRequest();
  54.     }
  55.     /**
  56.      * @param Request|null $request
  57.      *
  58.      * @return Request
  59.      */
  60.     public function getRequest(Request $request null)
  61.     {
  62.         if (null === $request) {
  63.             $request $this->getCurrentRequest();
  64.         }
  65.         return $request;
  66.     }
  67.     /**
  68.      * @deprecated will be removed in Pimcore 11, use getMainRequest() instead
  69.      *
  70.      * @return bool
  71.      */
  72.     public function hasMasterRequest(): bool
  73.     {
  74.         trigger_deprecation(
  75.             'pimcore/pimcore',
  76.             '10.2',
  77.             sprintf('%s is deprecated, please use RequestHelper::hasMainRequest() instead.'__METHOD__)
  78.         );
  79.         return $this->hasMainRequest();
  80.     }
  81.     /**
  82.      * @return bool
  83.      */
  84.     public function hasMainRequest(): bool
  85.     {
  86.         return null !== $this->requestStack->getMainRequest();
  87.     }
  88.     /**
  89.      * @deprecated will be removed in Pimcore 11 - use getMainRequest() instead
  90.      *
  91.      * @return Request
  92.      */
  93.     public function getMasterRequest(): Request
  94.     {
  95.         trigger_deprecation(
  96.             'pimcore/pimcore',
  97.             '10.2',
  98.             sprintf('%s is deprecated, please use RequestHelper::getMainRequest() instead.'__METHOD__)
  99.         );
  100.         return $this->getMainRequest();
  101.     }
  102.     /**
  103.      * @return Request
  104.      */
  105.     public function getMainRequest(): Request
  106.     {
  107.         $masterRequest $this->requestStack->getMainRequest();
  108.         if (null === $masterRequest) {
  109.             throw new \LogicException('There is no main request available.');
  110.         }
  111.         return $masterRequest;
  112.     }
  113.     /**
  114.      * @param Request|null $request
  115.      *
  116.      * @return bool
  117.      */
  118.     public function isFrontendRequest(Request $request null): bool
  119.     {
  120.         $request $this->getRequest($request);
  121.         $attribute self::ATTRIBUTE_FRONTEND_REQUEST;
  122.         if ($request->attributes->has($attribute)) {
  123.             return (bool)$request->attributes->get($attribute);
  124.         }
  125.         $frontendRequest $this->detectFrontendRequest($request);
  126.         $request->attributes->set($attribute$frontendRequest);
  127.         return $frontendRequest;
  128.     }
  129.     /**
  130.      * TODO use pimcore context here?
  131.      *
  132.      * @param Request $request
  133.      *
  134.      * @return bool
  135.      */
  136.     private function detectFrontendRequest(Request $request): bool
  137.     {
  138.         if (\Pimcore::inAdmin()) {
  139.             return false;
  140.         }
  141.         $excludePatterns = [
  142.             "/^\/admin.*/",
  143.             "/^\/install.*/",
  144.             "/^\/plugin.*/",
  145.         ];
  146.         foreach ($excludePatterns as $pattern) {
  147.             if (preg_match($pattern$request->getRequestUri())) {
  148.                 return false;
  149.             }
  150.         }
  151.         return true;
  152.     }
  153.     /**
  154.      * E.g. editmode, preview, version preview, always when it is a "frontend-request", but called out of the admin
  155.      *
  156.      * @param Request|null $request
  157.      *
  158.      * @return bool
  159.      */
  160.     public function isFrontendRequestByAdmin(Request $request null): bool
  161.     {
  162.         $request $this->getRequest($request);
  163.         $keys = [
  164.             'pimcore_editmode',
  165.             'pimcore_preview',
  166.             'pimcore_admin',
  167.             'pimcore_object_preview',
  168.             'pimcore_version',
  169.         ];
  170.         foreach ($keys as $key) {
  171.             if ($request->query->get($key) || $request->request->get($key)) {
  172.                 return true;
  173.             }
  174.         }
  175.         if (preg_match('@^/admin/document_tag/renderlet@'$request->getRequestUri())) {
  176.             return true;
  177.         }
  178.         return false;
  179.     }
  180.     /**
  181.      * Get an anonymized client IP from the request
  182.      *
  183.      * @internal
  184.      *
  185.      * @param Request|null $request
  186.      *
  187.      * @return string
  188.      */
  189.     public function getAnonymizedClientIp(Request $request null)
  190.     {
  191.         $request $this->getRequest($request);
  192.         return $this->anonymizeIp($request->getClientIp());
  193.     }
  194.     /**
  195.      * Anonymize IP: replace the last octet with 255
  196.      *
  197.      * @param string $ip
  198.      *
  199.      * @return string
  200.      */
  201.     private function anonymizeIp(string $ip)
  202.     {
  203.         $aip substr($ip0strrpos($ip'.') + 1);
  204.         $aip .= '255';
  205.         return $aip;
  206.     }
  207.     /**
  208.      * @internal
  209.      *
  210.      * @param string $uri
  211.      *
  212.      * @return Request
  213.      */
  214.     public function createRequestWithContext($uri '/')
  215.     {
  216.         $port '';
  217.         $scheme $this->requestContext->getScheme();
  218.         if ('http' === $scheme && 80 !== $this->requestContext->getHttpPort()) {
  219.             $port ':'.$this->requestContext->getHttpPort();
  220.         } elseif ('https' === $scheme && 443 !== $this->requestContext->getHttpsPort()) {
  221.             $port ':'.$this->requestContext->getHttpsPort();
  222.         }
  223.         $request Request::create(
  224.             $scheme .'://'$this->requestContext->getHost().$port.$this->requestContext->getBaseUrl().$uri,
  225.             $this->requestContext->getMethod(),
  226.             $this->requestContext->getParameters()
  227.         );
  228.         return $request;
  229.     }
  230. }