From e2224a2ddce3e2944765ecb46bc8a646df06109e Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Sat, 28 Oct 2017 11:48:29 +0000
Subject: [PATCH] Some Webfinger clean up

---
 mod/noscrape.php              |  1 +
 mod/xrd.php                   | 25 ++++++++++---------------
 src/Network/Probe.php         | 20 ++++++++++++++++----
 view/templates/xrd_person.tpl |  2 +-
 4 files changed, 28 insertions(+), 20 deletions(-)

diff --git a/mod/noscrape.php b/mod/noscrape.php
index 4b2ce73a39..7a32e4d55f 100644
--- a/mod/noscrape.php
+++ b/mod/noscrape.php
@@ -36,6 +36,7 @@ function noscrape_init(App $a) {
 		'fn'       => $a->profile['name'],
 		'addr'     => $a->profile['addr'],
 		'nick'     => $which,
+		'guid'     => $a->profile['guid'],
 		'key'      => $a->profile['pubkey'],
 		'homepage' => System::baseUrl()."/profile/{$which}",
 		'comm'     => (x($a->profile,'page-flags')) && ($a->profile['page-flags'] == PAGE_COMMUNITY),
diff --git a/mod/xrd.php b/mod/xrd.php
index ca6c02b6a2..60f78ed27c 100644
--- a/mod/xrd.php
+++ b/mod/xrd.php
@@ -22,16 +22,14 @@ function xrd_init(App $a) {
 		}
 	}
 
-	if(substr($uri,0,4) === 'http') {
-		$acct = false;
+	if (substr($uri, 0, 4) === 'http') {
 		$name = ltrim(basename($uri), '~');
 	} else {
-		$acct = true;
 		$local = str_replace('acct:', '', $uri);
-		if(substr($local,0,2) == '//')
+		if (substr($local, 0, 2) == '//')
 			$local = substr($local, 2);
 
-		$name = substr($local, 0, strpos($local,'@'));
+		$name = substr($local, 0, strpos($local, '@'));
 	}
 
 	$r = dba::select('user', array(), array('nickname' => $name), array('limit' => 1));
@@ -41,20 +39,17 @@ function xrd_init(App $a) {
 
 	$profile_url = System::baseUrl().'/profile/'.$r['nickname'];
 
-	if ($acct) {
-		$alias = $profile_url;
-	} else {
-		$alias = 'acct:'.$r['nickname'].'@'.$a->get_hostname();
+	$alias = str_replace('/profile/', '/~', $profile_url);
 
-		if ($a->get_path()) {
-			$alias .= '/'.$a->get_path();
-		}
+	$addr = 'acct:'.$r['nickname'].'@'.$a->get_hostname();
+	if ($a->get_path()) {
+		$addr .= '/'.$a->get_path();
 	}
 
 	if ($mode == 'xml') {
-		xrd_xml($a, $uri, $alias, $profile_url, $r);
+		xrd_xml($a, $addr, $alias, $profile_url, $r);
 	} else {
-		xrd_json($a, $uri, $alias, $profile_url, $r);
+		xrd_json($a, $addr, $alias, $profile_url, $r);
 	}
 }
 
@@ -65,7 +60,7 @@ function xrd_json($a, $uri, $alias, $profile_url, $r) {
 	header("Content-type: application/json; charset=utf-8");
 
 	$json = array('subject' => $uri,
-			'aliases' => array($alias),
+			'aliases' => array($alias, $profile_url),
 			'links' => array(array('rel' => NAMESPACE_DFRN, 'href' => $profile_url),
 					array('rel' => NAMESPACE_FEED, 'type' => 'application/atom+xml', 'href' => System::baseUrl().'/dfrn_poll/'.$r['nickname']),
 					array('rel' => 'http://webfinger.net/rel/profile-page', 'type' => 'text/html', 'href' => $profile_url),
diff --git a/src/Network/Probe.php b/src/Network/Probe.php
index 30b197f5b6..8ea7d660ae 100644
--- a/src/Network/Probe.php
+++ b/src/Network/Probe.php
@@ -778,6 +778,10 @@ class Probe {
 			$data["nick"] = $json["nick"];
 		}
 
+		if (!empty($json["guid"])) {
+			$data["guid"] = $json["guid"];
+		}
+
 		if (!empty($json["comm"])) {
 			$data["community"] = $json["comm"];
 		}
@@ -905,7 +909,6 @@ class Probe {
 	 * @return array DFRN data
 	 */
 	private static function dfrn($webfinger) {
-
 		$hcard_url = "";
 		$data = array();
 		foreach ($webfinger["links"] as $link) {
@@ -937,7 +940,9 @@ class Probe {
 
 		if (is_array($webfinger["aliases"])) {
 			foreach ($webfinger["aliases"] as $alias) {
-				if (substr($alias, 0, 5) == 'acct:') {
+				if (normalise_link($alias) != normalise_link($data["url"]) && ! strstr($alias, "@")) {
+					$data["alias"] = $alias;
+				} elseif (substr($alias, 0, 5) == 'acct:') {
 					$data["addr"] = substr($alias, 5);
 				}
 			}
@@ -1134,6 +1139,10 @@ class Probe {
 			}
 		}
 
+		if (!empty($webfinger["subject"]) && (substr($webfinger["subject"], 0, 5) == 'acct:')) {
+			$data["addr"] = substr($webfinger["subject"], 5);
+		}
+
 		// Fetch further information from the hcard
 		$data = self::pollHcard($hcard_url, $data);
 
@@ -1172,17 +1181,20 @@ class Probe {
 	 */
 	private static function ostatus($webfinger, $short = false) {
 		$data = array();
+
 		if (is_array($webfinger["aliases"])) {
 			foreach ($webfinger["aliases"] as $alias) {
-				if (strstr($alias, "@")) {
+				if (strstr($alias, "@") && !strstr(normalise_link($alias), "http://")) {
 					$data["addr"] = str_replace('acct:', '', $alias);
 				}
 			}
 		}
 
-		if (is_string($webfinger["subject"]) && strstr($webfinger["subject"], "@")) {
+		if (is_string($webfinger["subject"]) && strstr($webfinger["subject"], "@") &&
+			!strstr(normalise_link($webfinger["subject"]), "http://")) {
 			$data["addr"] = str_replace('acct:', '', $webfinger["subject"]);
 		}
+
 		$pubkey = "";
 		if (is_array($webfinger["links"])) {
 			foreach ($webfinger["links"] as $link) {
diff --git a/view/templates/xrd_person.tpl b/view/templates/xrd_person.tpl
index 89cf6dba1e..360489b87d 100644
--- a/view/templates/xrd_person.tpl
+++ b/view/templates/xrd_person.tpl
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0"> 
 	<Subject>{{$accturi}}</Subject>
- 	<Alias>{{$profile_url}}</Alias>
+	<Alias>{{$profile_url}}</Alias>
 	<Alias>{{$alias}}</Alias>
  
     <Link rel="http://purl.org/macgirvin/dfrn/1.0"