From 53ffe5a2e18034c914faa24a8ed01126310aeffc Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 21 Jul 2019 07:37:50 +0000 Subject: [PATCH] Fetch Diaspora posts by url --- src/Model/Item.php | 11 ++++---- src/Protocol/ActivityPub/Processor.php | 11 +++++--- src/Protocol/Diaspora.php | 35 ++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/src/Model/Item.php b/src/Model/Item.php index ddfc5e0b35..81c60b30b0 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -20,6 +20,7 @@ use Friendica\Core\Renderer; use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBA; +use Friendica\Protocol\ActivityPub; use Friendica\Protocol\Diaspora; use Friendica\Protocol\OStatus; use Friendica\Util\DateTimeFormat; @@ -29,7 +30,6 @@ use Friendica\Util\Security; use Friendica\Util\Strings; use Friendica\Util\XML; use Friendica\Worker\Delivery; -use Friendica\Protocol\ActivityPub; use Text_LanguageDetect; class Item extends BaseObject @@ -3628,11 +3628,12 @@ class Item extends BaseObject return $item_id; } - ActivityPub\Processor::fetchMissingActivity($uri); + if (ActivityPub\Processor::fetchMissingActivity($uri)) { + $item_id = self::searchByLink($uri, $uid); + } else { + $item_id = Diaspora::fetchByURL($uri); + } - /// @todo add Diaspora as well - - $item_id = self::searchByLink($uri, $uid); if (!empty($item_id)) { return $item_id; } diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index c1ab6bc1af..dadadecde9 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -534,8 +534,9 @@ class Processor /** * Fetches missing posts * - * @param $url - * @param $child + * @param string $url message URL + * @param array $child activity array with the child of this message + * @return boolean success * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ public static function fetchMissingActivity($url, $child = []) @@ -549,12 +550,12 @@ class Processor $object = ActivityPub::fetchContent($url, $uid); if (empty($object)) { Logger::log('Activity ' . $url . ' was not fetchable, aborting.'); - return; + return false; } if (empty($object['id'])) { Logger::log('Activity ' . $url . ' has got not id, aborting. ' . json_encode($object)); - return; + return false; } if (!empty($child['author'])) { @@ -593,6 +594,8 @@ class Processor ActivityPub\Receiver::processActivity($ldactivity); Logger::log('Activity ' . $url . ' had been fetched and processed.'); + + return true; } /** diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 8e2e487796..50300d136c 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -1414,6 +1414,41 @@ class Diaspora return $msg; } + /** + * @brief Fetches an item with a given URL + * + * @param string $url the message url + * + * @return int the message id of the stored message or false + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException + */ + public static function fetchByURL($url, $uid = 0) + { + if (!preg_match("=([http|https].*)/(.*)/(.*)=ism", $url, $matches)) { + return false; + } + + // Check for Diaspora (and Friendica) typical path components + if (!in_array($matches[2], ['posts', 'display'])) { + return false; + } + + $item = Item::selectFirst(['id'], ['guid' => $matches[3], 'uid' => $uid]); + if (DBA::isResult($item)) { + return $item['id']; + } + + self::storeByGuid($matches[3], $matches[1], $uid); + + $item = Item::selectFirst(['id'], ['guid' => $matches[3], 'uid' => $uid]); + if (DBA::isResult($item)) { + return $item['id']; + } else { + return false; + } + } + /** * @brief Fetches the item record of a given guid *