]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/ActivityPub/Processor.php
Escape url tags before attempting to add missing mention links in Protocol\ActivityPu...
[friendica.git] / src / Protocol / ActivityPub / Processor.php
index 5c53f27000ae934482ffdd09c56b80cb28dc3358..47a5300352d03ee73104ad05290d4f134c4035b8 100644 (file)
@@ -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'];
@@ -624,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);
@@ -743,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) . '...';
@@ -1191,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;
+       }
 }