X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2FProbe.php;h=f67a821f9dc04b3854570b881189ca98aa527ea8;hb=9ab0a9299e703c2815c4ac31a94bb936c8ce71ec;hp=1b6feb107f4d32cf260da732dac770b64247790d;hpb=18d23ca443a3a2df77b78ad28cc151199d70a8d8;p=friendica.git diff --git a/include/Probe.php b/include/Probe.php index 1b6feb107f..f67a821f9d 100644 --- a/include/Probe.php +++ b/include/Probe.php @@ -18,6 +18,8 @@ require_once('include/network.php'); */ class Probe { + private static $baseurl; + /** * @brief Rearrange the array so that it always has the same order * @@ -54,6 +56,9 @@ class Probe { */ private function xrd($host) { + // Reset the static variable + self::$baseurl = ''; + $ssl_url = "https://".$host."/.well-known/host-meta"; $url = "http://".$host."/.well-known/host-meta"; @@ -102,6 +107,9 @@ class Probe { elseif ($attributes["rel"] == "lrdd") $xrd_data["lrdd"] = $attributes["template"]; } + + self::$baseurl = "http://".$host; + return $xrd_data; } @@ -169,6 +177,8 @@ class Probe { $path_parts = explode("/", trim($parts["path"], "/")); + $nick = array_pop($path_parts); + do { $lrdd = self::xrd($host); $host .= "/".array_shift($path_parts); @@ -192,6 +202,19 @@ class Probe { $path = str_replace('{uri}', urlencode("acct:".$uri), $link); $webfinger = self::webfinger($path); } + + // Special treatment for Mastodon + // Problem is that Mastodon uses an URL format like http://domain.tld/@nick + // But the webfinger for this format fails. + if (!$webfinger AND isset($nick)) { + // Mastodon uses a "@" as prefix for usernames in their url format + $nick = ltrim($nick, '@'); + + $addr = $nick."@".$host; + + $path = str_replace('{uri}', urlencode("acct:".$addr), $link); + $webfinger = self::webfinger($path); + } } if (!is_array($webfinger["links"])) @@ -258,8 +281,13 @@ class Probe { $data['nick'] = trim(substr($data['nick'], 0, strpos($data['nick'], ' '))); } - if (!isset($data["network"])) + if (self::$baseurl != "") { + $data["baseurl"] = self::$baseurl; + } + + if (!isset($data["network"])) { $data["network"] = NETWORK_PHANTOM; + } $data = self::rearrange_data($data); @@ -286,6 +314,7 @@ class Probe { dbesc(normalise_link($data['url'])) ); } + return $data; } @@ -301,94 +330,98 @@ class Probe { * @return array uri data */ private function detect($uri, $network, $uid) { - if (strstr($uri, '@')) { + $parts = parse_url($uri); + + if (isset($parts["scheme"]) AND isset($parts["host"]) AND isset($parts["path"])) { + + /// @todo: Ports? + $host = $parts["host"]; + + if ($host == 'twitter.com') { + return array("network" => NETWORK_TWITTER); + } + $lrdd = self::xrd($host); + + $path_parts = explode("/", trim($parts["path"], "/")); + + while (!$lrdd AND (sizeof($path_parts) > 1)) { + $host .= "/".array_shift($path_parts); + $lrdd = self::xrd($host); + } + if (!$lrdd) { + return self::feed($uri); + } + $nick = array_pop($path_parts); + + // Mastodon uses a "@" as prefix for usernames in their url format + $nick = ltrim($nick, '@'); + + $addr = $nick."@".$host; + } elseif (strstr($uri, '@')) { // If the URI starts with "mailto:" then jump directly to the mail detection if (strpos($url,'mailto:') !== false) { $uri = str_replace('mailto:', '', $url); return self::mail($uri, $uid); } - if ($network == NETWORK_MAIL) + if ($network == NETWORK_MAIL) { return self::mail($uri, $uid); - + } // Remove "acct:" from the URI $uri = str_replace('acct:', '', $uri); $host = substr($uri,strpos($uri, '@') + 1); $nick = substr($uri,0, strpos($uri, '@')); - if (strpos($uri, '@twitter.com')) + if (strpos($uri, '@twitter.com')) { return array("network" => NETWORK_TWITTER); - + } $lrdd = self::xrd($host); - if (!$lrdd) + if (!$lrdd) { return self::mail($uri, $uid); - + } $addr = $uri; } else { - $parts = parse_url($uri); - if (!isset($parts["scheme"]) OR - !isset($parts["host"]) OR - !isset($parts["path"])) - return false; - - /// @todo: Ports? - $host = $parts["host"]; - - if ($host == 'twitter.com') - return array("network" => NETWORK_TWITTER); - - $lrdd = self::xrd($host); - - $path_parts = explode("/", trim($parts["path"], "/")); - - while (!$lrdd AND (sizeof($path_parts) > 1)) { - $host .= "/".array_shift($path_parts); - $lrdd = self::xrd($host); - } - if (!$lrdd) - return self::feed($uri); - - $nick = array_pop($path_parts); - $addr = $nick."@".$host; + return false; } + $webfinger = false; /// @todo Do we need the prefix "acct:" or "acct://"? foreach ($lrdd AS $key => $link) { - if ($webfinger) + if ($webfinger) { continue; - - if (!in_array($key, array("lrdd", "lrdd-xml", "lrdd-json"))) + } + if (!in_array($key, array("lrdd", "lrdd-xml", "lrdd-json"))) { continue; - - // Try webfinger with the address (user@domain.tld) - $path = str_replace('{uri}', urlencode($addr), $link); + } + // At first try it with the given uri + $path = str_replace('{uri}', urlencode($uri), $link); $webfinger = self::webfinger($path); - // Mastodon needs to have it with "acct:" + // We cannot be sure that the detected address was correct, so we don't use the values + if ($webfinger AND ($uri != $addr)) { + $nick = ""; + $addr = ""; + } + + // Try webfinger with the address (user@domain.tld) if (!$webfinger) { - $path = str_replace('{uri}', urlencode("acct:".$addr), $link); + $path = str_replace('{uri}', urlencode($addr), $link); $webfinger = self::webfinger($path); } - // If webfinger wasn't successful then try it with the URL - possibly in the format https://... - if (!$webfinger AND ($uri != $addr)) { - $path = str_replace('{uri}', urlencode($uri), $link); + // Mastodon needs to have it with "acct:" + if (!$webfinger) { + $path = str_replace('{uri}', urlencode("acct:".$addr), $link); $webfinger = self::webfinger($path); - - // Since the detection with the address wasn't successful, we delete it. - if ($webfinger) { - $nick = ""; - $addr = ""; - } } - } - if (!$webfinger) + if (!$webfinger) { return self::feed($uri); + } $result = false; @@ -855,33 +888,36 @@ class Probe { * @return array OStatus data */ private function ostatus($webfinger) { - $data = array(); - if (is_array($webfinger["aliases"])) - foreach($webfinger["aliases"] AS $alias) - if (strstr($alias, "@")) + if (is_array($webfinger["aliases"])) { + foreach ($webfinger["aliases"] AS $alias) { + if (strstr($alias, "@")) { $data["addr"] = str_replace('acct:', '', $alias); + } + } + } - if (is_string($webfinger["subject"]) AND strstr($webfinger["subject"], "@")) + if (is_string($webfinger["subject"]) AND strstr($webfinger["subject"], "@")) { $data["addr"] = str_replace('acct:', '', $webfinger["subject"]); - + } $pubkey = ""; foreach ($webfinger["links"] AS $link) { if (($link["rel"] == "http://webfinger.net/rel/profile-page") AND - ($link["type"] == "text/html") AND ($link["href"] != "")) + ($link["type"] == "text/html") AND ($link["href"] != "")) { $data["url"] = $link["href"]; - elseif (($link["rel"] == "salmon") AND ($link["href"] != "")) + } elseif (($link["rel"] == "salmon") AND ($link["href"] != "")) { $data["notify"] = $link["href"]; - elseif (($link["rel"] == NAMESPACE_FEED) AND ($link["href"] != "")) + } elseif (($link["rel"] == NAMESPACE_FEED) AND ($link["href"] != "")) { $data["poll"] = $link["href"]; - elseif (($link["rel"] == "magic-public-key") AND ($link["href"] != "")) { + } elseif (($link["rel"] == "magic-public-key") AND ($link["href"] != "")) { $pubkey = $link["href"]; if (substr($pubkey, 0, 5) === 'data:') { - if (strstr($pubkey, ',')) + if (strstr($pubkey, ',')) { $pubkey = substr($pubkey, strpos($pubkey, ',') + 1); - else + } else { $pubkey = substr($pubkey, 5); + } } elseif (normalise_link($pubkey) == 'http://') { $ret = z_fetch_url($pubkey); if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) { @@ -897,16 +933,15 @@ class Probe { $e = base64url_decode($key[2]); $data["pubkey"] = metopem($m,$e); } - } } if (isset($data["notify"]) AND isset($data["pubkey"]) AND isset($data["poll"]) AND isset($data["url"])) { $data["network"] = NETWORK_OSTATUS; - } else + } else { return false; - + } // Fetch all additional data from the feed $ret = z_fetch_url($data["poll"]); if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) { @@ -914,32 +949,32 @@ class Probe { } $feed = $ret['body']; $feed_data = feed_import($feed,$dummy1,$dummy2, $dummy3, true); - if (!$feed_data) + if (!$feed_data) { return false; - - if ($feed_data["header"]["author-name"] != "") + } + if ($feed_data["header"]["author-name"] != "") { $data["name"] = $feed_data["header"]["author-name"]; - - if ($feed_data["header"]["author-nick"] != "") + } + if ($feed_data["header"]["author-nick"] != "") { $data["nick"] = $feed_data["header"]["author-nick"]; - - if ($feed_data["header"]["author-avatar"] != "") - $data["photo"] = $feed_data["header"]["author-avatar"]; - - if ($feed_data["header"]["author-id"] != "") + } + if ($feed_data["header"]["author-avatar"] != "") { + $data["photo"] = ostatus::fix_avatar($feed_data["header"]["author-avatar"], $data["url"]); + } + if ($feed_data["header"]["author-id"] != "") { $data["alias"] = $feed_data["header"]["author-id"]; - - if ($feed_data["header"]["author-location"] != "") + } + if ($feed_data["header"]["author-location"] != "") { $data["location"] = $feed_data["header"]["author-location"]; - - if ($feed_data["header"]["author-about"] != "") + } + if ($feed_data["header"]["author-about"] != "") { $data["about"] = $feed_data["header"]["author-about"]; - + } // OStatus has serious issues when the the url doesn't fit (ssl vs. non ssl) // So we take the value that we just fetched, although the other one worked as well - if ($feed_data["header"]["author-link"] != "") + if ($feed_data["header"]["author-link"] != "") { $data["url"] = $feed_data["header"]["author-link"]; - + } /// @todo Fetch location and "about" from the feed as well return $data; }