X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FActivityPub%2FProcessor.php;h=47a5300352d03ee73104ad05290d4f134c4035b8;hb=1de159a2ae44b162524ec0f6ccb3dfedaccb2468;hp=ecbecb9551b5b8f5ad1ece9cb95f0caa6b5ba1ad;hpb=852d148efdfb737ea192b296cf07055194ac7706;p=friendica.git diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index ecbecb9551..47a5300352 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -52,18 +52,14 @@ use Friendica\Util\Strings; class Processor { /** - * Converts mentions from Pleroma into the Friendica format + * Extracts the tag character (#, @, !) from mention links * * @param string $body - * - * @return string converted body + * @return string */ - private static function convertMentions($body) + protected static function normalizeMentionLinks(string $body): string { - $URLSearchString = "^\[\]"; - $body = preg_replace("/\[url\=([$URLSearchString]*)\]([#@!])(.*?)\[\/url\]/ism", '$2[url=$1]$3[/url]', $body); - - return $body; + return preg_replace('%\[url=([^\[\]]*)]([#@!])(.*?)\[/url]%ism', '$2[url=$1]$3[/url]', $body); } /** @@ -126,6 +122,7 @@ class Processor $data['url'] = $attachment['url']; $data['mimetype'] = $attachment['mediaType']; $data['height'] = $attachment['height'] ?? null; + $data['width'] = $attachment['width'] ?? null; $data['size'] = $attachment['size'] ?? null; $data['preview'] = $attachment['image'] ?? null; $data['description'] = $attachment['name'] ?? null; @@ -395,6 +392,8 @@ class Processor * * @param array $activity Activity array * @param array $item + * + * @return int event id * @throws \Exception */ public static function createEvent($activity, $item) @@ -418,14 +417,16 @@ class Processor $event['direction'] = $item['direction']; $event['source'] = $item['source']; - $condition = ['uri' => $item['uri'], 'uid' => $item['uid']]; - $ev = DBA::selectFirst('event', ['id'], $condition); + $ev = DBA::selectFirst('event', ['id'], ['uri' => $item['uri'], 'uid' => $item['uid']]); if (DBA::isResult($ev)) { $event['id'] = $ev['id']; } $event_id = Event::store($event); + Logger::info('Event was stored', ['id' => $event_id]); + + return $event_id; } /** @@ -458,7 +459,7 @@ class Processor $content = self::replaceEmojis($content, $activity['emojis']); } - $content = self::convertMentions($content); + $content = self::addMentionLinks($content, $activity['tags']); if (!empty($activity['source'])) { $item['body'] = $activity['source']; @@ -602,6 +603,12 @@ class Processor continue; } + if (!($item['isForum'] ?? false) && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT) && + ($item['post-reason'] == Item::PR_BCC) && !Contact::isSharingByURL($activity['author'], $receiver)) { + Logger::info('Top level post via BCC from a non sharer, ignoring', ['uid' => $receiver, 'contact' => $item['contact-id']]); + continue; + } + if (DI::pConfig()->get($receiver, 'system', 'accept_only_sharer', false) && ($receiver != 0) && ($item['gravity'] == GRAVITY_PARENT)) { $skip = !Contact::isSharingByURL($activity['author'], $receiver); @@ -618,7 +625,9 @@ class Processor } if (($item['gravity'] != GRAVITY_ACTIVITY) && ($activity['object_type'] == 'as:Event')) { - self::createEvent($activity, $item); + $event_id = self::createEvent($activity, $item); + + $item = Event::getItemArrayForImportedId($event_id, $item); } $item_id = Item::insert($item); @@ -737,7 +746,7 @@ class Processor $title = $matches[3]; } - $title = trim(HTML::toPlaintext(BBCode::convert($title, false, BBCode::API, true), 0)); + $title = trim(BBCode::toPlaintext($title)); if (strlen($title) > 20) { $title = substr($title, 0, 20) . '...'; @@ -1185,4 +1194,38 @@ class Processor return implode('', $kept_mentions); } + + /** + * Adds links to string mentions + * + * @param string $body + * @param array $tags + * @return string + */ + protected static function addMentionLinks(string $body, array $tags): string + { + // This prevents links to be added again to Pleroma-style mention links + $body = self::normalizeMentionLinks($body); + + $body = BBCode::performWithEscapedTags($body, ['url'], function ($body) use ($tags) { + foreach ($tags as $tag) { + if (empty($tag['name']) || empty($tag['type']) || empty($tag['href']) || !in_array($tag['type'], ['Mention', 'Hashtag'])) { + continue; + } + + $hash = substr($tag['name'], 0, 1); + $name = substr($tag['name'], 1); + if (!in_array($hash, Tag::TAG_CHARACTER)) { + $hash = ''; + $name = $tag['name']; + } + + $body = str_replace($tag['name'], $hash . '[url=' . $tag['href'] . ']' . $name . '[/url]', $body); + } + + return $body; + }); + + return $body; + } }