aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--boot.php108
-rw-r--r--mod/dfrn_request.php2
2 files changed, 71 insertions, 39 deletions
diff --git a/boot.php b/boot.php
index 4deafe317..bd6d6cc86 100644
--- a/boot.php
+++ b/boot.php
@@ -833,58 +833,90 @@ function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
// Return an empty string if email-style addresses but webfinger fails,
// or if the resultant personal XRD doesn't contain a DFRN profile.
-if(! function_exists('webfinger')) {
-function webfinger($s) {
+if(! function_exists('webfinger_dfrn')) {
+function webfinger_dfrn($s) {
if(! strstr($s,'@')) {
return $s;
}
- $host = substr($s,strpos($s,'@') + 1);
- $url = 'http://' . $host . '/.well-known/host-meta' ;
- $xml = fetch_url($url);
- if (! $xml)
- return '';
- $h = simplexml_load_string($xml);
- $arr = convert_xml_element_to_array($h);
+ $links = webfinger($s);
+ if(count($links)) {
+ foreach($links as $link)
+ if($link['@attributes']['rel'] == NAMESPACE_DFRN)
+ return $link['@attributes']['href'];
+ }
+ return '';
+}}
- if(! isset($arr['xrd']['link']))
- 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.
- $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 '';
+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.
- $pxrd = str_replace('{uri}', urlencode('acct://'.$s), $tpl);
+if(! function_exists('fetch_xrd_links')) {
+function fetch_xrd_links($url) {
- $xml = fetch_url($pxrd);
+ $xml = fetch_url($url);
if (! $xml)
- return '';
+ return array();
$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'] == NAMESPACE_DFRN)
- return $link['@attributes']['href'];
- return '';
+ 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
if(! function_exists('perms2str')) {
diff --git a/mod/dfrn_request.php b/mod/dfrn_request.php
index 1458ba8e4..3cb2a16a4 100644
--- a/mod/dfrn_request.php
+++ b/mod/dfrn_request.php
@@ -181,7 +181,7 @@ function dfrn_request_post(&$a) {
// Canonicalise email-style profile locator
- $url = webfinger($url);
+ $url = webfinger_dfrn($url);
if(! strlen($url)) {
notice( t("Unable to resolve your name at the provided location.") . EOL);