use Friendica\Core\System;
use Friendica\Database\DBA;
use Friendica\Model\Profile;
+use Friendica\Protocol\Activity\ANamespace;
use Friendica\Protocol\ActivityPub;
use Friendica\Protocol\Email;
use Friendica\Protocol\Feed;
use Friendica\Util\Crypto;
-use Friendica\Util\DateTimeFormat;
use Friendica\Util\Network;
use Friendica\Util\Strings;
use Friendica\Util\XML;
Logger::log('webfingerDfrn: '.$webbie.':'.print_r($links, true), Logger::DATA);
if (!empty($links) && is_array($links)) {
foreach ($links as $link) {
- if ($link['@attributes']['rel'] === NAMESPACE_DFRN) {
+ if ($link['@attributes']['rel'] === ANamespace::DFRN) {
$profile_link = $link['@attributes']['href'];
}
- if (($link['@attributes']['rel'] === NAMESPACE_OSTATUSSUB) && ($profile_link == "")) {
+ if (($link['@attributes']['rel'] === ANamespace::OSTATUSSUB) && ($profile_link == "")) {
$profile_link = 'stat:'.$link['@attributes']['template'];
}
if ($link['@attributes']['rel'] === 'http://microformats.org/profile/hcard') {
if (!self::$istimeout) {
$ap_profile = ActivityPub::probeProfile($uri);
- if (empty($data) || (!empty($ap_profile) && empty($network) && (defaults($data, 'network', '') != Protocol::DFRN))) {
+ if (empty($data) || (!empty($ap_profile) && empty($network) && (($data['network'] ?? '') != Protocol::DFRN))) {
$data = $ap_profile;
} elseif (!empty($ap_profile)) {
$ap_profile['batch'] = '';
}
if (!empty($data['photo'])) {
- $data['baseurl'] = Network::getUrlMatch(Strings::normaliseLink(defaults($data, 'baseurl', '')), Strings::normaliseLink($data['photo']));
+ $data['baseurl'] = Network::getUrlMatch(Strings::normaliseLink($data['baseurl'] ?? ''), Strings::normaliseLink($data['photo']));
} else {
$data['photo'] = System::baseUrl() . '/images/person-300.jpg';
}
$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
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 (($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
*
$has_key = false;
foreach ($webfinger['links'] as $link) {
- if ($link['rel'] == NAMESPACE_OSTATUSSUB) {
+ if ($link['rel'] == ANamespace::OSTATUSSUB) {
$is_ostatus = true;
}
if ($link['rel'] == 'magic-public-key') {
return [];
}
- $path_parts = explode("/", trim(defaults($parts, 'path', ''), "/"));
+ $path_parts = explode("/", trim($parts['path'] ?? '', "/"));
while (!$lrdd && (sizeof($path_parts) > 1)) {
$host .= "/".array_shift($path_parts);
if (empty($data["addr"]) || empty($data["nick"])) {
$probe_data = self::uri($profile_link);
- $data["addr"] = defaults($data, "addr", $probe_data["addr"]);
- $data["nick"] = defaults($data, "nick", $probe_data["nick"]);
+ $data["addr"] = ($data["addr"] ?? '') ?: $probe_data["addr"];
+ $data["nick"] = ($data["nick"] ?? '') ?: $probe_data["nick"];
}
$prof_data["addr"] = $data["addr"];
$prof_data["nick"] = $data["nick"];
- $prof_data["dfrn-request"] = defaults($data, 'request', null);
- $prof_data["dfrn-confirm"] = defaults($data, 'confirm', null);
- $prof_data["dfrn-notify"] = defaults($data, 'notify' , null);
- $prof_data["dfrn-poll"] = defaults($data, 'poll' , null);
- $prof_data["photo"] = defaults($data, 'photo' , null);
- $prof_data["fn"] = defaults($data, 'name' , null);
- $prof_data["key"] = defaults($data, 'pubkey' , null);
+ $prof_data["dfrn-request"] = $data['request'] ?? null;
+ $prof_data["dfrn-confirm"] = $data['confirm'] ?? null;
+ $prof_data["dfrn-notify"] = $data['notify'] ?? null;
+ $prof_data["dfrn-poll"] = $data['poll'] ?? null;
+ $prof_data["photo"] = $data['photo'] ?? null;
+ $prof_data["fn"] = $data['name'] ?? null;
+ $prof_data["key"] = $data['pubkey'] ?? null;
Logger::log("Result for profile ".$profile_link.": ".print_r($prof_data, true), Logger::DEBUG);
// The array is reversed to take into account the order of preference for same-rel links
// See: https://tools.ietf.org/html/rfc7033#section-4.4.4
foreach (array_reverse($webfinger["links"]) as $link) {
- if (($link["rel"] == NAMESPACE_DFRN) && !empty($link["href"])) {
+ if (($link["rel"] == ANamespace::DFRN) && !empty($link["href"])) {
$data["network"] = Protocol::DFRN;
- } elseif (($link["rel"] == NAMESPACE_FEED) && !empty($link["href"])) {
+ } elseif (($link["rel"] == ANamespace::FEED) && !empty($link["href"])) {
$data["poll"] = $link["href"];
- } elseif (($link["rel"] == "http://webfinger.net/rel/profile-page") && (defaults($link, "type", "") == "text/html") && !empty($link["href"])) {
+ } elseif (($link["rel"] == "http://webfinger.net/rel/profile-page") && (($link["type"] ?? "") == "text/html") && !empty($link["href"])) {
$data["url"] = $link["href"];
} elseif (($link["rel"] == "http://microformats.org/profile/hcard") && !empty($link["href"])) {
$hcard_url = $link["href"];
- } elseif (($link["rel"] == NAMESPACE_POCO) && !empty($link["href"])) {
+ } elseif (($link["rel"] == ANamespace::POCO) && !empty($link["href"])) {
$data["poco"] = $link["href"];
} elseif (($link["rel"] == "http://webfinger.net/rel/avatar") && !empty($link["href"])) {
$data["photo"] = $link["href"];
$data["baseurl"] = trim($link["href"], '/');
} elseif (($link["rel"] == "http://joindiaspora.com/guid") && !empty($link["href"])) {
$data["guid"] = $link["href"];
- } elseif (($link["rel"] == "http://webfinger.net/rel/profile-page") && (defaults($link, "type", "") == "text/html") && !empty($link["href"])) {
+ } elseif (($link["rel"] == "http://webfinger.net/rel/profile-page") && (($link["type"] ?? "") == "text/html") && !empty($link["href"])) {
$data["url"] = $link["href"];
- } elseif (($link["rel"] == NAMESPACE_FEED) && !empty($link["href"])) {
+ } elseif (($link["rel"] == ANamespace::FEED) && !empty($link["href"])) {
$data["poll"] = $link["href"];
- } elseif (($link["rel"] == NAMESPACE_POCO) && !empty($link["href"])) {
+ } elseif (($link["rel"] == ANamespace::POCO) && !empty($link["href"])) {
$data["poco"] = $link["href"];
} elseif (($link["rel"] == "salmon") && !empty($link["href"])) {
$data["notify"] = $link["href"];
// See: https://tools.ietf.org/html/rfc7033#section-4.4.4
foreach (array_reverse($webfinger["links"]) as $link) {
if (($link["rel"] == "http://webfinger.net/rel/profile-page")
- && (defaults($link, "type", "") == "text/html")
+ && (($link["type"] ?? "") == "text/html")
&& ($link["href"] != "")
) {
$data["url"] = $link["href"];
} elseif (($link["rel"] == "salmon") && !empty($link["href"])) {
$data["notify"] = $link["href"];
- } elseif (($link["rel"] == NAMESPACE_FEED) && !empty($link["href"])) {
+ } elseif (($link["rel"] == ANamespace::FEED) && !empty($link["href"])) {
$data["poll"] = $link["href"];
} elseif (($link["rel"] == "magic-public-key") && !empty($link["href"])) {
$pubkey = $link["href"];
// See: https://tools.ietf.org/html/rfc7033#section-4.4.4
foreach (array_reverse($webfinger["links"]) as $link) {
if (($link["rel"] == "http://webfinger.net/rel/profile-page")
- && (defaults($link, "type", "") == "text/html")
+ && (($link["type"] ?? "") == "text/html")
&& ($link["href"] != "")
) {
$data["url"] = $link["href"];
$data['baseurl'] = 'https://twitter.com';
$curlResult = Network::curl($data['url'], false);
- if ($curlResult->isSuccess()) {
- return $data;
+ 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 [];
+
+ return $data;
}
/**