]> git.mxchange.org Git - friendica.git/commitdiff
Configurable list of domains to ignore redirects
authorMichael <heluecht@pirati.ca>
Wed, 16 Sep 2020 04:56:37 +0000 (04:56 +0000)
committerMichael <heluecht@pirati.ca>
Wed, 16 Sep 2020 04:56:37 +0000 (04:56 +0000)
src/Network/HTTPRequest.php
src/Protocol/Feed.php
src/Util/Network.php
static/defaults.config.php

index 79419d38e25fbe581504ce2e963e6e68f1354e7f..a6155647636578f87f76320828ef900c9630cbaa 100644 (file)
@@ -192,7 +192,7 @@ class HTTPRequest implements IHTTPRequest
 
                $curlResponse = new CurlResult($url, $s, $curl_info, curl_errno($ch), curl_error($ch));
 
-               if ($curlResponse->isRedirectUrl()) {
+               if (!Network::isRedirectBlocked($url) && $curlResponse->isRedirectUrl()) {
                        $redirects++;
                        $this->logger->notice('Curl redirect.', ['url' => $url, 'to' => $curlResponse->getRedirectUrl()]);
                        @curl_close($ch);
@@ -280,7 +280,7 @@ class HTTPRequest implements IHTTPRequest
 
                $curlResponse = new CurlResult($url, $s, $curl_info, curl_errno($ch), curl_error($ch));
 
-               if ($curlResponse->isRedirectUrl()) {
+               if (!Network::isRedirectBlocked($url) && $curlResponse->isRedirectUrl()) {
                        $redirects++;
                        $this->logger->info('Post redirect.', ['url' => $url, 'to' => $curlResponse->getRedirectUrl()]);
                        curl_close($ch);
@@ -321,6 +321,11 @@ class HTTPRequest implements IHTTPRequest
                        return $url;
                }
 
+               if (Network::isRedirectBlocked($url)) {
+                       $this->logger->info('Domain should not be redirected.', ['url' => $url]);
+                       return $url;
+               }
+
                $url = Network::stripTrackingQueryParams($url);
 
                if ($depth > 10) {
@@ -470,4 +475,14 @@ class HTTPRequest implements IHTTPRequest
                        DB_UPDATE_VERSION . '; ' .
                        $this->baseUrl;
        }
+
+       private function redirectBlocked(string $url = null)
+       {
+               $hosts = $this->config->get('system', 'no_redirect_hosts');
+               if (empty($hosts)) {
+                       return false;
+               }
+
+               $hostlist = explode(',', $hosts);
+       }
 }
index 6b73e7af098020a85196e102176ebdc98533f9cd..560fe005e6dbe0b9645b8ea051f5542ead90cce0 100644 (file)
@@ -351,6 +351,8 @@ class Feed
 
                        $orig_plink = $item["plink"];
 
+                       $item["plink"] = DI::httpRequest()->finalUrl($item["plink"]);
+
                        $item["parent-uri"] = $item["uri"];
 
                        $item["title"] = XML::getFirstNodeValue($xpath, 'atom:title/text()', $entry);
index 6694fd4f0c057f3fad686824233334457bf5957a..ec1427003a2c89352e051d56df59c1735d8a8eb8 100644 (file)
@@ -177,6 +177,35 @@ class Network
                return false;
        }
 
+       /**
+        * Checks if the provided url is on the list of domains where redirects are blocked.
+        * Returns true if it is or malformed URL, false if not.
+        *
+        * @param string $url The url to check the domain from
+        *
+        * @return boolean
+        */
+       public static function isRedirectBlocked(string $url)
+       {
+               $host = @parse_url($url, PHP_URL_HOST);
+               if (!$host) {
+                       return false;
+               }
+
+               $no_redirect_list = DI::config()->get('system', 'no_redirect_list', []);
+               if (!$no_redirect_list) {
+                       return false;
+               }
+
+               foreach ($no_redirect_list as $no_redirect) {
+                       if (fnmatch(strtolower($no_redirect), strtolower($host))) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
        /**
         * Check if email address is allowed to register here.
         *
index 35b1bc7b8700170cce785ca44a901219aef8a460..c1d6fff044e518206e1ed01f282f643013a9ec69 100644 (file)
@@ -362,6 +362,10 @@ return [
                // Don't use OEmbed to fetch more information about a link.
                'no_oembed' => false,
 
+               // no_redirect_list (Array)
+               // List of domains where HTTP redirects should be ignored. 
+               'no_redirect_list' => [],
+
                // no_smilies (Boolean)
                // Don't show smilies.
                'no_smilies' => false,