diff --git a/actions/showprofiletag.php b/actions/showprofiletag.php index 09085ebf1a..f99c9155e4 100644 --- a/actions/showprofiletag.php +++ b/actions/showprofiletag.php @@ -24,88 +24,29 @@ if (!defined('GNUSOCIAL')) { exit(1); } -class ShowprofiletagAction extends Action +class ShowprofiletagAction extends ShowstreamAction { - var $notice, $tagger, $peopletag, $userProfile; + var $notice, $peopletag; - function isReadOnly($args) + protected function doStreamPreparation() { - return true; - } - - function prepare($args) - { - parent::prepare($args); - - if (common_config('singleuser', 'enabled')) { - $tagger_arg = User::singleUserNickname(); - } else { - $tagger_arg = $this->arg('tagger'); - } - $tag_arg = $this->arg('tag'); - $tagger = common_canonical_nickname($tagger_arg); - $tag = common_canonical_tag($tag_arg); - - // Permanent redirect on non-canonical nickname - - if ($tagger_arg != $tagger || $tag_arg != $tag) { - $args = array('tagger' => $nickname, 'tag' => $tag); - if ($this->page != 1) { - $args['page'] = $this->page; - } - common_redirect(common_local_url('showprofiletag', $args), 301); - } - - if (!$tagger) { - // TRANS: Client error displayed when a tagger is expected but not provided. - $this->clientError(_('No tagger.'), 404); - } - - $user = User::getKV('nickname', $tagger); - - if (!$user) { - // TRANS: Client error displayed trying to perform an action related to a non-existing user. - $this->clientError(_('No such user.'), 404); - } - - $this->tagger = $user->getProfile(); - $this->peopletag = Profile_list::pkeyGet(array('tagger' => $user->id, 'tag' => $tag)); - - $current = common_current_user(); - $can_see = !empty($this->peopletag) && (!$this->peopletag->private || - ($this->peopletag->private && $this->peopletag->tagger === $current->id)); - - if (!$can_see) { + $tag = common_canonical_tag($this->arg('tag')); + try { + $this->peopletag = Profile_list::getByPK(array('tagger' => $this->target->getID(), 'tag' => $tag)); + } catch (NoResultException $e) { // TRANS: Client error displayed trying to reference a non-existing list. - $this->clientError(_('No such list.'), 404); + throw new ClientException('No such list.'); } - $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; - $this->userProfile = Profile::current(); - - $stream = new PeopletagNoticeStream($this->peopletag, $this->userProfile); - - $this->notice = $stream->getNotices(($this->page-1)*NOTICES_PER_PAGE, - NOTICES_PER_PAGE + 1); - - if ($this->page > 1 && $this->notice->N == 0) { - // TRANS: Client error when page not found (404). - $this->clientError(_('No such page.'), 404); + if ($this->peopletag->private && !$this->peopletag->getTagger()->sameAs($this->scoped)) { + // TRANS: Client error displayed trying to reference a non-existing list. + throw new AuthorizationException('You do not have permission to see this list.'); } - - return true; } - function handle($args) + public function getStream() { - parent::handle($args); - - if (!$this->peopletag) { - // TRANS: Client error displayed trying to perform an action related to a non-existing user. - $this->clientError(_('No such user.')); - } - - $this->showPage(); + return new PeopletagNoticeStream($this->peopletag, $this->scoped); } function title() @@ -130,7 +71,7 @@ class ShowprofiletagAction extends Action // TRANS: %1$s is a list, %2$s is the tagger's nickname, %3$d is a page number. return sprintf(_('Timeline for %1$s list by %2$s, page %3$d'), $this->peopletag->tag, - $this->tagger->nickname, + $this->target->getNickname(), $this->page ); } else { @@ -153,7 +94,7 @@ class ShowprofiletagAction extends Action // TRANS: %1$s is a list, %2$s is the tagger's nickname. return sprintf(_('Timeline for %1$s list by %2$s'), $this->peopletag->tag, - $this->tagger->nickname + $this->target->getNickname() ); } } @@ -164,29 +105,29 @@ class ShowprofiletagAction extends Action return array(new Feed(Feed::JSON, common_local_url( 'ApiTimelineList', array( - 'user' => $this->tagger->id, + 'user' => $this->target->id, 'id' => $this->peopletag->id, 'format' => 'as' ) ), // TRANS: Feed title. // TRANS: %s is tagger's nickname. - sprintf(_('Feed for friends of %s (Activity Streams JSON)'), $this->tagger->nickname)), + sprintf(_('Feed for friends of %s (Activity Streams JSON)'), $this->target->getNickname())), new Feed(Feed::RSS2, common_local_url( 'ApiTimelineList', array( - 'user' => $this->tagger->id, + 'user' => $this->target->id, 'id' => $this->peopletag->id, 'format' => 'rss' ) ), // TRANS: Feed title. // TRANS: %s is tagger's nickname. - sprintf(_('Feed for friends of %s (RSS 2.0)'), $this->tagger->nickname)), + sprintf(_('Feed for friends of %s (RSS 2.0)'), $this->target->getNickname())), new Feed(Feed::ATOM, common_local_url( 'ApiTimelineList', array( - 'user' => $this->tagger->id, + 'user' => $this->target->id, 'id' => $this->peopletag->id, 'format' => 'atom' ) @@ -194,7 +135,7 @@ class ShowprofiletagAction extends Action // TRANS: Feed title. // TRANS: %1$s is a list, %2$s is tagger's nickname. sprintf(_('Feed for %1$s list by %2$s (Atom)'), - $this->peopletag->tag, $this->tagger->nickname + $this->peopletag->tag, $this->target->getNickname() ) ) ); @@ -212,11 +153,10 @@ class ShowprofiletagAction extends Action // TRANS: %1$s is a list, %2$s is a tagger's nickname. $message = sprintf(_('This is the timeline for %1$s list by %2$s but no one has posted anything yet.'), $this->peopletag->tag, - $this->tagger->nickname) . ' '; + $this->target->getNickname()) . ' '; if (common_logged_in()) { - $current_user = common_current_user(); - if ($this->tagger->id == $current_user->id) { + if ($this->target->sameAs($this->scoped)) { // TRANS: Additional empty list message for list timeline for currently logged in user tagged tags. $message .= _('Try tagging more people.'); } @@ -231,16 +171,15 @@ class ShowprofiletagAction extends Action $this->elementEnd('div'); } - function showContent() + protected function showContent() { $this->showPeopletag(); - $this->showNotices(); + parent::showContent(); } function showPeopletag() { - $cur = common_current_user(); - $tag = new Peopletag($this->peopletag, $cur, $this); + $tag = new Peopletag($this->peopletag, $this->scoped, $this); $tag->show(); } @@ -260,7 +199,7 @@ class ShowprofiletagAction extends Action $this->page, 'showprofiletag', array('tag' => $this->peopletag->tag, - 'tagger' => $this->tagger->nickname) + 'nickname' => $this->target->getNickname()) ); Event::handle('EndShowProfileTagContent', array($this)); @@ -276,11 +215,6 @@ class ShowprofiletagAction extends Action # $this->showStatistics(); } - function showPageTitle() - { - $this->element('h1', null, $this->title()); - } - function showTagged() { $profile = $this->peopletag->getTagged(0, PROFILES_PER_MINILIST + 1); @@ -307,7 +241,7 @@ class ShowprofiletagAction extends Action if ($cnt > PROFILES_PER_MINILIST) { $this->elementStart('p'); $this->element('a', array('href' => common_local_url('taggedprofiles', - array('nickname' => $this->tagger->nickname, + array('nickname' => $this->target->getNickname(), 'profiletag' => $this->peopletag->tag)), 'class' => 'more'), // TRANS: Link for more "People in list x by a user" diff --git a/actions/showstream.php b/actions/showstream.php index 890c1e711b..650efc7948 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -85,7 +85,7 @@ class ShowstreamAction extends NoticestreamAction } } - function showContent() + protected function showContent() { $this->showNotices(); } diff --git a/classes/Profile.php b/classes/Profile.php index 09f9ca71d1..25a41bee72 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -1593,8 +1593,20 @@ class Profile extends Managed_DataObject return $this; } - public function sameAs(Profile $other) + /** + * Test whether the given profile is the same as the current class, + * for testing identities. + * + * @param Profile $other The other profile, usually from Action's $this->scoped + * + * @return boolean + */ + public function sameAs(Profile $other=null) { + if (is_null($other)) { + // In case $this->scoped is null or something, i.e. not a current/legitimate profile. + return false; + } return $this->getID() === $other->getID(); } diff --git a/classes/Profile_list.php b/classes/Profile_list.php index 2b3d2aa5ad..000e10b41f 100644 --- a/classes/Profile_list.php +++ b/classes/Profile_list.php @@ -21,20 +21,10 @@ * @license GNU Affero General Public License http://www.gnu.org/licenses/ */ -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -/** - * Table Definition for profile_list - */ -require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; +if (!defined('GNUSOCIAL')) { exit(1); } class Profile_list extends Managed_DataObject { - ###START_AUTOCODE - /* the code below is auto generated do not remove the above tag */ - public $__table = 'profile_list'; // table name public $id; // int(4) primary_key not_null public $tagger; // int(4) @@ -48,9 +38,6 @@ class Profile_list extends Managed_DataObject public $tagged_count; // smallint public $subscriber_count; // smallint - /* the code above is auto generated do not remove the tag below */ - ###END_AUTOCODE - public static function schemaDef() { return array( @@ -94,7 +81,7 @@ class Profile_list extends Managed_DataObject function getTagger() { - return Profile::getKV('id', $this->tagger); + return Profile::getByID($this->tagger); } /** @@ -145,7 +132,7 @@ class Profile_list extends Managed_DataObject $url = $this->mainpage; } else { $url = common_local_url('showprofiletag', - array('tagger' => $this->getTagger()->nickname, + array('nickname' => $this->getTagger()->nickname, 'tag' => $this->tag)); } } @@ -659,7 +646,7 @@ class Profile_list extends Managed_DataObject $orig = clone($ptag); $user = User::getKV('id', $ptag->tagger); if(!empty($user)) { - $ptag->mainpage = common_local_url('showprofiletag', array('tag' => $ptag->tag, 'tagger' => $user->nickname)); + $ptag->mainpage = common_local_url('showprofiletag', array('tag' => $ptag->tag, 'nickname' => $user->getNickname())); } else { $ptag->mainpage = $uri; // assume this is a remote peopletag and the uri works } diff --git a/lib/listsnav.php b/lib/listsnav.php index a2fa0b8cd1..d550233ef5 100644 --- a/lib/listsnav.php +++ b/lib/listsnav.php @@ -66,7 +66,7 @@ class ListsNav extends MoreMenu while ($this->lists->fetch()) { $mode = $this->lists->private ? 'private' : 'public'; $items[] = array('showprofiletag', - array('tagger' => $this->profile->nickname, + array('nickname' => $this->profile->getNickname(), 'tag' => $this->lists->tag), $this->lists->tag, ''); diff --git a/lib/noticestreamaction.php b/lib/noticestreamaction.php index ed8921860e..bf09b63780 100644 --- a/lib/noticestreamaction.php +++ b/lib/noticestreamaction.php @@ -9,6 +9,9 @@ abstract class NoticestreamAction extends ProfileAction protected function prepare(array $args=array()) { parent::prepare($args); + // In case we need more info than ProfileAction->doPreparation() gives us + $this->doStreamPreparation(); + // fetch the actual stream stuff $stream = $this->getStream(); $this->notice = $stream->getNotices(($this->page-1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); @@ -21,6 +24,11 @@ abstract class NoticestreamAction extends ProfileAction return true; } + protected function doStreamPreparation() + { + // pass by default + } + // this fetches the NoticeStream abstract public function getStream(); } diff --git a/lib/peopletaggroupnav.php b/lib/peopletaggroupnav.php index 212a90586b..fb579affe0 100644 --- a/lib/peopletaggroupnav.php +++ b/lib/peopletaggroupnav.php @@ -76,7 +76,7 @@ class PeopletagGroupNav extends Widget { $user = null; - // FIXME: we should probably pass this in + // FIXME: we should probably pass this in and check when PeopletagGroupNav is actually loaded etc. $action = $this->action->trimmed('action'); @@ -107,7 +107,7 @@ class PeopletagGroupNav extends Widget if (Event::handle('StartPeopletagGroupNav', array($this))) { // People tag timeline - $this->out->menuItem(common_local_url('showprofiletag', array('tagger' => $user_profile->nickname, + $this->out->menuItem(common_local_url('showprofiletag', array('nickname' => $user_profile->nickname, 'tag' => $tag->tag)), // TRANS: Menu item in list navigation panel. _m('MENU','List'), diff --git a/lib/profileaction.php b/lib/profileaction.php index 3dc28a7cc4..bdcd575b6b 100644 --- a/lib/profileaction.php +++ b/lib/profileaction.php @@ -315,7 +315,7 @@ abstract class ProfileAction extends ManagedAction $url = $lists->mainpage; } else { $url = common_local_url('showprofiletag', - array('tagger' => $this->target->getNickname(), + array('nickname' => $this->target->getNickname(), 'tag' => $lists->tag)); } if (!$first) { diff --git a/lib/router.php b/lib/router.php index b13c51c328..28ee42662d 100644 --- a/lib/router.php +++ b/lib/router.php @@ -921,6 +921,7 @@ class Router $m->connect('all/:tag', array('action' => 'showprofiletag', + 'nickname' => $nickname, 'tag' => self::REGEX_TAG)); foreach (array('subscriptions', 'subscribers') as $a) { @@ -1003,9 +1004,9 @@ class Router 'tagger_id' => '[0-9]+', 'id' => '[0-9]+')); - $m->connect(':tagger/all/:tag', - array('action' => 'showprofiletag', - 'tagger' => Nickname::DISPLAY_FMT, + $m->connect(':nickname/all/:tag', + array('action' => 'showprofiletag'), + array('nickname' => Nickname::DISPLAY_FMT, 'tag' => self::REGEX_TAG)); foreach (array('subscriptions', 'subscribers') as $a) { diff --git a/lib/util.php b/lib/util.php index 66847a4350..9c37a5e669 100644 --- a/lib/util.php +++ b/lib/util.php @@ -786,7 +786,7 @@ function common_find_mentions($text, Notice $notice) $tagged = $sender->getTaggedSubscribers($tag); $url = common_local_url('showprofiletag', - array('tagger' => $sender->nickname, + array('nickname' => $sender->getNickname(), 'tag' => $tag)); $mentions[] = array('mentioned' => $tagged,