From ef7494359ff78596f42ae034a0f04529b9d5afe5 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Mon, 14 Mar 2016 18:12:35 -0700 Subject: some re-working of webfinger and hcard parsing which will be necessary going forward. --- include/network.php | 43 +++++++++++++++++++++++++++++++++---------- mod/webfinger.php | 31 ++++++++++++++++++++++++------- version.inc | 2 +- 3 files changed, 58 insertions(+), 18 deletions(-) diff --git a/include/network.php b/include/network.php index 93fd836f8..4eca53f92 100644 --- a/include/network.php +++ b/include/network.php @@ -1288,12 +1288,22 @@ LSIeXnd14lQYK/uxW/8cTFjcmddsKxeXysoQxbSa9VdDK+KkpZdgYXYrTTofXs6v+ function webfinger_rfc7033($webbie,$zot = false) { - if(! strpos($webbie,'@')) - return false; - $lhs = substr($webbie,0,strpos($webbie,'@')); - $rhs = substr($webbie,strpos($webbie,'@')+1); - - $resource = 'acct:' . $webbie; + if(strpos($webbie,'@')) { + $lhs = substr($webbie,0,strpos($webbie,'@')); + $rhs = substr($webbie,strpos($webbie,'@')+1); + $resource = 'acct:' . $webbie; + } + else { + $m = parse_url($webbie); + if($m) { + if($m['scheme'] !== 'https') + return false; + $rhs = $m['host'] . (($m['port']) ? ':' . $m['port'] : ''); + $resource = urlencode($webbie); + } + else + return false; + } $s = z_fetch_url('https://' . $rhs . '/.well-known/webfinger?f=&resource=' . $resource . (($zot) ? '&zot=1' : '')); @@ -1455,8 +1465,25 @@ function scrape_vcard($url) { if(attribute_contains($item->getAttribute('class'), 'vcard')) { $level2 = $item->getElementsByTagName('*'); foreach($level2 as $x) { + if(attribute_contains($x->getAttribute('id'),'pod_location')) + $ret['pod_location'] = $x->textContent; if(attribute_contains($x->getAttribute('class'),'fn')) $ret['fn'] = $x->textContent; + if(attribute_contains($x->getAttribute('class'),'uid')) + $ret['uid'] = $x->textContent; + if(attribute_contains($x->getAttribute('class'),'nickname')) + $ret['nick'] = $x->textContent; + if(attribute_contains($x->getAttribute('class'),'searchable')) + $ret['searchable'] = $x->textContent; + if(attribute_contains($x->getAttribute('class'),'key')) + $ret['public_key'] = $x->textContent; + if(attribute_contains($x->getAttribute('class'),'given_name')) + $ret['given_name'] = $x->textContent; + if(attribute_contains($x->getAttribute('class'),'family_name')) + $ret['family_name'] = $x->textContent; + if(attribute_contains($x->getAttribute('class'),'url')) + $ret['url'] = $x->textContent; + if((attribute_contains($x->getAttribute('class'),'photo')) || (attribute_contains($x->getAttribute('class'),'avatar'))) { $size = intval($x->getAttribute('width')); @@ -1465,10 +1492,6 @@ function scrape_vcard($url) { $largest_photo = $size; } } - if((attribute_contains($x->getAttribute('class'),'nickname')) - || (attribute_contains($x->getAttribute('class'),'uid'))) { - $ret['nick'] = $x->textContent; - } } } } diff --git a/mod/webfinger.php b/mod/webfinger.php index 74bfc3ce5..e35767338 100644 --- a/mod/webfinger.php +++ b/mod/webfinger.php @@ -4,6 +4,7 @@ function webfinger_content(&$a) { + $o .= '

Webfinger Diagnostic

'; $o .= '
'; @@ -11,18 +12,34 @@ function webfinger_content(&$a) { $o .= '
'; $o .= '

'; - + + $old = false; if(x($_GET,'addr')) { $addr = trim($_GET['addr']); - if(strpos($addr,'@') !== false) { +// if(strpos($addr,'@') !== false) { $res = webfinger_rfc7033($addr,true); - if(! $res) + if(! $res) { $res = old_webfinger($addr); + $old = true; + } +// } +// else { +// if(function_exists('lrdd')) +// $res = lrdd($addr); +// } + + if($res && $old) { + foreach($res as $r) { + if($r['@attributes']['rel'] === 'http://microformats.org/profile/hcard') { + $hcard = unamp($r['@attributes']['href']); + require_once('library/HTML5/Parser.php'); + $res['vcard'] = scrape_vcard($hcard); + break; + } + } } - else { - if(function_exists('lrdd')) - $res = lrdd($addr); - } + + $o .= '
';
 		$o .= str_replace("\n",'
',print_r($res,true)); $o .= '
'; diff --git a/version.inc b/version.inc index 435a0e60c..745b7640c 100644 --- a/version.inc +++ b/version.inc @@ -1 +1 @@ -2016-03-13.1334H +2016-03-14.1335H -- cgit v1.2.3