}
if ((($item['gravity'] == GRAVITY_COMMENT) || $is_reshare) && !Post::exists(['uri-id' => $item['thr-parent-id'], 'uid' => $uid])) {
- // Only do an auto complete with the source uid "0" to prevent privavy problems
+ // Fetch the origin user for the post
+ $origin_uid = self::GetOriginUidForUriId($item['thr-parent-id'], $uid);
+ if (is_null($origin_uid)) {
+ Logger::info('Origin item was not found', ['uid' => $uid, 'uri-id' => $item['thr-parent-id']]);
+ return 0;
+ }
+
$causer = $item['causer-id'] ?: $item['author-id'];
- $result = self::storeForUserByUriId($item['thr-parent-id'], $uid, ['causer-id' => $causer, 'post-reason' => self::PR_FETCHED]);
+ $result = self::storeForUserByUriId($item['thr-parent-id'], $uid, ['causer-id' => $causer, 'post-reason' => self::PR_FETCHED], $origin_uid);
Logger::info('Fetched thread parent', ['uri-id' => $item['thr-parent-id'], 'uid' => $uid, 'causer' => $causer, 'result' => $result]);
}
return $stored;
}
+ /**
+ * Returns the origin uid of a post if the given user is allowed to see it.
+ *
+ * @param int $uriid
+ * @param int $uid
+ * @return int
+ */
+ private static function GetOriginUidForUriId(int $uriid, int $uid)
+ {
+ if (Post::exists(['uri-id' => $uriid, 'uid' => $uid])) {
+ return $uid;
+ }
+
+ $post = Post::selectFirst(['uid', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'private'], ['uri-id' => $uriid, 'origin' => true]);
+ if (empty($post)) {
+ if (Post::exists(['uri-id' => $uriid, 'uid' => 0])) {
+ return 0;
+ } else {
+ return null;
+ }
+ }
+
+ if (in_array($post['private'], [Item::PUBLIC, Item::UNLISTED])) {
+ return $post['uid'];
+ }
+
+ $pcid = Contact::getPublicIdByUserId($uid);
+ if (empty($pcid)) {
+ return null;
+ }
+
+ foreach (Item::enumeratePermissions($post, true) as $receiver) {
+ if ($receiver == $pcid) {
+ return $post['uid'];
+ }
+ }
+
+ return null;
+ }
+
/**
* Store a public item array for the given users
*
$allow_cid = '<' . $owner['id'] . '>';
$allow_gid = '<' . Group::getIdForForum($owner['id']) . '>';
- $deny_cid = '';
+ $deny_cid = '';
$deny_gid = '';
self::performActivity($item['id'], 'announce', $uid, $allow_cid, $allow_gid, $deny_cid, $deny_gid);
} else {
continue;
}
- if (!empty($profile = APContact::getByURL($contact['url'], false))) {
+ $profile = APContact::getByURL($term['url'], false);
+ if (!empty($profile)) {
+ if ($term['type'] == Tag::EXCLUSIVE_MENTION) {
+ $exclusive = true;
+ if (!empty($profile['followers']) && ($profile['type'] == 'Group')) {
+ $data['cc'][] = $profile['followers'];
+ }
+ }
$data['to'][] = $profile['url'];
}
}
}
- foreach ($receiver_list as $receiver) {
- $contact = DBA::selectFirst('contact', ['url', 'hidden', 'network', 'protocol', 'gsid'], ['id' => $receiver, 'network' => Protocol::FEDERATED]);
- if (!DBA::isResult($contact) || !self::isAPContact($contact, $networks)) {
- continue;
- }
+ if (!$exclusive) {
+ foreach ($receiver_list as $receiver) {
+ $contact = DBA::selectFirst('contact', ['url', 'hidden', 'network', 'protocol', 'gsid'], ['id' => $receiver, 'network' => Protocol::FEDERATED]);
+ if (!DBA::isResult($contact) || !self::isAPContact($contact, $networks)) {
+ continue;
+ }
- if (!empty($profile = APContact::getByURL($contact['url'], false))) {
- if ($contact['hidden'] || $always_bcc) {
- $data['bcc'][] = $profile['url'];
- } else {
- $data['cc'][] = $profile['url'];
+ if (!empty($profile = APContact::getByURL($contact['url'], false))) {
+ if ($contact['hidden'] || $always_bcc) {
+ $data['bcc'][] = $profile['url'];
+ } else {
+ $data['cc'][] = $profile['url'];
+ }
}
}
}