X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FApp%2FRequest.php;h=d61303d5d729f410c8776aec4d534f04e53629b1;hb=c4870a16d4ffbd37d6c4f379abfe2d18cacb88ff;hp=7eb31b22d7c4456f4cd3452d4edbc607544ecfdf;hpb=d441b90bda1766cf363ec120d3a704a875e17589;p=friendica.git diff --git a/src/App/Request.php b/src/App/Request.php index 7eb31b22d7..d61303d5d7 100644 --- a/src/App/Request.php +++ b/src/App/Request.php @@ -1,8 +1,28 @@ . + * + */ namespace Friendica\App; use Friendica\Core\Config\Capability\IManageConfigValues; +use Friendica\Core\System; /** * Container for the whole request @@ -13,23 +33,48 @@ use Friendica\Core\Config\Capability\IManageConfigValues; */ class Request { - /** @var string the default possible headers, which could contain the client IP */ - const ORDERED_FORWARD_FOR_HEADER = 'HTTP_X_FORWARDED_FOR'; + /** + * A comma separated list of default headers that could contain the client IP in a proxy request + * + * @var string + */ + const DEFAULT_FORWARD_FOR_HEADER = 'HTTP_X_FORWARDED_FOR'; + /** + * The default Request-ID header to retrieve the current transaction ID from the HTTP header (if set) + * + * @var string + */ + const DEFAULT_REQUEST_ID_HEADER = 'HTTP_X_REQUEST_ID'; /** @var string The remote IP address of the current request */ protected $remoteAddress; + /** @var string The request-id of the current request */ + protected $requestId; /** * @return string The remote IP address of the current request + * + * Do always use this instead of $_SERVER['REMOTE_ADDR'] */ public function getRemoteAddress(): string { return $this->remoteAddress; } + /** + * @return string The request ID of the current request + * + * Do always use this instead of $_SERVER['X_REQUEST_ID'] + */ + public function getRequestId(): string + { + return $this->requestId; + } + public function __construct(IManageConfigValues $config, array $server = []) { $this->remoteAddress = $this->determineRemoteAddress($config, $server); + $this->requestId = $server[static::DEFAULT_REQUEST_ID_HEADER] ?? System::createGUID(8, false); } /** @@ -39,6 +84,10 @@ class Request * Otherwise, $remoteAddress will be compared to $trustedProxy literally and the result * will be returned. * + * @param string $trustedProxy The current, trusted proxy to check + * @param string $remoteAddress The current remote IP address + * + * * @return boolean true if $remoteAddress matches $trustedProxy, false otherwise */ protected function matchesTrustedProxy(string $trustedProxy, string $remoteAddress): bool @@ -61,6 +110,9 @@ class Request * Checks if given $remoteAddress matches any entry in the given array $trustedProxies. * For details regarding what "match" means, refer to `matchesTrustedProxy`. * + * @param string[] $trustedProxies A list of the trusted proxies + * @param string $remoteAddress The current remote IP address + * * @return boolean true if $remoteAddress matches any entry in $trustedProxies, false otherwise */ protected function isTrustedProxy(array $trustedProxies, string $remoteAddress): bool @@ -75,8 +127,12 @@ class Request } /** + * Determines the remote address, if the connection came from a trusted proxy + * and `forwarded_for_headers` has been configured then the IP address + * specified in this header will be returned instead. + * * @param IManageConfigValues $config - * @param array $server + * @param array $server The $_SERVER array * * @return string */ @@ -86,7 +142,7 @@ class Request $trustedProxies = preg_split('/(\s*,*\s*)*,+(\s*,*\s*)*/', $config->get('proxy', 'trusted_proxies', '')); if (\is_array($trustedProxies) && $this->isTrustedProxy($trustedProxies, $remoteAddress)) { - $forwardedForHeaders = preg_split('/(\s*,*\s*)*,+(\s*,*\s*)*/', $config->get('proxy', 'forwarded_for_headers')) ?? static::ORDERED_FORWARD_FOR_HEADER; + $forwardedForHeaders = preg_split('/(\s*,*\s*)*,+(\s*,*\s*)*/', $config->get('proxy', 'forwarded_for_headers', static::DEFAULT_FORWARD_FOR_HEADER)); foreach ($forwardedForHeaders as $header) { if (isset($server[$header])) {