]> git.mxchange.org Git - friendica.git/blobdiff - src/Network/Probe.php
Fix session size problems
[friendica.git] / src / Network / Probe.php
index c38c43c0902261bfaff771787765454e954a5621..3f10895c3c5c8874054066735ef4b259061da1ab 100644 (file)
@@ -348,7 +348,7 @@ 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'] = '';
@@ -394,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
@@ -404,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
         *
@@ -471,7 +539,7 @@ class Probe
                        }
 
                        if ($host == 'twitter.com') {
-                               return ["network" => Protocol::TWITTER];
+                               return self::twitter($uri);
                        }
                        $lrdd = self::hostMeta($host);
 
@@ -512,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);
 
@@ -1411,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
         *