From a7963fe18a52fe5402b18421fa00dc58d7ee6420 Mon Sep 17 00:00:00 2001
From: Michael <heluecht@pirati.ca>
Date: Wed, 30 Jan 2019 21:33:23 +0000
Subject: [PATCH] AP: Automatically send follow requests for reshared items

---
 src/Object/Post.php                      |  4 ++++
 src/Protocol/ActivityPub/Processor.php   |  9 +++++++++
 src/Protocol/ActivityPub/Transmitter.php | 13 ++++++++++++-
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/Object/Post.php b/src/Object/Post.php
index bc1123db2..847135d36 100644
--- a/src/Object/Post.php
+++ b/src/Object/Post.php
@@ -775,6 +775,10 @@ class Post extends BaseObject
 	 */
 	private function getDefaultText()
 	{
+		if (!local_user()) {
+			return;
+		}
+
 		$a = self::getApp();
 
 		$item = Item::selectFirst(['author-addr'], ['id' => $this->getId()]);
diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php
index ea4d5ba41..fd6d70a42 100644
--- a/src/Protocol/ActivityPub/Processor.php
+++ b/src/Protocol/ActivityPub/Processor.php
@@ -329,6 +329,15 @@ class Processor
 			$item_id = Item::insert($item);
 			Logger::log('Storing for user ' . $item['uid'] . ': ' . $item_id);
 		}
+
+		if (!$item['private'] && ($item['gravity'] == GRAVITY_PARENT) && ($item['author-link'] != $item['owner-link'])) {
+			$author = APContact::getByURL($item['owner-link'], false);
+			// We send automatic follow requests for reshared messages. (We don't need though for forum posts)
+			if ($author['type'] != 'Group') {
+				Logger::log('Send follow request for ' . $item['uri'] . ' to ' . $item['author-link'], Logger::DEBUG);
+				ActivityPub\Transmitter::sendFollowObject($item['uri'], $item['author-link']);
+			}
+		}
 	}
 
 	/**
diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php
index b2f0291ad..f5953e7c5 100644
--- a/src/Protocol/ActivityPub/Transmitter.php
+++ b/src/Protocol/ActivityPub/Transmitter.php
@@ -6,6 +6,7 @@ namespace Friendica\Protocol\ActivityPub;
 
 use Friendica\BaseObject;
 use Friendica\Database\DBA;
+use Friendica\Core\Config;
 use Friendica\Core\Logger;
 use Friendica\Core\System;
 use Friendica\Util\HTTPSignature;
@@ -1295,10 +1296,20 @@ class Transmitter
 	 * @throws \ImagickException
 	 * @throws \Exception
 	 */
-	public static function sendFollowObject($object, $target, $uid)
+	public static function sendFollowObject($object, $target, $uid = 0)
 	{
 		$profile = APContact::getByURL($target);
 
+		if (empty($uid)) {
+			// Fetch the list of administrators
+			$admin_mail = explode(',', str_replace(' ', '', Config::get('config', 'admin_email')));
+
+			// We need to use some user as a sender. It doesn't care who it will send. We will use an administrator account.
+			$condition = ['verified' => true, 'blocked' => false, 'account_removed' => false, 'account_expired' => false, 'email' => $admin_mail];
+			$first_user = DBA::selectFirst('user', ['uid'], $condition);
+			$uid = $first_user['uid'];
+		}
+
 		$owner = User::getOwnerDataById($uid);
 
 		$data = ['@context' => ActivityPub::CONTEXT,