]> git.mxchange.org Git - friendica.git/commitdiff
Issue 7610-2: Read the "hide" status for non DFRN profiles
authorMichael <heluecht@pirati.ca>
Tue, 10 Sep 2019 20:06:07 +0000 (20:06 +0000)
committerMichael <heluecht@pirati.ca>
Tue, 10 Sep 2019 20:06:07 +0000 (20:06 +0000)
src/Network/Probe.php

index 15235c7c26d5969f2bc58caa67721e3e560474b1..ee8c686676f70a0854281b089d1ab1de5fe7b44f 100644 (file)
@@ -394,6 +394,10 @@ class Probe
                        $data['network'] = Protocol::PHANTOM;
                }
 
+               if (empty($data['hide']) && ($data['network'] != Protocol::DFRN)) {
+                       $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
         *