From dace658d5df3cc112aeb8f4571d74a14182f84d6 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 24 Aug 2024 14:07:59 +0000 Subject: [PATCH] Disallow posting to restricted groups --- src/Model/Contact.php | 14 +++++++++++++- src/Module/Contact/Conversations.php | 18 ++++++++++-------- src/Module/Search/Acl.php | 12 ++++++------ 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 1b4192327f..d5ec105fef 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -259,6 +259,17 @@ class Contact return DBA::update('contact', $fields, $condition, $old_fields); } + /** + * @param integer $id Contact ID + * @param array $fields Array of selected fields, empty for all + * @return array|boolean Contact record if it exists, false otherwise + * @throws \Exception + */ + public static function getAccountById(int $id, array $fields = []) + { + return DBA::selectFirst('account-user-view', $fields, ['id' => $id]); + } + /** * @param integer $id Contact ID * @param array $fields Array of selected fields, empty for all @@ -2375,7 +2386,8 @@ class Contact if ($default_avatar && Proxy::isLocalImage($avatar)) { $fields = [ - 'avatar' => $avatar, 'avatar-date' => DateTimeFormat::utcNow(), + 'avatar' => $avatar, + 'avatar-date' => DateTimeFormat::utcNow(), 'photo' => $avatar, 'thumb' => self::getDefaultAvatar($contact, Proxy::SIZE_THUMB), 'micro' => self::getDefaultAvatar($contact, Proxy::SIZE_MICRO) diff --git a/src/Module/Contact/Conversations.php b/src/Module/Contact/Conversations.php index 251ad0de2b..8192aabe17 100644 --- a/src/Module/Contact/Conversations.php +++ b/src/Module/Contact/Conversations.php @@ -86,7 +86,7 @@ class Conversations extends BaseModule throw new NotFoundException($this->t('Contact not found.')); } - $contact = Model\Contact::getById($pcid); + $contact = Model\Contact::getAccountById($pcid); if (empty($contact)) { throw new NotFoundException($this->t('Contact not found.')); } @@ -111,13 +111,15 @@ class Conversations extends BaseModule Nav::setSelected('contact'); - $options = [ - 'lockstate' => ACL::getLockstateForUserId($this->userSession->getLocalUserId()) ? 'lock' : 'unlock', - 'acl' => ACL::getFullSelectorHTML($this->page, $this->userSession->getLocalUserId(), true, []), - 'bang' => '', - 'content' => ($contact['contact-type'] == ModelContact::TYPE_COMMUNITY ? '!' : '@') . ($contact['addr'] ?: $contact['url']), - ]; - $o = $this->conversation->statusEditor($options); + if (!$contact['ap-posting-restricted']) { + $options = [ + 'lockstate' => ACL::getLockstateForUserId($this->userSession->getLocalUserId()) ? 'lock' : 'unlock', + 'acl' => ACL::getFullSelectorHTML($this->page, $this->userSession->getLocalUserId(), true, []), + 'bang' => '', + 'content' => ($contact['contact-type'] == ModelContact::TYPE_COMMUNITY ? '!' : '@') . ($contact['addr'] ?: $contact['url']), + ]; + $o = $this->conversation->statusEditor($options); + } $o .= Contact::getTabsHTML($contact, Contact::TAB_CONVERSATIONS); $o .= Model\Contact::getThreadsFromId($contact['id'], $this->userSession->getLocalUserId(), 0, 0, $request['last_created'] ?? ''); diff --git a/src/Module/Search/Acl.php b/src/Module/Search/Acl.php index 4671006da2..daa0cb2db1 100644 --- a/src/Module/Search/Acl.php +++ b/src/Module/Search/Acl.php @@ -156,30 +156,30 @@ class Acl extends BaseModule switch ($type) { case self::TYPE_MENTION_CONTACT_CIRCLE: $condition = DBA::mergeConditions($condition, - ["NOT `self` AND NOT `blocked` AND `notify` != ? AND `network` != ?", '', Protocol::OSTATUS + ["NOT `self` AND NOT `blocked` AND `network` != ?", Protocol::OSTATUS ]); break; case self::TYPE_MENTION_CONTACT: $condition = DBA::mergeConditions($condition, - ["NOT `self` AND NOT `blocked` AND `notify` != ?", '' + ["NOT `self` AND NOT `blocked`", ]); break; case self::TYPE_MENTION_GROUP: $condition = DBA::mergeConditions($condition, - ["NOT `self` AND NOT `blocked` AND `notify` != ? AND `contact-type` = ?", '', Contact::TYPE_COMMUNITY + ["NOT `self` AND NOT `blocked` AND (NOT `ap-posting-restricted` OR `ap-posting-restricted` IS NULL) AND `contact-type` = ?", Contact::TYPE_COMMUNITY ]); break; case self::TYPE_PRIVATE_MESSAGE: $condition = DBA::mergeConditions($condition, - ["NOT `self` AND NOT `blocked` AND `notify` != ? AND `network` IN (?, ?, ?)", '', Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA + ["NOT `self` AND NOT `blocked` AND `network` IN (?, ?, ?)", Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA ]); break; } - $contact_count = $this->database->count('contact', $condition); + $contact_count = $this->database->count('account-user-view', $condition); $resultTotal = $circle_count + $contact_count; @@ -220,7 +220,7 @@ class Acl extends BaseModule $contacts = []; if ($type != self::TYPE_MENTION_CIRCLE) { - $contacts = Contact::selectToArray([], $condition, ['order' => ['name']]); + $contacts = Contact::selectAccountToArray([], $condition, ['order' => ['name']]); } $groups = [];