X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FNotice.php;h=3891f431e460a04cd947e80edfb78dba3d8b43d3;hb=15d466ebe6576aa34efa7d4b5bb008e0d2cbc116;hp=adcc25973c5a093b8a24462f0d61bd97181a4945;hpb=c48cdc7d50cc2920e3f41e34e9b5e19638331dd9;p=quix0rs-gnu-social.git diff --git a/classes/Notice.php b/classes/Notice.php index adcc25973c..3891f431e4 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -122,11 +122,11 @@ class Notice extends Managed_DataObject 'notice_repeat_of_fkey' => array('notice', array('repeat_of' => 'id')), # @fixme: what about repeats of deleted notices? ), 'indexes' => array( + 'notice_created_id_is_local_idx' => array('created', 'id', 'is_local'), 'notice_profile_id_idx' => array('profile_id', 'created', 'id'), - 'notice_conversation_idx' => array('conversation'), - 'notice_created_idx' => array('created'), - 'notice_replyto_idx' => array('reply_to'), - 'notice_repeatof_idx' => array('repeat_of'), + 'notice_repeat_of_created_id_idx' => array('repeat_of', 'created', 'id'), + 'notice_conversation_created_id_idx' => array('conversation', 'created', 'id'), + 'notice_replyto_idx' => array('reply_to') ) ); @@ -645,7 +645,7 @@ class Notice extends Managed_DataObject } self::blow('notice:list-ids:conversation:%s', $this->conversation); - self::blow('conversation::notice_count:%d', $this->conversation); + self::blow('conversation:notice_count:%d', $this->conversation); if (!empty($this->repeat_of)) { // XXX: we should probably only use one of these @@ -1008,10 +1008,7 @@ class Notice extends Managed_DataObject $users = $ptag->getUserSubscribers(); foreach ($users as $id) { if (!array_key_exists($id, $ni)) { - $user = User::staticGet('id', $id); - if (!$user->hasBlocked($profile)) { - $ni[$id] = NOTICE_INBOX_SOURCE_PROFILE_TAG; - } + $ni[$id] = NOTICE_INBOX_SOURCE_PROFILE_TAG; } } } @@ -1020,23 +1017,30 @@ class Notice extends Managed_DataObject if (!array_key_exists($recipient, $ni)) { $ni[$recipient] = NOTICE_INBOX_SOURCE_REPLY; } + } - // Exclude any deleted, non-local, or blocking recipients. - $profile = $this->getProfile(); - $originalProfile = null; - if ($this->repeat_of) { - // Check blocks against the original notice's poster as well. - $original = Notice::staticGet('id', $this->repeat_of); - if ($original) { - $originalProfile = $original->getProfile(); - } + // Exclude any deleted, non-local, or blocking recipients. + $profile = $this->getProfile(); + $originalProfile = null; + if ($this->repeat_of) { + // Check blocks against the original notice's poster as well. + $original = Notice::staticGet('id', $this->repeat_of); + if ($original) { + $originalProfile = $original->getProfile(); } - foreach ($ni as $id => $source) { + } + + foreach ($ni as $id => $source) { + try { $user = User::staticGet('id', $id); - if (empty($user) || $user->hasBlocked($profile) || + if (empty($user) || + $user->hasBlocked($profile) || ($originalProfile && $user->hasBlocked($originalProfile))) { unset($ni[$id]); } + } catch (UserNoProfileException $e) { + // User doesn't have a profile; invalid; skip them. + unset($ni[$id]); } } @@ -1489,7 +1493,7 @@ class Notice extends Managed_DataObject * @return Activity activity object representing this Notice. */ - function asActivity($cur) + function asActivity($cur=null) { $act = self::cacheGet(Cache::codeKey('notice:as-activity:'.$this->id)); @@ -1504,7 +1508,6 @@ class Notice extends Managed_DataObject $act->time = strtotime($this->created); $act->link = $this->bestUrl(); $act->content = common_xml_safe_str($this->rendered); - $act->title = common_xml_safe_str($this->content); $profile = $this->getProfile(); @@ -1515,7 +1518,9 @@ class Notice extends Managed_DataObject if ($this->repeat_of) { $repeated = Notice::staticGet('id', $this->repeat_of); - $act->objects[] = $repeated->asActivity($cur); + if (!empty($repeated)) { + $act->objects[] = $repeated->asActivity($cur); + } } else { $act->objects[] = ActivityObject::fromNotice($this); } @@ -2365,7 +2370,11 @@ class Notice extends Managed_DataObject $result = self::cacheGet($keypart); if ($result === false) { - $bResult = $this->_inScope($profile); + $bResult = false; + if (Event::handle('StartNoticeInScope', array($this, $profile, &$bResult))) { + $bResult = $this->_inScope($profile); + Event::handle('EndNoticeInScope', array($this, $profile, &$bResult)); + } $result = ($bResult) ? 1 : 0; self::cacheSet($keypart, $result, 0, 300); } @@ -2383,75 +2392,110 @@ class Notice extends Managed_DataObject // If there's no scope, anyone (even anon) is in scope. - if ($scope == 0) { - return true; - } + if ($scope == 0) { // Not private - // If there's scope, anon cannot be in scope + return !$this->isHiddenSpam($profile); - if (empty($profile)) { - return false; - } + } else { // Private, somehow - // Author is always in scope + // If there's scope, anon cannot be in scope - if ($this->profile_id == $profile->id) { - return true; - } + if (empty($profile)) { + return false; + } - // Only for users on this site + // Author is always in scope - if ($scope & Notice::SITE_SCOPE) { - $user = $profile->getUser(); - if (empty($user)) { - return false; + if ($this->profile_id == $profile->id) { + return true; } - } - // Only for users mentioned in the notice + // Only for users on this site + + if ($scope & Notice::SITE_SCOPE) { + $user = $profile->getUser(); + if (empty($user)) { + return false; + } + } + + // Only for users mentioned in the notice - if ($scope & Notice::ADDRESSEE_SCOPE) { + if ($scope & Notice::ADDRESSEE_SCOPE) { - $repl = Reply::pkeyGet(array('notice_id' => $this->id, - 'profile_id' => $profile->id)); + $repl = Reply::pkeyGet(array('notice_id' => $this->id, + 'profile_id' => $profile->id)); - if (empty($repl)) { - return false; + if (empty($repl)) { + return false; + } } - } - // Only for members of the given group + // Only for members of the given group - if ($scope & Notice::GROUP_SCOPE) { + if ($scope & Notice::GROUP_SCOPE) { - // XXX: just query for the single membership + // XXX: just query for the single membership - $groups = $this->getGroups(); + $groups = $this->getGroups(); - $foundOne = false; + $foundOne = false; - foreach ($groups as $group) { - if ($profile->isMember($group)) { - $foundOne = true; - break; + foreach ($groups as $group) { + if ($profile->isMember($group)) { + $foundOne = true; + break; + } + } + + if (!$foundOne) { + return false; } } - if (!$foundOne) { - return false; + // Only for followers of the author + + $author = null; + + if ($scope & Notice::FOLLOWER_SCOPE) { + + try { + $author = $this->getProfile(); + } catch (Exception $e) { + return false; + } + + if (!Subscription::exists($profile, $author)) { + return false; + } } + + return !$this->isHiddenSpam($profile); } + } - // Only for followers of the author + function isHiddenSpam($profile) { + + // Hide posts by silenced users from everyone but moderators. - if ($scope & Notice::FOLLOWER_SCOPE) { - $author = $this->getProfile(); - if (!Subscription::exists($profile, $author)) { - return false; + if (common_config('notice', 'hidespam')) { + + try { + $author = $this->getProfile(); + } catch(Exception $e) { + // If we can't get an author, keep it hidden. + // XXX: technically not spam, but, whatever. + return true; + } + + if ($author->hasRole(Profile_role::SILENCED)) { + if (empty($profile) || (($profile->id !== $author->id) && (!$profile->hasRight(Right::REVIEWSPAM)))) { + return true; + } } } - return true; + return false; } static function groupsFromText($text, $profile)