]> git.mxchange.org Git - friendica.git/blobdiff - src/Network/Probe.php
Centralized gsid generation
[friendica.git] / src / Network / Probe.php
index ec857836cc1162268e06d9e90f6fd6ef186d934e..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\System;
 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;
@@ -47,6 +49,31 @@ class Probe
        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
         *
@@ -57,17 +84,19 @@ class Probe
        private static function rearrangeData($data)
        {
                $fields = ["name", "nick", "guid", "url", "addr", "alias", "photo", "account-type",
-                               "community", "keywords", "location", "about", "gender", "hide",
+                               "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];
-                       } else {
+                       } elseif ($field != "gsid") {
                                $newdata[$field] = "";
+                       } else {
+                               $newdata[$field] = null;
                        }
                }
 
@@ -116,27 +145,37 @@ class Probe
                // 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);
 
-               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 = 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;
                }
 
-               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()) {
@@ -149,7 +188,7 @@ class Probe
                        }
 
                        $xml = $curlResult->getBody();
-                       $xrd = XML::parseString($xml, false);
+                       $xrd = XML::parseString($xml, true);
                        $host_url = 'http://'.$host;
                }
                if (!is_object($xrd)) {
@@ -256,10 +295,6 @@ class Probe
        /**
         * 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
@@ -280,7 +315,7 @@ class Probe
                                return [];
                        }
 
-                       $host = $parts["host"];
+                       $host = $parts['scheme'] . '://' . $parts["host"];
                        if (!empty($parts["port"])) {
                                $host .= ':'.$parts["port"];
                        }
@@ -338,7 +373,7 @@ class Probe
                        $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",
@@ -429,6 +464,10 @@ class Probe
                        $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;
                }
@@ -849,9 +888,6 @@ class Probe
                        if (!empty($profile['description'])) {
                                $data['about'] = $profile['description'];
                        }
-                       if (!empty($profile['gender'])) {
-                               $data['gender'] = $profile['gender'];
-                       }
                        if (!empty($profile['keywords'])) {
                                $keywords = implode(', ', $profile['keywords']);
                                if (!empty($keywords)) {
@@ -907,7 +943,7 @@ class Probe
                }
 
                // 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;
@@ -1012,10 +1048,6 @@ class Probe
                        $data["about"] = $json["about"];
                }
 
-               if (!empty($json["gender"])) {
-                       $data["gender"] = $json["gender"];
-               }
-
                if (!empty($json["key"])) {
                        $data["pubkey"] = $json["key"];
                }