*
* @param array $item
* @param boolean $blindcopy
+ * @param boolean $last_id
*
* @return array with permission data
*/
- private static function createPermissionBlockForItem($item, $blindcopy)
+ private static function createPermissionBlockForItem($item, $blindcopy, $last_id = 0)
{
+ if ($last_id == 0) {
+ $last_id = $item['id'];
+ }
+
// Will be activated in a later step
// $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS];
$parents = Item::select(['id', 'author-link', 'owner-link', 'gravity', 'uri'], ['parent' => $item['parent']]);
while ($parent = Item::fetch($parents)) {
// Don't include data from future posts
- if ($parent['id'] >= $item['id']) {
+ if ($parent['id'] >= $last_id) {
continue;
}
* @param array $item
* @param integer $uid User ID
* @param boolean $personal fetch personal inboxes
+ * @param integer $last_id Last item id for adding receivers
*
* @return array with inboxes
*/
- public static function fetchTargetInboxes($item, $uid, $personal = false)
+ public static function fetchTargetInboxes($item, $uid, $personal = false, $last_id = 0)
{
- $permissions = self::createPermissionBlockForItem($item, true);
+ $permissions = self::createPermissionBlockForItem($item, true, $last_id);
if (empty($permissions)) {
return [];
}
$data['object'] = $item['thr-parent'];
}
- $owner = User::getOwnerDataById($item['contact-uid']);
+ if (!empty($item['contact-uid'])) {
+ $uid = $item['contact-uid'];
+ } else {
+ $uid = $item['uid'];
+ }
- if (!$object_mode) {
+ $owner = User::getOwnerDataById($uid);
+
+ if (!$object_mode && !empty($owner)) {
return LDSignature::sign($data, $owner);
} else {
return $data;
return;
}
- $uid = $target_item['contact-uid'];
+ if (!empty($target_item['contact-uid'])) {
+ $uid = $target_item['contact-uid'];
+ } elseif (!empty($target_item['uid'])) {
+ $uid = $target_item['uid'];
+ } else {
+ Logger::log('Only public users for item ' . $item_id, Logger::DEBUG);
+ return;
+ }
// avoid race condition with deleting entries
if ($items[0]['deleted']) {
}
$parent_id = intval($target_item['parent']);
- $uid = $target_item['contact-uid'];
+
+ if (!empty($target_item['contact-uid'])) {
+ $uid = $target_item['contact-uid'];
+ } elseif (!empty($target_item['uid'])) {
+ $uid = $target_item['uid'];
+ } else {
+ Logger::log('Only public users for item ' . $item_id, Logger::DEBUG);
+ return;
+ }
+
$updated = $target_item['edited'];
$condition = ['parent' => $parent_id, 'visible' => true, 'moderated' => false];
private static function activityPubDelivery($a, $cmd, $item_id, $uid, $target_item, $parent)
{
$inboxes = [];
- $personal = false;
if ($target_item['origin']) {
$inboxes = ActivityPub\Transmitter::fetchTargetInboxes($target_item, $uid);
} elseif (!DBA::exists('conversation', ['item-uri' => $target_item['uri'], 'protocol' => Conversation::PARCEL_ACTIVITYPUB])) {
Logger::log('Remote item ' . $item_id . ' with URL ' . $target_item['uri'] . ' is no AP post. It will not be distributed.', Logger::DEBUG);
return;
- } else {
+ } elseif ($parent['origin']) {
// Remote items are transmitted via the personal inboxes.
// Doing so ensures that the dedicated receiver will get the message.
- $personal = true;
+ $inboxes = ActivityPub\Transmitter::fetchTargetInboxes($parent, $uid, true, $item_id);
Logger::log('Remote item ' . $item_id . ' with URL ' . $target_item['uri'] . ' will be distributed.', Logger::DEBUG);
}
- if ($parent['origin']) {
- $parent_inboxes = ActivityPub\Transmitter::fetchTargetInboxes($parent, $uid, $personal);
- $inboxes = array_merge($inboxes, $parent_inboxes);
- }
-
if (empty($inboxes)) {
Logger::log('No inboxes found for item ' . $item_id . ' with URL ' . $target_item['uri'] . '. It will not be distributed.', Logger::DEBUG);
return;