X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FUtil%2FNetwork.php;h=415a20c763b7bfc4bf7389fefc49134389d47950;hb=3bca4fe2a64671d09e08346456cdfa6c12f996e9;hp=5a06a0056e5065bd890e10c1cc5e9a59af97141c;hpb=2f3f41ed9cdb4229d78bdf2f91b0617403a8dd62;p=friendica.git diff --git a/src/Util/Network.php b/src/Util/Network.php index 5a06a0056e..415a20c763 100644 --- a/src/Util/Network.php +++ b/src/Util/Network.php @@ -1,6 +1,6 @@ true, HttpClientOptions::TIMEOUT => $xrd_timeout]; - $curlResult = DI::httpClient()->head($url, $options); - + try { + $curlResult = DI::httpClient()->head($url, $options); + } catch (\Exception $e) { + return false; + } + // Workaround for systems that can't handle a HEAD request. Don't retry on timeouts. if (!$curlResult->isSuccess() && ($curlResult->getReturnCode() >= 400) && !in_array($curlResult->getReturnCode(), [408, 504])) { - $curlResult = DI::httpClient()->get($url, HttpClientAccept::DEFAULT, $options); + try { + $curlResult = DI::httpClient()->get($url, HttpClientAccept::DEFAULT, $options); + } catch (\Exception $e) { + return false; + } } - + if (!$curlResult->isSuccess()) { Logger::notice('Url not reachable', ['host' => $host, 'url' => $url]); return false; @@ -177,11 +186,28 @@ class Network * @param string $url The url to check the domain from * * @return boolean + * + * @deprecated since 2023.03 Use isUriBlocked instead */ public static function isUrlBlocked(string $url): bool { - $host = @parse_url($url, PHP_URL_HOST); - if (!$host) { + try { + return self::isUriBlocked(new Uri($url)); + } catch (\Throwable $e) { + Logger::warning('Invalid URL', ['url' => $url]); + return false; + } + } + + /** + * Checks if the provided URI domain is on the domain blocklist. + * + * @param UriInterface $uri + * @return boolean + */ + public static function isUriBlocked(UriInterface $uri): bool + { + if (!$uri->getHost()) { return false; } @@ -191,7 +217,7 @@ class Network } foreach ($domain_blocklist as $domain_block) { - if (fnmatch(strtolower($domain_block['domain']), strtolower($host))) { + if (fnmatch(strtolower($domain_block['domain']), strtolower($uri->getHost()))) { return true; } } @@ -331,7 +357,7 @@ class Network $pair = $param . '=' . str_replace(' ', '+', $value); $url = str_replace($pair, '', $url); - // Third try: Maybey the url isn't encoded at all + // Third try: Maybe the url isn't encoded at all $pair = $param . '=' . $value; $url = str_replace($pair, '', $url); @@ -358,6 +384,7 @@ class Network */ public static function addBasePath(string $url, string $basepath): string { + $url = trim($url); if (!empty(parse_url($url, PHP_URL_SCHEME)) || empty(parse_url($basepath, PHP_URL_SCHEME)) || empty($url) || empty(parse_url($url))) { return $url; } @@ -481,7 +508,7 @@ class Network $scheme = $get('scheme'); $query = $get('query'); $fragment = $get('fragment'); - $authority = ($userinfo !== null ? $userinfo . '@' : '') . + $authority = ($userinfo !== null ? $userinfo . '@' : '') . $get('host') . ($port ? ":$port" : ''); @@ -613,10 +640,11 @@ class Network * @param string $url * * @return bool + * @deprecated since 2023.09, please use BaseUrl->isLocalUrl or BaseUrl->isLocalUri instead. */ public static function isLocalLink(string $url): bool { - return (strpos(Strings::normaliseLink($url), Strings::normaliseLink(DI::baseUrl())) !== false); + return DI::baseUrl()->isLocalUrl($url); } /** @@ -630,4 +658,24 @@ class Network $scheme = parse_url($url, PHP_URL_SCHEME); return !empty($scheme) && in_array($scheme, ['http', 'https']) && parse_url($url, PHP_URL_HOST); } + + /** + * Creates an Uri object out of a given Uri string + * + * @param string|null $uri + * @return UriInterface|null + */ + public static function createUriFromString(string $uri = null): ?UriInterface + { + if (empty($uri)) { + return null; + } + + try { + return new Uri($uri); + } catch (\Exception $e) { + Logger::debug('Invalid URI', ['code' => $e->getCode(), 'message' => $e->getMessage(), 'uri' => $uri]); + return null; + } + } }