From e567406c9f9216ee9b1db7b5b190d32205f87664 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Fri, 10 Jul 2015 12:08:33 +0200 Subject: [PATCH 1/6] RedirecturlAction now extends ManagedAction --- actions/redirecturl.php | 66 +++++------------------------------------ 1 file changed, 7 insertions(+), 59 deletions(-) diff --git a/actions/redirecturl.php b/actions/redirecturl.php index 4befa4ab84..db3784bf31 100644 --- a/actions/redirecturl.php +++ b/actions/redirecturl.php @@ -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); } /** * Redirect to a given URL @@ -47,75 +43,27 @@ if (!defined('STATUSNET')) { * @link http://status.net/ */ -class RedirecturlAction extends Action +class RedirecturlAction extends ManagedAction { - protected $id = null; protected $file = null; - /** - * For initializing members of the class. - * - * @param array $argarray misc. arguments - * - * @return boolean true - */ - function prepare($argarray) + protected function doPreparation() { - parent::prepare($argarray); - - $this->id = $this->trimmed('id'); - - if (empty($this->id)) { - // TRANS: Client exception thrown when no ID parameter was provided. - throw new ClientException(_('No id parameter.')); - } - - $this->file = File::getKV('id', $this->id); - - if (empty($this->file)) { - // TRANS: Client exception thrown when an invalid ID parameter was provided for a file. - // TRANS: %d is the provided ID for which the file is not present (number). - throw new ClientException(sprintf(_('No such file "%d".'), - $this->id), - 404); - } + $this->file = File::getByID($this->int('id')); return true; } - /** - * Handler method - * - * @param array $argarray is ignored since it's now passed in in prepare() - * - * @return void - */ - function handle($argarray=null) + public function showPage() { common_redirect($this->file->url, 307); } - /** - * Return true if read only. - * - * MAY override - * - * @param array $args other arguments - * - * @return boolean is read only action? - */ function isReadOnly($args) { return true; } - /** - * Return last modified, if applicable. - * - * MAY override - * - * @return string last modified http header - */ function lastModified() { // For comparison with If-Last-Modified @@ -133,9 +81,9 @@ class RedirecturlAction extends Action */ function etag() { - return 'W/"' . implode(':', array($this->arg('action'), + return 'W/"' . implode(':', array($this->getActionName(), common_user_cache_hash(), common_language(), - $this->file->id)) . '"'; + $this->file->getID())) . '"'; } } From f9d82a6ac588bfc5458d063d172513263eac0073 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Fri, 10 Jul 2015 12:19:08 +0200 Subject: [PATCH 2/6] Easy comparison of two Profile objects --- classes/Profile.php | 5 +++++ classes/User.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/classes/Profile.php b/classes/Profile.php index f78cd34e36..f628965a74 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -1571,6 +1571,11 @@ class Profile extends Managed_DataObject return $this; } + public function sameAs(Profile $other) + { + return $this->getID() === $other->getID(); + } + /** * This will perform shortenLinks with the connected User object. * diff --git a/classes/User.php b/classes/User.php index 9ae0cba804..72510f162c 100644 --- a/classes/User.php +++ b/classes/User.php @@ -132,6 +132,11 @@ class User extends Managed_DataObject return $this->_profile[$this->id]; } + public function sameAs(Profile $other) + { + return $this->getProfile()->sameAs($other); + } + public function getUri() { return $this->uri; From 6a36121a56fa5ff5e09c0e1454ba4e853fae54b6 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Fri, 10 Jul 2015 12:23:55 +0200 Subject: [PATCH 3/6] Spiff up the PersonalTagCloudSection class missing a fix in actions/showstream.php for the switched position of arguments in the constructor --- lib/personaltagcloudsection.php | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/personaltagcloudsection.php b/lib/personaltagcloudsection.php index c861c4f57f..46b4661e89 100644 --- a/lib/personaltagcloudsection.php +++ b/lib/personaltagcloudsection.php @@ -27,9 +27,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * Personal tag cloud section @@ -42,12 +40,12 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { */ class PersonalTagCloudSection extends TagCloudSection { - var $user = null; + protected $profile = null; - function __construct($out=null, $user=null) + function __construct(Profile $profile, HTMLOutputter $out=null) { parent::__construct($out); - $this->user = $user; + $this->profile = $profile; } function title() @@ -80,7 +78,7 @@ class PersonalTagCloudSection extends TagCloudSection $tag = Memcached_DataObject::cachedQuery('Notice_tag', sprintf($qry, - $this->user->id), + $this->profile->getID()), 3600); return $tag; } From 50c297bcbefc232fe8886f0fe9f4e4952390b3d9 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Fri, 10 Jul 2015 12:34:06 +0200 Subject: [PATCH 4/6] ShowstreamAction fixes so it's not as horrible --- actions/all.php | 41 +++++++------------ actions/replies.php | 5 +-- actions/showstream.php | 21 +++++----- lib/noticestreamaction.php | 1 + lib/profileaction.php | 3 -- .../ExtendedProfile/actions/profiledetail.php | 11 ++--- 6 files changed, 32 insertions(+), 50 deletions(-) diff --git a/actions/all.php b/actions/all.php index 39041064f9..19413076b5 100644 --- a/actions/all.php +++ b/actions/all.php @@ -39,8 +39,6 @@ if (!defined('GNUSOCIAL')) { exit(1); } class AllAction extends ShowstreamAction { - var $notice; - public function getStream() { if ($this->scoped instanceof Profile && $this->scoped->isLocal() && $this->scoped->getUser()->streamModeOnly()) { @@ -54,7 +52,7 @@ class AllAction extends ShowstreamAction function title() { - if (!empty($this->scoped) && $this->scoped->id == $this->target->id) { + if (!empty($this->scoped) && $this->scoped->sameAs($this->target)) { // TRANS: Title of a user's own start page. return _('Home timeline'); } else { @@ -71,44 +69,44 @@ class AllAction extends ShowstreamAction common_local_url( 'ApiTimelineFriends', array( 'format' => 'as', - 'id' => $this->target->nickname + 'id' => $this->target->getNickname() ) ), // TRANS: %s is user nickname. - sprintf(_('Feed for friends of %s (Activity Streams JSON)'), $this->target->nickname)), + sprintf(_('Feed for friends of %s (Activity Streams JSON)'), $this->target->getNickname())), new Feed(Feed::RSS1, common_local_url( 'allrss', array( 'nickname' => - $this->target->nickname) + $this->target->getNickname()) ), // TRANS: %s is user nickname. - sprintf(_('Feed for friends of %s (RSS 1.0)'), $this->target->nickname)), + sprintf(_('Feed for friends of %s (RSS 1.0)'), $this->target->getNickname())), new Feed(Feed::RSS2, common_local_url( 'ApiTimelineFriends', array( 'format' => 'rss', - 'id' => $this->target->nickname + 'id' => $this->target->getNickname() ) ), // TRANS: %s is user nickname. - sprintf(_('Feed for friends of %s (RSS 2.0)'), $this->target->nickname)), + sprintf(_('Feed for friends of %s (RSS 2.0)'), $this->target->getNickname())), new Feed(Feed::ATOM, common_local_url( 'ApiTimelineFriends', array( 'format' => 'atom', - 'id' => $this->target->nickname + 'id' => $this->target->getNickname() ) ), // TRANS: %s is user nickname. - sprintf(_('Feed for friends of %s (Atom)'), $this->target->nickname)) + sprintf(_('Feed for friends of %s (Atom)'), $this->target->getNickname())) ); } function showEmptyListMessage() { // TRANS: Empty list message. %s is a user nickname. - $message = sprintf(_('This is the timeline for %s and friends but no one has posted anything yet.'), $this->target->nickname) . ' '; + $message = sprintf(_('This is the timeline for %s and friends but no one has posted anything yet.'), $this->target->getNickname()) . ' '; if (common_logged_in()) { if ($this->target->id === $this->scoped->id) { @@ -118,12 +116,12 @@ class AllAction extends ShowstreamAction } else { // TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@". // TRANS: This message contains Markdown links. Keep "](" together. - $message .= sprintf(_('You can try to [nudge %1$s](../%2$s) from their profile or [post something to them](%%%%action.newnotice%%%%?status_textarea=%3$s).'), $this->target->nickname, $this->target->nickname, '@' . $this->target->nickname); + $message .= sprintf(_('You can try to [nudge %1$s](../%2$s) from their profile or [post something to them](%%%%action.newnotice%%%%?status_textarea=%3$s).'), $this->target->getNickname(), $this->target->getNickname(), '@' . $this->target->getNickname()); } } else { // TRANS: Encouragement displayed on empty timeline user pages for anonymous users. // TRANS: %s is a user nickname. This message contains Markdown links. Keep "](" together. - $message .= sprintf(_('Why not [register an account](%%%%action.register%%%%) and then nudge %s or post a notice to them.'), $this->target->nickname); + $message .= sprintf(_('Why not [register an account](%%%%action.register%%%%) and then nudge %s or post a notice to them.'), $this->target->getNickname()); } $this->elementStart('div', 'guide'); @@ -134,19 +132,10 @@ class AllAction extends ShowstreamAction function showContent() { if (Event::handle('StartShowAllContent', array($this))) { - - $profile = null; - - $current_user = common_current_user(); - - if (!empty($current_user)) { - $profile = $current_user->getProfile(); - } - - if (!empty($current_user) && $current_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, $profile); + $nl = new ThreadedNoticeList($this->notice, $this, $this->scoped); } $cnt = $nl->show(); @@ -157,7 +146,7 @@ class AllAction extends ShowstreamAction $this->pagination( $this->page > 1, $cnt > NOTICES_PER_PAGE, - $this->page, 'all', array('nickname' => $this->target->nickname) + $this->page, 'all', array('nickname' => $this->target->getNickname()) ); Event::handle('EndShowAllContent', array($this)); diff --git a/actions/replies.php b/actions/replies.php index 8baf9d69e0..ae6ec90658 100644 --- a/actions/replies.php +++ b/actions/replies.php @@ -40,9 +40,6 @@ if (!defined('GNUSOCIAL')) { exit(1); } */ class RepliesAction extends ShowstreamAction { - var $page = null; - var $notice; - public function getStream() { return new ReplyNoticeStream($this->target->getID(), $this->scoped); @@ -85,7 +82,7 @@ class RepliesAction extends ShowstreamAction // TRANS: Link for feed with replies for a user. // TRANS: %s is a user nickname. sprintf(_('Replies feed for %s (Activity Streams JSON)'), - $this->user->nickname)), + $this->target->getNickname())), new Feed(Feed::RSS1, common_local_url('repliesrss', array('nickname' => $this->target->getNickname())), diff --git a/actions/showstream.php b/actions/showstream.php index 6eccbd06bf..51384eb487 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -47,16 +47,15 @@ if (!defined('GNUSOCIAL')) { exit(1); } */ class ShowstreamAction extends NoticestreamAction { - var $notice; + protected $target = null; protected function doPreparation() { // showstream requires a nickname - $nickname_arg = $this->arg('nickname'); + $nickname_arg = $this->trimmed('nickname'); $nickname = common_canonical_nickname($nickname_arg); // Permanent redirect on non-canonical nickname - if ($nickname_arg != $nickname) { $args = array('nickname' => $nickname); if ($this->arg('page') && $this->arg('page') != 1) { @@ -64,18 +63,20 @@ class ShowstreamAction extends NoticestreamAction } common_redirect(common_local_url($this->getActionName(), $args), 301); } - $this->user = User::getKV('nickname', $nickname); - if (!$this->user) { + try { + $user = User::getByNickname($nickname); + } catch (NoSuchUserException $e) { $group = Local_group::getKV('nickname', $nickname); if ($group instanceof Local_group) { common_redirect($group->getProfile()->getUrl()); } - // TRANS: Client error displayed when calling a profile action without specifying a user. - $this->clientError(_('No such user.'), 404); + + // No user nor group found, throw the NoSuchUserException again + throw $e; } - $this->target = $this->user->getProfile(); + $this->target = $user->getProfile(); } public function getStream() @@ -289,7 +290,7 @@ class ShowstreamAction extends NoticestreamAction { parent::showSections(); if (!common_config('performance', 'high')) { - $cloud = new PersonalTagCloudSection($this, $this->user); + $cloud = new PersonalTagCloudSection($this->target, $this); $cloud->show(); } } @@ -298,7 +299,7 @@ class ShowstreamAction extends NoticestreamAction { $options = parent::noticeFormOptions(); - if (!$this->scoped instanceof Profile || $this->scoped->id != $this->target->id) { + if (!$this->scoped instanceof Profile || !$this->scoped->sameAs($this->target)) { $options['to_profile'] = $this->target; } diff --git a/lib/noticestreamaction.php b/lib/noticestreamaction.php index 39c19d551f..ed8921860e 100644 --- a/lib/noticestreamaction.php +++ b/lib/noticestreamaction.php @@ -4,6 +4,7 @@ if (!defined('GNUSOCIAL')) { exit(1); } abstract class NoticestreamAction extends ProfileAction { + protected $notice = null; // holds the stream result protected function prepare(array $args=array()) { parent::prepare($args); diff --git a/lib/profileaction.php b/lib/profileaction.php index d98bcd7f74..d08446afae 100644 --- a/lib/profileaction.php +++ b/lib/profileaction.php @@ -58,9 +58,6 @@ abstract class ProfileAction extends ManagedAction throw new ClientException(_('This profile has been silenced by site moderators'), 403); } - // backwards compatibility until all actions are fixed to use $this->target - $this->profile = $this->target; - $this->tag = $this->trimmed('tag'); $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; common_set_returnto($this->selfUrl()); diff --git a/plugins/ExtendedProfile/actions/profiledetail.php b/plugins/ExtendedProfile/actions/profiledetail.php index a777a28e03..ea0b8ad630 100644 --- a/plugins/ExtendedProfile/actions/profiledetail.php +++ b/plugins/ExtendedProfile/actions/profiledetail.php @@ -17,13 +17,10 @@ * along with this program. If not, see . */ -if (!defined('STATUSNET')) { - exit(1); -} +if (!defined('GNUSOCIAL')) { exit(1); } class ProfileDetailAction extends ShowstreamAction { - function isReadOnly($args) { return true; @@ -31,7 +28,7 @@ class ProfileDetailAction extends ShowstreamAction function title() { - return $this->profile->getFancyName(); + return $this->target->getFancyName(); } function showStylesheets() { @@ -43,7 +40,7 @@ class ProfileDetailAction extends ShowstreamAction function showContent() { $cur = common_current_user(); - if ($cur && $cur->id == $this->profile->id) { // your own page + if ($this->scoped instanceof Profile && $this->scoped->sameAs($this->target)) { $this->elementStart('div', 'entity_actions'); $this->elementStart('ul'); $this->elementStart('li', 'entity_edit'); @@ -57,7 +54,7 @@ class ProfileDetailAction extends ShowstreamAction $this->elementEnd('div'); } - $widget = new ExtendedProfileWidget($this, $this->profile); + $widget = new ExtendedProfileWidget($this, $this->target); $widget->show(); } } From f8877e015b1c0a81b34de77642947a57e7507f73 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Fri, 10 Jul 2015 12:59:19 +0200 Subject: [PATCH 5/6] static definition of User::getByNickname --- classes/User.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/User.php b/classes/User.php index 72510f162c..ec6ceccf12 100644 --- a/classes/User.php +++ b/classes/User.php @@ -147,7 +147,7 @@ class User extends Managed_DataObject return $this->getProfile()->getNickname(); } - public function getByNickname($nickname) + static function getByNickname($nickname) { $user = User::getKV('nickname', $nickname); if (!$user instanceof User) { From 9a92b58057fb3a6ae5a6da6d37d2cd3ff4d84bd7 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Fri, 10 Jul 2015 13:44:47 +0200 Subject: [PATCH 6/6] ShowstreamAction tidying up Lots of these changes mean that we're requiring certain values to either by typed properly or return the expected value. If it doesn't there should be a fatal exception thrown which we can followup in the logs and won't go silently suppressed. --- lib/implugin.php | 14 ++--- lib/profileaction.php | 3 + lib/profilelistitem.php | 11 +++- plugins/GeoURL/GeoURLPlugin.php | 18 +++--- plugins/ModLog/ModLogPlugin.php | 27 ++++----- plugins/OStatus/OStatusPlugin.php | 79 +++++++++++++++------------ plugins/OpenID/OpenIDPlugin.php | 4 +- plugins/WebFinger/WebFingerPlugin.php | 2 +- 8 files changed, 88 insertions(+), 70 deletions(-) diff --git a/lib/implugin.php b/lib/implugin.php index 2da4fa961a..87ca037160 100644 --- a/lib/implugin.php +++ b/lib/implugin.php @@ -563,14 +563,12 @@ abstract class ImPlugin extends Plugin return true; } - function onEndShowHeadElements($action) + function onEndShowHeadElements(Action $action) { - $aname = $action->trimmed('action'); - - if ($aname == 'shownotice') { + if ($action instanceof ShownoticeAction) { $user_im_prefs = new User_im_prefs(); - $user_im_prefs->user_id = $action->profile->id; + $user_im_prefs->user_id = $action->notice->getProfile()->getID(); $user_im_prefs->transport = $this->transport; if ($user_im_prefs->find() && $user_im_prefs->fetch() && $user_im_prefs->microid && $action->notice->uri) { @@ -580,13 +578,13 @@ abstract class ImPlugin extends Plugin 'content' => $id->toString())); } - } else if ($aname == 'showstream') { + } elseif ($action instanceof ShowstreamAction) { $user_im_prefs = new User_im_prefs(); - $user_im_prefs->user_id = $action->user->id; + $user_im_prefs->user_id = $action->getTarget()->getID(); $user_im_prefs->transport = $this->transport; - if ($user_im_prefs->find() && $user_im_prefs->fetch() && $user_im_prefs->microid && $action->profile->profileurl) { + if ($user_im_prefs->find() && $user_im_prefs->fetch() && $user_im_prefs->microid && $action->getTarget()->getUrl()) { $id = new Microid($this->microiduri($user_im_prefs->screenname), $action->selfUrl()); $action->element('meta', array('name' => 'microid', diff --git a/lib/profileaction.php b/lib/profileaction.php index d08446afae..5a5d526e42 100644 --- a/lib/profileaction.php +++ b/lib/profileaction.php @@ -72,6 +72,9 @@ abstract class ProfileAction extends ManagedAction public function getTarget() { + if (!$this->target instanceof Profile) { + throw new ServerException('No target profile in ProfileAction class'); + } return $this->target; } diff --git a/lib/profilelistitem.php b/lib/profilelistitem.php index e0b94ac76a..e21ff04ebe 100644 --- a/lib/profilelistitem.php +++ b/lib/profilelistitem.php @@ -32,18 +32,25 @@ if (!defined('GNUSOCIAL')) { exit(1); } class ProfileListItem extends Widget { /** Current profile. */ + protected $target = null; var $profile = null; /** Action object using us. */ var $action = null; - function __construct($profile, $action) + function __construct(Profile $target, HTMLOutputter $action) { parent::__construct($action); - $this->profile = $profile; + $this->target = $target; + $this->profile = $this->target; $this->action = $action; } + function getTarget() + { + return $this->target; + } + function show() { if (Event::handle('StartProfileListItem', array($this))) { diff --git a/plugins/GeoURL/GeoURLPlugin.php b/plugins/GeoURL/GeoURLPlugin.php index caad8fde11..a8e2546c4f 100644 --- a/plugins/GeoURL/GeoURLPlugin.php +++ b/plugins/GeoURL/GeoURLPlugin.php @@ -57,25 +57,27 @@ class GeoURLPlugin extends Plugin * * @return boolean event handler flag */ - function onEndShowHeadElements($action) + function onEndShowHeadElements(Action $action) { $name = $action->trimmed('action'); $location = null; - if ($name == 'showstream') { - $profile = $action->profile; - if (!empty($profile) && !empty($profile->lat) && !empty($profile->lon)) { + if ($action instanceof ShowstreamAction) { + $profile = $action->getTarget(); + if (!empty($profile->lat) && !empty($profile->lon)) { $location = $profile->lat . ', ' . $profile->lon; } - } else if ($name == 'shownotice') { - $notice = $action->profile; - if (!empty($notice) && !empty($notice->lat) && !empty($notice->lon)) { + } elseif ($action instanceof ShownoticeAction) { + // FIXME: getNotice in ShownoticeAction will do a new lookup, we should fix those classes + // so they can reliably just get a pre-stored notice object which was fetched in Shownotice prepare()... + $notice = $action->notice; + if ($notice instanceof Notice && !empty($notice->lat) && !empty($notice->lon)) { $location = $notice->lat . ', ' . $notice->lon; } } - if (!empty($location)) { + if (!is_null($location)) { $action->element('meta', array('name' => 'ICBM', 'content' => $location)); $action->element('meta', array('name' => 'DC.title', diff --git a/plugins/ModLog/ModLogPlugin.php b/plugins/ModLog/ModLogPlugin.php index 32c96be0e8..d1e01ca849 100644 --- a/plugins/ModLog/ModLogPlugin.php +++ b/plugins/ModLog/ModLogPlugin.php @@ -101,10 +101,10 @@ class ModLogPlugin extends Plugin $modlog->profile_id = $profile->id; - $cur = common_current_user(); + $scoped = Profile::current(); - if (!empty($cur)) { - $modlog->moderator_id = $cur->id; + if ($scoped instanceof Profile) { + $modlog->moderator_id = $scoped->getID(); } $modlog->role = $role; @@ -118,21 +118,22 @@ class ModLogPlugin extends Plugin function onEndShowSections(Action $action) { - if ($action->arg('action') != 'showstream') { + if (!$action instanceof ShowstreamAction) { + // early return for actions we're not interested in return true; } - $cur = common_current_user(); - - if (empty($cur) || !$cur->hasRight(self::VIEWMODLOG)) { + $scoped = $action->getScoped(); + if (!$scoped instanceof Profile || !$scoped->hasRight(self::VIEWMODLOG)) { + // only continue if we are allowed to VIEWMODLOG return true; } - $profile = $action->profile; + $profile = $action->getTarget(); $ml = new ModLog(); - $ml->profile_id = $profile->id; + $ml->profile_id = $profile->getID(); $ml->orderBy("created"); $cnt = $ml->find(); @@ -152,13 +153,13 @@ class ModLogPlugin extends Plugin $action->element('td', null, sprintf(($ml->is_grant) ? _('+%s') : _('-%s'), $ml->role)); $action->elementStart('td'); if ($ml->moderator_id) { - $mod = Profile::getKV('id', $ml->moderator_id); + $mod = Profile::getByID($ml->moderator_id); if (empty($mod)) { $action->text(_('[unknown]')); } else { - $action->element('a', array('href' => $mod->profileurl, - 'title' => $mod->fullname), - $mod->nickname); + $action->element('a', array('href' => $mod->getUrl(), + 'title' => $mod->getFullname()), + $mod->getNickname()); } } else { $action->text(_('[unknown]')); diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 630031fdde..2fd60ad654 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -1063,12 +1063,16 @@ class OStatusPlugin extends Plugin function showEntityRemoteSubscribe($action, $target='ostatussub') { - $user = common_current_user(); - if ($user && ($user->id == $action->profile->id)) { + if (!$action->getScoped() instanceof Profile) { + // early return if we're not logged in + return true; + } + + if ($action->getScoped()->sameAs($action->getTarget())) { $action->elementStart('div', 'entity_actions'); $action->elementStart('p', array('id' => 'entity_remote_subscribe', 'class' => 'entity_subscribe')); - $action->element('a', array('href' => common_local_url($target), + $action->element('a', array('href' => common_local_url($action->getTarget()), 'class' => 'entity_remote_subscribe'), // TRANS: Link text for link to remote subscribe. _m('Remote')); @@ -1127,42 +1131,45 @@ class OStatusPlugin extends Plugin return true; } - function onStartProfileListItemActionElements($item, $profile=null) + // FIXME: This one can accept both an Action and a Widget. Confusing! Refactor to (HTMLOutputter $out, Profile $target)! + function onStartProfileListItemActionElements($item) { - if (!common_logged_in()) { - - $profileUser = User::getKV('id', $item->profile->id); - - if (!empty($profileUser)) { - - if ($item instanceof Action) { - $output = $item; - $profile = $item->profile; - } else { - $output = $item->out; - } - - // Add an OStatus subscribe - $output->elementStart('li', 'entity_subscribe'); - $url = common_local_url('ostatusinit', - array('nickname' => $profileUser->nickname)); - $output->element('a', array('href' => $url, - 'class' => 'entity_remote_subscribe'), - // TRANS: Link text for a user to subscribe to an OStatus user. - _m('Subscribe')); - $output->elementEnd('li'); - - $output->elementStart('li', 'entity_tag'); - $url = common_local_url('ostatustag', - array('nickname' => $profileUser->nickname)); - $output->element('a', array('href' => $url, - 'class' => 'entity_remote_tag'), - // TRANS: Link text for a user to list an OStatus user. - _m('List')); - $output->elementEnd('li'); - } + if (common_logged_in()) { + // only non-logged in users get to see the "remote subscribe" form + return true; + } elseif (!$item->getTarget()->isLocal()) { + // we can (for now) only provide remote subscribe forms for local users + return true; } + if ($item instanceof ProfileAction) { + $output = $item; + } elseif ($item instanceof Widget) { + $output = $item->out; + } else { + // Bad $item class, don't know how to use this for outputting! + throw new ServerException('Bad item type for onStartProfileListItemActionElements'); + } + + // Add an OStatus subscribe + $output->elementStart('li', 'entity_subscribe'); + $url = common_local_url('ostatusinit', + array('nickname' => $item->getTarget()->getNickname())); + $output->element('a', array('href' => $url, + 'class' => 'entity_remote_subscribe'), + // TRANS: Link text for a user to subscribe to an OStatus user. + _m('Subscribe')); + $output->elementEnd('li'); + + $output->elementStart('li', 'entity_tag'); + $url = common_local_url('ostatustag', + array('nickname' => $item->getTarget()->getNickname())); + $output->element('a', array('href' => $url, + 'class' => 'entity_remote_tag'), + // TRANS: Link text for a user to list an OStatus user. + _m('List')); + $output->elementEnd('li'); + return true; } diff --git a/plugins/OpenID/OpenIDPlugin.php b/plugins/OpenID/OpenIDPlugin.php index 710a34410a..2e9ada9806 100644 --- a/plugins/OpenID/OpenIDPlugin.php +++ b/plugins/OpenID/OpenIDPlugin.php @@ -390,11 +390,11 @@ class OpenIDPlugin extends Plugin $action->element('link', array('rel' => 'openid2.provider', 'href' => common_local_url('openidserver'))); $action->element('link', array('rel' => 'openid2.local_id', - 'href' => $action->profile->profileurl)); + 'href' => $action->getTarget()->getUrl())); $action->element('link', array('rel' => 'openid.server', 'href' => common_local_url('openidserver'))); $action->element('link', array('rel' => 'openid.delegate', - 'href' => $action->profile->profileurl)); + 'href' => $action->getTarget()->getUrl())); } if ($action instanceof SitestreamAction) { diff --git a/plugins/WebFinger/WebFingerPlugin.php b/plugins/WebFinger/WebFingerPlugin.php index 91dc9b53f7..c2a9c69d0c 100644 --- a/plugins/WebFinger/WebFingerPlugin.php +++ b/plugins/WebFinger/WebFingerPlugin.php @@ -144,7 +144,7 @@ class WebFingerPlugin extends Plugin public function onStartShowHTML($action) { if ($action instanceof ShowstreamAction) { - $acct = 'acct:'. $action->profile->nickname .'@'. common_config('site', 'server'); + $acct = 'acct:'. $action->getTarget()->getNickname() .'@'. common_config('site', 'server'); $url = common_local_url('webfinger') . '?resource='.$acct; foreach (array(Discovery::JRD_MIMETYPE, Discovery::XRD_MIMETYPE) as $type) {