class AllAction extends ShowstreamAction
{
- var $notice;
-
public function getStream()
{
if ($this->scoped instanceof Profile && $this->scoped->isLocal() && $this->scoped->getUser()->streamModeOnly()) {
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 {
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) {
} 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');
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();
$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));
* @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
* @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
*/
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())) . '"';
}
}
*/
class RepliesAction extends ShowstreamAction
{
- var $page = null;
- var $notice;
-
public function getStream()
{
return new ReplyNoticeStream($this->target->getID(), $this->scoped);
// 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())),
*/
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) {
}
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()
{
parent::showSections();
if (!common_config('performance', 'high')) {
- $cloud = new PersonalTagCloudSection($this, $this->user);
+ $cloud = new PersonalTagCloudSection($this->target, $this);
$cloud->show();
}
}
{
$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;
}
return $this;
}
+ public function sameAs(Profile $other)
+ {
+ return $this->getID() === $other->getID();
+ }
+
/**
* This will perform shortenLinks with the connected User object.
*
return $this->_profile[$this->id];
}
+ public function sameAs(Profile $other)
+ {
+ return $this->getProfile()->sameAs($other);
+ }
+
public function getUri()
{
return $this->uri;
return $this->getProfile()->getNickname();
}
- public function getByNickname($nickname)
+ static function getByNickname($nickname)
{
$user = User::getKV('nickname', $nickname);
if (!$user instanceof User) {
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) {
'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',
abstract class NoticestreamAction extends ProfileAction
{
+ protected $notice = null; // holds the stream result
protected function prepare(array $args=array()) {
parent::prepare($args);
* @link http://status.net/
*/
-if (!defined('STATUSNET') && !defined('LACONICA')) {
- exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
/**
* Personal tag cloud section
*/
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()
$tag = Memcached_DataObject::cachedQuery('Notice_tag',
sprintf($qry,
- $this->user->id),
+ $this->profile->getID()),
3600);
return $tag;
}
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());
public function getTarget()
{
+ if (!$this->target instanceof Profile) {
+ throw new ServerException('No target profile in ProfileAction class');
+ }
return $this->target;
}
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))) {
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-if (!defined('STATUSNET')) {
- exit(1);
-}
+if (!defined('GNUSOCIAL')) { exit(1); }
class ProfileDetailAction extends ShowstreamAction
{
-
function isReadOnly($args)
{
return true;
function title()
{
- return $this->profile->getFancyName();
+ return $this->target->getFancyName();
}
function showStylesheets() {
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');
$this->elementEnd('div');
}
- $widget = new ExtendedProfileWidget($this, $this->profile);
+ $widget = new ExtendedProfileWidget($this, $this->target);
$widget->show();
}
}
*
* @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',
$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;
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();
$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]'));
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'));
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;
- }
+ 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;
+ }
- // 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 ($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;
}
$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) {
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) {