]> git.mxchange.org Git - friendica.git/blobdiff - src/Network/Probe.php
Centralized gsid generation
[friendica.git] / src / Network / Probe.php
index b547c430564e9977e69e2f13e88faa8869bab271..5872ae587b53fe84efd4248699a98a2d9cf5c064 100644 (file)
@@ -26,9 +26,11 @@ use DomXPath;
 use Friendica\Core\Cache\Duration;
 use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
 use Friendica\Core\Cache\Duration;
 use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
+use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Model\Contact;
 use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Model\Contact;
+use Friendica\Model\GServer;
 use Friendica\Model\Profile;
 use Friendica\Protocol\ActivityNamespace;
 use Friendica\Protocol\ActivityPub;
 use Friendica\Model\Profile;
 use Friendica\Protocol\ActivityNamespace;
 use Friendica\Protocol\ActivityPub;
@@ -47,6 +49,31 @@ class Probe
        private static $baseurl;
        private static $istimeout;
 
        private static $baseurl;
        private static $istimeout;
 
+       /**
+        * Remove stuff from an URI that doesn't belong there
+        *
+        * @param string $URI
+        * @return string Cleaned URI
+        */
+       public static function cleanURI(string $URI)
+       {
+               // At first remove leading and trailing junk
+               $URI = trim($URI, "@#?:/ \t\n\r\0\x0B");
+
+               $parts = parse_url($URI);
+
+               if (empty($parts['scheme'])) {
+                       return $URI;
+               }
+
+               // Remove the URL fragment, since these shouldn't be part of any profile URL
+               unset($parts['fragment']);
+
+               $URI = Network::unparseURL($parts);
+
+               return $URI;
+       }
+
        /**
         * Rearrange the array so that it always has the same order
         *
        /**
         * Rearrange the array so that it always has the same order
         *
@@ -60,14 +87,16 @@ class Probe
                                "community", "keywords", "location", "about", "hide",
                                "batch", "notify", "poll", "request", "confirm", "poco",
                                "following", "followers", "inbox", "outbox", "sharedinbox",
                                "community", "keywords", "location", "about", "hide",
                                "batch", "notify", "poll", "request", "confirm", "poco",
                                "following", "followers", "inbox", "outbox", "sharedinbox",
-                               "priority", "network", "pubkey", "baseurl"];
+                               "priority", "network", "pubkey", "baseurl", "gsid"];
 
                $newdata = [];
                foreach ($fields as $field) {
                        if (isset($data[$field])) {
                                $newdata[$field] = $data[$field];
 
                $newdata = [];
                foreach ($fields as $field) {
                        if (isset($data[$field])) {
                                $newdata[$field] = $data[$field];
-                       } else {
+                       } elseif ($field != "gsid") {
                                $newdata[$field] = "";
                                $newdata[$field] = "";
+                       } else {
+                               $newdata[$field] = null;
                        }
                }
 
                        }
                }
 
@@ -116,27 +145,37 @@ class Probe
                // Reset the static variable
                self::$baseurl = '';
 
                // Reset the static variable
                self::$baseurl = '';
 
-               $ssl_url = "https://".$host."/.well-known/host-meta";
-               $url = "http://".$host."/.well-known/host-meta";
+               // Handles the case when the hostname contains the scheme
+               if (!parse_url($host, PHP_URL_SCHEME)) {
+                       $ssl_url = "https://" . $host . "/.well-known/host-meta";
+                       $url = "http://" . $host . "/.well-known/host-meta";
+               } else {
+                       $ssl_url = $host . "/.well-known/host-meta";
+                       $url = '';
+               }
 
                $xrd_timeout = DI::config()->get('system', 'xrd_timeout', 20);
 
 
                $xrd_timeout = DI::config()->get('system', 'xrd_timeout', 20);
 
-               Logger::log("Probing for ".$host, Logger::DEBUG);
+               Logger::info('Probing', ['host' => $host, 'ssl_url' => $ssl_url, 'url' => $url, 'callstack' => System::callstack(20)]);
                $xrd = null;
 
                $curlResult = Network::curl($ssl_url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
                $ssl_connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
                if ($curlResult->isSuccess()) {
                        $xml = $curlResult->getBody();
                $xrd = null;
 
                $curlResult = Network::curl($ssl_url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
                $ssl_connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
                if ($curlResult->isSuccess()) {
                        $xml = $curlResult->getBody();
-                       $xrd = XML::parseString($xml, false);
-                       $host_url = 'https://'.$host;
+                       $xrd = XML::parseString($xml, true);
+                       if (!empty($url)) {
+                               $host_url = 'https://' . $host;
+                       } else {
+                               $host_url = $host;
+                       }
                } elseif ($curlResult->isTimeout()) {
                        Logger::info('Probing timeout', ['url' => $ssl_url], Logger::DEBUG);
                        self::$istimeout = true;
                        return false;
                }
 
                } elseif ($curlResult->isTimeout()) {
                        Logger::info('Probing timeout', ['url' => $ssl_url], Logger::DEBUG);
                        self::$istimeout = true;
                        return false;
                }
 
-               if (!is_object($xrd)) {
+               if (!is_object($xrd) && !empty($url)) {
                        $curlResult = Network::curl($url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
                        $connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
                        if ($curlResult->isTimeout()) {
                        $curlResult = Network::curl($url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
                        $connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
                        if ($curlResult->isTimeout()) {
@@ -149,7 +188,7 @@ class Probe
                        }
 
                        $xml = $curlResult->getBody();
                        }
 
                        $xml = $curlResult->getBody();
-                       $xrd = XML::parseString($xml, false);
+                       $xrd = XML::parseString($xml, true);
                        $host_url = 'http://'.$host;
                }
                if (!is_object($xrd)) {
                        $host_url = 'http://'.$host;
                }
                if (!is_object($xrd)) {
@@ -256,10 +295,6 @@ class Probe
        /**
         * Check an URI for LRDD data
         *
        /**
         * Check an URI for LRDD data
         *
-        * this is a replacement for the "lrdd" function.
-        * It isn't used in this class and has some redundancies in the code.
-        * When time comes we can check the existing calls for "lrdd" if we can rework them.
-        *
         * @param string $uri Address that should be probed
         *
         * @return array uri data
         * @param string $uri Address that should be probed
         *
         * @return array uri data
@@ -280,7 +315,7 @@ class Probe
                                return [];
                        }
 
                                return [];
                        }
 
-                       $host = $parts["host"];
+                       $host = $parts['scheme'] . '://' . $parts["host"];
                        if (!empty($parts["port"])) {
                                $host .= ':'.$parts["port"];
                        }
                        if (!empty($parts["port"])) {
                                $host .= ':'.$parts["port"];
                        }
@@ -338,7 +373,7 @@ class Probe
                        $data[] = ["@attributes" => $link];
                }
 
                        $data[] = ["@attributes" => $link];
                }
 
-               if (is_array($webfinger["aliases"])) {
+               if (!empty($webfinger["aliases"]) && is_array($webfinger["aliases"])) {
                        foreach ($webfinger["aliases"] as $alias) {
                                $data[] = ["@attributes" =>
                                                        ["rel" => "alias",
                        foreach ($webfinger["aliases"] as $alias) {
                                $data[] = ["@attributes" =>
                                                        ["rel" => "alias",
@@ -429,6 +464,10 @@ class Probe
                        $data['baseurl'] = self::$baseurl;
                }
 
                        $data['baseurl'] = self::$baseurl;
                }
 
+               if (!empty($data['baseurl']) && empty($data['gsid'])) {
+                       $data['gsid'] = GServer::getID($data['baseurl']);
+               }
+
                if (empty($data['network'])) {
                        $data['network'] = Protocol::PHANTOM;
                }
                if (empty($data['network'])) {
                        $data['network'] = Protocol::PHANTOM;
                }
@@ -904,7 +943,7 @@ class Probe
                }
 
                // If it is not JSON, maybe it is XML
                }
 
                // If it is not JSON, maybe it is XML
-               $xrd = XML::parseString($data, false);
+               $xrd = XML::parseString($data, true);
                if (!is_object($xrd)) {
                        Logger::log("No webfinger data retrievable for ".$url, Logger::DEBUG);
                        return false;
                if (!is_object($xrd)) {
                        Logger::log("No webfinger data retrievable for ".$url, Logger::DEBUG);
                        return false;