diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 15235c7c26..1b1d0cee32 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -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 *