]> git.mxchange.org Git - friendica.git/blobdiff - src/Network/Probe.php
Merge pull request #11518 from annando/issue-11504
[friendica.git] / src / Network / Probe.php
index baae0d3d310d989bd2faa99e9772ab49a2e3fcb7..c5ecf96ed3746d884072d3de29ab0fffaf00527f 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -34,6 +34,7 @@ use Friendica\Model\Contact;
 use Friendica\Model\GServer;
 use Friendica\Model\Profile;
 use Friendica\Model\User;
+use Friendica\Network\HTTPClient\Client\HttpClientAccept;
 use Friendica\Network\HTTPClient\Client\HttpClientOptions;
 use Friendica\Protocol\ActivityNamespace;
 use Friendica\Protocol\ActivityPub;
@@ -67,6 +68,8 @@ class Probe
                // At first remove leading and trailing junk
                $rawUri = trim($rawUri, "@#?:/ \t\n\r\0\x0B");
 
+               $rawUri = Network::convertToIdn($rawUri);
+
                $uri = new Uri($rawUri);
                if (!$uri->getScheme()) {
                        return $uri->__toString();
@@ -169,7 +172,7 @@ class Probe
                Logger::info('Probing', ['host' => $host, 'ssl_url' => $ssl_url, 'url' => $url, 'callstack' => System::callstack(20)]);
                $xrd = null;
 
-               $curlResult = DI::httpClient()->get($ssl_url, [HttpClientOptions::TIMEOUT => $xrd_timeout, HttpClientOptions::ACCEPT_CONTENT => ['application/xrd+xml']]);
+               $curlResult = DI::httpClient()->get($ssl_url, HttpClientAccept::XRD_XML, [HttpClientOptions::TIMEOUT => $xrd_timeout]);
                $ssl_connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
                if ($curlResult->isSuccess()) {
                        $xml = $curlResult->getBody();
@@ -186,7 +189,7 @@ class Probe
                }
 
                if (!is_object($xrd) && !empty($url)) {
-                       $curlResult = DI::httpClient()->get($url, [HttpClientOptions::TIMEOUT => $xrd_timeout, HttpClientOptions::ACCEPT_CONTENT => ['application/xrd+xml']]);
+                       $curlResult = DI::httpClient()->get($url, HttpClientAccept::XRD_XML, [HttpClientOptions::TIMEOUT => $xrd_timeout]);
                        $connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
                        if ($curlResult->isTimeout()) {
                                Logger::info('Probing timeout', ['url' => $url]);
@@ -242,49 +245,6 @@ class Probe
                return $lrdd;
        }
 
-       /**
-        * Perform Webfinger lookup and return DFRN data
-        *
-        * Given an email style address, perform webfinger lookup and
-        * return the resulting DFRN profile URL, or if no DFRN profile URL
-        * is located, returns an OStatus subscription template (prefixed
-        * with the string 'stat:' to identify it as on OStatus template).
-        * If this isn't an email style address just return $webbie.
-        * Return an empty string if email-style addresses but webfinger fails,
-        * or if the resultant personal XRD doesn't contain a supported
-        * subscription/friend-request attribute.
-        *
-        * amended 7/9/2011 to return an hcard which could save potentially loading
-        * a lengthy content page to scrape dfrn attributes
-        *
-        * @param string $webbie    Address that should be probed
-        * @param string $hcard_url Link to the hcard - is returned by reference
-        *
-        * @return string profile link
-        * @throws HTTPException\InternalServerErrorException
-        */
-       public static function webfingerDfrn(string $webbie, string &$hcard_url)
-       {
-               $profile_link = '';
-
-               $links = self::lrdd($webbie);
-               Logger::debug('Result', ['url' => $webbie, 'links' => $links]);
-               if (!empty($links) && is_array($links)) {
-                       foreach ($links as $link) {
-                               if ($link['@attributes']['rel'] === ActivityNamespace::DFRN) {
-                                       $profile_link = $link['@attributes']['href'];
-                               }
-                               if (($link['@attributes']['rel'] === ActivityNamespace::OSTATUSSUB) && ($profile_link == "")) {
-                                       $profile_link = 'stat:'.$link['@attributes']['template'];
-                               }
-                               if ($link['@attributes']['rel'] === 'http://microformats.org/profile/hcard') {
-                                       $hcard_url = $link['@attributes']['href'];
-                               }
-                       }
-               }
-               return $profile_link;
-       }
-
        /**
         * Check an URI for LRDD data
         *
@@ -428,7 +388,7 @@ class Probe
         */
        private static function getHideStatus($url)
        {
-               $curlResult = DI::httpClient()->get($url, [HttpClientOptions::CONTENT_LENGTH => 1000000]);
+               $curlResult = DI::httpClient()->get($url, HttpClientAccept::HTML, [HttpClientOptions::CONTENT_LENGTH => 1000000]);
                if (!$curlResult->isSuccess()) {
                        return false;
                }
@@ -530,7 +490,7 @@ class Probe
                                $addr = $nick . '@' . $host;
                        }
 
-                       $webfinger = self::getWebfinger($parts['scheme'] . '://' . $host . self::WEBFINGER, 'application/jrd+json', $uri, $addr);
+                       $webfinger = self::getWebfinger($parts['scheme'] . '://' . $host . self::WEBFINGER, HttpClientAccept::JRD_JSON, $uri, $addr);
                        if (empty($webfinger)) {
                                $lrdd = self::hostMeta($host);
                        }
@@ -544,7 +504,7 @@ class Probe
                                                $addr = $nick . '@' . $host;
                                        }
 
-                                       $webfinger = self::getWebfinger($parts['scheme'] . '://' . $host . self::WEBFINGER, 'application/jrd+json', $uri, $addr);
+                                       $webfinger = self::getWebfinger($parts['scheme'] . '://' . $host . self::WEBFINGER, HttpClientAccept::JRD_JSON, $uri, $addr);
                                        if (empty($webfinger)) {
                                                $lrdd = self::hostMeta($host);
                                        }
@@ -562,13 +522,13 @@ class Probe
                        $nick = substr($uri, 0, strpos($uri, '@'));
                        $addr = $uri;
 
-                       $webfinger = self::getWebfinger('https://' . $host . self::WEBFINGER, 'application/jrd+json', $uri, $addr);
+                       $webfinger = self::getWebfinger('https://' . $host . self::WEBFINGER, HttpClientAccept::JRD_JSON, $uri, $addr);
                        if (self::$istimeout) {
                                return [];
                        }
 
                        if (empty($webfinger)) {
-                               $webfinger = self::getWebfinger('http://' . $host . self::WEBFINGER, 'application/jrd+json', $uri, $addr);
+                               $webfinger = self::getWebfinger('http://' . $host . self::WEBFINGER, HttpClientAccept::JRD_JSON, $uri, $addr);
                                if (self::$istimeout) {
                                        return [];
                                }
@@ -686,22 +646,21 @@ class Probe
                }
 
                $parts = parse_url($uri);
-
-               if (empty($parts['scheme']) || !empty($parts['host']) && strstr($uri, '@')) {
-                       // If the URI starts with "mailto:" then jump directly to the mail detection
-                       if (strpos($uri, 'mailto:') !== false) {
-                               $uri = str_replace('mailto:', '', $uri);
-                               return self::mail($uri, $uid);
-                       }
-
-                       if ($network == Protocol::MAIL) {
-                               return self::mail($uri, $uid);
-                       }
-               } else {
+               if (empty($parts['scheme']) && empty($parts['host']) && !strstr($parts['path'], '@')) {
                        Logger::info('URI was not detectable', ['uri' => $uri]);
                        return [];
                }
 
+               // If the URI starts with "mailto:" then jump directly to the mail detection
+               if (strpos($uri, 'mailto:') !== false) {
+                       $uri = str_replace('mailto:', '', $uri);
+                       return self::mail($uri, $uid);
+               }
+
+               if ($network == Protocol::MAIL) {
+                       return self::mail($uri, $uid);
+               }
+
                Logger::info('Probing start', ['uri' => $uri]);
 
                if (!empty($ap_profile['addr']) && ($ap_profile['addr'] != $uri)) {
@@ -834,7 +793,7 @@ class Probe
 
        public static function pollZot($url, $data)
        {
-               $curlResult = DI::httpClient()->get($url);
+               $curlResult = DI::httpClient()->get($url, HttpClientAccept::JSON);
                if ($curlResult->isTimeout()) {
                        return $data;
                }
@@ -931,7 +890,7 @@ class Probe
        {
                $xrd_timeout = DI::config()->get('system', 'xrd_timeout', 20);
 
-               $curlResult = DI::httpClient()->get($url, [HttpClientOptions::TIMEOUT => $xrd_timeout, HttpClientOptions::ACCEPT_CONTENT => [$type]]);
+               $curlResult = DI::httpClient()->get($url, $type, [HttpClientOptions::TIMEOUT => $xrd_timeout]);
                if ($curlResult->isTimeout()) {
                        self::$istimeout = true;
                        return [];
@@ -1000,7 +959,7 @@ class Probe
         */
        private static function pollNoscrape($noscrape_url, $data)
        {
-               $curlResult = DI::httpClient()->get($noscrape_url);
+               $curlResult = DI::httpClient()->get($noscrape_url, HttpClientAccept::JSON);
                if ($curlResult->isTimeout()) {
                        self::$istimeout = true;
                        return $data;
@@ -1266,7 +1225,7 @@ class Probe
         */
        private static function pollHcard($hcard_url, $data, $dfrn = false)
        {
-               $curlResult = DI::httpClient()->get($hcard_url);
+               $curlResult = DI::httpClient()->get($hcard_url, HttpClientAccept::HTML);
                if ($curlResult->isTimeout()) {
                        self::$istimeout = true;
                        return [];
@@ -1527,11 +1486,12 @@ class Probe
                                                        $pubkey = substr($pubkey, 5);
                                                }
                                        } elseif (Strings::normaliseLink($pubkey) == 'http://') {
-                                               $curlResult = DI::httpClient()->get($pubkey);
+                                               $curlResult = DI::httpClient()->get($pubkey, HttpClientAccept::MAGIC_KEY);
                                                if ($curlResult->isTimeout()) {
                                                        self::$istimeout = true;
                                                        return $short ? false : [];
                                                }
+                                               Logger::debug('Fetched public key', ['Content-Type' => $curlResult->getHeader('Content-Type'), 'url' => $pubkey]);
                                                $pubkey = $curlResult->getBody();
                                        }
 
@@ -1561,7 +1521,7 @@ class Probe
                }
 
                // Fetch all additional data from the feed
-               $curlResult = DI::httpClient()->get($data["poll"]);
+               $curlResult = DI::httpClient()->get($data["poll"], HttpClientAccept::FEED_XML);
                if ($curlResult->isTimeout()) {
                        self::$istimeout = true;
                        return [];
@@ -1613,7 +1573,7 @@ class Probe
         */
        private static function pumpioProfileData($profile_link)
        {
-               $curlResult = DI::httpClient()->get($profile_link);
+               $curlResult = DI::httpClient()->get($profile_link, HttpClientAccept::HTML);
                if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
                        return [];
                }
@@ -1826,7 +1786,7 @@ class Probe
         */
        private static function feed($url, $probe = true)
        {
-               $curlResult = DI::httpClient()->get($url);
+               $curlResult = DI::httpClient()->get($url, HttpClientAccept::FEED_XML);
                if ($curlResult->isTimeout()) {
                        self::$istimeout = true;
                        return [];
@@ -1999,7 +1959,7 @@ class Probe
        /**
         * Fetch the last date that the contact had posted something (publically)
         *
-        * @param string $data  probing result
+        * @param array $data  probing result
         * @return string last activity
         */
        public static function getLastUpdate(array $data)
@@ -2048,7 +2008,7 @@ class Probe
                        return '';
                }
 
-               $curlResult = DI::httpClient()->get($gserver['noscrape'] . '/' . $data['nick']);
+               $curlResult = DI::httpClient()->get($gserver['noscrape'] . '/' . $data['nick'], HttpClientAccept::JSON);
 
                if ($curlResult->isSuccess() && !empty($curlResult->getBody())) {
                        $noscrape = json_decode($curlResult->getBody(), true);
@@ -2123,7 +2083,7 @@ class Probe
        private static function updateFromFeed(array $data)
        {
                // Search for the newest entry in the feed
-               $curlResult = DI::httpClient()->get($data['poll']);
+               $curlResult = DI::httpClient()->get($data['poll'], HttpClientAccept::ATOM_XML);
                if (!$curlResult->isSuccess() || !$curlResult->getBody()) {
                        return '';
                }