]> git.mxchange.org Git - friendica.git/blobdiff - src/Network/Probe.php
Merge branch '2021.03-rc' into copyright-2021
[friendica.git] / src / Network / Probe.php
index 943d53ff66b168f9ce532ac50d52c7ab3a83b10b..6359d8607a4699ea1b50f0fdf52d9c12150f8b55 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
 <?php
 /**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2021, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -91,17 +91,19 @@ class Probe
                                "community", "keywords", "location", "about", "hide",
                                "batch", "notify", "poll", "request", "confirm", "subscribe", "poco",
                                "following", "followers", "inbox", "outbox", "sharedinbox",
                                "community", "keywords", "location", "about", "hide",
                                "batch", "notify", "poll", "request", "confirm", "subscribe", "poco",
                                "following", "followers", "inbox", "outbox", "sharedinbox",
-                               "priority", "network", "pubkey", "baseurl", "gsid"];
+                               "priority", "network", "pubkey", "manually-approve", "baseurl", "gsid"];
+
+               $numeric_fields = ["gsid", "hide", "account-type", "manually-approve"];
 
                $newdata = [];
                foreach ($fields as $field) {
                        if (isset($data[$field])) {
 
                $newdata = [];
                foreach ($fields as $field) {
                        if (isset($data[$field])) {
-                               if (in_array($field, ["gsid", "hide", "account-type"])) {
+                               if (in_array($field, $numeric_fields)) {
                                        $newdata[$field] = (int)$data[$field];
                                } else {        
                                        $newdata[$field] = $data[$field];
                                }
                                        $newdata[$field] = (int)$data[$field];
                                } else {        
                                        $newdata[$field] = $data[$field];
                                }
-                       } elseif ($field != "gsid") {
+                       } elseif (!in_array($field, $numeric_fields)) {
                                $newdata[$field] = "";
                        } else {
                                $newdata[$field] = null;
                                $newdata[$field] = "";
                        } else {
                                $newdata[$field] = null;
@@ -167,7 +169,7 @@ class Probe
                Logger::info('Probing', ['host' => $host, 'ssl_url' => $ssl_url, 'url' => $url, 'callstack' => System::callstack(20)]);
                $xrd = null;
 
                Logger::info('Probing', ['host' => $host, 'ssl_url' => $ssl_url, 'url' => $url, 'callstack' => System::callstack(20)]);
                $xrd = null;
 
-               $curlResult = DI::httpRequest()->get($ssl_url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
+               $curlResult = DI::httpRequest()->get($ssl_url, ['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();
                $ssl_connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
                if ($curlResult->isSuccess()) {
                        $xml = $curlResult->getBody();
@@ -184,7 +186,7 @@ class Probe
                }
 
                if (!is_object($xrd) && !empty($url)) {
                }
 
                if (!is_object($xrd) && !empty($url)) {
-                       $curlResult = DI::httpRequest()->get($url, false, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
+                       $curlResult = DI::httpRequest()->get($url, ['timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml']);
                        $connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
                        if ($curlResult->isTimeout()) {
                                Logger::info('Probing timeout', ['url' => $url]);
                        $connection_error = ($curlResult->getErrorNumber() == CURLE_COULDNT_CONNECT) || ($curlResult->getReturnCode() == 0);
                        if ($curlResult->isTimeout()) {
                                Logger::info('Probing timeout', ['url' => $url]);
@@ -256,7 +258,7 @@ class Probe
         * @return string profile link
         * @throws HTTPException\InternalServerErrorException
         */
         * @return string profile link
         * @throws HTTPException\InternalServerErrorException
         */
-       public static function webfingerDfrn($webbie, &$hcard_url)
+       public static function webfingerDfrn(string $webbie, string &$hcard_url)
        {
                $profile_link = '';
 
        {
                $profile_link = '';
 
@@ -712,7 +714,14 @@ class Probe
 
                Logger::info('Probing start', ['uri' => $uri]);
 
 
                Logger::info('Probing start', ['uri' => $uri]);
 
-               $data = self::getWebfingerArray($uri);
+               if (!empty($ap_profile['addr']) && ($ap_profile['addr'] != $uri)) {
+                       $data = self::getWebfingerArray($ap_profile['addr']);
+               }
+
+               if (empty($data)) {
+                       $data = self::getWebfingerArray($uri);
+               }
+
                if (empty($data)) {
                        if (!empty($parts['scheme'])) {
                                return self::feed($uri);
                if (empty($data)) {
                        if (!empty($parts['scheme'])) {
                                return self::feed($uri);
@@ -932,7 +941,7 @@ class Probe
        {
                $xrd_timeout = DI::config()->get('system', 'xrd_timeout', 20);
 
        {
                $xrd_timeout = DI::config()->get('system', 'xrd_timeout', 20);
 
-               $curlResult = DI::httpRequest()->get($url, false, ['timeout' => $xrd_timeout, 'accept_content' => $type]);
+               $curlResult = DI::httpRequest()->get($url, ['timeout' => $xrd_timeout, 'accept_content' => $type]);
                if ($curlResult->isTimeout()) {
                        self::$istimeout = true;
                        return [];
                if ($curlResult->isTimeout()) {
                        self::$istimeout = true;
                        return [];
@@ -1447,6 +1456,7 @@ class Probe
                        && !empty($hcard_url)
                ) {
                        $data["network"] = Protocol::DIASPORA;
                        && !empty($hcard_url)
                ) {
                        $data["network"] = Protocol::DIASPORA;
+                       $data["manually-approve"] = false;
 
                        // The Diaspora handle must always be lowercase
                        if (!empty($data["addr"])) {
 
                        // The Diaspora handle must always be lowercase
                        if (!empty($data["addr"])) {
@@ -1537,6 +1547,7 @@ class Probe
                        && isset($data["url"])
                ) {
                        $data["network"] = Protocol::OSTATUS;
                        && isset($data["url"])
                ) {
                        $data["network"] = Protocol::OSTATUS;
+                       $data["manually-approve"] = false;
                } else {
                        return $short ? false : [];
                }
                } else {
                        return $short ? false : [];
                }
@@ -1743,6 +1754,10 @@ class Probe
         */
        public static function getFeedLink(string $url, string $body)
        {
         */
        public static function getFeedLink(string $url, string $body)
        {
+               if (empty($body)) {
+                       return '';
+               }
+
                $doc = new DOMDocument();
                if (!@$doc->loadHTML($body)) {
                        return false;
                $doc = new DOMDocument();
                if (!@$doc->loadHTML($body)) {
                        return false;
@@ -1790,26 +1805,28 @@ class Probe
 
                $hrefParts = parse_url($href);
 
 
                $hrefParts = parse_url($href);
 
-               // Root path case (/path) including relative scheme case (//host/path)
-               if ($hrefParts['path'] && $hrefParts['path'][0] == '/') {
-                       $path = $hrefParts['path'];
-               } else {
-                       $path = $path . '/' . $hrefParts['path'];
-
-                       // Resolve arbitrary relative path
-                       // Lifted from https://www.php.net/manual/en/function.realpath.php#84012
-                       $parts = array_filter(explode('/', $path), 'strlen');
-                       $absolutes = array();
-                       foreach ($parts as $part) {
-                               if ('.' == $part) continue;
-                               if ('..' == $part) {
-                                       array_pop($absolutes);
-                               } else {
-                                       $absolutes[] = $part;
+               if (!empty($hrefParts['path'])) {
+                       // Root path case (/path) including relative scheme case (//host/path)
+                       if ($hrefParts['path'] && $hrefParts['path'][0] == '/') {
+                               $path = $hrefParts['path'];
+                       } else {
+                               $path = $path . '/' . $hrefParts['path'];
+
+                               // Resolve arbitrary relative path
+                               // Lifted from https://www.php.net/manual/en/function.realpath.php#84012
+                               $parts = array_filter(explode('/', $path), 'strlen');
+                               $absolutes = array();
+                               foreach ($parts as $part) {
+                                       if ('.' == $part) continue;
+                                       if ('..' == $part) {
+                                               array_pop($absolutes);
+                                       } else {
+                                               $absolutes[] = $part;
+                                       }
                                }
                                }
-                       }
 
 
-                       $path = '/' . implode('/', $absolutes);
+                               $path = '/' . implode('/', $absolutes);
+                       }
                }
 
                // Relative scheme case (//host/path)
                }
 
                // Relative scheme case (//host/path)
@@ -2211,7 +2228,8 @@ class Probe
                        'following' => $approfile['following'], 'followers' => $approfile['followers'],
                        'inbox' => $approfile['inbox'], 'outbox' => $approfile['outbox'],
                        'sharedinbox' => $approfile['endpoints']['sharedInbox'], 'network' => Protocol::DFRN, 
                        'following' => $approfile['following'], 'followers' => $approfile['followers'],
                        'inbox' => $approfile['inbox'], 'outbox' => $approfile['outbox'],
                        'sharedinbox' => $approfile['endpoints']['sharedInbox'], 'network' => Protocol::DFRN, 
-                       'pubkey' => $profile['upubkey'], 'baseurl' => $approfile['generator']['url'], 'gsid' => $profile['gsid']];
+                       'pubkey' => $profile['upubkey'], 'baseurl' => $approfile['generator']['url'], 'gsid' => $profile['gsid'],
+                       'manually-approve' => in_array($profile['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP])];
                return self::rearrangeData($data);              
        }
 }
                return self::rearrangeData($data);              
        }
 }