modularise webfinger and make it service agnostic
This commit is contained in:
parent
a340f70c51
commit
744edcf2ab
116
boot.php
116
boot.php
|
@ -833,57 +833,89 @@ function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
|
||||||
// Return an empty string if email-style addresses but webfinger fails,
|
// Return an empty string if email-style addresses but webfinger fails,
|
||||||
// or if the resultant personal XRD doesn't contain a DFRN profile.
|
// or if the resultant personal XRD doesn't contain a DFRN profile.
|
||||||
|
|
||||||
if(! function_exists('webfinger')) {
|
if(! function_exists('webfinger_dfrn')) {
|
||||||
function webfinger($s) {
|
function webfinger_dfrn($s) {
|
||||||
if(! strstr($s,'@')) {
|
if(! strstr($s,'@')) {
|
||||||
return $s;
|
return $s;
|
||||||
}
|
}
|
||||||
$host = substr($s,strpos($s,'@') + 1);
|
$links = webfinger($s);
|
||||||
$url = 'http://' . $host . '/.well-known/host-meta' ;
|
if(count($links)) {
|
||||||
$xml = fetch_url($url);
|
|
||||||
if (! $xml)
|
|
||||||
return '';
|
|
||||||
$h = simplexml_load_string($xml);
|
|
||||||
$arr = convert_xml_element_to_array($h);
|
|
||||||
|
|
||||||
if(! isset($arr['xrd']['link']))
|
|
||||||
return '';
|
|
||||||
|
|
||||||
$link = $arr['xrd']['link'];
|
|
||||||
if(! isset($link[0]))
|
|
||||||
$links = array($link);
|
|
||||||
else
|
|
||||||
$links = $link;
|
|
||||||
|
|
||||||
foreach($links as $link)
|
|
||||||
if($link['@attributes']['rel'] && $link['@attributes']['rel'] === 'lrdd')
|
|
||||||
$tpl = $link['@attributes']['template'];
|
|
||||||
if((empty($tpl)) || (! strpos($tpl, '{uri}')))
|
|
||||||
return '';
|
|
||||||
|
|
||||||
$pxrd = str_replace('{uri}', urlencode('acct://'.$s), $tpl);
|
|
||||||
|
|
||||||
$xml = fetch_url($pxrd);
|
|
||||||
if (! $xml)
|
|
||||||
return '';
|
|
||||||
$h = simplexml_load_string($xml);
|
|
||||||
$arr = convert_xml_element_to_array($h);
|
|
||||||
|
|
||||||
if(! isset($arr['xrd']['link']))
|
|
||||||
return '';
|
|
||||||
|
|
||||||
$link = $arr['xrd']['link'];
|
|
||||||
if(! isset($link[0]))
|
|
||||||
$links = array($link);
|
|
||||||
else
|
|
||||||
$links = $link;
|
|
||||||
|
|
||||||
foreach($links as $link)
|
foreach($links as $link)
|
||||||
if($link['@attributes']['rel'] == NAMESPACE_DFRN)
|
if($link['@attributes']['rel'] == NAMESPACE_DFRN)
|
||||||
return $link['@attributes']['href'];
|
return $link['@attributes']['href'];
|
||||||
|
}
|
||||||
return '';
|
return '';
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
// Given an email style address, perform webfinger lookup and
|
||||||
|
// return the array of link attributes from the personal XRD file.
|
||||||
|
// On error/failure return an empty array.
|
||||||
|
|
||||||
|
|
||||||
|
if(! function_exists('webfinger')) {
|
||||||
|
function webfinger($s) {
|
||||||
|
$host = '';
|
||||||
|
if(strstr($s,'@')) {
|
||||||
|
$host = substr($s,strpos($s,'@') + 1);
|
||||||
|
}
|
||||||
|
if(strlen($host)) {
|
||||||
|
$tpl = fetch_lrdd_template($host);
|
||||||
|
if(strlen($tpl)) {
|
||||||
|
$pxrd = str_replace('{uri}', urlencode('acct://'.$s), $tpl);
|
||||||
|
$links = fetch_xrd_links($pxrd);
|
||||||
|
if(! count($links)) {
|
||||||
|
// try without the double slashes
|
||||||
|
$pxrd = str_replace('{uri}', urlencode('acct:'.$s), $tpl);
|
||||||
|
$links = fetch_xrd_links($pxrd);
|
||||||
|
}
|
||||||
|
return $links;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return array();
|
||||||
|
}}
|
||||||
|
|
||||||
|
// Given a host name, locate the LRDD template from that
|
||||||
|
// host. Returns the LRDD template or an empty string on
|
||||||
|
// error/failure.
|
||||||
|
|
||||||
|
if(! function_exists('fetch_lrdd_template')) {
|
||||||
|
function fetch_lrdd_template($host) {
|
||||||
|
$tpl = '';
|
||||||
|
$url = 'http://' . $host . '/.well-known/host-meta' ;
|
||||||
|
$links = fetch_xrd_links($url);
|
||||||
|
if(count($links)) {
|
||||||
|
foreach($links as $link)
|
||||||
|
if($link['@attributes']['rel'] && $link['@attributes']['rel'] === 'lrdd')
|
||||||
|
$tpl = $link['@attributes']['template'];
|
||||||
|
}
|
||||||
|
if(! strpos($tpl,'{uri}'))
|
||||||
|
$tpl = '';
|
||||||
|
return $tpl;
|
||||||
|
}}
|
||||||
|
|
||||||
|
// Given a URL, retrieve the page as an XRD document.
|
||||||
|
// Return an array of links.
|
||||||
|
// on error/failure return empty array.
|
||||||
|
|
||||||
|
if(! function_exists('fetch_xrd_links')) {
|
||||||
|
function fetch_xrd_links($url) {
|
||||||
|
|
||||||
|
$xml = fetch_url($url);
|
||||||
|
if (! $xml)
|
||||||
|
return array();
|
||||||
|
$h = simplexml_load_string($xml);
|
||||||
|
$arr = convert_xml_element_to_array($h);
|
||||||
|
|
||||||
|
if(isset($arr['xrd']['link'])) {
|
||||||
|
$link = $arr['xrd']['link'];
|
||||||
|
if(! isset($link[0]))
|
||||||
|
$links = array($link);
|
||||||
|
else
|
||||||
|
$links = $link;
|
||||||
|
return $links;
|
||||||
|
}
|
||||||
|
return array();
|
||||||
|
}}
|
||||||
|
|
||||||
// Convert an ACL array to a storable string
|
// Convert an ACL array to a storable string
|
||||||
|
|
||||||
|
|
|
@ -181,7 +181,7 @@ function dfrn_request_post(&$a) {
|
||||||
|
|
||||||
// Canonicalise email-style profile locator
|
// Canonicalise email-style profile locator
|
||||||
|
|
||||||
$url = webfinger($url);
|
$url = webfinger_dfrn($url);
|
||||||
|
|
||||||
if(! strlen($url)) {
|
if(! strlen($url)) {
|
||||||
notice( t("Unable to resolve your name at the provided location.") . EOL);
|
notice( t("Unable to resolve your name at the provided location.") . EOL);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user