X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FActivityPub%2FProcessor.php;h=e6f3e156690042bd1701c20c9d662b181238c048;hb=befc2af5043a3afde251721c0d27df695db1bb7e;hp=63732b0e15a4a66048c34045678e3ce99d2ce30d;hpb=56fe1400a748fd351bdee62da65a03586adaeafc;p=friendica.git diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index 63732b0e15..e6f3e15669 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -1,6 +1,6 @@ $activity['id']]); + $item = Post::selectFirst(['uri', 'uri-id', 'thr-parent', 'gravity'], ['uri' => $activity['id']]); if (!DBA::isResult($item)) { Logger::warning('No existing item, item will be created', ['uri' => $activity['id']]); $item = self::createItem($activity); @@ -256,7 +281,7 @@ class Processor $item['object-type'] = Activity\ObjectType::COMMENT; } - if (empty($activity['directmessage']) && ($activity['id'] != $activity['reply-to-id']) && !Item::exists(['uri' => $activity['reply-to-id']])) { + if (empty($activity['directmessage']) && ($activity['id'] != $activity['reply-to-id']) && !Post::exists(['uri' => $activity['reply-to-id']])) { Logger::notice('Parent not found. Try to refetch it.', ['parent' => $activity['reply-to-id']]); self::fetchMissingActivity($activity['reply-to-id'], $activity); } @@ -264,7 +289,7 @@ class Processor $item['diaspora_signed_text'] = $activity['diaspora:comment'] ?? ''; /// @todo What to do with $activity['context']? - if (empty($activity['directmessage']) && ($item['gravity'] != GRAVITY_PARENT) && !Item::exists(['uri' => $item['thr-parent']])) { + if (empty($activity['directmessage']) && ($item['gravity'] != GRAVITY_PARENT) && !Post::exists(['uri' => $item['thr-parent']])) { Logger::info('Parent not found, message will be discarded.', ['thr-parent' => $item['thr-parent']]); return []; } @@ -294,6 +319,10 @@ class Processor } } + if (!empty($activity['from-relay'])) { + $item['direction'] = Conversation::RELAY; + } + $item['isForum'] = false; if (!empty($activity['thread-completion'])) { @@ -324,6 +353,10 @@ class Processor $item['guid'] = $activity['diaspora:guid'] ?: $guid; $item['uri-id'] = ItemURI::insert(['uri' => $item['uri'], 'guid' => $item['guid']]); + if (empty($item['uri-id'])) { + Logger::warning('Unable to get a uri-id for an item uri', ['uri' => $item['uri'], 'guid' => $item['guid']]); + return []; + } $item = self::processContent($activity, $item); if (empty($item)) { @@ -335,6 +368,19 @@ class Processor $item = self::constructAttachList($activity, $item); + // We received the post via AP, so we set the protocol of the server to AP + $contact = Contact::getById($item['author-id'], ['gsid']); + if (!empty($contact['gsid'])) { + GServer::setProtocol($contact['gsid'], Post\DeliveryData::ACTIVITYPUB); + } + + if ($item['author-id'] != $item['owner-id']) { + $contact = Contact::getById($item['owner-id'], ['gsid']); + if (!empty($contact['gsid'])) { + GServer::setProtocol($contact['gsid'], Post\DeliveryData::ACTIVITYPUB); + } + } + return $item; } @@ -367,7 +413,7 @@ class Processor } foreach ($activity['receiver'] as $receiver) { - $item = Item::selectFirst(['id', 'uri-id', 'tag', 'origin', 'author-link'], ['uri' => $activity['target_id'], 'uid' => $receiver]); + $item = Post::selectFirst(['id', 'uri-id', 'origin', 'author-link'], ['uri' => $activity['target_id'], 'uid' => $receiver]); if (!DBA::isResult($item)) { // We don't fetch missing content for this purpose continue; @@ -413,20 +459,24 @@ class Processor */ public static function createEvent($activity, $item) { - $event['summary'] = HTML::toBBCode($activity['name']); - $event['desc'] = HTML::toBBCode($activity['content']); - $event['start'] = $activity['start-time']; - $event['finish'] = $activity['end-time']; - $event['nofinish'] = empty($event['finish']); - $event['location'] = $activity['location']; - $event['adjust'] = true; - $event['cid'] = $item['contact-id']; - $event['uid'] = $item['uid']; - $event['uri'] = $item['uri']; - $event['edited'] = $item['edited']; - $event['private'] = $item['private']; - $event['guid'] = $item['guid']; - $event['plink'] = $item['plink']; + $event['summary'] = HTML::toBBCode($activity['name']); + $event['desc'] = HTML::toBBCode($activity['content']); + $event['start'] = $activity['start-time']; + $event['finish'] = $activity['end-time']; + $event['nofinish'] = empty($event['finish']); + $event['location'] = $activity['location']; + $event['adjust'] = true; + $event['cid'] = $item['contact-id']; + $event['uid'] = $item['uid']; + $event['uri'] = $item['uri']; + $event['edited'] = $item['edited']; + $event['private'] = $item['private']; + $event['guid'] = $item['guid']; + $event['plink'] = $item['plink']; + $event['network'] = $item['network']; + $event['protocol'] = $item['protocol']; + $event['direction'] = $item['direction']; + $event['source'] = $item['source']; $condition = ['uri' => $item['uri'], 'uid' => $item['uid']]; $ev = DBA::selectFirst('event', ['id'], $condition); @@ -448,9 +498,21 @@ class Processor */ private static function processContent($activity, $item) { - $item['title'] = HTML::toBBCode($activity['name']); + if (!empty($activity['mediatype']) && ($activity['mediatype'] == 'text/markdown')) { + $item['title'] = Markdown::toBBCode($activity['name']); + $content = Markdown::toBBCode($activity['content']); + } elseif (!empty($activity['mediatype']) && ($activity['mediatype'] == 'text/bbcode')) { + $item['title'] = $activity['name']; + $content = $activity['content']; + } else { + // By default assume "text/html" + $item['title'] = HTML::toBBCode($activity['name']); + $content = HTML::toBBCode($activity['content']); + } - $content = HTML::toBBCode($activity['content']); + if (!empty($activity['languages'])) { + $item['language'] = self::processLanguages($activity['languages']); + } if (!empty($activity['emojis'])) { $content = self::replaceEmojis($content, $activity['emojis']); @@ -464,7 +526,7 @@ class Processor } else { if (empty($activity['directmessage']) && ($item['thr-parent'] != $item['uri']) && ($item['gravity'] == GRAVITY_COMMENT)) { $item_private = !in_array(0, $activity['item_receiver']); - $parent = Item::selectFirst(['id', 'uri-id', 'private', 'author-link', 'alias'], ['uri' => $item['thr-parent']]); + $parent = Post::selectFirst(['id', 'uri-id', 'private', 'author-link', 'alias'], ['uri' => $item['thr-parent']]); if (!DBA::isResult($parent)) { Logger::warning('Unknown parent item.', ['uri' => $item['thr-parent']]); return false; @@ -780,6 +842,10 @@ class Processor $object_actor = $object['actor']; } elseif (!empty($object['attributedTo'])) { $object_actor = $object['attributedTo']; + if (is_array($object_actor)) { + $compacted = JsonLD::compact($object); + $object_actor = JsonLD::fetchElement($compacted, 'as:attributedTo', '@id'); + } } else { // Shouldn't happen $object_actor = ''; @@ -803,7 +869,7 @@ class Processor } $activity = []; - $activity['@context'] = $object['@context']; + $activity['@context'] = $object['@context'] ?? ActivityPub::CONTEXT; unset($object['@context']); $activity['id'] = $object['id']; $activity['to'] = $object['to'] ?? []; @@ -849,8 +915,9 @@ class Processor } $replyto = JsonLD::fetchElement($activity['as:object'], 'as:inReplyTo', '@id'); - if (Item::exists(['uri' => $replyto])) { - Logger::info('Post is a reply to an existing post - accepted', ['id' => $id, 'replyto' => $replyto]); + $uriid = ItemURI::getIdByURI($replyto); + if (Post::exists(['uri-id' => $uriid])) { + Logger::info('Post is a reply to an existing post - accepted', ['id' => $id, 'uri-id' => $uriid, 'replyto' => $replyto]); return true; } @@ -896,20 +963,15 @@ class Processor if (!empty($cid)) { self::switchContact($cid); DBA::update('contact', ['hub-verify' => $activity['id'], 'protocol' => Protocol::ACTIVITYPUB], ['id' => $cid]); - $contact = DBA::selectFirst('contact', [], ['id' => $cid, 'network' => Protocol::NATIVE_SUPPORT]); - } else { - $contact = []; } $item = ['author-id' => Contact::getIdForURL($activity['actor']), 'author-link' => $activity['actor']]; - $note = Strings::escapeTags(trim($activity['content'] ?? '')); - // Ensure that the contact has got the right network type self::switchContact($item['author-id']); - $result = Contact::addRelationship($owner, $contact, $item, false, $note); + $result = Contact::addRelationship($owner, [], $item, false, $activity['content'] ?? ''); if ($result === true) { ActivityPub\Transmitter::sendContactAccept($item['author-link'], $activity['id'], $owner['uid']); } @@ -1128,7 +1190,7 @@ class Processor $implicit_mentions = []; if (empty($parent_author['url'])) { - Logger::notice('Author public contact unknown.', ['author-link' => $parent['author-link'], 'item-id' => $parent['id']]); + Logger::notice('Author public contact unknown.', ['author-link' => $parent['author-link'], 'parent-id' => $parent['id']]); } else { $implicit_mentions[] = $parent_author['url']; $implicit_mentions[] = $parent_author['nurl'];