From 14cb128264248a726f12f9d99ad305e76231ea25 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Sat, 16 Jun 2018 06:44:19 +0000
Subject: [PATCH] New function for generating item URI

---
 include/api.php           |  2 +-
 include/text.php          | 27 ---------------------------
 mod/item.php              |  2 +-
 mod/photos.php            |  6 +++---
 mod/poke.php              |  2 +-
 mod/subthread.php         |  2 +-
 mod/tagger.php            |  2 +-
 src/Model/Event.php       |  2 +-
 src/Model/Item.php        | 33 ++++++++++++++++++++++++++++-----
 src/Protocol/Diaspora.php | 18 ++++++++++++++----
 10 files changed, 51 insertions(+), 45 deletions(-)

diff --git a/include/api.php b/include/api.php
index 00c2173c3..af71e2f1c 100644
--- a/include/api.php
+++ b/include/api.php
@@ -4599,7 +4599,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $
 function post_photo_item($hash, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $filetype, $visibility = false)
 {
 	// get data about the api authenticated user
-	$uri = item_new_uri(get_app()->get_hostname(), intval(api_user()));
+	$uri = Item::newURI(intval(api_user()));
 	$owner_record = q("SELECT * FROM `contact` WHERE `uid`= %d AND `self` LIMIT 1", intval(api_user()));
 
 	$arr = [];
diff --git a/include/text.php b/include/text.php
index acc6bec4f..612100cb6 100644
--- a/include/text.php
+++ b/include/text.php
@@ -462,33 +462,6 @@ function perms2str($p) {
 	return $ret;
 }
 
-
-/**
- * generate a guaranteed unique (for this domain) item ID for ATOM
- * safe from birthday paradox
- *
- * @param string $hostname
- * @param int $uid
- * @return string
- */
-function item_new_uri($hostname, $uid, $guid = "") {
-
-	do {
-		if ($guid == "") {
-			$hash = get_guid(32);
-		} else {
-			$hash = $guid;
-			$guid = "";
-		}
-
-		$uri = "urn:X-dfrn:" . $hostname . ':' . $uid . ':' . $hash;
-
-		$dups = dba::exists('item', ['uri' => $uri]);
-	} while ($dups == true);
-
-	return $uri;
-}
-
 /**
  * @deprecated
  * wrapper to load a view template, checking for alternate
diff --git a/mod/item.php b/mod/item.php
index 823350874..f164fb0ae 100644
--- a/mod/item.php
+++ b/mod/item.php
@@ -576,7 +576,7 @@ function item_post(App $a) {
 
 	$notify_type = ($parent ? 'comment-new' : 'wall-new');
 
-	$uri = ($message_id ? $message_id : item_new_uri($a->get_hostname(), $profile_uid, $guid));
+	$uri = ($message_id ? $message_id : Item::newURI($profile_uid, $guid));
 
 	// Fallback so that we alway have a parent uri
 	if (!$thr_parent_uri || !$parent) {
diff --git a/mod/photos.php b/mod/photos.php
index 9bc870ca1..f6540c260 100644
--- a/mod/photos.php
+++ b/mod/photos.php
@@ -454,7 +454,7 @@ function photos_post(App $a)
 		if (!$item_id) {
 			// Create item container
 			$title = '';
-			$uri = item_new_uri($a->get_hostname(),$page_owner_uid);
+			$uri = Item::newURI($page_owner_uid);
 
 			$arr = [];
 			$arr['guid']          = get_guid(32);
@@ -624,7 +624,7 @@ function photos_post(App $a)
 
 			if (count($taginfo)) {
 				foreach ($taginfo as $tagged) {
-					$uri = item_new_uri($a->get_hostname(), $page_owner_uid);
+					$uri = Item::newURI($page_owner_uid);
 
 					$arr = [];
 					$arr['guid']          = get_guid(32);
@@ -848,7 +848,7 @@ function photos_post(App $a)
 		$smallest = 2;
 	}
 
-	$uri = item_new_uri($a->get_hostname(), $page_owner_uid);
+	$uri = Item::newURI($page_owner_uid);
 
 	// Create item container
 	$lat = $lon = null;
diff --git a/mod/poke.php b/mod/poke.php
index 73e8e1740..470f1eb2d 100644
--- a/mod/poke.php
+++ b/mod/poke.php
@@ -92,7 +92,7 @@ function poke_init(App $a) {
 
 	$poster = $a->contact;
 
-	$uri = item_new_uri($a->get_hostname(), $uid);
+	$uri = Item::newURI($uid);
 
 	$arr = [];
 
diff --git a/mod/subthread.php b/mod/subthread.php
index db8b9ba4f..e2c11d0a3 100644
--- a/mod/subthread.php
+++ b/mod/subthread.php
@@ -92,7 +92,7 @@ function subthread_content(App $a) {
 		return;
 	}
 
-	$uri = item_new_uri($a->get_hostname(),$owner_uid);
+	$uri = Item::newURI($owner_uid);
 
 	$post_type = (($item['resource-id']) ? L10n::t('photo') : L10n::t('status'));
 	$objtype = (($item['resource-id']) ? ACTIVITY_OBJ_IMAGE : ACTIVITY_OBJ_NOTE );
diff --git a/mod/tagger.php b/mod/tagger.php
index fa8dc3530..e72061b59 100644
--- a/mod/tagger.php
+++ b/mod/tagger.php
@@ -65,7 +65,7 @@ function tagger_content(App $a) {
 		return;
 	}
 
-	$uri = item_new_uri($a->get_hostname(),$owner_uid);
+	$uri = Item::newURI($owner_uid);
 	$xterm = xmlify($term);
 	$post_type = (($item['resource-id']) ? L10n::t('photo') : L10n::t('status'));
 	$targettype = (($item['resource-id']) ? ACTIVITY_OBJ_IMAGE : ACTIVITY_OBJ_NOTE );
diff --git a/src/Model/Event.php b/src/Model/Event.php
index 1c848dcad..9b258960e 100644
--- a/src/Model/Event.php
+++ b/src/Model/Event.php
@@ -234,7 +234,7 @@ class Event extends BaseObject
 		$event['id']        = intval(defaults($arr, 'id'       , 0));
 		$event['uid']       = intval(defaults($arr, 'uid'      , 0));
 		$event['cid']       = intval(defaults($arr, 'cid'      , 0));
-		$event['uri']       =        defaults($arr, 'uri'      , item_new_uri($a->get_hostname(), $event['uid']));
+		$event['uri']       =        defaults($arr, 'uri'      , Item::newURI($event['uid']));
 		$event['type']      =        defaults($arr, 'type'     , 'event');
 		$event['summary']   =        defaults($arr, 'summary'  , '');
 		$event['desc']      =        defaults($arr, 'desc'     , '');
diff --git a/src/Model/Item.php b/src/Model/Item.php
index 5fe096c82..a30ed3739 100644
--- a/src/Model/Item.php
+++ b/src/Model/Item.php
@@ -675,7 +675,7 @@ class Item extends BaseObject
 		}
 
 		$item['guid'] = self::guid($item, $notify);
-		$item['uri'] = notags(trim(defaults($item, 'uri', item_new_uri($a->get_hostname(), $item['uid'], $item['guid']))));
+		$item['uri'] = notags(trim(defaults($item, 'uri', self::newURI($item['uid'], $item['guid']))));
 
 		// Store conversation data
 		$item = Conversation::insert($item);
@@ -853,8 +853,8 @@ class Item extends BaseObject
 		}
 
 		//unset($item['author-link']);
-		//unset($item['author-name']);
-		//unset($item['author-avatar']);
+		unset($item['author-name']);
+		unset($item['author-avatar']);
 
 		//unset($item['owner-link']);
 		unset($item['owner-name']);
@@ -1528,6 +1528,29 @@ class Item extends BaseObject
 		return $guid_prefix.$host_hash;
 	}
 
+	/**
+	 * generate an unique URI
+	 *
+	 * @param integer $uid User id
+	 * @param string $guid An existing GUID (Otherwise it will be generated)
+	 *
+	 * @return string
+	 */
+	public static function newURI($uid, $guid = "")
+	{
+		if ($guid == "") {
+			$guid = get_guid(32);
+		}
+
+		$hostname = self::getApp()->get_hostname();
+
+		$user = dba::selectFirst('user', ['nickname'], ['uid' => $uid]);
+
+		$uri = "urn:X-dfrn:" . $hostname . ':' . $user['nickname'] . ':' . $guid;
+
+		return $uri;
+	}
+
 	/**
 	 * @brief Set "success_update" and "last-item" to the date of the last time we heard from this contact
 	 *
@@ -1844,7 +1867,7 @@ class Item extends BaseObject
 			if ($contact['network'] != NETWORK_FEED) {
 				$datarray["guid"] = get_guid(32);
 				unset($datarray["plink"]);
-				$datarray["uri"] = item_new_uri($a->get_hostname(), $contact['uid'], $datarray["guid"]);
+				$datarray["uri"] = self::newURI($contact['uid'], $datarray["guid"]);
 				$datarray["parent-uri"] = $datarray["uri"];
 				$datarray["thr-parent"] = $datarray["uri"];
 				$datarray["extid"] = NETWORK_DFRN;
@@ -2316,7 +2339,7 @@ EOT;
 
 		$new_item = [
 			'guid'          => get_guid(32),
-			'uri'           => item_new_uri(self::getApp()->get_hostname(), $item['uid']),
+			'uri'           => self::newURI($item['uid']),
 			'uid'           => $item['uid'],
 			'contact-id'    => $item_contact_id,
 			'type'          => 'activity',
diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php
index 2bb846134..20d1d74fe 100644
--- a/src/Protocol/Diaspora.php
+++ b/src/Protocol/Diaspora.php
@@ -1602,11 +1602,21 @@ class Diaspora
 	 */
 	private static function getUriFromGuid($author, $guid, $onlyfound = false)
 	{
-		$r = q("SELECT `uri` FROM `item` WHERE `guid` = '%s' LIMIT 1", dbesc($guid));
-		if (DBM::is_result($r)) {
-			return $r[0]["uri"];
+		$item = dba::selectFirst('item', ['uri'], ['guid' => $guid]);
+		if (DBM::is_result($item)) {
+			return $item["uri"];
 		} elseif (!$onlyfound) {
-			return $author.":".$guid;
+			$contact = Contact::getDetailsByAddr($author, 0);
+			if (!empty($contact['network'])) {
+				$prefix = 'urn:X-' . $contact['network'] . ':';
+			} else {
+				// This fallback should happen most unlikely
+				$prefix = 'urn:X-dspr:';
+			}
+
+			$author_parts = explode('@', $author);
+
+			return $prefix . $author_parts[1] . ':' . $author_parts[0] . ':'. $guid;
 		}
 
 		return "";