From a8c6160dd7b65da7cfc9ab0371770d0bf70657f3 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 23 Jan 2022 04:40:45 +0000 Subject: [PATCH 1/2] Improved handling of several object types --- src/Model/Item.php | 1 + src/Protocol/ActivityPub/Processor.php | 2 ++ src/Protocol/ActivityPub/Receiver.php | 19 ++++++++++++++----- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/Model/Item.php b/src/Model/Item.php index 39d045d0cd..8c2f2e205c 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -56,6 +56,7 @@ class Item const PT_VIDEO = 18; const PT_DOCUMENT = 19; const PT_EVENT = 32; + const PT_POLL = 33; const PT_PERSONAL_NOTE = 128; // Posting reasons (Why had a post been stored for a user?) diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 5941a408b7..38999eb0da 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -258,6 +258,8 @@ class Processor $item['post-type'] = Item::PT_IMAGE; } elseif ($activity['object_type'] == 'as:Page') { $item['post-type'] = Item::PT_PAGE; + } elseif ($activity['object_type'] == 'as:Question') { + $item['post-type'] = Item::PT_POLL; } elseif ($activity['object_type'] == 'as:Video') { $item['post-type'] = Item::PT_VIDEO; } else { diff --git a/src/Protocol/ActivityPub/Receiver.php b/src/Protocol/ActivityPub/Receiver.php index dd138494d8..4504cee4c4 100644 --- a/src/Protocol/ActivityPub/Receiver.php +++ b/src/Protocol/ActivityPub/Receiver.php @@ -56,7 +56,7 @@ class Receiver { const PUBLIC_COLLECTION = 'as:Public'; const ACCOUNT_TYPES = ['as:Person', 'as:Organization', 'as:Service', 'as:Group', 'as:Application']; - const CONTENT_TYPES = ['as:Note', 'as:Article', 'as:Video', 'as:Image', 'as:Event', 'as:Audio', 'as:Page']; + const CONTENT_TYPES = ['as:Note', 'as:Article', 'as:Video', 'as:Image', 'as:Event', 'as:Audio', 'as:Page', 'as:Question']; const ACTIVITY_TYPES = ['as:Like', 'as:Dislike', 'as:Accept', 'as:Reject', 'as:TentativeAccept']; const TARGET_UNKNOWN = 0; @@ -322,7 +322,7 @@ class Receiver $object_type = self::fetchObjectType($activity, $object_id, $uid); // Fetch the activity on Lemmy "Announce" messages (announces of activities) - if (($type == 'as:Announce') && in_array($object_type, self::ACTIVITY_TYPES)) { + if (($type == 'as:Announce') && in_array($object_type, array_merge(self::ACTIVITY_TYPES, ['as:Delete', 'as:Undo', 'as:Update']))) { $data = ActivityPub::fetchContent($object_id, $uid); if (!empty($data)) { $type = $object_type; @@ -335,9 +335,18 @@ class Receiver } } + // Any activities on account types must not be altered + if (in_array($object_type, self::ACCOUNT_TYPES)) { + $object_data = []; + $object_data['id'] = JsonLD::fetchElement($activity, '@id'); + $object_data['object_id'] = JsonLD::fetchElement($activity, 'as:object', '@id'); + $object_data['object_actor'] = JsonLD::fetchElement($activity['as:object'], 'as:actor', '@id'); + $object_data['object_object'] = JsonLD::fetchElement($activity['as:object'], 'as:object'); + $object_data['object_type'] = JsonLD::fetchElement($activity['as:object'], '@type'); + $object_data['push'] = $push; + } elseif (in_array($type, ['as:Create', 'as:Update', 'as:Announce']) || strpos($type, '#emojiReaction')) { // Fetch the content only on activities where this matters // We can receive "#emojiReaction" when fetching content from Hubzilla systems - if (in_array($type, ['as:Create', 'as:Update', 'as:Announce']) || strpos($type, '#emojiReaction')) { // Always fetch on "Announce" $object_data = self::fetchObject($object_id, $activity['as:object'], $trust_source && ($type != 'as:Announce'), $uid); if (empty($object_data)) { @@ -361,7 +370,7 @@ class Receiver } } elseif (in_array($type, array_merge(self::ACTIVITY_TYPES, ['as:Follow'])) && in_array($object_type, self::CONTENT_TYPES)) { // Create a mostly empty array out of the activity data (instead of the object). - // This way we later don't have to check for the existence of ech individual array element. + // This way we later don't have to check for the existence of each individual array element. $object_data = self::processObject($activity); $object_data['name'] = $type; $object_data['author'] = JsonLD::fetchElement($activity, 'as:actor', '@id'); @@ -489,7 +498,7 @@ class Receiver // Lemmy is announcing activities. // We are changing the announces into regular activities. - if (($type == 'as:Announce') && in_array($object_data['type'] ?? '', self::ACTIVITY_TYPES)) { + if (($type == 'as:Announce') && in_array($object_data['type'] ?? '', array_merge(self::ACTIVITY_TYPES, ['as:Delete', 'as:Undo', 'as:Update']))) { $type = $object_data['type']; } From ad526f5ad20e887efde86a15b9be3088e52cdc47 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 23 Jan 2022 05:50:39 +0000 Subject: [PATCH 2/2] set the post-type to "poll" for incoming poll posts --- src/Protocol/Diaspora.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index d276814f5d..45879df2ae 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -2712,6 +2712,9 @@ class Diaspora $datarray["object-type"] = Activity\ObjectType::IMAGE; $datarray["post-type"] = Item::PT_IMAGE; + } elseif ($data->poll) { + $datarray["object-type"] = Activity\ObjectType::NOTE; + $datarray["post-type"] = Item::PT_POLL; } else { $datarray["object-type"] = Activity\ObjectType::NOTE; $datarray["post-type"] = Item::PT_NOTE;