]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/ActivityPub/Transmitter.php
Merge pull request #5899 from annando/avoid-flooding
[friendica.git] / src / Protocol / ActivityPub / Transmitter.php
index bfbd9f9b4e05d28be5eb0de2564f0d08592f235a..96c069e589c94d503845e77cff7dc4d44809eceb 100644 (file)
@@ -22,12 +22,17 @@ use Friendica\Model\Profile;
 use Friendica\Core\Config;
 use Friendica\Object\Image;
 use Friendica\Protocol\ActivityPub;
+use Friendica\Core\Cache;
 
 /**
  * @brief ActivityPub Transmitter Protocol class
  *
  * To-Do:
  *
+ * Missing object fields:
+ * - service (App)
+ * - location
+ *
  * Missing object types:
  * - Event
  *
@@ -41,7 +46,7 @@ use Friendica\Protocol\ActivityPub;
 class Transmitter
 {
        /**
-        * @brief collects the lost of followers of the given owner
+        * collects the lost of followers of the given owner
         *
         * @param array $owner Owner array
         * @param integer $page Page number
@@ -88,7 +93,7 @@ class Transmitter
        }
 
        /**
-        * @brief Create list of following contacts
+        * Create list of following contacts
         *
         * @param array $owner Owner array
         * @param integer $page Page numbe
@@ -135,7 +140,7 @@ class Transmitter
        }
 
        /**
-        * @brief Public posts for the given owner
+        * Public posts for the given owner
         *
         * @param array $owner Owner array
         * @param integer $page Page numbe
@@ -204,12 +209,17 @@ class Transmitter
                        return [];
                }
 
-               $fields = ['name', 'url', 'location', 'about', 'avatar'];
+               $fields = ['name', 'url', 'location', 'about', 'avatar', 'photo'];
                $contact = DBA::selectFirst('contact', $fields, ['uid' => $uid, 'self' => true]);
                if (!DBA::isResult($contact)) {
                        return [];
                }
 
+               // On old installations and never changed contacts this might not be filled
+               if (empty($contact['avatar'])) {
+                       $contact['avatar'] = $contact['photo'];
+               }
+
                $data = ['@context' => ActivityPub::CONTEXT];
                $data['id'] = $contact['url'];
                $data['diaspora:guid'] = $user['guid'];
@@ -237,7 +247,7 @@ class Transmitter
        }
 
        /**
-        * @brief Returns an array with permissions of a given item array
+        * Returns an array with permissions of a given item array
         *
         * @param array $item
         *
@@ -290,7 +300,7 @@ class Transmitter
        }
 
        /**
-        * @brief Creates an array of permissions from an item thread
+        * Creates an array of permissions from an item thread
         *
         * @param array $item
         *
@@ -378,7 +388,7 @@ class Transmitter
        }
 
        /**
-        * @brief Fetches a list of inboxes of followers of a given user
+        * Fetches a list of inboxes of followers of a given user
         *
         * @param integer $uid User ID
         *
@@ -405,7 +415,7 @@ class Transmitter
        }
 
        /**
-        * @brief Fetches an array of inboxes for the given item and user
+        * Fetches an array of inboxes for the given item and user
         *
         * @param array $item
         * @param integer $uid User ID
@@ -449,7 +459,7 @@ class Transmitter
        }
 
        /**
-        * @brief Returns the activity type of a given item
+        * Returns the activity type of a given item
         *
         * @param array $item
         *
@@ -481,7 +491,28 @@ class Transmitter
        }
 
        /**
-        * @brief Creates an activity array for a given item id
+        * Creates the activity or fetches it from the cache
+        *
+        * @param integer $item_id
+        *
+        * @return array with the activity
+        */
+       public static function createCachedActivityFromItem($item_id)
+       {
+               $cachekey = 'APDelivery:createActivity:' . $item_id;
+               $data = Cache::get($cachekey);
+               if (!is_null($data)) {
+                       return $data;
+               }
+
+               $data = ActivityPub\Transmitter::createActivityFromItem($item_id);
+
+               Cache::set($cachekey, $data, CACHE_QUARTER_HOUR);
+               return $data;
+       }
+
+       /**
+        * Creates an activity array for a given item id
         *
         * @param integer $item_id
         * @param boolean $object_mode Is the activity item is used inside another object?
@@ -532,6 +563,7 @@ class Transmitter
                } elseif ($data['type'] == 'Undo') {
                        $data['object'] = self::createActivityFromItem($item_id, true);
                } else {
+                       $data['diaspora:guid'] = $item['guid'];
                        $data['object'] = $item['thr-parent'];
                }
 
@@ -547,7 +579,7 @@ class Transmitter
        }
 
        /**
-        * @brief Creates an object array for a given item id
+        * Creates an object array for a given item id
         *
         * @param integer $item_id
         *
@@ -568,7 +600,7 @@ class Transmitter
        }
 
        /**
-        * @brief Returns a tag array for a given item array
+        * Returns a tag array for a given item array
         *
         * @param array $item
         *
@@ -597,7 +629,7 @@ class Transmitter
        }
 
        /**
-        * @brief Adds attachment data to the JSON document
+        * Adds attachment data to the JSON document
         *
         * @param array $item Data of the item that is to be posted
         * @param text $type Object type
@@ -652,7 +684,7 @@ class Transmitter
        }
 
        /**
-        * @brief Remove image elements and replaces them with links to the image
+        * Remove image elements and replaces them with links to the image
         *
         * @param string $body
         *
@@ -670,7 +702,7 @@ class Transmitter
        }
 
        /**
-        * @brief Fetches the "context" value for a givem item array from the "conversation" table
+        * Fetches the "context" value for a givem item array from the "conversation" table
         *
         * @param array $item
         *
@@ -690,7 +722,7 @@ class Transmitter
        }
 
        /**
-        * @brief Returns if the post contains sensitive content ("nsfw")
+        * Returns if the post contains sensitive content ("nsfw")
         *
         * @param integer $item_id
         *
@@ -703,7 +735,7 @@ class Transmitter
        }
 
        /**
-        * @brief Creates a note/article object array
+        * Creates a note/article object array
         *
         * @param array $item
         *
@@ -746,12 +778,11 @@ class Transmitter
 
                $data['url'] = $item['plink'];
                $data['attributedTo'] = $item['author-link'];
-               $data['actor'] = $item['author-link'];
                $data['sensitive'] = self::isSensitive($item['id']);
                $data['context'] = self::fetchContextURLForItem($item);
 
                if (!empty($item['title'])) {
-                       $data['name'] = BBCode::convert($item['title'], false, 7);
+                       $data['name'] = BBCode::toPlaintext($item['title'], false);
                }
 
                $body = $item['body'];
@@ -775,7 +806,37 @@ class Transmitter
        }
 
        /**
-        * @brief Transmits a profile deletion to a given inbox
+        * Transmits a contact suggestion to a given inbox
+        *
+        * @param integer $uid User ID
+        * @param string $inbox Target inbox
+        * @param integer $suggestion_id Suggestion ID
+        */
+       public static function sendContactSuggestion($uid, $inbox, $suggestion_id)
+       {
+               $owner = User::getOwnerDataById($uid);
+               $profile = APContact::getByURL($owner['url']);
+
+               $suggestion = DBA::selectFirst('fsuggest', ['url', 'note', 'created'], ['id' => $suggestion_id]);
+
+               $data = ['@context' => 'https://www.w3.org/ns/activitystreams',
+                       'id' => System::baseUrl() . '/activity/' . System::createGUID(),
+                       'type' => 'Announce',
+                       'actor' => $owner['url'],
+                       'object' => $suggestion['url'],
+                       'content' => $suggestion['note'],
+                       'published' => DateTimeFormat::utc($suggestion['created'] . '+00:00', DateTimeFormat::ATOM),
+                       'to' => [ActivityPub::PUBLIC_COLLECTION],
+                       'cc' => []];
+
+               $signed = LDSignature::sign($data, $owner);
+
+               logger('Deliver profile deletion for user ' . $uid . ' to ' . $inbox . ' via ActivityPub', LOGGER_DEBUG);
+               HTTPSignature::transmit($signed, $inbox, $uid);
+       }
+
+       /**
+        * Transmits a profile deletion to a given inbox
         *
         * @param integer $uid User ID
         * @param string $inbox Target inbox
@@ -801,7 +862,7 @@ class Transmitter
        }
 
        /**
-        * @brief Transmits a profile change to a given inbox
+        * Transmits a profile change to a given inbox
         *
         * @param integer $uid User ID
         * @param string $inbox Target inbox
@@ -827,7 +888,7 @@ class Transmitter
        }
 
        /**
-        * @brief Transmits a given activity to a target
+        * Transmits a given activity to a target
         *
         * @param array $activity
         * @param string $target Target profile
@@ -853,7 +914,7 @@ class Transmitter
        }
 
        /**
-        * @brief Transmit a message that the contact request had been accepted
+        * Transmit a message that the contact request had been accepted
         *
         * @param string $target Target profile
         * @param $id
@@ -880,7 +941,7 @@ class Transmitter
        }
 
        /**
-        * @brief Reject a contact request or terminates the contact relation
+        * Reject a contact request or terminates the contact relation
         *
         * @param string $target Target profile
         * @param $id
@@ -907,7 +968,7 @@ class Transmitter
        }
 
        /**
-        * @brief Transmits a message that we don't want to follow this contact anymore
+        * Transmits a message that we don't want to follow this contact anymore
         *
         * @param string $target Target profile
         * @param integer $uid User ID