git.gnu.io has moved to IP address 209.51.188.249 -- please double check where you are logging in.

Commit 63c087a2 authored by mmn's avatar mmn

Consistent behaviour for ScopingNoticeStream $scoped

We don't guess the current profile anymore if the value of the profile === -1

Also sets $this->scoped for all ScopingNoticeStream inheritors, which just
like in an Action can be null if we're not scoped in any way (logged in).
parent 7862b853
......@@ -46,7 +46,7 @@ class AllrssAction extends TargetedRss10Action
{
protected function getNotices()
{
$stream = new InboxNoticeStream($this->target);
$stream = new InboxNoticeStream($this->target, $this->scoped);
return $stream->getNotices(0, $this->limit)->fetchAll();
}
......
......@@ -65,8 +65,7 @@ class NoticesearchAction extends SearchAction
if (!empty($this->q)) {
$profile = Profile::current();
$stream = new SearchNoticeStream($this->q, $profile);
$stream = new SearchNoticeStream($this->q, $this->scoped);
$page = $this->trimmed('page');
if (empty($page)) {
......
......@@ -28,12 +28,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR.'/lib/noticelist.php';
require_once INSTALLDIR.'/lib/feedlist.php';
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Group main page
......@@ -48,7 +43,6 @@ class ShowgroupAction extends GroupAction
{
/** page we're viewing. */
var $page = null;
var $userProfile = null;
var $notice = null;
/**
......@@ -97,14 +91,10 @@ class ShowgroupAction extends GroupAction
$this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
$this->userProfile = Profile::current();
$user = common_current_user();
if (!empty($user) && $user->streamModeOnly()) {
$stream = new GroupNoticeStream($this->group, $this->userProfile);
if ($this->scoped instanceof Profile && $this->scoped->isLocal() && $this->scoped->getUser()->streamModeOnly()) {
$stream = new GroupNoticeStream($this->group, $this->scoped);
} else {
$stream = new ThreadingGroupNoticeStream($this->group, $this->userProfile);
$stream = new ThreadingGroupNoticeStream($this->group, $this->scoped);
}
$this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE,
......@@ -146,12 +136,10 @@ class ShowgroupAction extends GroupAction
*/
function showGroupNotices()
{
$user = common_current_user();
if (!empty($user) && $user->streamModeOnly()) {
if ($this->scoped instanceof Profile && $this->scoped->isLocal() && $this->scoped->getUser()->streamModeOnly()) {
$nl = new PrimaryNoticeList($this->notice, $this, array('show_n'=>NOTICES_PER_PAGE));
} else {
$nl = new ThreadedNoticeList($this->notice, $this, $this->userProfile);
$nl = new ThreadedNoticeList($this->notice, $this, $this->scoped);
}
$cnt = $nl->show();
......
......@@ -579,7 +579,9 @@ class File extends Managed_DataObject
function stream($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
{
$stream = new FileNoticeStream($this);
// FIXME: Try to get the Profile::current() here in some other way to avoid mixing
// the current session user with possibly background/queue processing.
$stream = new FileNoticeStream($this, Profile::current());
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
......
......@@ -1280,9 +1280,9 @@ class Notice extends Managed_DataObject
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
static function conversationStream($id, $offset=0, $limit=20, $since_id=null, $max_id=null)
static function conversationStream($id, $offset=0, $limit=20, $since_id=null, $max_id=null, Profile $scoped=null)
{
$stream = new ConversationNoticeStream($id);
$stream = new ConversationNoticeStream($id, $scoped);
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
......@@ -1300,8 +1300,9 @@ class Notice extends Managed_DataObject
return false;
}
$stream = new ConversationNoticeStream($this->conversation);
$notice = $stream->getNotices(/*offset*/ 1, /*limit*/ 1);
//FIXME: Get the Profile::current() stuff some other way
// to avoid confusion between queue processing and session.
$notice = self::conversationStream($this->conversation, 1, 1, null, null, Profile::current());
// if our "offset 1, limit 1" query got a result, return true else false
return $notice->N > 0;
......
......@@ -55,7 +55,9 @@ class Notice_tag extends Managed_DataObject
static function getStream($tag, $offset=0, $limit=20, $sinceId=0, $maxId=0)
{
$stream = new TagNoticeStream($tag);
// FIXME: Get the Profile::current value some other way
// to avoid confusino between queue processing and session.
$stream = new TagNoticeStream($tag, Profile::current());
return $stream;
}
......
......@@ -266,7 +266,9 @@ class Profile extends Managed_DataObject
function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
{
$stream = new TaggedProfileNoticeStream($this, $tag);
//FIXME: Get Profile::current() some other way to avoid possible
// confusion between current session profile and background processing.
$stream = new TaggedProfileNoticeStream($this, $tag, Profile::current());
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
......
......@@ -171,7 +171,9 @@ class Profile_list extends Managed_DataObject
function getNotices($offset, $limit, $since_id=null, $max_id=null)
{
$stream = new PeopletagNoticeStream($this);
// FIXME: Use something else than Profile::current() to avoid
// possible confusion between session user and queue processing.
$stream = new PeopletagNoticeStream($this, Profile::current());
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
......
......@@ -57,7 +57,9 @@ class Reply extends Managed_DataObject
static function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
{
$stream = new ReplyNoticeStream($user_id);
// FIXME: Use some other method to get Profile::current() in order
// to avoid confusion between background processing and session user.
$stream = new ReplyNoticeStream($user_id, Profile::current());
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
}
......@@ -701,15 +701,18 @@ class User extends Managed_DataObject
function repeatedByMe($offset=0, $limit=20, $since_id=null, $max_id=null)
{
$stream = new RepeatedByMeNoticeStream($this);
// FIXME: Use another way to get Profile::current() since we
// want to avoid confusion between session user and queue processing.
$stream = new RepeatedByMeNoticeStream($this->getProfile(), Profile::current());
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
function repeatsOfMe($offset=0, $limit=20, $since_id=null, $max_id=null)
{
$stream = new RepeatsOfMeNoticeStream($this);
// FIXME: Use another way to get Profile::current() since we
// want to avoid confusion between session user and queue processing.
$stream = new RepeatsOfMeNoticeStream($this->getProfile(), Profile::current());
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
......
......@@ -153,7 +153,9 @@ class User_group extends Managed_DataObject
function getNotices($offset, $limit, $since_id=null, $max_id=null)
{
$stream = new GroupNoticeStream($this);
// FIXME: Get the Profile::current() some other way, to avoid
// possible confusion between current session and queue process.
$stream = new GroupNoticeStream($this, Profile::current());
return $stream->getNotices($offset, $limit, $since_id, $max_id);
}
......
......@@ -42,14 +42,10 @@ if (!defined('GNUSOCIAL')) { exit(1); }
*/
class ConversationNoticeStream extends ScopingNoticeStream
{
function __construct($id, $profile = -1)
function __construct($id, Profile $scoped=null)
{
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
parent::__construct(new RawConversationNoticeStream($id),
$profile);
$scoped);
}
}
......
......@@ -28,22 +28,15 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
class FileNoticeStream extends ScopingNoticeStream
{
function __construct($file, $profile = -1)
function __construct($file, Profile $scoped=null)
{
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
parent::__construct(new CachingNoticeStream(new RawFileNoticeStream($file),
'file:notice-ids:'.$file->id),
$profile);
$scoped);
}
}
......
......@@ -28,11 +28,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Stream of notices for a group
......@@ -47,19 +43,14 @@ if (!defined('STATUSNET')) {
class GroupNoticeStream extends ScopingNoticeStream
{
var $group;
var $userProfile;
function __construct($group, $profile = -1)
function __construct($group, Profile $scoped=null)
{
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
$this->group = $group;
$this->userProfile = $profile;
parent::__construct(new CachingNoticeStream(new RawGroupNoticeStream($group),
'user_group:notice_ids:' . $group->id),
$profile);
$scoped);
}
function getNoticeIds($offset, $limit, $since_id, $max_id)
......@@ -83,7 +74,7 @@ class GroupNoticeStream extends ScopingNoticeStream
function impossibleStream()
{
if ($this->group->force_scope &&
(empty($this->userProfile) || !$this->userProfile->isMember($this->group))) {
(!$this->scoped instanceof Profile || $this->scoped->isMember($this->group))) {
return true;
}
......
......@@ -54,9 +54,6 @@ class InboxNoticeStream extends ScopingNoticeStream
*/
function __construct(Profile $target, Profile $scoped=null)
{
if ($scoped === null) {
$scoped = Profile::current();
}
// FIXME: we don't use CachingNoticeStream - but maybe we should?
parent::__construct(new CachingNoticeStream(new RawInboxNoticeStream($target), 'profileall'), $scoped);
}
......
......@@ -27,9 +27,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Personal tag cloud section
......@@ -60,9 +58,9 @@ class InboxTagCloudSection extends TagCloudSection
function getTags()
{
$profile = Profile::current();
$stream = new InboxNoticeStream($this->target, $profile);
// FIXME: Get the Profile::current() value some other way
// to avoid confusion between background stuff and session.
$stream = new InboxNoticeStream($this->target, Profile::current());
$ids = $stream->getNoticeIds(0, self::MAX_NOTICES, null, null);
......
......@@ -28,11 +28,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Stream of notices for a list
......@@ -47,14 +43,11 @@ if (!defined('STATUSNET')) {
*/
class PeopletagNoticeStream extends ScopingNoticeStream
{
function __construct($plist, $profile = -1)
function __construct($plist, Profile $scoped=null)
{
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
parent::__construct(new CachingNoticeStream(new RawPeopletagNoticeStream($plist),
'profile_list:notice_ids:' . $plist->id),
$profile);
$scoped);
}
}
......
......@@ -43,19 +43,14 @@ if (!defined('GNUSOCIAL')) { exit(1); }
class ProfileNoticeStream extends ScopingNoticeStream
{
var $streamProfile;
var $userProfile;
protected $target;
function __construct($profile, $userProfile = -1)
function __construct(Profile $target, Profile $scoped=null)
{
if (is_int($userProfile) && $userProfile == -1) {
$userProfile = Profile::current();
}
$this->streamProfile = $profile;
$this->userProfile = $userProfile;
parent::__construct(new CachingNoticeStream(new RawProfileNoticeStream($profile),
'profile:notice_ids:' . $profile->id),
$userProfile);
$this->target = $target;
parent::__construct(new CachingNoticeStream(new RawProfileNoticeStream($target),
'profile:notice_ids:' . $target->getID()),
$scoped);
}
function getNoticeIds($offset, $limit, $since_id=null, $max_id=null)
......@@ -70,7 +65,7 @@ class ProfileNoticeStream extends ScopingNoticeStream
function getNotices($offset, $limit, $since_id=null, $max_id=null)
{
if ($this->impossibleStream()) {
throw new PrivateStreamException($this->streamProfile, $this->userProfile);
throw new PrivateStreamException($this->target, $this->scoped);
} else {
return parent::getNotices($offset, $limit, $since_id, $max_id);
}
......@@ -78,7 +73,7 @@ class ProfileNoticeStream extends ScopingNoticeStream
function impossibleStream()
{
if (!$this->streamProfile->readableBy($this->userProfile)) {
if (!$this->target->readableBy($this->scoped)) {
// cannot read because it's a private stream and either noone's logged in or they are not subscribers
return true;
}
......@@ -86,8 +81,13 @@ class ProfileNoticeStream extends ScopingNoticeStream
// If it's a spammy stream, and no user or not a moderator
if (common_config('notice', 'hidespam')) {
if ($this->streamProfile->hasRole(Profile_role::SILENCED) &&
(empty($this->userProfile) || (($this->userProfile->id !== $this->streamProfile->id) && !$this->userProfile->hasRight(Right::REVIEWSPAM)))) {
// if this is a silenced user
if ($this->target->hasRole(Profile_role::SILENCED)
// and we are either not logged in
&& (!$this->scoped instanceof Profile
// or if we are, we are not logged in as the target, and we don't have right to review spam
|| (!$this->scoped->sameAs($this->target) && !$this->scoped->hasRight(Right::REVIEWSPAM))
)) {
return true;
}
}
......@@ -109,20 +109,20 @@ class ProfileNoticeStream extends ScopingNoticeStream
class RawProfileNoticeStream extends NoticeStream
{
protected $profile;
protected $target;
protected $selectVerbs = array(); // select all verbs
function __construct($profile)
function __construct(Profile $target)
{
parent::__construct();
$this->profile = $profile;
$this->target = $target;
}
function getNoticeIds($offset, $limit, $since_id, $max_id)
{
$notice = new Notice();
$notice->profile_id = $this->profile->id;
$notice->profile_id = $this->target->getID();
$notice->selectAdd();
$notice->selectAdd('id');
......
......@@ -43,11 +43,11 @@ if (!defined('GNUSOCIAL')) { exit(1); }
class PublicNoticeStream extends ScopingNoticeStream
{
function __construct($profile=null)
function __construct(Profile $scoped=null)
{
parent::__construct(new CachingNoticeStream(new RawPublicNoticeStream(),
'public'),
$profile);
$scoped);
}
}
......
......@@ -43,14 +43,11 @@ if (!defined('GNUSOCIAL')) { exit(1); }
class ReplyNoticeStream extends ScopingNoticeStream
{
function __construct($userId, $profile=-1)
function __construct($userId, Profile $scoped=null)
{
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
parent::__construct(new CachingNoticeStream(new RawReplyNoticeStream($userId),
'reply:stream:' . $userId),
$profile);
$scoped);
}
}
......
......@@ -28,11 +28,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Class comment
......@@ -49,16 +45,12 @@ class ScopingNoticeStream extends FilteringNoticeStream
{
protected $profile;
function __construct($upstream, $profile = -1)
function __construct(NoticeStream $upstream, Profile $scoped=null)
{
parent::__construct($upstream);
// Invalid but not null
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
$this->profile = $profile;
$this->profile = $scoped; // legacy
$this->scoped = $scoped;
}
/**
......@@ -71,7 +63,7 @@ class ScopingNoticeStream extends FilteringNoticeStream
function filter($notice)
{
return $notice->inScope($this->profile);
return $notice->inScope($this->scoped);
}
function prefill($notices)
......
......@@ -28,11 +28,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Stream of notice search results
......@@ -47,13 +43,9 @@ if (!defined('STATUSNET')) {
class SearchNoticeStream extends ScopingNoticeStream
{
function __construct($q, $profile = -1)
function __construct($q, Profile $scoped=null)
{
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
parent::__construct(new RawSearchNoticeStream($q), $profile);
parent::__construct(new RawSearchNoticeStream($q), $scoped);
}
}
......@@ -89,4 +81,4 @@ class RawSearchNoticeStream extends NoticeStream
return $ids;
}
}
\ No newline at end of file
}
......@@ -28,11 +28,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Stream of notices with a given profile and tag
......@@ -47,14 +43,11 @@ if (!defined('STATUSNET')) {
class TaggedProfileNoticeStream extends ScopingNoticeStream
{
function __construct($profile, $tag, $userProfile=-1)
function __construct($profile, $tag, Profile $scoped=null)
{
if (is_int($userProfile) && $userProfile == -1) {
$userProfile = Profile::current();
}
parent::__construct(new CachingNoticeStream(new RawTaggedProfileNoticeStream($profile, $tag),
'profile:notice_ids_tagged:'.$profile->id.':'.Cache::keyize($tag)),
$userProfile);
$scoped);
}
}
......
......@@ -43,13 +43,11 @@ if (!defined('GNUSOCIAL')) { exit(1); }
class TagNoticeStream extends ScopingNoticeStream
{
function __construct($tag, $profile = -1)
function __construct($tag, Profile $scoped=null)
{
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
parent::__construct(new CachingNoticeStream(new RawTagNoticeStream($tag),
'notice_tag:notice_ids:' . Cache::keyize($tag)));
'notice_tag:notice_ids:' . Cache::keyize($tag)),
$scoped);
}
}
......
......@@ -4,8 +4,8 @@ if (!defined('GNUSOCIAL')) { exit(1); }
class ThreadingGroupNoticeStream extends ThreadingNoticeStream
{
function __construct($group, $profile)
function __construct($group, Profile $scoped=null)
{
parent::__construct(new GroupNoticeStream($group, $profile));
parent::__construct(new GroupNoticeStream($group, $scoped));
}
}
......@@ -74,19 +74,17 @@ class SpamAction extends Action
// User must be logged in.
$user = common_current_user();
if (empty($user)) {
if (!$this->scoped instanceof Profile) {
throw new ClientException(_("You must be logged in to review."), 403);
}
// User must have the right to review spam
if (!$user->hasRight(ActivitySpamPlugin::REVIEWSPAM)) {
if (!$this->scoped->hasRight(ActivitySpamPlugin::REVIEWSPAM)) {
throw new ClientException(_('You cannot review spam on this site.'), 403);
}
$stream = new SpamNoticeStream($user->getProfile());
$stream = new SpamNoticeStream($this->scoped);
$this->notices = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE,
NOTICES_PER_PAGE + 1);
......
......@@ -28,11 +28,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Spam notice stream
......@@ -47,13 +43,10 @@ if (!defined('STATUSNET')) {
class SpamNoticeStream extends ScopingNoticeStream
{
function __construct($tag, $profile = -1)
function __construct(Profile $scoped=null)
{
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
parent::__construct(new CachingNoticeStream(new RawSpamNoticeStream(),
'spam_score:notice_ids'));
parent::__construct(new CachingNoticeStream(new RawSpamNoticeStream(), 'spam_score:notice_ids'),
$scoped);
}
}
......
<?php
if (!defined('GNUSOCIAL')) { exit(1); }
class RawBookmarksNoticeStream extends NoticeStream
{
protected $user_id;
......@@ -60,7 +62,7 @@ class RawBookmarksNoticeStream extends NoticeStream
class BookmarksNoticeStream extends ScopingNoticeStream
{
function __construct($user_id, $own, $profile = -1)
function __construct($user_id, $own, Profile $scoped=null)
{
$stream = new RawBookmarksNoticeStream($user_id, $own);
......@@ -70,11 +72,6 @@ class BookmarksNoticeStream extends ScopingNoticeStream
$key = 'bookmark:ids_by_user:'.$user_id;
}
if (is_int($profile) && $profile == -1) {
$profile = Profile::current();
}
parent::__construct(new CachingNoticeStream($stream, $key),
$profile);
parent::__construct(new CachingNoticeStream($stream, $key), $scoped);
}
}
......@@ -26,9 +26,7 @@
* @link http://status.net/
*/
if (!defined('STATUSNET')) {
exit(1);
}
if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Handler for queue items of type 'usersum', sends an email summaries
......@@ -95,15 +93,15 @@ class UserEmailSummaryHandler extends QueueHandler
return true;
}
$profile = $user->getProfile();
if (empty($profile)) {
try {
$profile = $user->getProfile();
} catch (UserNoProfileException $e) {
common_log(LOG_WARNING, sprintf('Not sending email summary for user %s; no profile.', $user_id));
return true;
}
// An InboxNoticeStream for a certain user, scoped to its own view
$stream = new InboxNoticeStream($profile);
$stream = new InboxNoticeStream($profile, $profile);
$notice = $stream->getNotices(0, self::MAX_NOTICES, $since_id);
......
<?php
if (!defined('GNUSOCIAL')) { exit(1); }