]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/Network.php
Merge pull request #12836 from damianwajer/post-interactions
[friendica.git] / src / Util / Network.php
index 508934db2c6eb0ccb89ed799c34eb7f6010932d3..30c4798a5a985dc1db09d4545a04f73c7009d9d5 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2010-2022, the Friendica project
+ * @copyright Copyright (C) 2010-2023, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -29,6 +29,7 @@ use Friendica\Network\HTTPClient\Client\HttpClientAccept;
 use Friendica\Network\HTTPClient\Client\HttpClientOptions;
 use Friendica\Network\HTTPException\NotModifiedException;
 use GuzzleHttp\Psr7\Uri;
+use Psr\Http\Message\UriInterface;
 
 class Network
 {
@@ -79,12 +80,12 @@ class Network
                if (in_array(parse_url($url, PHP_URL_SCHEME), ['https', 'http'])) {
                        $options = [HttpClientOptions::VERIFY => true, HttpClientOptions::TIMEOUT => $xrd_timeout];
                        $curlResult = DI::httpClient()->head($url, $options);
-       
+
                        // 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);
                        }
-       
+
                        if (!$curlResult->isSuccess()) {
                                Logger::notice('Url not reachable', ['host' => $host, 'url' => $url]);
                                return false;
@@ -177,11 +178,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 +209,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;
                        }
                }
@@ -358,6 +376,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,15 +500,15 @@ class Network
                $scheme    = $get('scheme');
                $query     = $get('query');
                $fragment  = $get('fragment');
-               $authority = ($userinfo !== null ? $userinfo . '@' : '') . 
+               $authority = ($userinfo !== null ? $userinfo . '@' : '') .
                                                $get('host') .
                                                ($port ? ":$port" : '');
 
-               return  (strlen($scheme) ? $scheme . ':' : '') .
-                       (strlen($authority) ? '//' . $authority : '') .
+               return  (!empty($scheme) ? $scheme . ':' : '') .
+                       (!empty($authority) ? '//' . $authority : '') .
                        $get('path') .
-                       (strlen($query) ? '?' . $query : '') .
-                       (strlen($fragment) ? '#' . $fragment : '');
+                       (!empty($query) ? '?' . $query : '') .
+                       (!empty($fragment) ? '#' . $fragment : '');
        }
 
        /**