]> git.mxchange.org Git - friendica.git/blobdiff - src/Network/Probe.php
Fix session size problems
[friendica.git] / src / Network / Probe.php
index 5c20cc071f5633fda04570d8ec9d83a3e278305c..3f10895c3c5c8874054066735ef4b259061da1ab 100644 (file)
@@ -45,9 +45,10 @@ class Probe
         */
        private static function rearrangeData($data)
        {
-               $fields = ["name", "nick", "guid", "url", "addr", "alias",
-                               "photo", "community", "keywords", "location", "about",
+               $fields = ["name", "nick", "guid", "url", "addr", "alias", "photo", "account-type",
+                               "community", "keywords", "location", "about", "gender", "hide",
                                "batch", "notify", "poll", "request", "confirm", "poco",
+                               "following", "followers", "inbox", "outbox", "sharedinbox",
                                "priority", "network", "pubkey", "baseurl"];
 
                $newdata = [];
@@ -347,8 +348,11 @@ class Probe
                if (!self::$istimeout) {
                        $ap_profile = ActivityPub::probeProfile($uri);
 
-                       if (!empty($ap_profile) && empty($network) && (defaults($data, 'network', '') != Protocol::DFRN)) {
+                       if (empty($data) || (!empty($ap_profile) && empty($network) && (defaults($data, 'network', '') != Protocol::DFRN))) {
                                $data = $ap_profile;
+                       } elseif (!empty($ap_profile)) {
+                               $ap_profile['batch'] = '';
+                               $data = array_merge($ap_profile, $data);
                        }
                } else {
                        Logger::notice('Time out detected. AP will not be probed.', ['uri' => $uri]);
@@ -390,6 +394,10 @@ class Probe
                        $data['network'] = Protocol::PHANTOM;
                }
 
+               if (!isset($data['hide']) && in_array($data['network'], Protocol::FEDERATED)) {
+                       $data['hide'] = self::getHideStatus($data['url']);
+               }
+
                $data = self::rearrangeData($data);
 
                // Only store into the cache if the value seems to be valid
@@ -400,6 +408,70 @@ class Probe
                return $data;
        }
 
+
+       /**
+        * Fetches the "hide" status from the profile
+        *
+        * @param string $url URL of the profile
+        *
+        * @return boolean "hide" status
+        */
+       private static function getHideStatus($url)
+       {
+               $curlResult = Network::curl($url);
+               if (!$curlResult->isSuccess()) {
+                       return false;
+               }
+
+               // If the file is too large then exit
+               if (defaults($curlResult->getInfo(), 'download_content_length', 0) > 1000000) {
+                       return false;
+               }
+
+               // If it isn't a HTML file then exit
+               if (($curlResult->getContentType() != '') && !strstr(strtolower($curlResult->getContentType()), 'html')) {
+                       return false;
+               }
+
+               $body = $curlResult->getBody();
+
+               $doc = new DOMDocument();
+               @$doc->loadHTML($body);
+
+               $xpath = new DOMXPath($doc);
+
+               $list = $xpath->query('//meta[@name]');
+               foreach ($list as $node) {
+                       $meta_tag = [];
+                       if ($node->attributes->length) {
+                               foreach ($node->attributes as $attribute) {
+                                       $meta_tag[$attribute->name] = $attribute->value;
+                               }
+                       }
+
+                       if (empty($meta_tag['content'])) {
+                               continue;
+                       }
+
+                       $content = strtolower(trim($meta_tag['content']));
+
+                       switch (strtolower(trim($meta_tag['name']))) {
+                               case 'dfrn-global-visibility':
+                                       if ($content == 'false') {
+                                               return true;
+                                       }
+                                       break;
+                               case 'robots':
+                                       if (strpos($content, 'noindex') !== false) {
+                                               return true;
+                                       }
+                                       break;
+                       }
+               }
+
+               return false;
+       }
+
        /**
         * @brief Checks if a profile url should be OStatus but only provides partial information
         *
@@ -467,7 +539,7 @@ class Probe
                        }
 
                        if ($host == 'twitter.com') {
-                               return ["network" => Protocol::TWITTER];
+                               return self::twitter($uri);
                        }
                        $lrdd = self::hostMeta($host);
 
@@ -508,7 +580,7 @@ class Probe
                        $nick = substr($uri, 0, strpos($uri, '@'));
 
                        if (strpos($uri, '@twitter.com')) {
-                               return ["network" => Protocol::TWITTER];
+                               return self::twitter($uri);
                        }
                        $lrdd = self::hostMeta($host);
 
@@ -736,7 +808,7 @@ class Probe
                }
 
                if (!empty($json["tags"])) {
-                       $keywords = implode(" ", $json["tags"]);
+                       $keywords = implode(", ", $json["tags"]);
                        if ($keywords != "") {
                                $data["keywords"] = $keywords;
                        }
@@ -751,6 +823,10 @@ class Probe
                        $data["about"] = $json["about"];
                }
 
+               if (!empty($json["gender"])) {
+                       $data["gender"] = $json["gender"];
+               }
+
                if (!empty($json["key"])) {
                        $data["pubkey"] = $json["key"];
                }
@@ -775,6 +851,12 @@ class Probe
                        $data["poll"] = $json["dfrn-poll"];
                }
 
+               if (isset($json["hide"])) {
+                       $data["hide"] = (bool)$json["hide"];
+               } else {
+                       $data["hide"] = false;
+               }
+
                return $data;
        }
 
@@ -1397,6 +1479,66 @@ class Probe
                return $data;
        }
 
+       /**
+        * @brief Check for twitter contact
+        *
+        * @param string $uri
+        *
+        * @return array twitter data
+        */
+       private static function twitter($uri)
+       {
+               if (preg_match('=(.*)@twitter.com=i', $uri, $matches)) {
+                       $nick = $matches[1];
+               } elseif (preg_match('=https?://twitter.com/(.*)=i', $uri, $matches)) {
+                       $nick = $matches[1];
+               } else {
+                       return [];
+               }
+
+               $data = [];
+               $data['url'] = 'https://twitter.com/' . $nick;
+               $data['addr'] = $nick . '@twitter.com';
+               $data['nick'] = $data['name'] = $nick;
+               $data['network'] = Protocol::TWITTER;
+               $data['baseurl'] = 'https://twitter.com';
+
+               $curlResult = Network::curl($data['url'], false);
+               if (!$curlResult->isSuccess()) {
+                       return [];
+               }
+
+               $body = $curlResult->getBody();
+               $doc = new DOMDocument();
+               @$doc->loadHTML($body);
+               $xpath = new DOMXPath($doc);
+
+               $list = $xpath->query('//img[@class]');
+               foreach ($list as $node) {
+                       $img_attr = [];
+                       if ($node->attributes->length) {
+                               foreach ($node->attributes as $attribute) {
+                                       $img_attr[$attribute->name] = $attribute->value;
+                               }
+                       }
+
+                       if (empty($img_attr['class'])) {
+                               continue;
+                       }
+
+                       if (strpos($img_attr['class'], 'ProfileAvatar-image') !== false) {
+                               if (!empty($img_attr['src'])) {
+                                       $data['photo'] = $img_attr['src'];
+                               }
+                               if (!empty($img_attr['alt'])) {
+                                       $data['name'] = $img_attr['alt'];
+                               }
+                       }
+               }
+
+               return $data;
+       }
+
        /**
         * @brief Check page for feed link
         *