]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/ActivityPub/Transmitter.php
The "summary" field seems to be interpreted as plain text only
[friendica.git] / src / Protocol / ActivityPub / Transmitter.php
index 1032627b32911a92613036c56908558a5ad73aae..ce23e6db209910d7530ccb1376ffe58132d66ac1 100644 (file)
@@ -20,6 +20,7 @@ use Friendica\Model\Term;
 use Friendica\Model\User;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Content\Text\BBCode;
+use Friendica\Content\Text\Plaintext;
 use Friendica\Util\JsonLD;
 use Friendica\Util\LDSignature;
 use Friendica\Model\Profile;
@@ -152,7 +153,7 @@ class Transmitter
 
                $condition = ['uid' => 0, 'contact-id' => $public_contact, 'author-id' => $public_contact,
                        'private' => false, 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT],
-                       'deleted' => false, 'visible' => true];
+                       'deleted' => false, 'visible' => true, 'moderated' => false];
                $count = DBA::count('item', $condition);
 
                $data = ['@context' => ActivityPub::CONTEXT];
@@ -303,15 +304,16 @@ class Transmitter
        /**
         * Creates an array of permissions from an item thread
         *
-        * @param array   $item
-        * @param boolean $blindcopy
-        * @param boolean $last_id
+        * @param array   $item       Item array
+        * @param boolean $blindcopy  addressing via "bcc" or "cc"?
+        * @param integer $last_id    Last item id for adding receivers
+        * @param boolean $forum_mode "true" means that we are sending content to a forum
         *
         * @return array with permission data
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       private static function createPermissionBlockForItem($item, $blindcopy, $last_id = 0)
+       private static function createPermissionBlockForItem($item, $blindcopy, $last_id = 0, $forum_mode = false)
        {
                if ($last_id == 0) {
                        $last_id = $item['id'];
@@ -343,7 +345,7 @@ class Transmitter
                        $actor_profile = APContact::getByURL($item['author-link']);
                }
 
-               $terms = Term::tagArrayFromItemId($item['id'], TERM_MENTION);
+               $terms = Term::tagArrayFromItemId($item['id'], [Term::MENTION, Term::IMPLICIT_MENTION]);
 
                if (!$item['private']) {
                        $data = array_merge($data, self::fetchPermissionBlockFromConversation($item));
@@ -399,7 +401,7 @@ class Transmitter
                                                }
                                        } else {
                                                // Public thread parent post always are directed to the followes
-                                               if (!$item['private']) {
+                                               if (!$item['private'] && !$forum_mode) {
                                                        $data['cc'][] = $actor_profile['followers'];
                                                }
                                        }
@@ -515,18 +517,18 @@ class Transmitter
        /**
         * Fetches an array of inboxes for the given item and user
         *
-        * @param array   $item
-        * @param integer $uid      User ID
-        * @param boolean $personal fetch personal inboxes
-        * @param integer $last_id Last item id for adding receivers
-        *
+        * @param array   $item       Item array
+        * @param integer $uid        User ID
+        * @param boolean $personal   fetch personal inboxes
+        * @param integer $last_id    Last item id for adding receivers
+        * @param boolean $forum_mode "true" means that we are sending content to a forum
         * @return array with inboxes
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         * @throws \ImagickException
         */
-       public static function fetchTargetInboxes($item, $uid, $personal = false, $last_id = 0)
+       public static function fetchTargetInboxes($item, $uid, $personal = false, $last_id = 0, $forum_mode = false)
        {
-               $permissions = self::createPermissionBlockForItem($item, true, $last_id);
+               $permissions = self::createPermissionBlockForItem($item, true, $last_id, $forum_mode);
                if (empty($permissions)) {
                        return [];
                }
@@ -659,7 +661,7 @@ class Transmitter
                        return false;
                }
 
-               if ($item['wall']) {
+               if ($item['wall'] && ($item['uri'] == $item['parent-uri'])) {
                        $owner = User::getOwnerDataById($item['uid']);
                        if (($owner['account-type'] == User::ACCOUNT_TYPE_COMMUNITY) && ($item['author-link'] != $owner['url'])) {
                                $type = 'Announce';
@@ -697,7 +699,12 @@ class Transmitter
 
                $data['id'] = $item['uri'] . '#' . $type;
                $data['type'] = $type;
-               $data['actor'] = $item['owner-link'];
+
+               if (Item::isForumPost($item) && ($type != 'Announce')) {
+                       $data['actor'] = $item['author-link'];
+               } else {
+                       $data['actor'] = $item['owner-link'];
+               }
 
                $data['published'] = DateTimeFormat::utc($item['created'] . '+00:00', DateTimeFormat::ATOM);
 
@@ -807,12 +814,12 @@ class Transmitter
        {
                $tags = [];
 
-               $terms = Term::tagArrayFromItemId($item['id']);
+               $terms = Term::tagArrayFromItemId($item['id'], [Term::HASHTAG, Term::MENTION, Term::IMPLICIT_MENTION]);
                foreach ($terms as $term) {
-                       if ($term['type'] == TERM_HASHTAG) {
+                       if ($term['type'] == Term::HASHTAG) {
                                $url = System::baseUrl() . '/search?tag=' . urlencode($term['term']);
                                $tags[] = ['type' => 'Hashtag', 'href' => $url, 'name' => '#' . $term['term']];
-                       } elseif ($term['type'] == TERM_MENTION) {
+                       } elseif ($term['type'] == Term::MENTION || $term['type'] == Term::IMPLICIT_MENTION) {
                                $contact = Contact::getDetailsByURL($term['url']);
                                if (!empty($contact['addr'])) {
                                        $mention = '@' . $contact['addr'];
@@ -1014,7 +1021,7 @@ class Transmitter
                        return $data;
                }
 
-               $data['summary'] = null; // Ignore by now
+               $data['summary'] = BBCode::toPlaintext(BBCode::getAbstract($item['body'], Protocol::ACTIVITYPUB));
 
                if ($item['uri'] != $item['thr-parent']) {
                        $data['inReplyTo'] = $item['thr-parent'];
@@ -1048,6 +1055,8 @@ class Transmitter
 
                if ($type == 'Note') {
                        $body = self::removePictures($body);
+               } elseif (($type == 'Article') && empty($data['summary'])) {
+                       $data['summary'] = BBCode::toPlaintext(Plaintext::shorten(self::removePictures($body), 1000));
                }
 
                if ($type == 'Event') {
@@ -1209,6 +1218,16 @@ class Transmitter
        {
                $owner = User::getOwnerDataById($uid);
 
+               if (empty($owner)) {
+                       Logger::error('No owner data found, the deletion message cannot be processed.', ['user' => $uid]);
+                       return false;
+               }
+
+               if (empty($owner['uprvkey'])) {
+                       Logger::error('No private key for owner found, the deletion message cannot be processed.', ['user' => $uid]);
+                       return false;
+               }
+
                $data = ['@context' => ActivityPub::CONTEXT,
                        'id' => System::baseUrl() . '/activity/' . System::createGUID(),
                        'type' => 'Delete',
@@ -1317,6 +1336,13 @@ class Transmitter
                        $uid = $first_user['uid'];
                }
 
+               $condition = ['verb' => ACTIVITY_FOLLOW, 'uid' => 0, 'parent-uri' => $object,
+                       'author-id' => Contact::getPublicIdByUserId($uid)];
+               if (Item::exists($condition)) {
+                       Logger::log('Follow for ' . $object . ' for user ' . $uid . ' does already exist.', Logger::DEBUG);
+                       return false;
+               }
+
                $owner = User::getOwnerDataById($uid);
 
                $data = ['@context' => ActivityPub::CONTEXT,
@@ -1432,6 +1458,10 @@ class Transmitter
 
        private static function prependMentions($body, array $permission_block)
        {
+               if (Config::get('system', 'disable_implicit_mentions')) {
+                       return $body;
+               }
+
                $mentions = [];
 
                foreach ($permission_block['to'] as $profile_url) {