From aa6313dee6b46353dc5d6a6b0b74449842357daf Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Mon, 19 Jul 2021 04:15:57 +0000
Subject: [PATCH] Improved detection for a local contact

---
 src/Model/APContact.php | 18 ++++++++++++++++--
 src/Model/Contact.php   |  7 +++++++
 src/Network/Probe.php   |  2 +-
 3 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/src/Model/APContact.php b/src/Model/APContact.php
index a4c97f6232..7bdde60c65 100644
--- a/src/Model/APContact.php
+++ b/src/Model/APContact.php
@@ -54,6 +54,20 @@ class APContact
 			return [];
 		}
 
+		if (Contact::isLocal($addr) && ($local_uid = User::getIdForURL($addr)) && ($local_owner = User::getOwnerDataById($local_uid))) {
+			$data = [
+				'addr'      => $local_owner['addr'],
+				'baseurl'   => $local_owner['baseurl'],
+				'url'       => $local_owner['url'],
+				'subscribe' => $local_owner['baseurl'] . '/follow?url={uri}'];
+
+			if (!empty($local_owner['alias']) && ($local_owner['url'] != $local_owner['alias'])) {
+				$data['alias'] = $local_owner['alias'];
+			}
+
+			return $data;
+		}
+
 		$data = ['addr' => $addr];
 		$template = 'https://' . $addr_parts[1] . '/.well-known/webfinger?resource=acct:' . urlencode($addr);
 		$webfinger = Probe::webfinger(str_replace('{uri}', urlencode($addr), $template), 'application/jrd+json');
@@ -284,7 +298,7 @@ class APContact
 				$following = ActivityPub::fetchContent($apcontact['following']);
 			}
 			if (!empty($following['totalItems'])) {
-				// Mastodon seriously allows for this condition? 
+				// Mastodon seriously allows for this condition?
 				// Jul 14 2021 - See https://mastodon.social/@BLUW for a negative following count
 				if ($following['totalItems'] < 0) {
 					$following['totalItems'] = 0;
@@ -300,7 +314,7 @@ class APContact
 				$followers = ActivityPub::fetchContent($apcontact['followers']);
 			}
 			if (!empty($followers['totalItems'])) {
-				// Mastodon seriously allows for this condition? 
+				// Mastodon seriously allows for this condition?
 				// Jul 14 2021 - See https://mastodon.online/@goes11 for a negative followers count
 				if ($followers['totalItems'] < 0) {
 					$followers['totalItems'] = 0;
diff --git a/src/Model/Contact.php b/src/Model/Contact.php
index fe6fe55f32..c68039643f 100644
--- a/src/Model/Contact.php
+++ b/src/Model/Contact.php
@@ -453,6 +453,13 @@ class Contact
 	 */
 	public static function isLocal($url)
 	{
+		if (!parse_url($url, PHP_URL_SCHEME)) {
+			$addr_parts = explode('@', $url);
+			if (count($addr_parts) == 2) {
+				return $addr_parts[1] == DI::baseUrl()->getHostname();
+			}
+		}
+
 		return Strings::compareLink(self::getBasepath($url, true), DI::baseUrl());
 	}
 
diff --git a/src/Network/Probe.php b/src/Network/Probe.php
index e44a8d326e..12a5b26925 100644
--- a/src/Network/Probe.php
+++ b/src/Network/Probe.php
@@ -333,7 +333,7 @@ class Probe
 	public static function uri($uri, $network = '', $uid = -1)
 	{
 		// Local profiles aren't probed via network
-		if (empty($network) && strpos($uri, DI::baseUrl()->getHostname())) {
+		if (empty($network) && Contact::isLocal($uri)) {
 			$data = self::localProbe($uri);
 			if (!empty($data)) {
 				return $data;
-- 
2.39.5