Reestablish the communication with Mastodon

This commit is contained in:
Michael 2017-03-27 20:58:15 +00:00
parent 8580cd87a6
commit c85331d8ac

View file

@ -177,6 +177,8 @@ class Probe {
$path_parts = explode("/", trim($parts["path"], "/")); $path_parts = explode("/", trim($parts["path"], "/"));
$nick = array_pop($path_parts);
do { do {
$lrdd = self::xrd($host); $lrdd = self::xrd($host);
$host .= "/".array_shift($path_parts); $host .= "/".array_shift($path_parts);
@ -200,6 +202,19 @@ class Probe {
$path = str_replace('{uri}', urlencode("acct:".$uri), $link); $path = str_replace('{uri}', urlencode("acct:".$uri), $link);
$webfinger = self::webfinger($path); $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"])) if (!is_array($webfinger["links"]))
@ -315,7 +330,34 @@ class Probe {
* @return array uri data * @return array uri data
*/ */
private function detect($uri, $network, $uid) { 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 the URI starts with "mailto:" then jump directly to the mail detection
if (strpos($url,'mailto:') !== false) { if (strpos($url,'mailto:') !== false) {
$uri = str_replace('mailto:', '', $url); $uri = str_replace('mailto:', '', $url);
@ -341,32 +383,9 @@ class Probe {
$addr = $uri; $addr = $uri;
} else { } else {
$parts = parse_url($uri); return false;
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;
} }
$webfinger = false; $webfinger = false;
/// @todo Do we need the prefix "acct:" or "acct://"? /// @todo Do we need the prefix "acct:" or "acct://"?