diff --git a/include/Probe.php b/include/Probe.php index c91b2cdf27..78199e772b 100644 --- a/include/Probe.php +++ b/include/Probe.php @@ -177,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); @@ -200,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"])) @@ -315,7 +330,34 @@ 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); @@ -341,32 +383,9 @@ class Probe { $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://"?