diff --git a/src/App/Router.php b/src/App/Router.php index d16cc5b44..b904de64b 100644 --- a/src/App/Router.php +++ b/src/App/Router.php @@ -45,11 +45,11 @@ class Router $this->routeCollector->addRoute(['GET'], '/host-meta', Module\HostMeta::class); $this->routeCollector->addRoute(['GET'], '/hostxrd', Module\HostMeta::class); $this->routeCollector->addRoute(['GET'], '/nodeinfo/1.0', Module\NodeInfo::class); - $this->routeCollector->addRoute(['GET'], '/xrd', Module\WebFinger::class); + $this->routeCollector->addRoute(['GET'], '/xrd', Module\Xrd::class); $this->routeCollector->addGroup('/.well-known', function (RouteCollector $collector) { $collector->addRoute(['GET'], '/host-meta' , Module\WellKnown\HostMeta::class); $collector->addRoute(['GET'], '/nodeinfo[/1.0]' , Module\NodeInfo::class); - $collector->addRoute(['GET'], '/webfinger' , Module\WebFinger::class); + $collector->addRoute(['GET'], '/webfinger' , Module\WellKnown\WebFinger::class); $collector->addRoute(['GET'], '/x-social-relay' , Module\WellKnown\XSocialRelay::class); }); } diff --git a/src/Module/WebFinger.php b/src/Module/WebFinger.php deleted file mode 100644 index d456c6aac..000000000 --- a/src/Module/WebFinger.php +++ /dev/null @@ -1,235 +0,0 @@ - L10n::t("Public access denied."), - "description" => L10n::t("Only logged in users are permitted to perform a probing.") - ] - ); - exit(); - } - - $output = '
'; - $output .= '

Webfinger Diagnostic

'; - - $output .= '
'; - $output .= 'Lookup address: '; - $output .= '
'; - - $output .= '

'; - - if (!empty($_GET['addr'])) { - $addr = trim($_GET['addr']); - $res = Probe::lrdd($addr); - $output .= '
';
-			$output .= str_replace("\n", '
', print_r($res, true)); - $output .= '
'; - } - $output .= '
'; - - return $output; - } - - public static function rawContent() - { - parent::rawContent(); - - $app = self::getApp(); - - // @TODO: Replace with parameter from router - if ($app->argv[0] == 'xrd') { - if (empty($_GET['uri'])) { - return; - } - - $uri = urldecode(Strings::escapeTags(trim($_GET['uri']))); - if (defaults($_SERVER, 'HTTP_ACCEPT', '') == 'application/jrd+json') { - $mode = 'json'; - } else { - $mode = 'xml'; - } - } else { - if (empty($_GET['resource'])) { - return; - } - - $uri = urldecode(Strings::escapeTags(trim($_GET['resource']))); - if (defaults($_SERVER, 'HTTP_ACCEPT', '') == 'application/xrd+xml') { - $mode = 'xml'; - } else { - $mode = 'json'; - } - } - - if (substr($uri, 0, 4) === 'http') { - $name = ltrim(basename($uri), '~'); - } else { - $local = str_replace('acct:', '', $uri); - if (substr($local, 0, 2) == '//') { - $local = substr($local, 2); - } - - $name = substr($local, 0, strpos($local, '@')); - } - - $user = User::getByNickname($name); - - if (empty($user)) { - System::httpExit(404); - } - - $profileURL = $app->getBaseURL() . '/profile/' . $user['nickname']; - $alias = str_replace('/profile/', '/~', $profileURL); - - $addr = 'acct:' . $user['nickname'] . '@' . $app->getHostName(); - if ($app->getURLPath()) { - $addr .= '/' . $app->getURLPath(); - } - - if ($mode == 'xml') { - self::printXML($addr, $alias, $profileURL, $app->getBaseURL(), $user); - } else { - self::printJSON($addr, $alias, $profileURL, $app->getBaseURL(), $user); - } - } - - private static function printJSON($uri, $alias, $orofileURL, $baseURL, $user) - { - $salmon_key = Salmon::salmonKey($user['spubkey']); - - header('Access-Control-Allow-Origin: *'); - header("Content-type: application/json; charset=utf-8"); - - $json = ['subject' => $uri, - 'aliases' => [ - $alias, - $orofileURL, - ], - 'links' => [ - [ - 'rel' => NAMESPACE_DFRN, - 'href' => $orofileURL, - ], - [ - 'rel' => NAMESPACE_FEED, - 'type' => 'application/atom+xml', - 'href' => $baseURL . '/dfrn_poll/' . $user['nickname'], - ], - [ - 'rel' => 'http://webfinger.net/rel/profile-page', - 'type' => 'text/html', - 'href' => $orofileURL, - ], - [ - 'rel' => 'self', - 'type' => 'application/activity+json', - 'href' => $orofileURL, - ], - [ - 'rel' => 'http://microformats.org/profile/hcard', - 'type' => 'text/html', - 'href' => $baseURL . '/hcard/' . $user['nickname'], - ], - [ - 'rel' => NAMESPACE_POCO, - 'href' => $baseURL . '/poco/' . $user['nickname'], - ], - [ - 'rel' => 'http://webfinger.net/rel/avatar', - 'type' => 'image/jpeg', - 'href' => $baseURL . '/photo/profile/' . $user['uid'] . '.jpg', - ], - [ - 'rel' => 'http://joindiaspora.com/seed_location', - 'type' => 'text/html', - 'href' => $baseURL, - ], - [ - 'rel' => 'salmon', - 'href' => $baseURL . '/salmon/' . $user['nickname'], - ], - [ - 'rel' => 'http://salmon-protocol.org/ns/salmon-replies', - 'href' => $baseURL . '/salmon/' . $user['nickname'], - ], - [ - 'rel' => 'http://salmon-protocol.org/ns/salmon-mention', - 'href' => $baseURL . '/salmon/' . $user['nickname'] . '/mention', - ], - [ - 'rel' => 'http://ostatus.org/schema/1.0/subscribe', - 'template' => $baseURL . '/follow?url={uri}', - ], - [ - 'rel' => 'magic-public-key', - 'href' => 'data:application/magic-public-key,' . $salmon_key, - ], - [ - 'rel' => 'http://purl.org/openwebauth/v1', - 'type' => 'application/x-zot+json', - 'href' => $baseURL . '/owa', - ], - ], - ]; - - echo json_encode($json); - exit(); - } - - private static function printXML($uri, $alias, $profileURL, $baseURL, $user) - { - $salmon_key = Salmon::salmonKey($user['spubkey']); - - header('Access-Control-Allow-Origin: *'); - header("Content-type: text/xml"); - - $tpl = Renderer::getMarkupTemplate('xrd_person.tpl'); - - $o = Renderer::replaceMacros($tpl, [ - '$nick' => $user['nickname'], - '$accturi' => $uri, - '$alias' => $alias, - '$profile_url' => $profileURL, - '$hcard_url' => $baseURL . '/hcard/' . $user['nickname'], - '$atom' => $baseURL . '/dfrn_poll/' . $user['nickname'], - '$poco_url' => $baseURL . '/poco/' . $user['nickname'], - '$photo' => $baseURL . '/photo/profile/' . $user['uid'] . '.jpg', - '$baseurl' => $baseURL, - '$salmon' => $baseURL . '/salmon/' . $user['nickname'], - '$salmen' => $baseURL . '/salmon/' . $user['nickname'] . '/mention', - '$subscribe' => $baseURL . '/follow?url={uri}', - '$openwebauth' => $baseURL . '/owa', - '$modexp' => 'data:application/magic-public-key,' . $salmon_key] - ); - - $arr = ['user' => $user, 'xml' => $o]; - Hook::callAll('personal_xrd', $arr); - - echo $arr['xml']; - exit(); - } -} diff --git a/src/Module/WellKnown/HostMeta.php b/src/Module/WellKnown/HostMeta.php index 282781adf..aad56293d 100644 --- a/src/Module/WellKnown/HostMeta.php +++ b/src/Module/WellKnown/HostMeta.php @@ -15,8 +15,6 @@ class HostMeta extends BaseModule { public static function rawContent() { - parent::rawContent(); - $app = self::getApp(); $config = $app->getConfig(); diff --git a/src/Module/WellKnown/WebFinger.php b/src/Module/WellKnown/WebFinger.php new file mode 100644 index 000000000..d9a143a7a --- /dev/null +++ b/src/Module/WellKnown/WebFinger.php @@ -0,0 +1,196 @@ +argv[0] == 'xrd') { + if (empty($_GET['uri'])) { + return; + } + + $uri = urldecode(Strings::escapeTags(trim($_GET['uri']))); + if (defaults($_SERVER, 'HTTP_ACCEPT', '') == 'application/jrd+json') { + $mode = 'json'; + } else { + $mode = 'xml'; + } + } else { + if (empty($_GET['resource'])) { + return; + } + + $uri = urldecode(Strings::escapeTags(trim($_GET['resource']))); + if (defaults($_SERVER, 'HTTP_ACCEPT', '') == 'application/xrd+xml') { + $mode = 'xml'; + } else { + $mode = 'json'; + } + } + + if (substr($uri, 0, 4) === 'http') { + $name = ltrim(basename($uri), '~'); + } else { + $local = str_replace('acct:', '', $uri); + if (substr($local, 0, 2) == '//') { + $local = substr($local, 2); + } + + $name = substr($local, 0, strpos($local, '@')); + } + + $user = User::getByNickname($name); + + if (empty($user)) { + System::httpExit(404); + } + + $profileURL = $app->getBaseURL() . '/profile/' . $user['nickname']; + $alias = str_replace('/profile/', '/~', $profileURL); + + $addr = 'acct:' . $user['nickname'] . '@' . $app->getHostName(); + if ($app->getURLPath()) { + $addr .= '/' . $app->getURLPath(); + } + + if ($mode == 'xml') { + self::printXML($addr, $alias, $profileURL, $app->getBaseURL(), $user); + } else { + self::printJSON($addr, $alias, $profileURL, $app->getBaseURL(), $user); + } + } + + private static function printJSON($uri, $alias, $orofileURL, $baseURL, $user) + { + $salmon_key = Salmon::salmonKey($user['spubkey']); + + header('Access-Control-Allow-Origin: *'); + header("Content-type: application/json; charset=utf-8"); + + $json = [ + 'subject' => $uri, + 'aliases' => [ + $alias, + $orofileURL, + ], + 'links' => [ + [ + 'rel' => NAMESPACE_DFRN, + 'href' => $orofileURL, + ], + [ + 'rel' => NAMESPACE_FEED, + 'type' => 'application/atom+xml', + 'href' => $baseURL . '/dfrn_poll/' . $user['nickname'], + ], + [ + 'rel' => 'http://webfinger.net/rel/profile-page', + 'type' => 'text/html', + 'href' => $orofileURL, + ], + [ + 'rel' => 'self', + 'type' => 'application/activity+json', + 'href' => $orofileURL, + ], + [ + 'rel' => 'http://microformats.org/profile/hcard', + 'type' => 'text/html', + 'href' => $baseURL . '/hcard/' . $user['nickname'], + ], + [ + 'rel' => NAMESPACE_POCO, + 'href' => $baseURL . '/poco/' . $user['nickname'], + ], + [ + 'rel' => 'http://webfinger.net/rel/avatar', + 'type' => 'image/jpeg', + 'href' => $baseURL . '/photo/profile/' . $user['uid'] . '.jpg', + ], + [ + 'rel' => 'http://joindiaspora.com/seed_location', + 'type' => 'text/html', + 'href' => $baseURL, + ], + [ + 'rel' => 'salmon', + 'href' => $baseURL . '/salmon/' . $user['nickname'], + ], + [ + 'rel' => 'http://salmon-protocol.org/ns/salmon-replies', + 'href' => $baseURL . '/salmon/' . $user['nickname'], + ], + [ + 'rel' => 'http://salmon-protocol.org/ns/salmon-mention', + 'href' => $baseURL . '/salmon/' . $user['nickname'] . '/mention', + ], + [ + 'rel' => 'http://ostatus.org/schema/1.0/subscribe', + 'template' => $baseURL . '/follow?url={uri}', + ], + [ + 'rel' => 'magic-public-key', + 'href' => 'data:application/magic-public-key,' . $salmon_key, + ], + [ + 'rel' => 'http://purl.org/openwebauth/v1', + 'type' => 'application/x-zot+json', + 'href' => $baseURL . '/owa', + ], + ], + ]; + + echo json_encode($json); + exit(); + } + + private static function printXML($uri, $alias, $profileURL, $baseURL, $user) + { + $salmon_key = Salmon::salmonKey($user['spubkey']); + + header('Access-Control-Allow-Origin: *'); + header("Content-type: text/xml"); + + $tpl = Renderer::getMarkupTemplate('xrd_person.tpl'); + + $o = Renderer::replaceMacros($tpl, [ + '$nick' => $user['nickname'], + '$accturi' => $uri, + '$alias' => $alias, + '$profile_url' => $profileURL, + '$hcard_url' => $baseURL . '/hcard/' . $user['nickname'], + '$atom' => $baseURL . '/dfrn_poll/' . $user['nickname'], + '$poco_url' => $baseURL . '/poco/' . $user['nickname'], + '$photo' => $baseURL . '/photo/profile/' . $user['uid'] . '.jpg', + '$baseurl' => $baseURL, + '$salmon' => $baseURL . '/salmon/' . $user['nickname'], + '$salmen' => $baseURL . '/salmon/' . $user['nickname'] . '/mention', + '$subscribe' => $baseURL . '/follow?url={uri}', + '$openwebauth' => $baseURL . '/owa', + '$modexp' => 'data:application/magic-public-key,' . $salmon_key + ]); + + $arr = ['user' => $user, 'xml' => $o]; + Hook::callAll('personal_xrd', $arr); + + echo $arr['xml']; + exit(); + } +} diff --git a/src/Module/WellKnown/XSocialRelay.php b/src/Module/WellKnown/XSocialRelay.php index 5766a8ce5..da3533fee 100644 --- a/src/Module/WellKnown/XSocialRelay.php +++ b/src/Module/WellKnown/XSocialRelay.php @@ -13,8 +13,6 @@ class XSocialRelay extends BaseModule { public static function rawContent() { - parent::rawContent(); - $app = self::getApp(); $config = $app->getConfig(); diff --git a/src/Module/Xrd.php b/src/Module/Xrd.php new file mode 100644 index 000000000..1251e6e28 --- /dev/null +++ b/src/Module/Xrd.php @@ -0,0 +1,43 @@ + L10n::t("Public access denied."), + "description" => L10n::t("Only logged in users are permitted to perform a probing.") + ] + ); + exit(); + } + } + + public static function content() + { + $addr = defaults($_GET, 'addr', ''); + $res = ''; + + if (!empty($addr)) { + $res = Probe::lrdd($addr); + $res = str_replace("\n", '
', print_r($res, true)); + } + + $tpl = Renderer::getMarkupTemplate("xrd.tpl"); + return Renderer::replaceMacros($tpl, [ + '$addr' => $addr, + '$res' => $res, + ]); + } +} diff --git a/view/templates/xrd.tpl b/view/templates/xrd.tpl new file mode 100644 index 000000000..c9c2e48a1 --- /dev/null +++ b/view/templates/xrd.tpl @@ -0,0 +1,16 @@ +
+

Webfinger Diagnostic

+ +
+ Lookup address: + +
+ +

+ + {{if $res}} +
+		{{$res}}
+	
+ {{/if}} +