/** * Take arguments for running * * This method is called first, and it lets the action class get * all its arguments and validate them. It's also the time * to fetch any relevant data from the database. * * Action classes should run parent::prepare($args) as the first * line of this method to make sure the default argument-processing * happens. * * @param array $args $_REQUEST args * * @return boolean success flag */ function prepare($args) { parent::prepare($args); if (common_config('singleuser', 'enabled')) { $nickname = User::singleUserNickname(); } else { // PHP 5.4 // $nickname = $this->returnToArgs()[1]['nickname']; // PHP < 5.4 $nickname = $this->returnToArgs(); $nickname = $nickname[1]['nickname']; } $this->user = User::staticGet('nickname', $nickname); if (!$this->user) { // TRANS: Client error displayed when trying to display bookmarks for a non-existing user. $this->clientError(_('No such user.')); return false; } $this->page = $this->arg('page') ? $this->arg('page') + 0 : 1; $stream = new BookmarksNoticeStream($this->user->id, true); $this->notices = $stream->getNotices(($this->page - 1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1); if ($this->page > 1 && $this->notices->N == 0) { throw new ClientException(_('No such page.'), 404); } return true; }
function prepare($args) { parent::prepare($args); if (common_config('singleuser', 'enabled')) { $nickname_arg = User::singleUserNickname(); } else { $nickname_arg = $this->arg('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) { $args['page'] = $this->arg['page']; } common_redirect(common_local_url('peopletagsforuser', $args), 301); } $this->user = User::getKV('nickname', $nickname); if (!$this->user) { // TRANS: Client error displayed trying to perform an action related to a non-existing user. $this->clientError(_('No such user.'), 404); } $this->tagged = $this->user->getProfile(); if (!$this->tagged) { // TRANS: Error message displayed when referring to a user without a profile. $this->serverError(_('User has no profile.')); } $this->page = $this->arg('page') ? $this->arg('page') + 0 : 1; return true; }
/** * Prepare to run */ function prepare($args) { parent::prepare($args); if (!common_logged_in()) { // TRANS: Error message displayed when trying to perform an action that requires a logged in user. $this->clientError(_('Not logged in.')); return false; } $id = $this->arg('id'); 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); $current = common_current_user(); // Permanent redirect on non-canonical tag if ($tagger_arg != $tagger || $tag_arg != $tag) { $args = array('tagger' => $tagger, 'tag' => $tag); common_redirect(common_local_url('editpeopletag', $args), 301); return false; } $user = null; if ($id) { $this->peopletag = Profile_list::staticGet('id', $id); if (!empty($this->peopletag)) { $user = User::staticGet('id', $this->peopletag->tagger); } } else { if (!$tagger) { // TRANS: Error message displayed when trying to perform an action that requires a tagging user or ID. $this->clientError(_('No tagger or ID.'), 404); return false; } $user = User::staticGet('nickname', $tagger); $this->peopletag = Profile_list::pkeyGet(array('tagger' => $user->id, 'tag' => $tag)); } if (!$this->peopletag) { // TRANS: Client error displayed when referring to a non-existing list. $this->clientError(_('No such list.'), 404); return false; } if (!$user) { // This should not be happening // TRANS: Client error displayed when referring to non-local user. $this->clientError(_('Not a local user.'), 404); return false; } if ($current->id != $user->id) { // TRANS: Client error displayed when reting to edit a tag that was not self-created. $this->clientError(_('You must be the creator of the tag to edit it.'), 404); return false; } $this->tagger = $user->getProfile(); return true; }
function prepare($args) { parent::prepare($args); if ($this->arg('public') && $this->arg('private')) { $this->args['public'] = $this->args['private'] = false; } if (common_config('singleuser', 'enabled')) { $nickname_arg = User::singleUserNickname(); } else { $nickname_arg = $this->arg('nickname'); } $nickname = common_canonical_nickname($nickname_arg); // Permanent redirect on non-canonical nickname if ($nickname_arg != $nickname) { $args = $this->getSelfUrlArgs(); if ($this->arg('page') && $this->arg('page') != 1) { $args['page'] = $this->arg['page']; } common_redirect(common_local_url('peopletagsbyuser', $args), 301); return false; } $this->user = User::staticGet('nickname', $nickname); if (!$this->user) { // TRANS: Client error displayed trying to perform an action related to a non-existing user. $this->clientError(_('No such user.'), 404); return false; } $this->tagger = $this->user->getProfile(); if (!$this->tagger) { // TRANS: Error message displayed when referring to a user without a profile. $this->serverError(_('User has no profile.')); return false; } $this->page = $this->arg('page') ? $this->arg('page') + 0 : 1; $offset = ($this->page - 1) * PEOPLETAGS_PER_PAGE; $limit = PEOPLETAGS_PER_PAGE + 1; $user = common_current_user(); if ($this->arg('public')) { $this->tags = $this->tagger->getLists(false, $offset, $limit); } else { if ($this->arg('private')) { if (empty($user)) { // TRANS: Error message displayed when trying to perform an action that requires a logged in user. $this->clientError(_('Not logged in.'), 403); } if ($this->isOwner()) { $this->tags = $this->tagger->getPrivateTags($offset, $limit); } else { // TRANS: Client error displayed when trying view another user's private lists. $this->clientError(_('You cannot view others\' private lists'), 403); } } else { $this->tags = $this->tagger->getLists(common_current_user(), $offset, $limit); } } return true; }
static function url($tag) { if (common_config('singleuser', 'enabled')) { // regular TagAction isn't set up in 1user mode $nickname = User::singleUserNickname(); $url = common_local_url('showstream', array('nickname' => $nickname, 'tag' => $tag)); } else { $url = common_local_url('tag', array('tag' => $tag)); } return $url; }
/** * Handler method * * @param array $argarray is ignored since it's now passed in in prepare() * * @return void */ function handle($argarray = null) { if (common_config('singleuser', 'enabled')) { $url = common_local_url('showstream', array('nickname' => User::singleUserNickname())); } else { $url = common_local_url('public'); } // XXX: Permanent? I think so. common_redirect($url, 301); return; }
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); return false; } if (!$tagger) { // TRANS: Client error displayed when a tagger is expected but not provided. $this->clientError(_('No tagger.'), 404); return false; } $user = User::staticGet('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); return false; } $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) { // TRANS: Client error displayed trying to reference a non-existing list. $this->clientError(_('No such list.'), 404); return false; } $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: Server error when page not found (404). $this->serverError(_('No such page.'), $code = 404); } return true; }
function prepare($args) { parent::prepare($args); $this->page = $this->arg('page') ? $this->arg('page') + 0 : 1; 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('peopletagged', $args), 301); return false; } if (!$tagger) { // TRANS: Client error displayed when a tagger is expected but not provided. $this->clientError(_('No tagger.'), 404); return false; } $user = User::staticGet('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); return false; } $this->tagger = $user->getProfile(); $this->peopletag = Profile_list::pkeyGet(array('tagger' => $user->id, 'tag' => $tag)); if (!$this->peopletag) { // TRANS: Client error displayed trying to reference a non-existing list. $this->clientError(_('No such list.'), 404); return false; } return true; }
/** * Show the menu * * @return void */ function show() { $user = null; // FIXME: we should probably pass this in $action = $this->action->trimmed('action'); if (common_config('singleuser', 'enabled')) { $nickname = User::singleUserNickname(); } else { $nickname = $this->action->arg('tagger'); } $tag = $this->action->trimmed('tag'); if ($nickname) { $user = User::getKV('nickname', $nickname); $user_profile = $user->getProfile(); if ($tag) { $tag = Profile_list::pkeyGet(array('tagger' => $user->id, 'tag' => $tag)); } else { $tag = false; } } else { $user_profile = false; } $this->out->elementStart('ul', array('class' => 'nav')); if (Event::handle('StartPeopletagGroupNav', array($this))) { // People tag timeline $this->out->menuItem(common_local_url('showprofiletag', array('tagger' => $user_profile->nickname, 'tag' => $tag->tag)), _m('MENU', 'List'), sprintf(_('%1$s list by %2$s.'), $tag->tag, $user_profile && $user_profile->fullname ? $user_profile->fullname : $nickname), $action == 'showprofiletag', 'nav_timeline_peopletag'); // Tagged $this->out->menuItem(common_local_url('peopletagged', array('tagger' => $user->nickname, 'tag' => $tag->tag)), _m('MENU', 'Listed'), sprintf(_('%1$s list by %2$s.'), $tag->tag, $user_profile && $user_profile->fullname ? $user_profile->fullname : $nickname), $action == 'peopletagged', 'nav_peopletag_tagged'); // Subscribers $this->out->menuItem(common_local_url('peopletagsubscribers', array('tagger' => $user->nickname, 'tag' => $tag->tag)), _m('MENU', 'Subscribers'), sprintf(_('Subscribers to %1$s list by %2$s.'), $tag->tag, $user_profile && $user_profile->fullname ? $user_profile->fullname : $nickname), $action == 'peopletagsubscribers', 'nav_peopletag_subscribers'); $cur = common_current_user(); if (!empty($cur) && $user_profile->id == $cur->id) { // Edit $this->out->menuItem(common_local_url('editpeopletag', array('tagger' => $user->nickname, 'tag' => $tag->tag)), _m('MENU', 'Edit'), sprintf(_('Edit %s list by you.'), $tag->tag, $user_profile && $user_profile->fullname ? $user_profile->fullname : $nickname), $action == 'editpeopletag', 'nav_peopletag_edit'); } Event::handle('EndPeopletagGroupNav', array($this)); } $this->out->elementEnd('ul'); }
public function onRouterInitialized(URLMapper $m) { // Web UI actions $m->connect('main/favor', array('action' => 'favor')); $m->connect('main/disfavor', array('action' => 'disfavor')); if (common_config('singleuser', 'enabled')) { $nickname = User::singleUserNickname(); $m->connect('favorites', array('action' => 'showfavorites', 'nickname' => $nickname)); $m->connect('favoritesrss', array('action' => 'favoritesrss', 'nickname' => $nickname)); } else { $m->connect('favoritedrss', array('action' => 'favoritedrss')); $m->connect('favorited/', array('action' => 'favorited')); $m->connect('favorited', array('action' => 'favorited')); $m->connect(':nickname/favorites', array('action' => 'showfavorites'), array('nickname' => Nickname::DISPLAY_FMT)); $m->connect(':nickname/favorites/rss', array('action' => 'favoritesrss'), array('nickname' => Nickname::DISPLAY_FMT)); } // Favorites for API $m->connect('api/favorites/create.:format', array('action' => 'ApiFavoriteCreate'), array('format' => '(xml|json)')); $m->connect('api/favorites/destroy.:format', array('action' => 'ApiFavoriteDestroy'), array('format' => '(xml|json)')); $m->connect('api/favorites/list.:format', array('action' => 'ApiTimelineFavorites'), array('format' => '(xml|json|rss|atom|as)')); $m->connect('api/favorites/:id.:format', array('action' => 'ApiTimelineFavorites'), array('id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/favorites.:format', array('action' => 'ApiTimelineFavorites'), array('format' => '(xml|json|rss|atom|as)')); $m->connect('api/favorites/create/:id.:format', array('action' => 'ApiFavoriteCreate'), array('id' => '[0-9]+', 'format' => '(xml|json)')); $m->connect('api/favorites/destroy/:id.:format', array('action' => 'ApiFavoriteDestroy'), array('id' => '[0-9]+', 'format' => '(xml|json)')); // AtomPub API $m->connect('api/statusnet/app/favorites/:profile/:notice.atom', array('action' => 'AtomPubShowFavorite'), array('profile' => '[0-9]+', 'notice' => '[0-9]+')); $m->connect('api/statusnet/app/favorites/:profile.atom', array('action' => 'AtomPubFavoriteFeed'), array('profile' => '[0-9]+')); // Required for qvitter API $m->connect('api/statuses/favs/:id.:format', array('action' => 'ApiStatusesFavs'), array('id' => '[0-9]+', 'format' => '(xml|json)')); }
function common_tag_link($tag) { $canonical = common_canonical_tag($tag); if (common_config('singleuser', 'enabled')) { // regular TagAction isn't set up in 1user mode $nickname = User::singleUserNickname(); $url = common_local_url('showstream', array('nickname' => $nickname, 'tag' => $canonical)); } else { $url = common_local_url('tag', array('tag' => $canonical)); } $xs = new XMLStringer(); $xs->elementStart('span', 'tag'); $xs->element('a', array('href' => $url, 'rel' => 'tag'), $tag); $xs->elementEnd('span'); return $xs->getString(); }
function initialize() { $m = StatusNet_URL_Mapper::getInstance(); if (Event::handle('StartInitializeRouter', array(&$m))) { $m->connect('robots.txt', array('action' => 'robotstxt')); $m->connect('opensearch/people', array('action' => 'opensearch', 'type' => 'people')); $m->connect('opensearch/notice', array('action' => 'opensearch', 'type' => 'notice')); // docs $m->connect('doc/:title', array('action' => 'doc')); $m->connect('main/otp/:user_id/:token', array('action' => 'otp'), array('user_id' => '[0-9]+', 'token' => '.+')); // main stuff is repetitive $main = array('login', 'logout', 'register', 'subscribe', 'unsubscribe', 'cancelsubscription', 'approvesub', 'confirmaddress', 'recoverpassword', 'invite', 'favor', 'disfavor', 'sup', 'block', 'unblock', 'subedit', 'groupblock', 'groupunblock', 'sandbox', 'unsandbox', 'silence', 'unsilence', 'grantrole', 'revokerole', 'repeat', 'deleteuser', 'geocode', 'version', 'backupaccount', 'deleteaccount', 'restoreaccount'); foreach ($main as $a) { $m->connect('main/' . $a, array('action' => $a)); } // Also need a block variant accepting ID on URL for mail links $m->connect('main/block/:profileid', array('action' => 'block'), array('profileid' => '[0-9]+')); $m->connect('main/sup/:seconds', array('action' => 'sup'), array('seconds' => '[0-9]+')); $m->connect('main/tagprofile', array('action' => 'tagprofile')); $m->connect('main/tagprofile/:id', array('action' => 'tagprofile'), array('id' => '[0-9]+')); $m->connect('main/oembed', array('action' => 'oembed')); $m->connect('main/xrds', array('action' => 'publicxrds')); $m->connect('.well-known/host-meta', array('action' => 'hostmeta')); $m->connect('main/xrd', array('action' => 'userxrd')); // these take a code foreach (array('register', 'confirmaddress', 'recoverpassword') as $c) { $m->connect('main/' . $c . '/:code', array('action' => $c)); } // exceptional $m->connect('main/remote', array('action' => 'remotesubscribe')); $m->connect('main/remote?nickname=:nickname', array('action' => 'remotesubscribe'), array('nickname' => '[A-Za-z0-9_-]+')); foreach (Router::$bare as $action) { $m->connect('index.php?action=' . $action, array('action' => $action)); } // settings foreach (array('profile', 'avatar', 'password', 'im', 'oauthconnections', 'oauthapps', 'email', 'sms', 'url') as $s) { $m->connect('settings/' . $s, array('action' => $s . 'settings')); } $m->connect('settings/oauthapps/show/:id', array('action' => 'showapplication'), array('id' => '[0-9]+')); $m->connect('settings/oauthapps/new', array('action' => 'newapplication')); $m->connect('settings/oauthapps/edit/:id', array('action' => 'editapplication'), array('id' => '[0-9]+')); $m->connect('settings/oauthapps/delete/:id', array('action' => 'deleteapplication'), array('id' => '[0-9]+')); // search foreach (array('group', 'people', 'notice') as $s) { $m->connect('search/' . $s, array('action' => $s . 'search')); $m->connect('search/' . $s . '?q=:q', array('action' => $s . 'search'), array('q' => '.+')); } // The second of these is needed to make the link work correctly // when inserted into the page. The first is needed to match the // route on the way in. Seems to be another Net_URL_Mapper bug to me. $m->connect('search/notice/rss', array('action' => 'noticesearchrss')); $m->connect('search/notice/rss?q=:q', array('action' => 'noticesearchrss'), array('q' => '.+')); $m->connect('attachment/:attachment', array('action' => 'attachment'), array('attachment' => '[0-9]+')); $m->connect('attachment/:attachment/ajax', array('action' => 'attachment_ajax'), array('attachment' => '[0-9]+')); $m->connect('attachment/:attachment/thumbnail', array('action' => 'attachment_thumbnail'), array('attachment' => '[0-9]+')); $m->connect('notice/new', array('action' => 'newnotice')); $m->connect('notice/new?replyto=:replyto', array('action' => 'newnotice'), array('replyto' => Nickname::DISPLAY_FMT)); $m->connect('notice/new?replyto=:replyto&inreplyto=:inreplyto', array('action' => 'newnotice'), array('replyto' => Nickname::DISPLAY_FMT), array('inreplyto' => '[0-9]+')); $m->connect('notice/:notice/file', array('action' => 'file'), array('notice' => '[0-9]+')); $m->connect('notice/:notice', array('action' => 'shownotice'), array('notice' => '[0-9]+')); $m->connect('notice/delete', array('action' => 'deletenotice')); $m->connect('notice/delete/:notice', array('action' => 'deletenotice'), array('notice' => '[0-9]+')); $m->connect('bookmarklet/new', array('action' => 'bookmarklet')); // conversation $m->connect('conversation/:id', array('action' => 'conversation'), array('id' => '[0-9]+')); $m->connect('conversation/:id/replies', array('action' => 'conversationreplies'), array('id' => '[0-9]+')); $m->connect('message/new', array('action' => 'newmessage')); $m->connect('message/new?to=:to', array('action' => 'newmessage'), array('to' => Nickname::DISPLAY_FMT)); $m->connect('message/:message', array('action' => 'showmessage'), array('message' => '[0-9]+')); $m->connect('user/:id', array('action' => 'userbyid'), array('id' => '[0-9]+')); $m->connect('tags/', array('action' => 'publictagcloud')); $m->connect('tag/', array('action' => 'publictagcloud')); $m->connect('tags', array('action' => 'publictagcloud')); $m->connect('tag', array('action' => 'publictagcloud')); $m->connect('tag/:tag/rss', array('action' => 'tagrss'), array('tag' => self::REGEX_TAG)); $m->connect('tag/:tag', array('action' => 'tag'), array('tag' => self::REGEX_TAG)); // groups $m->connect('group/new', array('action' => 'newgroup')); foreach (array('edit', 'join', 'leave', 'delete', 'cancel', 'approve') as $v) { $m->connect('group/:nickname/' . $v, array('action' => $v . 'group'), array('nickname' => Nickname::DISPLAY_FMT)); $m->connect('group/:id/id/' . $v, array('action' => $v . 'group'), array('id' => '[0-9]+')); } foreach (array('members', 'logo', 'rss') as $n) { $m->connect('group/:nickname/' . $n, array('action' => 'group' . $n), array('nickname' => Nickname::DISPLAY_FMT)); } $m->connect('group/:nickname/foaf', array('action' => 'foafgroup'), array('nickname' => Nickname::DISPLAY_FMT)); $m->connect('group/:nickname/blocked', array('action' => 'blockedfromgroup'), array('nickname' => Nickname::DISPLAY_FMT)); $m->connect('group/:nickname/makeadmin', array('action' => 'makeadmin'), array('nickname' => Nickname::DISPLAY_FMT)); $m->connect('group/:nickname/members/pending', array('action' => 'groupqueue'), array('nickname' => Nickname::DISPLAY_FMT)); $m->connect('group/:id/id', array('action' => 'groupbyid'), array('id' => '[0-9]+')); $m->connect('group/:nickname', array('action' => 'showgroup'), array('nickname' => Nickname::DISPLAY_FMT)); $m->connect('group/', array('action' => 'groups')); $m->connect('group', array('action' => 'groups')); $m->connect('groups/', array('action' => 'groups')); $m->connect('groups', array('action' => 'groups')); // Twitter-compatible API // statuses API $m->connect('api', array('action' => 'Redirect', 'nextAction' => 'doc', 'args' => array('title' => 'api'))); $m->connect('api/statuses/public_timeline.:format', array('action' => 'ApiTimelinePublic', 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/friends_timeline.:format', array('action' => 'ApiTimelineFriends', 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/friends_timeline/:id.:format', array('action' => 'ApiTimelineFriends', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/home_timeline.:format', array('action' => 'ApiTimelineHome', 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/home_timeline/:id.:format', array('action' => 'ApiTimelineHome', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/user_timeline.:format', array('action' => 'ApiTimelineUser', 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/user_timeline/:id.:format', array('action' => 'ApiTimelineUser', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/mentions.:format', array('action' => 'ApiTimelineMentions', 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/mentions/:id.:format', array('action' => 'ApiTimelineMentions', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/replies.:format', array('action' => 'ApiTimelineMentions', 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/replies/:id.:format', array('action' => 'ApiTimelineMentions', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statuses/retweeted_by_me.:format', array('action' => 'ApiTimelineRetweetedByMe', 'format' => '(xml|json|atom|as)')); $m->connect('api/statuses/retweeted_to_me.:format', array('action' => 'ApiTimelineRetweetedToMe', 'format' => '(xml|json|atom|as)')); $m->connect('api/statuses/retweets_of_me.:format', array('action' => 'ApiTimelineRetweetsOfMe', 'format' => '(xml|json|atom|as)')); $m->connect('api/statuses/friends.:format', array('action' => 'ApiUserFriends', 'format' => '(xml|json)')); $m->connect('api/statuses/friends/:id.:format', array('action' => 'ApiUserFriends', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/statuses/followers.:format', array('action' => 'ApiUserFollowers', 'format' => '(xml|json)')); $m->connect('api/statuses/followers/:id.:format', array('action' => 'ApiUserFollowers', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/statuses/show.:format', array('action' => 'ApiStatusesShow', 'format' => '(xml|json|atom)')); $m->connect('api/statuses/show/:id.:format', array('action' => 'ApiStatusesShow', 'id' => '[0-9]+', 'format' => '(xml|json|atom)')); $m->connect('api/statuses/update.:format', array('action' => 'ApiStatusesUpdate', 'format' => '(xml|json)')); $m->connect('api/statuses/destroy.:format', array('action' => 'ApiStatusesDestroy', 'format' => '(xml|json)')); $m->connect('api/statuses/destroy/:id.:format', array('action' => 'ApiStatusesDestroy', 'id' => '[0-9]+', 'format' => '(xml|json)')); $m->connect('api/statuses/retweet/:id.:format', array('action' => 'ApiStatusesRetweet', 'id' => '[0-9]+', 'format' => '(xml|json)')); $m->connect('api/statuses/retweets/:id.:format', array('action' => 'ApiStatusesRetweets', 'id' => '[0-9]+', 'format' => '(xml|json)')); // users $m->connect('api/users/show.:format', array('action' => 'ApiUserShow', 'format' => '(xml|json)')); $m->connect('api/users/show/:id.:format', array('action' => 'ApiUserShow', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/users/profile_image/:screen_name.:format', array('action' => 'ApiUserProfileImage', 'screen_name' => Nickname::DISPLAY_FMT, 'format' => '(xml|json)')); // direct messages $m->connect('api/direct_messages.:format', array('action' => 'ApiDirectMessage', 'format' => '(xml|json|rss|atom)')); $m->connect('api/direct_messages/sent.:format', array('action' => 'ApiDirectMessage', 'format' => '(xml|json|rss|atom)', 'sent' => true)); $m->connect('api/direct_messages/new.:format', array('action' => 'ApiDirectMessageNew', 'format' => '(xml|json)')); // friendships $m->connect('api/friendships/show.:format', array('action' => 'ApiFriendshipsShow', 'format' => '(xml|json)')); $m->connect('api/friendships/exists.:format', array('action' => 'ApiFriendshipsExists', 'format' => '(xml|json)')); $m->connect('api/friendships/create.:format', array('action' => 'ApiFriendshipsCreate', 'format' => '(xml|json)')); $m->connect('api/friendships/destroy.:format', array('action' => 'ApiFriendshipsDestroy', 'format' => '(xml|json)')); $m->connect('api/friendships/create/:id.:format', array('action' => 'ApiFriendshipsCreate', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/friendships/destroy/:id.:format', array('action' => 'ApiFriendshipsDestroy', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); // Social graph $m->connect('api/friends/ids/:id.:format', array('action' => 'ApiUserFriends', 'ids_only' => true)); $m->connect('api/followers/ids/:id.:format', array('action' => 'ApiUserFollowers', 'ids_only' => true)); $m->connect('api/friends/ids.:format', array('action' => 'ApiUserFriends', 'ids_only' => true)); $m->connect('api/followers/ids.:format', array('action' => 'ApiUserFollowers', 'ids_only' => true)); // account $m->connect('api/account/register.:format', array('action' => 'ApiRegister')); $m->connect('api/account/verify_credentials.:format', array('action' => 'ApiAccountVerifyCredentials')); $m->connect('api/account/update_profile.:format', array('action' => 'ApiAccountUpdateProfile')); $m->connect('api/account/update_profile_image.:format', array('action' => 'ApiAccountUpdateProfileImage')); $m->connect('api/account/update_delivery_device.:format', array('action' => 'ApiAccountUpdateDeliveryDevice')); // special case where verify_credentials is called w/out a format $m->connect('api/account/verify_credentials', array('action' => 'ApiAccountVerifyCredentials')); $m->connect('api/account/rate_limit_status.:format', array('action' => 'ApiAccountRateLimitStatus')); // favorites $m->connect('api/favorites.:format', array('action' => 'ApiTimelineFavorites', 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/favorites/:id.:format', array('action' => 'ApiTimelineFavorites', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/favorites/create/:id.:format', array('action' => 'ApiFavoriteCreate', 'id' => '[0-9]+', 'format' => '(xml|json)')); $m->connect('api/favorites/destroy/:id.:format', array('action' => 'ApiFavoriteDestroy', 'id' => '[0-9]+', 'format' => '(xml|json)')); // blocks $m->connect('api/blocks/create.:format', array('action' => 'ApiBlockCreate', 'format' => '(xml|json)')); $m->connect('api/blocks/create/:id.:format', array('action' => 'ApiBlockCreate', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/blocks/destroy.:format', array('action' => 'ApiBlockDestroy', 'format' => '(xml|json)')); $m->connect('api/blocks/destroy/:id.:format', array('action' => 'ApiBlockDestroy', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); // help $m->connect('api/help/test.:format', array('action' => 'ApiHelpTest', 'format' => '(xml|json)')); // statusnet $m->connect('api/statusnet/version.:format', array('action' => 'ApiStatusnetVersion', 'format' => '(xml|json)')); $m->connect('api/statusnet/config.:format', array('action' => 'ApiStatusnetConfig', 'format' => '(xml|json)')); // For older methods, we provide "laconica" base action $m->connect('api/laconica/version.:format', array('action' => 'ApiStatusnetVersion', 'format' => '(xml|json)')); $m->connect('api/laconica/config.:format', array('action' => 'ApiStatusnetConfig', 'format' => '(xml|json)')); // Groups and tags are newer than 0.8.1 so no backward-compatibility // necessary // Groups //'list' has to be handled differently, as php will not allow a method to be named 'list' $m->connect('api/statusnet/groups/timeline/:id.:format', array('action' => 'ApiTimelineGroup', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); $m->connect('api/statusnet/groups/show.:format', array('action' => 'ApiGroupShow', 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/show/:id.:format', array('action' => 'ApiGroupShow', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/join.:format', array('action' => 'ApiGroupJoin', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/addmember.:format', array('action' => 'ApiGroupAddMember', 'id' => Nickname::INPUT_FMT, 'uid' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/join/:id.:format', array('action' => 'ApiGroupJoin', 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/leave.:format', array('action' => 'ApiGroupLeave', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/leave/:id.:format', array('action' => 'ApiGroupLeave', 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/is_member.:format', array('action' => 'ApiGroupIsMember', 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/list.:format', array('action' => 'ApiGroupList', 'format' => '(xml|json|rss|atom)')); $m->connect('api/statusnet/groups/list/:id.:format', array('action' => 'ApiGroupList', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom)')); $m->connect('api/statusnet/groups/list_all.:format', array('action' => 'ApiGroupListAll', 'format' => '(xml|json|rss|atom)')); $m->connect('api/statusnet/groups/membership.:format', array('action' => 'ApiGroupMembership', 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/membership/:id.:format', array('action' => 'ApiGroupMembership', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/create.:format', array('action' => 'ApiGroupCreate', 'format' => '(xml|json)')); $m->connect('api/statusnet/groups/update/:id.:format', array('action' => 'ApiGroupProfileUpdate', 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); // Lists (people tags) $m->connect('api/lists/memberships.:format', array('action' => 'ApiListMemberships', 'format' => '(xml|json)')); $m->connect('api/:user/lists/memberships.:format', array('action' => 'ApiListMemberships', 'user' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); $m->connect('api/lists/subscriptions.:format', array('action' => 'ApiListSubscriptions', 'format' => '(xml|json)')); $m->connect('api/:user/lists/subscriptions.:format', array('action' => 'ApiListSubscriptions', 'user' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); $m->connect('api/lists.:format', array('action' => 'ApiLists', 'format' => '(xml|json)')); $m->connect('api/:user/lists.:format', array('action' => 'ApiLists', 'user' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); $m->connect('api/:user/lists/:id.:format', array('action' => 'ApiList', 'user' => '[a-zA-Z0-9]+', 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); $m->connect('api/:user/lists/:id/statuses.:format', array('action' => 'ApiTimelineList', 'user' => '[a-zA-Z0-9]+', 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json|rss|atom)')); $m->connect('api/:user/:list_id/members.:format', array('action' => 'ApiListMembers', 'user' => '[a-zA-Z0-9]+', 'list_id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); $m->connect('api/:user/:list_id/subscribers.:format', array('action' => 'ApiListSubscribers', 'user' => '[a-zA-Z0-9]+', 'list_id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); $m->connect('api/:user/:list_id/members/:id.:format', array('action' => 'ApiListMember', 'user' => '[a-zA-Z0-9]+', 'list_id' => '[a-zA-Z0-9]+', 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); $m->connect('api/:user/:list_id/subscribers/:id.:format', array('action' => 'ApiListSubscriber', 'user' => '[a-zA-Z0-9]+', 'list_id' => '[a-zA-Z0-9]+', 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); // Tags $m->connect('api/statusnet/tags/timeline/:tag.:format', array('action' => 'ApiTimelineTag', 'format' => '(xml|json|rss|atom|as)')); // media related $m->connect('api/statusnet/media/upload', array('action' => 'ApiMediaUpload')); // search $m->connect('api/search.atom', array('action' => 'ApiSearchAtom')); $m->connect('api/search.json', array('action' => 'ApiSearchJSON')); $m->connect('api/trends.json', array('action' => 'ApiTrends')); $m->connect('api/oauth/request_token', array('action' => 'ApiOauthRequestToken')); $m->connect('api/oauth/access_token', array('action' => 'ApiOauthAccessToken')); $m->connect('api/oauth/authorize', array('action' => 'ApiOauthAuthorize')); // Admin $m->connect('panel/site', array('action' => 'siteadminpanel')); $m->connect('panel/user', array('action' => 'useradminpanel')); $m->connect('panel/access', array('action' => 'accessadminpanel')); $m->connect('panel/paths', array('action' => 'pathsadminpanel')); $m->connect('panel/sessions', array('action' => 'sessionsadminpanel')); $m->connect('panel/sitenotice', array('action' => 'sitenoticeadminpanel')); $m->connect('panel/snapshot', array('action' => 'snapshotadminpanel')); $m->connect('panel/license', array('action' => 'licenseadminpanel')); $m->connect('panel/plugins', array('action' => 'pluginsadminpanel')); $m->connect('panel/plugins/enable/:plugin', array('action' => 'pluginenable'), array('plugin' => '[A-Za-z0-9_]+')); $m->connect('panel/plugins/disable/:plugin', array('action' => 'plugindisable'), array('plugin' => '[A-Za-z0-9_]+')); $m->connect('getfile/:filename', array('action' => 'getfile'), array('filename' => '[A-Za-z0-9._-]+')); // In the "root" if (common_config('singleuser', 'enabled')) { $nickname = User::singleUserNickname(); foreach (array('subscriptions', 'subscribers', 'all', 'foaf', 'xrds', 'replies', 'microsummary', 'hcard') as $a) { $m->connect($a, array('action' => $a, 'nickname' => $nickname)); } foreach (array('subscriptions', 'subscribers') as $a) { $m->connect($a . '/:tag', array('action' => $a, 'nickname' => $nickname), array('tag' => self::REGEX_TAG)); } $m->connect('subscribers/pending', array('action' => 'subqueue', 'nickname' => $nickname)); foreach (array('rss', 'groups') as $a) { $m->connect($a, array('action' => 'user' . $a, 'nickname' => $nickname)); } foreach (array('all', 'replies', 'favorites') as $a) { $m->connect($a . '/rss', array('action' => $a . 'rss', 'nickname' => $nickname)); } $m->connect('favorites', array('action' => 'showfavorites', 'nickname' => $nickname)); $m->connect('avatar/:size', array('action' => 'avatarbynickname', 'nickname' => $nickname), array('size' => '(original|96|48|24)')); $m->connect('tag/:tag/rss', array('action' => 'userrss', 'nickname' => $nickname), array('tag' => self::REGEX_TAG)); $m->connect('tag/:tag', array('action' => 'showstream', 'nickname' => $nickname), array('tag' => self::REGEX_TAG)); $m->connect('rsd.xml', array('action' => 'rsd', 'nickname' => $nickname)); $m->connect('', array('action' => 'showstream', 'nickname' => $nickname)); } else { $m->connect('', array('action' => 'public')); $m->connect('rss', array('action' => 'publicrss')); $m->connect('featuredrss', array('action' => 'featuredrss')); $m->connect('favoritedrss', array('action' => 'favoritedrss')); $m->connect('featured/', array('action' => 'featured')); $m->connect('featured', array('action' => 'featured')); $m->connect('favorited/', array('action' => 'favorited')); $m->connect('favorited', array('action' => 'favorited')); $m->connect('rsd.xml', array('action' => 'rsd')); foreach (array('subscriptions', 'subscribers', 'nudge', 'all', 'foaf', 'xrds', 'replies', 'inbox', 'outbox', 'microsummary', 'hcard') as $a) { $m->connect(':nickname/' . $a, array('action' => $a), array('nickname' => Nickname::DISPLAY_FMT)); } $m->connect(':nickname/subscribers/pending', array('action' => 'subqueue'), array('nickname' => Nickname::DISPLAY_FMT)); // people tags $m->connect('peopletags', array('action' => 'publicpeopletagcloud')); $m->connect('peopletag/:tag', array('action' => 'peopletag', 'tag' => self::REGEX_TAG)); $m->connect('selftag/:tag', array('action' => 'selftag', 'tag' => self::REGEX_TAG)); $m->connect('main/addpeopletag', array('action' => 'addpeopletag')); $m->connect('main/removepeopletag', array('action' => 'removepeopletag')); $m->connect('main/profilecompletion', array('action' => 'profilecompletion')); $m->connect('main/peopletagautocomplete', array('action' => 'peopletagautocomplete')); $m->connect(':nickname/peopletags', array('action' => 'peopletagsbyuser', 'nickname' => Nickname::DISPLAY_FMT)); $m->connect(':nickname/peopletags/private', array('action' => 'peopletagsbyuser', 'nickname' => Nickname::DISPLAY_FMT, 'private' => 1)); $m->connect(':nickname/peopletags/public', array('action' => 'peopletagsbyuser', 'nickname' => Nickname::DISPLAY_FMT, 'public' => 1)); $m->connect(':nickname/othertags', array('action' => 'peopletagsforuser', 'nickname' => Nickname::DISPLAY_FMT)); $m->connect(':nickname/peopletagsubscriptions', array('action' => 'peopletagsubscriptions', 'nickname' => Nickname::DISPLAY_FMT)); $m->connect(':tagger/all/:tag/subscribers', array('action' => 'peopletagsubscribers', 'tagger' => Nickname::DISPLAY_FMT, 'tag' => self::REGEX_TAG)); $m->connect(':tagger/all/:tag/tagged', array('action' => 'peopletagged', 'tagger' => Nickname::DISPLAY_FMT, 'tag' => self::REGEX_TAG)); $m->connect(':tagger/all/:tag/edit', array('action' => 'editpeopletag', 'tagger' => Nickname::DISPLAY_FMT, 'tag' => self::REGEX_TAG)); foreach (array('subscribe', 'unsubscribe') as $v) { $m->connect('peopletag/:id/' . $v, array('action' => $v . 'peopletag', 'id' => '[0-9]{1,64}')); } $m->connect('user/:tagger_id/profiletag/:id/id', array('action' => 'profiletagbyid', 'tagger_id' => '[0-9]+', 'id' => '[0-9]+')); $m->connect(':tagger/all/:tag', array('action' => 'showprofiletag', 'tagger' => Nickname::DISPLAY_FMT, 'tag' => self::REGEX_TAG)); foreach (array('subscriptions', 'subscribers') as $a) { $m->connect(':nickname/' . $a . '/:tag', array('action' => $a), array('tag' => self::REGEX_TAG, 'nickname' => Nickname::DISPLAY_FMT)); } foreach (array('rss', 'groups') as $a) { $m->connect(':nickname/' . $a, array('action' => 'user' . $a), array('nickname' => Nickname::DISPLAY_FMT)); } foreach (array('all', 'replies', 'favorites') as $a) { $m->connect(':nickname/' . $a . '/rss', array('action' => $a . 'rss'), array('nickname' => Nickname::DISPLAY_FMT)); } $m->connect(':nickname/favorites', array('action' => 'showfavorites'), array('nickname' => Nickname::DISPLAY_FMT)); $m->connect(':nickname/avatar/:size', array('action' => 'avatarbynickname'), array('size' => '(original|96|48|24)', 'nickname' => Nickname::DISPLAY_FMT)); $m->connect(':nickname/tag/:tag/rss', array('action' => 'userrss'), array('nickname' => Nickname::DISPLAY_FMT), array('tag' => self::REGEX_TAG)); $m->connect(':nickname/tag/:tag', array('action' => 'showstream'), array('nickname' => Nickname::DISPLAY_FMT), array('tag' => self::REGEX_TAG)); $m->connect(':nickname/rsd.xml', array('action' => 'rsd'), array('nickname' => Nickname::DISPLAY_FMT)); $m->connect(':nickname', array('action' => 'showstream'), array('nickname' => Nickname::DISPLAY_FMT)); } // AtomPub API $m->connect('api/statusnet/app/service/:id.xml', array('action' => 'ApiAtomService'), array('id' => Nickname::DISPLAY_FMT)); $m->connect('api/statusnet/app/service.xml', array('action' => 'ApiAtomService')); $m->connect('api/statusnet/app/subscriptions/:subscriber/:subscribed.atom', array('action' => 'AtomPubShowSubscription'), array('subscriber' => '[0-9]+', 'subscribed' => '[0-9]+')); $m->connect('api/statusnet/app/subscriptions/:subscriber.atom', array('action' => 'AtomPubSubscriptionFeed'), array('subscriber' => '[0-9]+')); $m->connect('api/statusnet/app/favorites/:profile/:notice.atom', array('action' => 'AtomPubShowFavorite'), array('profile' => '[0-9]+', 'notice' => '[0-9]+')); $m->connect('api/statusnet/app/favorites/:profile.atom', array('action' => 'AtomPubFavoriteFeed'), array('profile' => '[0-9]+')); $m->connect('api/statusnet/app/memberships/:profile/:group.atom', array('action' => 'AtomPubShowMembership'), array('profile' => '[0-9]+', 'group' => '[0-9]+')); $m->connect('api/statusnet/app/memberships/:profile.atom', array('action' => 'AtomPubMembershipFeed'), array('profile' => '[0-9]+')); // URL shortening $m->connect('url/:id', array('action' => 'redirecturl', 'id' => '[0-9]+')); // user stuff Event::handle('RouterInitialized', array($m)); } return $m; }
/** * Map URLs to actions * * @param URLMapper $m path-to-action mapper * * @return boolean hook value; true means continue processing, false means stop. */ public function onRouterInitialized(URLMapper $m) { if (common_config('singleuser', 'enabled')) { $nickname = User::singleUserNickname(); $m->connect('bookmarks', array('action' => 'bookmarks', 'nickname' => $nickname)); $m->connect('bookmarks/rss', array('action' => 'bookmarksrss', 'nickname' => $nickname)); } else { $m->connect(':nickname/bookmarks', array('action' => 'bookmarks'), array('nickname' => Nickname::DISPLAY_FMT)); $m->connect(':nickname/bookmarks/rss', array('action' => 'bookmarksrss'), array('nickname' => Nickname::DISPLAY_FMT)); } $m->connect('api/bookmarks/:id.:format', array('action' => 'ApiTimelineBookmarks', 'id' => Nickname::INPUT_FMT, 'format' => '(xml|json|rss|atom|as)')); $m->connect('main/bookmark/new', array('action' => 'newbookmark'), array('id' => '[0-9]+')); $m->connect('main/bookmark/popup', array('action' => 'bookmarkpopup')); $m->connect('main/bookmark/import', array('action' => 'importdelicious')); $m->connect('main/bookmark/forurl', array('action' => 'bookmarkforurl')); $m->connect('bookmark/:id', array('action' => 'showbookmark'), array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')); $m->connect('notice/by-url/:id', array('action' => 'noticebyurl'), array('id' => '[0-9]+')); return true; }