diff options
Diffstat (limited to 'Zotlabs/Lib/Webfinger.php')
-rw-r--r-- | Zotlabs/Lib/Webfinger.php | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/Zotlabs/Lib/Webfinger.php b/Zotlabs/Lib/Webfinger.php new file mode 100644 index 000000000..c2364ac4d --- /dev/null +++ b/Zotlabs/Lib/Webfinger.php @@ -0,0 +1,109 @@ +<?php + +namespace Zotlabs\Lib; + +/** + * @brief Fetch and return a webfinger for a resource + * + * @param string $resource - The resource + * @return boolean|string false or associative array from result JSON + */ + +class Webfinger { + + static private $server = EMPTY_STR; + static private $resource = EMPTY_STR; + + static function exec($resource) { + + if(! $resource) { + return false; + } + + self::parse_resource($resource); + + if(! ( self::$server && self::$resource)) { + return false; + } + + if(! check_siteallowed(self::$server)) { + logger('blacklisted: ' . self::$server); + return false; + } + + btlogger('fetching resource: ' . self::$resource . ' from ' . self::$server, LOGGER_DEBUG, LOG_INFO); + + $url = 'https://' . self::$server . '/.well-known/webfinger?f=&resource=' . self::$resource ; + + $counter = 0; + $s = z_fetch_url($url, false, $counter, [ 'headers' => [ 'Accept: application/jrd+json, */*' ] ]); + + if($s['success']) { + $j = json_decode($s['body'], true); + return($j); + } + + return false; + } + + static function parse_resource($resource) { + + self::$resource = urlencode($resource); + + if(strpos($resource,'http') === 0) { + $m = parse_url($resource); + if($m) { + if($m['scheme'] !== 'https') { + return false; + } + self::$server = $m['host'] . (($m['port']) ? ':' . $m['port'] : ''); + } + else { + return false; + } + } + elseif(strpos($resource,'tag:') === 0) { + $arr = explode(':',$resource); // split the tag + $h = explode(',',$arr[1]); // split the host,date + self::$server = $h[0]; + } + else { + $x = explode('@',$resource); + $username = $x[0]; + if(count($x) > 1) { + self::$server = $x[1]; + } + else { + return false; + } + if(strpos($resource,'acct:') !== 0) { + self::$resource = urlencode('acct:' . $resource); + } + } + + } + + /** + * @brief fetch a webfinger resource and return a zot6 discovery url if present + * + */ + + static function zot_url($resource) { + + $arr = self::exec($resource); + + if(is_array($arr) && array_key_exists('links',$arr)) { + foreach($arr['links'] as $link) { + if(array_key_exists('rel',$link) && $link['rel'] === PROTOCOL_ZOT6) { + if(array_key_exists('href',$link) && $link['href'] !== EMPTY_STR) { + return $link['href']; + } + } + } + } + return false; + } + + + +}
\ No newline at end of file |