mirror of
https://github.com/friendica/friendica
synced 2025-04-26 13:50:11 +00:00
Support unlisted public posts
This commit is contained in:
parent
357c0072bd
commit
ca1b92bb34
29 changed files with 146 additions and 100 deletions
|
@ -375,7 +375,7 @@ class Processor
|
|||
Logger::warning('Unknown parent item.', ['uri' => $item['thr-parent']]);
|
||||
return false;
|
||||
}
|
||||
if ($item_private && !$parent['private']) {
|
||||
if ($item_private && ($parent['private'] == Item::PRIVATE)) {
|
||||
Logger::warning('Item is private but the parent is not. Dropping.', ['item-uri' => $item['uri'], 'thr-parent' => $item['thr-parent']]);
|
||||
return false;
|
||||
}
|
||||
|
@ -442,12 +442,19 @@ class Processor
|
|||
}
|
||||
|
||||
$item['network'] = Protocol::ACTIVITYPUB;
|
||||
$item['private'] = !in_array(0, $activity['receiver']);
|
||||
$item['author-link'] = $activity['author'];
|
||||
$item['author-id'] = Contact::getIdForURL($activity['author'], 0, true);
|
||||
$item['owner-link'] = $activity['actor'];
|
||||
$item['owner-id'] = Contact::getIdForURL($activity['actor'], 0, true);
|
||||
|
||||
if (in_array(0, $activity['receiver']) && !empty($activity['unlisted'])) {
|
||||
$item['private'] = Item::UNLISTED;
|
||||
} elseif (in_array(0, $activity['receiver'])) {
|
||||
$item['private'] = Item::PUBLIC;
|
||||
} else {
|
||||
$item['private'] = Item::PRIVATE;
|
||||
}
|
||||
|
||||
$isForum = false;
|
||||
|
||||
if (!empty($activity['thread-completion'])) {
|
||||
|
@ -481,6 +488,10 @@ class Processor
|
|||
$stored = false;
|
||||
|
||||
foreach ($activity['receiver'] as $receiver) {
|
||||
if ($receiver == -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$item['uid'] = $receiver;
|
||||
|
||||
if ($isForum) {
|
||||
|
@ -530,7 +541,7 @@ class Processor
|
|||
}
|
||||
|
||||
// Store send a follow request for every reshare - but only when the item had been stored
|
||||
if ($stored && !$item['private'] && ($item['gravity'] == GRAVITY_PARENT) && ($item['author-link'] != $item['owner-link'])) {
|
||||
if ($stored && ($item['private'] != 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') {
|
||||
|
|
|
@ -506,14 +506,15 @@ class Receiver
|
|||
/**
|
||||
* Fetch the receiver list from an activity array
|
||||
*
|
||||
* @param array $activity
|
||||
* @param string $actor
|
||||
* @param array $tags
|
||||
* @param array $activity
|
||||
* @param string $actor
|
||||
* @param array $tags
|
||||
* @param boolean $fetch_unlisted
|
||||
*
|
||||
* @return array with receivers (user id)
|
||||
* @throws \Exception
|
||||
*/
|
||||
private static function getReceivers($activity, $actor, $tags = [])
|
||||
private static function getReceivers($activity, $actor, $tags = [], $fetch_unlisted = false)
|
||||
{
|
||||
$receivers = [];
|
||||
|
||||
|
@ -551,6 +552,11 @@ class Receiver
|
|||
$receivers['uid:0'] = 0;
|
||||
}
|
||||
|
||||
// Add receiver "-1" for unlisted posts
|
||||
if ($fetch_unlisted && ($receiver == self::PUBLIC_COLLECTION) && ($element == 'as:cc')) {
|
||||
$receivers['uid:-1'] = -1;
|
||||
}
|
||||
|
||||
if (($receiver == self::PUBLIC_COLLECTION) && !empty($actor)) {
|
||||
// This will most likely catch all OStatus connections to Mastodon
|
||||
$condition = ['alias' => [$actor, Strings::normaliseLink($actor)], 'rel' => [Contact::SHARING, Contact::FRIEND]
|
||||
|
@ -1022,7 +1028,9 @@ class Receiver
|
|||
}
|
||||
}
|
||||
|
||||
$object_data['receiver'] = self::getReceivers($object, $object_data['actor'], $object_data['tags']);
|
||||
$object_data['receiver'] = self::getReceivers($object, $object_data['actor'], $object_data['tags'], true);
|
||||
$object_data['unlisted'] = in_array(-1, $object_data['receiver']);
|
||||
unset($object_data['receiver']['uid:-1']);
|
||||
|
||||
// Common object data:
|
||||
|
||||
|
|
|
@ -173,7 +173,7 @@ class Transmitter
|
|||
$public_contact = Contact::getIdForURL($owner['url'], 0, true);
|
||||
|
||||
$condition = ['uid' => 0, 'contact-id' => $public_contact, 'author-id' => $public_contact,
|
||||
'private' => false, 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT],
|
||||
'private' => [Item::PUBLIC, Item::UNLISTED], 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT],
|
||||
'deleted' => false, 'visible' => true, 'moderated' => false];
|
||||
$count = DBA::count('item', $condition);
|
||||
|
||||
|
@ -401,7 +401,7 @@ class Transmitter
|
|||
|
||||
$terms = Term::tagArrayFromItemId($item['id'], [Term::MENTION, Term::IMPLICIT_MENTION]);
|
||||
|
||||
if (!$item['private']) {
|
||||
if ($item['private'] != Item::PRIVATE) {
|
||||
// Directly mention the original author upon a quoted reshare.
|
||||
// Else just ensure that the original author receives the reshare.
|
||||
$announce = self::getAnnounceArray($item);
|
||||
|
@ -413,7 +413,12 @@ class Transmitter
|
|||
|
||||
$data = array_merge($data, self::fetchPermissionBlockFromConversation($item));
|
||||
|
||||
$data['to'][] = ActivityPub::PUBLIC_COLLECTION;
|
||||
// Check if the item is completely public or unlisted
|
||||
if ($item['private'] == Item::PUBLIC) {
|
||||
$data['to'][] = ActivityPub::PUBLIC_COLLECTION;
|
||||
} else {
|
||||
$data['cc'][] = ActivityPub::PUBLIC_COLLECTION;
|
||||
}
|
||||
|
||||
foreach ($terms as $term) {
|
||||
$profile = APContact::getByURL($term['url'], false);
|
||||
|
@ -467,13 +472,13 @@ class Transmitter
|
|||
$data['to'][] = $profile['url'];
|
||||
} else {
|
||||
$data['cc'][] = $profile['url'];
|
||||
if (!$item['private'] && !empty($actor_profile['followers'])) {
|
||||
if (($item['private'] != Item::PRIVATE) && $item['private'] && !empty($actor_profile['followers'])) {
|
||||
$data['cc'][] = $actor_profile['followers'];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Public thread parent post always are directed to the followers
|
||||
if (!$item['private'] && !$forum_mode) {
|
||||
if (($item['private'] != Item::PRIVATE) && !$forum_mode) {
|
||||
$data['cc'][] = $actor_profile['followers'];
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue