Merge pull request #11288 from annando/api-fix2
API: Only display active incoming contact requests
This commit is contained in:
commit
7df5b41f2e
5 changed files with 116 additions and 95 deletions
93
mod/item.php
93
mod/item.php
|
@ -383,69 +383,34 @@ function item_post(App $a) {
|
||||||
$contact_record = DBA::selectFirst('contact', [], ['uid' => $profile_uid, 'self' => true]) ?: [];
|
$contact_record = DBA::selectFirst('contact', [], ['uid' => $profile_uid, 'self' => true]) ?: [];
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look for any tags and linkify them
|
|
||||||
$inform = '';
|
|
||||||
$private_forum = false;
|
|
||||||
$private_id = null;
|
|
||||||
$only_to_forum = false;
|
|
||||||
$forum_contact = [];
|
|
||||||
|
|
||||||
// Personal notes must never be altered to a forum post.
|
// Personal notes must never be altered to a forum post.
|
||||||
if ($posttype != Item::PT_PERSONAL_NOTE) {
|
if ($posttype != Item::PT_PERSONAL_NOTE) {
|
||||||
// Convert mentions in the body to a unified format
|
// Look for any tags and linkify them
|
||||||
$body = BBCode::setMentions($body, local_user() ? local_user() : $profile_uid, $network);
|
$item = [
|
||||||
|
'uid' => local_user() ? local_user() : $profile_uid,
|
||||||
|
'gravity' => $toplevel_item_id ? GRAVITY_COMMENT : GRAVITY_PARENT,
|
||||||
|
'network' => $network,
|
||||||
|
'body' => $body,
|
||||||
|
'postopts' => $postopts,
|
||||||
|
'private' => $private,
|
||||||
|
'allow_cid' => $str_contact_allow,
|
||||||
|
'allow_gid' => $str_group_allow,
|
||||||
|
'deny_cid' => $str_contact_deny,
|
||||||
|
'deny_gid' => $str_group_deny,
|
||||||
|
];
|
||||||
|
|
||||||
// Search for forum mentions
|
$item = DI::contentItem()->expandTags($item);
|
||||||
foreach (Tag::getFromBody($body, Tag::TAG_CHARACTER[Tag::MENTION] . Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]) as $tag) {
|
|
||||||
$contact = Contact::getByURLForUser($tag[2], $profile_uid);
|
|
||||||
if (!empty($inform)) {
|
|
||||||
$inform .= ',';
|
|
||||||
}
|
|
||||||
$inform .= 'cid:' . $contact['id'];
|
|
||||||
|
|
||||||
if ($toplevel_item_id || empty($contact['cid']) || ($contact['contact-type'] != Contact::TYPE_COMMUNITY)) {
|
$body = $item['body'];
|
||||||
continue;
|
$inform = $item['inform'];
|
||||||
}
|
$postopts = $item['postopts'];
|
||||||
|
$private = $item['private'];
|
||||||
if (!empty($contact['prv']) || ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION])) {
|
$str_contact_allow = $item['allow_cid'];
|
||||||
$private_forum = $contact['prv'];
|
$str_group_allow = $item['allow_gid'];
|
||||||
$only_to_forum = ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]);
|
$str_contact_deny = $item['deny_cid'];
|
||||||
$private_id = $contact['id'];
|
$str_group_deny = $item['deny_gid'];
|
||||||
$forum_contact = $contact;
|
} else {
|
||||||
Logger::info('Private forum or exclusive mention', ['url' => $tag[2], 'mention' => $tag[1]]);
|
$inform = '';
|
||||||
} elseif ($str_contact_allow == '<' . $contact['id'] . '>') {
|
|
||||||
$private_forum = false;
|
|
||||||
$only_to_forum = true;
|
|
||||||
$private_id = $contact['id'];
|
|
||||||
$forum_contact = $contact;
|
|
||||||
Logger::info('Public forum', ['url' => $tag[2], 'mention' => $tag[1]]);
|
|
||||||
} else {
|
|
||||||
Logger::info('Post with forum mention will not be converted to a forum post', ['url' => $tag[2], 'mention' => $tag[1]]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Logger::info('Got inform', ['inform' => $inform]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$original_contact_id = $contact_id;
|
|
||||||
|
|
||||||
if (!$toplevel_item_id && !empty($forum_contact) && ($private_forum || $only_to_forum)) {
|
|
||||||
// we tagged a forum in a top level post. Now we change the post
|
|
||||||
$private = $private_forum ? Item::PRIVATE : Item::UNLISTED;
|
|
||||||
|
|
||||||
if ($only_to_forum) {
|
|
||||||
$postopts = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
$str_contact_deny = '';
|
|
||||||
$str_group_deny = '';
|
|
||||||
|
|
||||||
if ($private_forum) {
|
|
||||||
$str_contact_allow = '<' . $private_id . '>';
|
|
||||||
$str_group_allow = '<' . Group::getIdForForum($forum_contact['id']) . '>';
|
|
||||||
} else {
|
|
||||||
$str_contact_allow = '';
|
|
||||||
$str_group_allow = '';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -460,7 +425,7 @@ function item_post(App $a) {
|
||||||
|
|
||||||
$match = null;
|
$match = null;
|
||||||
|
|
||||||
if (!$preview && Photo::setPermissionFromBody($body, $uid, $original_contact_id, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny)) {
|
if (!$preview && Photo::setPermissionFromBody($body, $uid, $contact_id, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny)) {
|
||||||
$objecttype = Activity\ObjectType::IMAGE;
|
$objecttype = Activity\ObjectType::IMAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -475,7 +440,7 @@ function item_post(App $a) {
|
||||||
if (count($attaches)) {
|
if (count($attaches)) {
|
||||||
foreach ($attaches as $attach) {
|
foreach ($attaches as $attach) {
|
||||||
// Ensure to only modify attachments that you own
|
// Ensure to only modify attachments that you own
|
||||||
$srch = '<' . intval($original_contact_id) . '>';
|
$srch = '<' . intval($contact_id) . '>';
|
||||||
|
|
||||||
$condition = ['allow_cid' => $srch, 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '',
|
$condition = ['allow_cid' => $srch, 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '',
|
||||||
'id' => $attach];
|
'id' => $attach];
|
||||||
|
@ -797,12 +762,6 @@ function item_post(App $a) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// When we are doing some forum posting via ! we have to start the notifier manually.
|
|
||||||
// These kind of posts don't initiate the notifier call in the item class.
|
|
||||||
if ($only_to_forum) {
|
|
||||||
Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => false], "Notifier", Delivery::POST, (int)$datarray['uri-id'], (int)$datarray['uid']);
|
|
||||||
}
|
|
||||||
|
|
||||||
Logger::info('post_complete');
|
Logger::info('post_complete');
|
||||||
|
|
||||||
if ($api_source) {
|
if ($api_source) {
|
||||||
|
|
|
@ -21,12 +21,15 @@
|
||||||
|
|
||||||
namespace Friendica\Content;
|
namespace Friendica\Content;
|
||||||
|
|
||||||
|
use Friendica\Content\Text\BBCode;
|
||||||
use Friendica\Core\Hook;
|
use Friendica\Core\Hook;
|
||||||
use Friendica\Core\L10n;
|
use Friendica\Core\L10n;
|
||||||
|
use Friendica\Core\Logger;
|
||||||
use Friendica\Core\Protocol;
|
use Friendica\Core\Protocol;
|
||||||
use Friendica\Core\Session;
|
use Friendica\Core\Session;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\Model\Contact;
|
use Friendica\Model\Contact;
|
||||||
|
use Friendica\Model\Group;
|
||||||
use Friendica\Model\Item as ModelItem;
|
use Friendica\Model\Item as ModelItem;
|
||||||
use Friendica\Model\Tag;
|
use Friendica\Model\Tag;
|
||||||
use Friendica\Model\Post;
|
use Friendica\Model\Post;
|
||||||
|
@ -490,4 +493,68 @@ class Item
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function expandTags(array $item)
|
||||||
|
{
|
||||||
|
// Look for any tags and linkify them
|
||||||
|
$item['inform'] = '';
|
||||||
|
$private_forum = false;
|
||||||
|
$private_id = null;
|
||||||
|
$only_to_forum = false;
|
||||||
|
$forum_contact = [];
|
||||||
|
|
||||||
|
// Convert mentions in the body to a unified format
|
||||||
|
$item['body'] = BBCode::setMentions($item['body'], $item['uid'], $item['network']);
|
||||||
|
|
||||||
|
// Search for forum mentions
|
||||||
|
foreach (Tag::getFromBody($item['body'], Tag::TAG_CHARACTER[Tag::MENTION] . Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]) as $tag) {
|
||||||
|
$contact = Contact::getByURLForUser($tag[2], $item['uid']);
|
||||||
|
if (!empty($item['inform'])) {
|
||||||
|
$item['inform'] .= ',';
|
||||||
|
}
|
||||||
|
$item['inform'] .= 'cid:' . $contact['id'];
|
||||||
|
|
||||||
|
if (($item['gravity'] == GRAVITY_COMMENT) || empty($contact['cid']) || ($contact['contact-type'] != Contact::TYPE_COMMUNITY)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($contact['prv']) || ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION])) {
|
||||||
|
$private_forum = $contact['prv'];
|
||||||
|
$only_to_forum = ($tag[1] == Tag::TAG_CHARACTER[Tag::EXCLUSIVE_MENTION]);
|
||||||
|
$private_id = $contact['id'];
|
||||||
|
$forum_contact = $contact;
|
||||||
|
Logger::info('Private forum or exclusive mention', ['url' => $tag[2], 'mention' => $tag[1]]);
|
||||||
|
} elseif ($item['allow_cid'] == '<' . $contact['id'] . '>') {
|
||||||
|
$private_forum = false;
|
||||||
|
$only_to_forum = true;
|
||||||
|
$private_id = $contact['id'];
|
||||||
|
$forum_contact = $contact;
|
||||||
|
Logger::info('Public forum', ['url' => $tag[2], 'mention' => $tag[1]]);
|
||||||
|
} else {
|
||||||
|
Logger::info('Post with forum mention will not be converted to a forum post', ['url' => $tag[2], 'mention' => $tag[1]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Logger::info('Got inform', ['inform' => $item['inform']]);
|
||||||
|
|
||||||
|
if (($item['gravity'] == GRAVITY_PARENT) && !empty($forum_contact) && ($private_forum || $only_to_forum)) {
|
||||||
|
// we tagged a forum in a top level post. Now we change the post
|
||||||
|
$item['private'] = $private_forum ? ModelItem::PRIVATE : ModelItem::UNLISTED;
|
||||||
|
|
||||||
|
if ($only_to_forum) {
|
||||||
|
$item['postopts'] = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$item['deny_cid'] = '';
|
||||||
|
$item['deny_gid'] = '';
|
||||||
|
|
||||||
|
if ($private_forum) {
|
||||||
|
$item['allow_cid'] = '<' . $private_id . '>';
|
||||||
|
$item['allow_gid'] = '<' . Group::getIdForForum($forum_contact['id']) . '>';
|
||||||
|
} else {
|
||||||
|
$item['allow_cid'] = '';
|
||||||
|
$item['allow_gid'] = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $item;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,8 +21,8 @@
|
||||||
|
|
||||||
namespace Friendica\Module\Api\Mastodon;
|
namespace Friendica\Module\Api\Mastodon;
|
||||||
|
|
||||||
use Friendica\Content\Text\BBCode;
|
|
||||||
use Friendica\Content\Text\Markdown;
|
use Friendica\Content\Text\Markdown;
|
||||||
|
use Friendica\Core\Protocol;
|
||||||
use Friendica\Core\System;
|
use Friendica\Core\System;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\DI;
|
use Friendica\DI;
|
||||||
|
@ -63,12 +63,8 @@ class Statuses extends BaseApi
|
||||||
// The imput is defined as text. So we can use Markdown for some enhancements
|
// The imput is defined as text. So we can use Markdown for some enhancements
|
||||||
$body = Markdown::toBBCode($request['status']);
|
$body = Markdown::toBBCode($request['status']);
|
||||||
|
|
||||||
// Avoids potential double expansion of existing links
|
$item = [];
|
||||||
$body = BBCode::performWithEscapedTags($body, ['url'], function ($body) {
|
$item['network'] = Protocol::DFRN;
|
||||||
return BBCode::expandTags($body);
|
|
||||||
});
|
|
||||||
|
|
||||||
$item = [];
|
|
||||||
$item['uid'] = $uid;
|
$item['uid'] = $uid;
|
||||||
$item['verb'] = Activity::POST;
|
$item['verb'] = Activity::POST;
|
||||||
$item['contact-id'] = $owner['id'];
|
$item['contact-id'] = $owner['id'];
|
||||||
|
@ -149,6 +145,8 @@ class Statuses extends BaseApi
|
||||||
$item['object-type'] = Activity\ObjectType::NOTE;
|
$item['object-type'] = Activity\ObjectType::NOTE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$item = DI::contentItem()->expandTags($item);
|
||||||
|
|
||||||
if (!empty($request['media_ids'])) {
|
if (!empty($request['media_ids'])) {
|
||||||
$item['object-type'] = Activity\ObjectType::IMAGE;
|
$item['object-type'] = Activity\ObjectType::IMAGE;
|
||||||
$item['post-type'] = Item::PT_IMAGE;
|
$item['post-type'] = Item::PT_IMAGE;
|
||||||
|
|
|
@ -46,32 +46,32 @@ class Incoming extends ContactEndpoint
|
||||||
$max_id = $this->getRequestValue($request, 'max_id', 0, 0);
|
$max_id = $this->getRequestValue($request, 'max_id', 0, 0);
|
||||||
$min_id = $this->getRequestValue($request, 'min_id', 0, 0);
|
$min_id = $this->getRequestValue($request, 'min_id', 0, 0);
|
||||||
|
|
||||||
$params = ['order' => ['cid' => true], 'limit' => $count];
|
$params = ['order' => ['contact-id' => true], 'limit' => $count];
|
||||||
|
|
||||||
$condition = ['uid' => $uid, 'pending' => true];
|
$condition = ["`uid` = ? AND NOT `blocked` AND NOT `ignore` AND `contact-id` != 0 AND (`suggest-cid` = 0 OR `suggest-cid` IS NULL)", $uid];
|
||||||
|
|
||||||
$total_count = (int)DBA::count('user-contact', $condition);
|
$total_count = (int)DBA::count('intro', $condition);
|
||||||
|
|
||||||
if (!empty($max_id)) {
|
if (!empty($max_id)) {
|
||||||
$condition = DBA::mergeConditions($condition, ["`cid` < ?", $max_id]);
|
$condition = DBA::mergeConditions($condition, ["`contact-id` < ?", $max_id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($since_id)) {
|
if (!empty($since_id)) {
|
||||||
$condition = DBA::mergeConditions($condition, ["`cid` > ?", $since_id]);
|
$condition = DBA::mergeConditions($condition, ["`contact-id` > ?", $since_id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($min_id)) {
|
if (!empty($min_id)) {
|
||||||
$condition = DBA::mergeConditions($condition, ["`cid` > ?", $min_id]);
|
$condition = DBA::mergeConditions($condition, ["`contact-id` > ?", $min_id]);
|
||||||
|
|
||||||
$params['order'] = ['cid'];
|
$params['order'] = ['contact-id'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$ids = [];
|
$ids = [];
|
||||||
|
|
||||||
$contacts = DBA::select('user-contact', ['cid'], $condition, $params);
|
$contacts = DBA::select('intro', ['contact-id'], $condition, $params);
|
||||||
while ($contact = DBA::fetch($contacts)) {
|
while ($contact = DBA::fetch($contacts)) {
|
||||||
self::setBoundaries($contact['cid']);
|
self::setBoundaries($contact['contact-id']);
|
||||||
$ids[] = $contact['cid'];
|
$ids[] = $contact['contact-id'];
|
||||||
}
|
}
|
||||||
DBA::close($contacts);
|
DBA::close($contacts);
|
||||||
|
|
||||||
|
|
|
@ -21,9 +21,9 @@
|
||||||
|
|
||||||
namespace Friendica\Module\Api\Twitter\Statuses;
|
namespace Friendica\Module\Api\Twitter\Statuses;
|
||||||
|
|
||||||
use Friendica\Content\Text\BBCode;
|
|
||||||
use Friendica\Content\Text\HTML;
|
use Friendica\Content\Text\HTML;
|
||||||
use Friendica\Content\Text\Markdown;
|
use Friendica\Content\Text\Markdown;
|
||||||
|
use Friendica\Core\Protocol;
|
||||||
use Friendica\Database\DBA;
|
use Friendica\Database\DBA;
|
||||||
use Friendica\DI;
|
use Friendica\DI;
|
||||||
use Friendica\Model\Contact;
|
use Friendica\Model\Contact;
|
||||||
|
@ -78,17 +78,12 @@ class Update extends BaseApi
|
||||||
$body = Markdown::toBBCode($request['status']);
|
$body = Markdown::toBBCode($request['status']);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avoids potential double expansion of existing links
|
|
||||||
$body = BBCode::performWithEscapedTags($body, ['url'], function ($body) {
|
|
||||||
return BBCode::expandTags($body);
|
|
||||||
});
|
|
||||||
|
|
||||||
$item = [];
|
$item = [];
|
||||||
|
$item['network'] = Protocol::DFRN;
|
||||||
$item['uid'] = $uid;
|
$item['uid'] = $uid;
|
||||||
$item['verb'] = Activity::POST;
|
$item['verb'] = Activity::POST;
|
||||||
$item['contact-id'] = $owner['id'];
|
$item['contact-id'] = $owner['id'];
|
||||||
$item['author-id'] = Contact::getPublicIdByUserId($uid);
|
$item['author-id'] = $item['owner-id'] = Contact::getPublicIdByUserId($uid);
|
||||||
$item['owner-id'] = $item['author-id'];
|
|
||||||
$item['title'] = $request['title'];
|
$item['title'] = $request['title'];
|
||||||
$item['body'] = $body;
|
$item['body'] = $body;
|
||||||
$item['app'] = $request['source'];
|
$item['app'] = $request['source'];
|
||||||
|
@ -127,6 +122,8 @@ class Update extends BaseApi
|
||||||
$item['object-type'] = Activity\ObjectType::NOTE;
|
$item['object-type'] = Activity\ObjectType::NOTE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$item = DI::contentItem()->expandTags($item);
|
||||||
|
|
||||||
if (!empty($request['media_ids'])) {
|
if (!empty($request['media_ids'])) {
|
||||||
$ids = explode(',', $request['media_ids']);
|
$ids = explode(',', $request['media_ids']);
|
||||||
} elseif (!empty($_FILES['media'])) {
|
} elseif (!empty($_FILES['media'])) {
|
||||||
|
|
Loading…
Reference in a new issue