return $permissions;
}
+ /**
+ * Check if the given item id is from ActivityPub
+ *
+ * @param integer $item_id
+ * @return boolean "true" if the post is from ActivityPub
+ */
+ private static function isAPPost(int $item_id) {
+ if (empty($item_id)) {
+ return false;
+ }
+
+ return Item::exists(['id' => $item_id, 'network' => Protocol::ACTIVITYPUB]);
+ }
+
/**
* Creates an array of permissions from an item thread
*
$always_bcc = true;
}
- if (self::isAnnounce($item) || DI::config()->get('debug', 'total_ap_delivery')) {
+ if (self::isAnnounce($item) || DI::config()->get('debug', 'total_ap_delivery') || self::isAPPost($last_id)) {
// Will be activated in a later step
$networks = Protocol::FEDERATED;
} else {
*
* @param integer $uid User ID
* @param boolean $personal fetch personal inboxes
+ * @param boolean $all_ap Retrieve all AP enabled inboxes
*
* @return array of follower inboxes
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- public static function fetchTargetInboxesforUser($uid, $personal = false)
+ public static function fetchTargetInboxesforUser($uid, $personal = false, bool $all_ap = false)
{
$inboxes = [];
}
}
- if (DI::config()->get('debug', 'total_ap_delivery')) {
+ if (DI::config()->get('debug', 'total_ap_delivery') || $all_ap) {
// Will be activated in a later step
$networks = Protocol::FEDERATED;
} else {
}
if ($item_profile && ($receiver == $item_profile['followers']) && ($uid == $profile_uid)) {
- $inboxes = array_merge($inboxes, self::fetchTargetInboxesforUser($uid, $personal));
+ $inboxes = array_merge($inboxes, self::fetchTargetInboxesforUser($uid, $personal, self::isAPPost($last_id)));
} else {
if (Contact::isLocal($receiver)) {
continue;
$owner['uprvkey'] = $owner['prvkey'];
}
- $envelope = self::buildMessage($msg, $owner, $contact, $owner['uprvkey'], $contact['pubkey'], $public_batch);
+ // When sending content to Friendica contacts using the Diaspora protocol
+ // we have to fetch the public key from the fcontact.
+ // This is due to the fact that legacy DFRN had unique keys for every contact.
+ $pubkey = $contact['pubkey'];
+ if (!empty($contact['addr'])) {
+ $fcontact = FContact::getByURL($contact['addr']);
+ if (!empty($fcontact)) {
+ $pubkey = $fcontact['pubkey'];
+ }
+ }
+
+ $envelope = self::buildMessage($msg, $owner, $contact, $owner['uprvkey'], $pubkey, $public_batch);
$return_code = self::transmit($owner, $contact, $envelope, $public_batch, $guid);
}
}
- // When commenting too fast after delivery, a post wasn't recognized as top level post.
- // The count then showed more than one entry. The additional check should help.
- // The check for the "count" should be superfluous, but I'm not totally sure by now, so we keep it.
- if ((($parent['id'] == $target_id) || (count($items) == 1)) && ($parent['uri'] === $parent['parent-uri'])) {
- Logger::log('Top level post');
- $top_level = true;
- }
+ $top_level = $target_item['gravity'] == GRAVITY_PARENT;
// This is IMPORTANT!!!!
// Transmit via Diaspora if the thread had started as Diaspora post.
// Also transmit via Diaspora if this is a direct answer to a Diaspora comment.
// This is done since the uri wouldn't match (Diaspora doesn't transmit it)
- if (!empty($parent) && !empty($thr_parent) && in_array(Protocol::DIASPORA, [$parent['network'], $thr_parent['network']])) {
+ // Also transmit relayed posts from Diaspora contacts via Diaspora.
+ if (!empty($parent) && !empty($thr_parent) && in_array(Protocol::DIASPORA, [$parent['network'], $thr_parent['network'], $target_item['network']])) {
$contact['network'] = Protocol::DIASPORA;
}
}
}
- if ((count($items) == 1) && ($items[0]['id'] === $target_item['id']) && ($items[0]['uri'] === $items[0]['parent-uri'])) {
- Logger::info('Top level post', ['target' => $target_id]);
- $top_level = true;
- }
+ $top_level = $target_item['gravity'] == GRAVITY_PARENT;
}
$owner = User::getOwnerDataById($uid);
return 0;
}
- // Also don't deliver when the direct thread parent was delivered via Diaspora
+ // Also don't deliver when the direct thread parent was delivered via Diaspora
if ($thr_parent['network'] == Protocol::DIASPORA) {
return 0;
}
+ // Posts from Diaspora contacts are transmitted via Diaspora
+ if ($target_item['network'] == Protocol::DIASPORA) {
+ return 0;
+ }
+
$inboxes = [];
$relay_inboxes = [];