X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Frouter.php;h=161b198318875f6eb38f80a0d4dca26813da52e5;hb=f67a93eddce8120a26ed15a5559bdf08d190a04c;hp=536797dce17ec6d224b2fb56ffaf9a99668040ea;hpb=6f0bd73e6c714213bd4a8a800a2330ad9d711ac6;p=quix0rs-gnu-social.git diff --git a/lib/router.php b/lib/router.php index 536797dce1..161b198318 100644 --- a/lib/router.php +++ b/lib/router.php @@ -27,76 +27,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -require_once 'Net/URL/Mapper.php'; - -class StatusNet_URL_Mapper extends Net_URL_Mapper -{ - private static $_singleton = null; - private $_actionToPath = array(); - - private function __construct() - { - } - - public static function getInstance($id = '__default__') - { - if (empty(self::$_singleton)) { - self::$_singleton = new StatusNet_URL_Mapper(); - } - return self::$_singleton; - } - - public function connect($path, $defaults = array(), $rules = array()) - { - $result = null; - if (Event::handle('StartConnectPath', array(&$path, &$defaults, &$rules, &$result))) { - $result = parent::connect($path, $defaults, $rules); - if (array_key_exists('action', $defaults)) { - $action = $defaults['action']; - } elseif (array_key_exists('action', $rules)) { - $action = $rules['action']; - } else { - $action = null; - } - $this->_mapAction($action, $result); - Event::handle('EndConnectPath', array($path, $defaults, $rules, $result)); - } - return $result; - } - - protected function _mapAction($action, $path) - { - if (!array_key_exists($action, $this->_actionToPath)) { - $this->_actionToPath[$action] = array(); - } - $this->_actionToPath[$action][] = $path; - return; - } - - public function generate($values = array(), $qstring = array(), $anchor = '') - { - if (!array_key_exists('action', $values)) { - return parent::generate($values, $qstring, $anchor); - } - - $action = $values['action']; - - if (!array_key_exists($action, $this->_actionToPath)) { - return parent::generate($values, $qstring, $anchor); - } - - $oldPaths = $this->paths; - $this->paths = $this->_actionToPath[$action]; - $result = parent::generate($values, $qstring, $anchor); - $this->paths = $oldPaths; - - return $result; - } -} +if (!defined('GNUSOCIAL')) { exit(1); } /** * URL Router @@ -136,19 +67,7 @@ class Router function __construct() { if (empty($this->m)) { - if (!common_config('router', 'cache')) { - $this->m = $this->initialize(); - } else { - $k = self::cacheKey(); - $c = Cache::instance(); - $m = $c->get($k); - if (!empty($m)) { - $this->m = $m; - } else { - $this->m = $this->initialize(); - $c->set($k, $this->m); - } - } + $this->m = $this->initialize(); } } @@ -159,8 +78,8 @@ class Router * you're running and the plugins that are enabled. To avoid having bad routes * get stuck in the cache, the key includes a list of plugins and the software * version. - * - * There can still be problems with a) differences in versions of the plugins and + * + * There can still be problems with a) differences in versions of the plugins and * b) people running code between official versions, but these tend to be more * sophisticated users who can grok what's going on and clear their caches. * @@ -183,513 +102,517 @@ class Router function initialize() { - $m = StatusNet_URL_Mapper::getInstance(); + $m = new URLMapper(); + + if (Event::handle('StartInitializeRouter', [&$m])) { + + // top of the menu hierarchy, sometimes "Home" + $m->connect('', ['action' => 'top']); - if (Event::handle('StartInitializeRouter', array(&$m))) { + // public endpoints - $m->connect('robots.txt', array('action' => 'robotstxt')); + $m->connect('robots.txt', ['action' => 'robotstxt']); - $m->connect('opensearch/people', array('action' => 'opensearch', - 'type' => 'people')); - $m->connect('opensearch/notice', array('action' => 'opensearch', - 'type' => 'notice')); + $m->connect('opensearch/people', + ['action' => 'opensearch', + 'type' => 'people']); + + $m->connect('opensearch/notice', + ['action' => 'opensearch', + 'type' => 'notice']); // docs - $m->connect('doc/:title', array('action' => 'doc')); + $m->connect('doc/:title', ['action' => 'doc']); $m->connect('main/otp/:user_id/:token', - array('action' => 'otp'), - array('user_id' => '[0-9]+', - 'token' => '.+')); - - // main stuff is repetitive + ['action' => 'otp'], + ['user_id' => '[0-9]+', + 'token' => '.+']); - $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', - ); + // these take a code; before the main part - foreach ($main as $a) { - $m->connect('main/'.$a, array('action' => $a)); + foreach (['register', 'confirmaddress', 'recoverpassword'] as $c) { + $m->connect('main/'.$c.'/:code', ['action' => $c]); } // Also need a block variant accepting ID on URL for mail links $m->connect('main/block/:profileid', - array('action' => 'block'), - array('profileid' => '[0-9]+')); + ['action' => 'block'], + ['profileid' => '[0-9]+']); - $m->connect('main/sup/:seconds', array('action' => 'sup'), - array('seconds' => '[0-9]+')); + $m->connect('main/sup/:seconds', + ['action' => 'sup'], + ['seconds' => '[0-9]+']); - $m->connect('main/tagprofile', array('action' => 'tagprofile')); - $m->connect('main/tagprofile/:id', array('action' => 'tagprofile'), - array('id' => '[0-9]+')); + // main stuff is repetitive - $m->connect('main/oembed', - array('action' => 'oembed')); + $main = ['login', 'logout', 'register', 'subscribe', + 'unsubscribe', 'cancelsubscription', 'approvesub', + 'confirmaddress', 'recoverpassword', + 'invite', 'sup', + 'block', 'unblock', 'subedit', + 'groupblock', 'groupunblock', + 'sandbox', 'unsandbox', + 'silence', 'unsilence', + 'grantrole', 'revokerole', + 'deleteuser', + 'geocode', + 'version', + 'backupaccount', + 'deleteaccount', + 'restoreaccount', + 'top', + 'public']; - $m->connect('main/xrds', - array('action' => 'publicxrds')); - $m->connect('.well-known/host-meta', - array('action' => 'hostmeta')); - $m->connect('main/xrd', - array('action' => 'userxrd')); + foreach ($main as $a) { + $m->connect('main/'.$a, ['action' => $a]); + } - // these take a code + $m->connect('main/all', ['action' => 'networkpublic']); - foreach (array('register', 'confirmaddress', 'recoverpassword') as $c) { - $m->connect('main/'.$c.'/:code', array('action' => $c)); - } + $m->connect('main/tagprofile/:id', + ['action' => 'tagprofile'], + ['id' => '[0-9]+']); + + $m->connect('main/tagprofile', ['action' => 'tagprofile']); + + $m->connect('main/xrds', + ['action' => 'publicxrds']); // settings - foreach (array('profile', 'avatar', 'password', 'im', 'oauthconnections', - 'oauthapps', 'email', 'sms', 'url') as $s) { - $m->connect('settings/'.$s, array('action' => $s.'settings')); + foreach (['profile', 'avatar', 'password', 'im', 'oauthconnections', + 'oauthapps', 'email', 'sms', 'url'] as $s) { + $m->connect('settings/'.$s, ['action' => $s.'settings']); + } + + if (common_config('oldschool', 'enabled')) { + $m->connect('settings/oldschool', ['action' => 'oldschoolsettings']); } $m->connect('settings/oauthapps/show/:id', - array('action' => 'showapplication'), - array('id' => '[0-9]+') - ); + ['action' => 'showapplication'], + ['id' => '[0-9]+']); + $m->connect('settings/oauthapps/new', - array('action' => 'newapplication') - ); + ['action' => 'newapplication']); + $m->connect('settings/oauthapps/edit/:id', - array('action' => 'editapplication'), - array('id' => '[0-9]+') - ); + ['action' => 'editapplication'], + ['id' => '[0-9]+']); + $m->connect('settings/oauthapps/delete/:id', - array('action' => 'deleteapplication'), - array('id' => '[0-9]+') - ); + ['action' => 'deleteapplication'], + ['id' => '[0-9]+']); // search - foreach (array('group', 'people', 'notice') as $s) { - $m->connect('search/'.$s, array('action' => $s.'search')); + foreach (['group', 'people', 'notice'] as $s) { $m->connect('search/'.$s.'?q=:q', - array('action' => $s.'search'), - array('q' => '.+')); + ['action' => $s.'search'], + ['q' => '.+']); + $m->connect('search/'.$s, ['action' => $s.'search']); } // 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('search/notice/rss?q=:q', + ['action' => 'noticesearchrss'], + ['q' => '.+']); + $m->connect('search/notice/rss', ['action' => 'noticesearchrss']); + + foreach (['' => 'attachment', + '/view' => 'attachment_view', + '/download' => 'attachment_download', + '/thumbnail' => 'attachment_thumbnail'] as $postfix => $action) { + foreach (['filehash' => '[A-Za-z0-9._-]{64}', + 'attachment' => '[0-9]+'] as $type => $match) { + $m->connect("attachment/:{$type}{$postfix}", + ['action' => $action], + [$type => $match]); + } + } - $m->connect('attachment/:attachment/thumbnail', - array('action' => 'attachment_thumbnail'), - array('attachment' => '[0-9]+')); + $m->connect('notice/new?replyto=:replyto&inreplyto=:inreplyto', + ['action' => 'newnotice'], + ['replyto' => Nickname::DISPLAY_FMT, + 'inreplyto' => '[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]+')); + ['action' => 'newnotice'], + ['replyto' => Nickname::DISPLAY_FMT]); - $m->connect('notice/:notice/file', - array('action' => 'file'), - array('notice' => '[0-9]+')); + $m->connect('notice/new', ['action' => 'newnotice']); $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]+')); + ['action' => 'shownotice'], + ['notice' => '[0-9]+']); - $m->connect('bookmarklet/new', array('action' => 'bookmarklet')); + $m->connect('notice/:notice/delete', + ['action' => 'deletenotice'], + ['notice' => '[0-9]+']); // 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]+')); + ['action' => 'conversation'], + ['id' => '[0-9]+']); $m->connect('user/:id', - array('action' => 'userbyid'), - array('id' => '[0-9]+')); + ['action' => 'userbyid'], + ['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)); + ['action' => 'tagrss'], + ['tag' => self::REGEX_TAG]); $m->connect('tag/:tag', - array('action' => 'tag'), - array('tag' => self::REGEX_TAG)); + ['action' => 'tag'], + ['tag' => self::REGEX_TAG]); // groups - $m->connect('group/new', array('action' => 'newgroup')); + $m->connect('group/new', ['action' => 'newgroup']); - foreach (array('edit', 'join', 'leave', 'delete', 'cancel', 'approve') as $v) { + foreach (['edit', 'join', 'leave', 'delete', 'cancel', 'approve'] as $v) { $m->connect('group/:nickname/'.$v, - array('action' => $v.'group'), - array('nickname' => Nickname::DISPLAY_FMT)); + ['action' => $v.'group'], + ['nickname' => Nickname::DISPLAY_FMT]); $m->connect('group/:id/id/'.$v, - array('action' => $v.'group'), - array('id' => '[0-9]+')); + ['action' => $v.'group'], + ['id' => '[0-9]+']); } - foreach (array('members', 'logo', 'rss') as $n) { + foreach (['members', 'logo', 'rss'] as $n) { $m->connect('group/:nickname/'.$n, - array('action' => 'group'.$n), - array('nickname' => Nickname::DISPLAY_FMT)); + ['action' => 'group'.$n], + ['nickname' => Nickname::DISPLAY_FMT]); } $m->connect('group/:nickname/foaf', - array('action' => 'foafgroup'), - array('nickname' => Nickname::DISPLAY_FMT)); + ['action' => 'foafgroup'], + ['nickname' => Nickname::DISPLAY_FMT]); $m->connect('group/:nickname/blocked', - array('action' => 'blockedfromgroup'), - array('nickname' => Nickname::DISPLAY_FMT)); + ['action' => 'blockedfromgroup'], + ['nickname' => Nickname::DISPLAY_FMT]); $m->connect('group/:nickname/makeadmin', - array('action' => 'makeadmin'), - array('nickname' => Nickname::DISPLAY_FMT)); + ['action' => 'makeadmin'], + ['nickname' => Nickname::DISPLAY_FMT]); $m->connect('group/:nickname/members/pending', - array('action' => 'groupqueue'), - array('nickname' => Nickname::DISPLAY_FMT)); + ['action' => 'groupqueue'], + ['nickname' => Nickname::DISPLAY_FMT]); $m->connect('group/:id/id', - array('action' => 'groupbyid'), - array('id' => '[0-9]+')); + ['action' => 'groupbyid'], + ['id' => '[0-9]+']); $m->connect('group/:nickname', - array('action' => 'showgroup'), - array('nickname' => Nickname::DISPLAY_FMT)); + ['action' => 'showgroup'], + ['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')); + $m->connect('group/:nickname/', + ['action' => 'showgroup'], + ['nickname' => Nickname::DISPLAY_FMT]); + + $m->connect('group/', ['action' => 'groups']); + $m->connect('group', ['action' => 'groups']); + $m->connect('groups/', ['action' => 'groups']); + $m->connect('groups', ['action' => 'groups']); // Twitter-compatible API // statuses API $m->connect('api', - array('action' => 'Redirect', - 'nextAction' => 'doc', - 'args' => array('title' => 'api'))); + ['action' => 'Redirect', + 'nextAction' => 'doc', + 'args' => ['title' => 'api']]); $m->connect('api/statuses/public_timeline.:format', - array('action' => 'ApiTimelinePublic', - 'format' => '(xml|json|rss|atom|as)')); + ['action' => 'ApiTimelinePublic'], + ['format' => '(xml|json|rss|atom|as)']); - $m->connect('api/statuses/friends_timeline.:format', - array('action' => 'ApiTimelineFriends', - 'format' => '(xml|json|rss|atom|as)')); + // this is not part of the Twitter API. Also may require authentication depending on server config! + $m->connect('api/statuses/networkpublic_timeline.:format', + ['action' => 'ApiTimelineNetworkPublic'], + ['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)')); + ['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/friends_timeline.:format', + ['action' => 'ApiTimelineFriends'], + ['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)')); + ['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/home_timeline.:format', + ['action' => 'ApiTimelineHome'], + ['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)')); + ['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/user_timeline.:format', + ['action' => 'ApiTimelineUser'], + ['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)')); + ['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/mentions.:format', + ['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)')); + ['action' => 'ApiTimelineMentions'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json|rss|atom|as)']); - $m->connect('api/statuses/retweeted_to_me.:format', - array('action' => 'ApiTimelineRetweetedToMe', - 'format' => '(xml|json|atom|as)')); + $m->connect('api/statuses/replies.:format', + ['action' => 'ApiTimelineMentions'], + ['format' => '(xml|json|rss|atom|as)']); + + $m->connect('api/statuses/mentions_timeline/:id.:format', + ['action' => 'ApiTimelineMentions'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json|rss|atom|as)']); + + $m->connect('api/statuses/mentions_timeline.:format', + ['action' => 'ApiTimelineMentions'], + ['format' => '(xml|json|rss|atom|as)']); - $m->connect('api/statuses/retweets_of_me.:format', - array('action' => 'ApiTimelineRetweetsOfMe', - 'format' => '(xml|json|atom|as)')); + $m->connect('api/statuses/friends/:id.:format', + ['action' => 'ApiUserFriends'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); $m->connect('api/statuses/friends.:format', - array('action' => 'ApiUserFriends', - 'format' => '(xml|json)')); + ['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/:id.:format', + ['action' => 'ApiUserFollowers'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); $m->connect('api/statuses/followers.:format', - array('action' => 'ApiUserFollowers', - 'format' => '(xml|json)')); + ['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/:id.:format', + ['action' => 'ApiStatusesShow'], + ['id' => '[0-9]+', + 'format' => '(xml|json|atom)']); $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)')); + ['action' => 'ApiStatusesShow'], + ['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)')); + ['action' => 'ApiStatusesUpdate'], + ['format' => '(xml|json|atom)']); $m->connect('api/statuses/destroy/:id.:format', - array('action' => 'ApiStatusesDestroy', - 'id' => '[0-9]+', - 'format' => '(xml|json)')); + ['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)')); + $m->connect('api/statuses/destroy.:format', + ['action' => 'ApiStatusesDestroy'], + ['format' => '(xml|json)']); + + // START qvitter API additions + + $m->connect('api/attachment/:id.:format', + ['action' => 'ApiAttachment'], + ['id' => '[0-9]+', + 'format' => '(xml|json)']); + + $m->connect('api/checkhub.:format', + ['action' => 'ApiCheckHub'], + ['format' => '(xml|json)']); + + $m->connect('api/externalprofile/show.:format', + ['action' => 'ApiExternalProfileShow'], + ['format' => '(xml|json)']); + + $m->connect('api/statusnet/groups/admins/:id.:format', + ['action' => 'ApiGroupAdmins'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); + + $m->connect('api/account/update_link_color.:format', + ['action' => 'ApiAccountUpdateLinkColor'], + ['format' => '(xml|json)']); + + $m->connect('api/account/update_background_color.:format', + ['action' => 'ApiAccountUpdateBackgroundColor'], + ['format' => '(xml|json)']); + + $m->connect('api/account/register.:format', + ['action' => 'ApiAccountRegister'], + ['format' => '(xml|json)']); + + $m->connect('api/check_nickname.:format', + ['action' => 'ApiCheckNickname'], + ['format' => '(xml|json)']); + + // END qvitter API additions // 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)')); + ['action' => 'ApiUserShow'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); - $m->connect('api/direct_messages/sent.:format', - array('action' => 'ApiDirectMessage', - 'format' => '(xml|json|rss|atom)', - 'sent' => true)); + $m->connect('api/users/show.:format', + ['action' => 'ApiUserShow'], + ['format' => '(xml|json)']); - $m->connect('api/direct_messages/new.:format', - array('action' => 'ApiDirectMessageNew', - 'format' => '(xml|json)')); + $m->connect('api/users/profile_image/:screen_name.:format', + ['action' => 'ApiUserProfileImage'], + ['screen_name' => Nickname::DISPLAY_FMT, + 'format' => '(xml|json)']); // friendships $m->connect('api/friendships/show.:format', - array('action' => 'ApiFriendshipsShow', - 'format' => '(xml|json)')); + ['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)')); + ['action' => 'ApiFriendshipsExists'], + ['format' => '(xml|json)']); $m->connect('api/friendships/create/:id.:format', - array('action' => 'ApiFriendshipsCreate', - 'id' => Nickname::INPUT_FMT, - 'format' => '(xml|json)')); + ['action' => 'ApiFriendshipsCreate'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); + + $m->connect('api/friendships/create.:format', + ['action' => 'ApiFriendshipsCreate'], + ['format' => '(xml|json)']); $m->connect('api/friendships/destroy/:id.:format', - array('action' => 'ApiFriendshipsDestroy', - 'id' => Nickname::INPUT_FMT, - 'format' => '(xml|json)')); + ['action' => 'ApiFriendshipsDestroy'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); + + $m->connect('api/friendships/destroy.:format', + ['action' => 'ApiFriendshipsDestroy'], + ['format' => '(xml|json)']); // Social graph $m->connect('api/friends/ids/:id.:format', - array('action' => 'ApiUserFriends', - 'ids_only' => true)); + ['action' => 'ApiUserFriends', + 'ids_only' => true], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); $m->connect('api/followers/ids/:id.:format', - array('action' => 'ApiUserFollowers', - 'ids_only' => true)); + ['action' => 'ApiUserFollowers', + 'ids_only' => true], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); $m->connect('api/friends/ids.:format', - array('action' => 'ApiUserFriends', - 'ids_only' => true)); + ['action' => 'ApiUserFriends', + 'ids_only' => true], + ['format' => '(xml|json)']); $m->connect('api/followers/ids.:format', - array('action' => 'ApiUserFollowers', - 'ids_only' => true)); + ['action' => 'ApiUserFollowers', + 'ids_only' => true], + ['format' => '(xml|json)']); // account $m->connect('api/account/verify_credentials.:format', - array('action' => 'ApiAccountVerifyCredentials')); + ['action' => 'ApiAccountVerifyCredentials'], + ['format' => '(xml|json)']); $m->connect('api/account/update_profile.:format', - array('action' => 'ApiAccountUpdateProfile')); + ['action' => 'ApiAccountUpdateProfile'], + ['format' => '(xml|json)']); $m->connect('api/account/update_profile_image.:format', - array('action' => 'ApiAccountUpdateProfileImage')); + ['action' => 'ApiAccountUpdateProfileImage'], + ['format' => '(xml|json)']); $m->connect('api/account/update_delivery_device.:format', - array('action' => 'ApiAccountUpdateDeliveryDevice')); + ['action' => 'ApiAccountUpdateDeliveryDevice'], + ['format' => '(xml|json)']); // special case where verify_credentials is called w/out a format $m->connect('api/account/verify_credentials', - array('action' => 'ApiAccountVerifyCredentials')); + ['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)')); + ['action' => 'ApiAccountRateLimitStatus'], + ['format' => '(xml|json)']); - $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/:id.:format', + ['action' => 'ApiBlockCreate'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); + $m->connect('api/blocks/create.:format', - array('action' => 'ApiBlockCreate', - 'format' => '(xml|json)')); + ['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/:id.:format', + ['action' => 'ApiBlockDestroy'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); $m->connect('api/blocks/destroy.:format', - array('action' => 'ApiBlockDestroy', - 'format' => '(xml|json)')); + ['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)')); + ['action' => 'ApiHelpTest'], + ['format' => '(xml|json)']); // statusnet $m->connect('api/statusnet/version.:format', - array('action' => 'ApiStatusnetVersion', - 'format' => '(xml|json)')); + ['action' => 'ApiGNUsocialVersion'], + ['format' => '(xml|json)']); $m->connect('api/statusnet/config.:format', - array('action' => 'ApiStatusnetConfig', - 'format' => '(xml|json)')); + ['action' => 'ApiGNUsocialConfig'], + ['format' => '(xml|json)']); - // For older methods, we provide "laconica" base action + // For our current software name, we provide "gnusocial" base action - $m->connect('api/laconica/version.:format', - array('action' => 'ApiStatusnetVersion', - 'format' => '(xml|json)')); + $m->connect('api/gnusocial/version.:format', + ['action' => 'ApiGNUsocialVersion'], + ['format' => '(xml|json)']); - $m->connect('api/laconica/config.:format', - array('action' => 'ApiStatusnetConfig', - 'format' => '(xml|json)')); + $m->connect('api/gnusocial/config.:format', + ['action' => 'ApiGNUsocialConfig'], + ['format' => '(xml|json)']); // Groups and tags are newer than 0.8.1 so no backward-compatibility // necessary @@ -698,185 +621,214 @@ class Router //'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)')); + ['action' => 'ApiTimelineGroup'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json|rss|atom|as)']); $m->connect('api/statusnet/groups/show/:id.:format', - array('action' => 'ApiGroupShow', - 'id' => Nickname::INPUT_FMT, - 'format' => '(xml|json)')); + ['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/show.:format', + ['action' => 'ApiGroupShow'], + ['format' => '(xml|json)']); $m->connect('api/statusnet/groups/join/:id.:format', - array('action' => 'ApiGroupJoin', - 'format' => '(xml|json)')); + ['action' => 'ApiGroupJoin'], + ['id' => Nickname::INPUT_FMT, + '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/join.:format', + ['action' => 'ApiGroupJoin'], + ['format' => '(xml|json)']); $m->connect('api/statusnet/groups/leave/:id.:format', - array('action' => 'ApiGroupLeave', - 'format' => '(xml|json)')); + ['action' => 'ApiGroupLeave'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); - $m->connect('api/statusnet/groups/is_member.:format', - array('action' => 'ApiGroupIsMember', - 'format' => '(xml|json)')); + $m->connect('api/statusnet/groups/leave.:format', + ['action' => 'ApiGroupLeave'], + ['format' => '(xml|json)']); - $m->connect('api/statusnet/groups/list.:format', - array('action' => 'ApiGroupList', - 'format' => '(xml|json|rss|atom)')); + $m->connect('api/statusnet/groups/is_member.:format', + ['action' => 'ApiGroupIsMember'], + ['format' => '(xml|json)']); $m->connect('api/statusnet/groups/list/:id.:format', - array('action' => 'ApiGroupList', - 'id' => Nickname::INPUT_FMT, - 'format' => '(xml|json|rss|atom)')); + ['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/list.:format', + ['action' => 'ApiGroupList'], + ['format' => '(xml|json|rss|atom)']); - $m->connect('api/statusnet/groups/membership.:format', - array('action' => 'ApiGroupMembership', - 'format' => '(xml|json)')); + $m->connect('api/statusnet/groups/list_all.:format', + ['action' => 'ApiGroupListAll'], + ['format' => '(xml|json|rss|atom)']); $m->connect('api/statusnet/groups/membership/:id.:format', - array('action' => 'ApiGroupMembership', - 'id' => Nickname::INPUT_FMT, - 'format' => '(xml|json)')); + ['action' => 'ApiGroupMembership'], + ['id' => Nickname::INPUT_FMT, + 'format' => '(xml|json)']); + + $m->connect('api/statusnet/groups/membership.:format', + ['action' => 'ApiGroupMembership'], + ['format' => '(xml|json)']); $m->connect('api/statusnet/groups/create.:format', - array('action' => 'ApiGroupCreate', - 'format' => '(xml|json)')); + ['action' => 'ApiGroupCreate'], + ['format' => '(xml|json)']); $m->connect('api/statusnet/groups/update/:id.:format', - array('action' => 'ApiGroupProfileUpdate', - 'id' => '[a-zA-Z0-9]+', - 'format' => '(xml|json)')); + ['action' => 'ApiGroupProfileUpdate'], + ['id' => '[a-zA-Z0-9]+', + 'format' => '(xml|json)']); + + $m->connect('api/statusnet/conversation/:id.:format', + ['action' => 'apiconversation'], + ['id' => '[0-9]+', + 'format' => '(xml|json|rss|atom|as)']); // Lists (people tags) + $m->connect('api/lists/list.:format', + ['action' => 'ApiListSubscriptions'], + ['format' => '(xml|json)']); $m->connect('api/lists/memberships.:format', - array('action' => 'ApiListMemberships', - 'format' => '(xml|json)')); + ['action' => 'ApiListMemberships'], + ['format' => '(xml|json)']); $m->connect('api/:user/lists/memberships.:format', - array('action' => 'ApiListMemberships', - 'user' => '[a-zA-Z0-9]+', - 'format' => '(xml|json)')); + ['action' => 'ApiListMemberships'], + ['user' => '[a-zA-Z0-9]+', + 'format' => '(xml|json)']); $m->connect('api/lists/subscriptions.:format', - array('action' => 'ApiListSubscriptions', - 'format' => '(xml|json)')); + ['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)')); + ['action' => 'ApiListSubscriptions'], + ['user' => '[a-zA-Z0-9]+', + 'format' => '(xml|json)']); - $m->connect('api/:user/lists.:format', - array('action' => 'ApiLists', - 'user' => '[a-zA-Z0-9]+', - 'format' => '(xml|json)')); + $m->connect('api/lists.:format', + ['action' => 'ApiLists'], + ['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)')); + ['action' => 'ApiList'], + ['user' => '[a-zA-Z0-9]+', + 'id' => '[a-zA-Z0-9]+', + 'format' => '(xml|json)']); - $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/lists.:format', + ['action' => 'ApiLists'], + ['user' => '[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/lists/:id/statuses.:format', + ['action' => 'ApiTimelineList'], + ['user' => '[a-zA-Z0-9]+', + 'id' => '[a-zA-Z0-9]+', + 'format' => '(xml|json|rss|atom)']); $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)')); + ['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/members.:format', + ['action' => 'ApiListMembers'], + ['user' => '[a-zA-Z0-9]+', + 'list_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)')); + ['action' => 'ApiListSubscriber'], + ['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.:format', + ['action' => 'ApiListSubscribers'], + ['user' => '[a-zA-Z0-9]+', + 'list_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)')); + ['action' => 'ApiTimelineTag'], + ['tag' => self::REGEX_TAG, + 'format' => '(xml|json|rss|atom|as)']); // media related - $m->connect( - 'api/statusnet/media/upload', - array('action' => 'ApiMediaUpload') - ); + $m->connect('api/statusnet/media/upload', + ['action' => 'ApiMediaUpload']); + + $m->connect('api/statuses/update_with_media.json', + ['action' => 'ApiMediaUpload']); + + // Twitter Media upload API v1.1 + $m->connect('api/media/upload.:format', + ['action' => 'ApiMediaUpload'], + ['format' => '(xml|json)']); // 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/search.atom', ['action' => 'ApiSearchAtom']); + $m->connect('api/search.json', ['action' => 'ApiSearchJSON']); + $m->connect('api/trends.json', ['action' => 'ApiTrends']); $m->connect('api/oauth/request_token', - array('action' => 'ApiOauthRequestToken')); + ['action' => 'ApiOAuthRequestToken']); $m->connect('api/oauth/access_token', - array('action' => 'ApiOauthAccessToken')); + ['action' => 'ApiOAuthAccessToken']); $m->connect('api/oauth/authorize', - array('action' => 'ApiOauthAuthorize')); + ['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/site', ['action' => 'siteadminpanel']); + $m->connect('panel/user', ['action' => 'useradminpanel']); + $m->connect('panel/access', ['action' => 'accessadminpanel']); + $m->connect('panel/paths', ['action' => 'pathsadminpanel']); + $m->connect('panel/sessions', ['action' => 'sessionsadminpanel']); + $m->connect('panel/sitenotice', ['action' => 'sitenoticeadminpanel']); + $m->connect('panel/license', ['action' => 'licenseadminpanel']); - $m->connect('panel/plugins', array('action' => 'pluginsadminpanel')); + $m->connect('panel/plugins', ['action' => 'pluginsadminpanel']); $m->connect('panel/plugins/enable/:plugin', - array('action' => 'pluginenable'), - array('plugin' => '[A-Za-z0-9_]+')); + ['action' => 'pluginenable'], + ['plugin' => '[A-Za-z0-9_]+']); $m->connect('panel/plugins/disable/:plugin', - array('action' => 'plugindisable'), - array('plugin' => '[A-Za-z0-9_]+')); + ['action' => 'plugindisable'], + ['plugin' => '[A-Za-z0-9_]+']); - $m->connect('getfile/:filename', - array('action' => 'getfile'), - array('filename' => '[A-Za-z0-9._-]+')); + // Common people-tag stuff + + $m->connect('peopletag/:tag', + ['action' => 'peopletag'], + ['tag' => self::REGEX_TAG]); + + $m->connect('selftag/:tag', + ['action' => 'selftag'], + ['tag' => self::REGEX_TAG]); + + $m->connect('main/addpeopletag', ['action' => 'addpeopletag']); + + $m->connect('main/removepeopletag', ['action' => 'removepeopletag']); + + $m->connect('main/profilecompletion', ['action' => 'profilecompletion']); + + $m->connect('main/peopletagautocomplete', ['action' => 'peopletagautocomplete']); // In the "root" @@ -884,247 +836,272 @@ class Router $nickname = User::singleUserNickname(); - foreach (array('subscriptions', 'subscribers', - 'all', 'foaf', 'replies', - 'microsummary', 'hcard') as $a) { + foreach (['subscriptions', 'subscribers', 'all', 'foaf', 'replies'] as $a) { $m->connect($a, - array('action' => $a, - 'nickname' => $nickname)); + ['action' => $a, + 'nickname' => $nickname]); } - foreach (array('subscriptions', 'subscribers') as $a) { + foreach (['subscriptions', 'subscribers'] as $a) { $m->connect($a.'/:tag', - array('action' => $a, - 'nickname' => $nickname), - array('tag' => self::REGEX_TAG)); + ['action' => $a, + 'nickname' => $nickname], + ['tag' => self::REGEX_TAG]); } $m->connect('subscribers/pending', - array('action' => 'subqueue', - 'nickname' => $nickname)); + ['action' => 'subqueue', + 'nickname' => $nickname]); - foreach (array('rss', 'groups') as $a) { + foreach (['rss', 'groups'] as $a) { $m->connect($a, - array('action' => 'user'.$a, - 'nickname' => $nickname)); + ['action' => 'user'.$a, + 'nickname' => $nickname]); } - foreach (array('all', 'replies', 'favorites') as $a) { + foreach (['all', 'replies'] as $a) { $m->connect($a.'/rss', - array('action' => $a.'rss', - 'nickname' => $nickname)); + ['action' => $a.'rss', + 'nickname' => $nickname]); } - $m->connect('favorites', - array('action' => 'showfavorites', - 'nickname' => $nickname)); + $m->connect('avatar', + ['action' => 'avatarbynickname', + 'nickname' => $nickname]); $m->connect('avatar/:size', - array('action' => 'avatarbynickname', - 'nickname' => $nickname), - array('size' => '(original|96|48|24)')); + ['action' => 'avatarbynickname', + 'nickname' => $nickname], + ['size' => '(|original|\d+)']); $m->connect('tag/:tag/rss', - array('action' => 'userrss', - 'nickname' => $nickname), - array('tag' => self::REGEX_TAG)); + ['action' => 'userrss', + 'nickname' => $nickname], + ['tag' => self::REGEX_TAG]); $m->connect('tag/:tag', - array('action' => 'showstream', - 'nickname' => $nickname), - array('tag' => self::REGEX_TAG)); + ['action' => 'showstream', + 'nickname' => $nickname], + ['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', '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)); + ['action' => 'rsd', + 'nickname' => $nickname]); - $m->connect('selftag/:tag', array('action' => 'selftag', - 'tag' => self::REGEX_TAG)); + // peopletags - $m->connect('main/addpeopletag', array('action' => 'addpeopletag')); + $m->connect('peopletags', + ['action' => 'peopletagsbyuser']); - $m->connect('main/removepeopletag', array('action' => 'removepeopletag')); + $m->connect('peopletags/private', + ['action' => 'peopletagsbyuser', + 'private' => 1]); - $m->connect('main/profilecompletion', array('action' => 'profilecompletion')); + $m->connect('peopletags/public', + ['action' => 'peopletagsbyuser', + 'public' => 1]); - $m->connect('main/peopletagautocomplete', array('action' => 'peopletagautocomplete')); + $m->connect('othertags', + ['action' => 'peopletagsforuser']); - $m->connect(':nickname/peopletags', - array('action' => 'peopletagsbyuser', - 'nickname' => Nickname::DISPLAY_FMT)); + $m->connect('peopletagsubscriptions', + ['action' => 'peopletagsubscriptions']); - $m->connect(':nickname/peopletags/private', - array('action' => 'peopletagsbyuser', - 'nickname' => Nickname::DISPLAY_FMT, - 'private' => 1)); + $m->connect('all/:tag/subscribers', + ['action' => 'peopletagsubscribers'], + ['tag' => self::REGEX_TAG]); - $m->connect(':nickname/peopletags/public', - array('action' => 'peopletagsbyuser', - 'nickname' => Nickname::DISPLAY_FMT, - 'public' => 1)); + $m->connect('all/:tag/tagged', + ['action' => 'peopletagged'], + ['tag' => self::REGEX_TAG]); - $m->connect(':nickname/othertags', - array('action' => 'peopletagsforuser', - 'nickname' => Nickname::DISPLAY_FMT)); + $m->connect('all/:tag/edit', + ['action' => 'editpeopletag'], + ['tag' => self::REGEX_TAG]); - $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) { + foreach (['subscribe', 'unsubscribe'] as $v) { $m->connect('peopletag/:id/'.$v, - array('action' => $v.'peopletag', - 'id' => '[0-9]{1,64}')); + ['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)); - } + ['action' => 'profiletagbyid'], + ['tagger_id' => '[0-9]+', + 'id' => '[0-9]+']); - foreach (array('rss', 'groups') as $a) { - $m->connect(':nickname/'.$a, - array('action' => 'user'.$a), - array('nickname' => Nickname::DISPLAY_FMT)); - } + $m->connect('all/:tag', + ['action' => 'showprofiletag', + 'tagger' => $nickname], + ['tag' => self::REGEX_TAG]); - foreach (array('all', 'replies', 'favorites') as $a) { - $m->connect(':nickname/'.$a.'/rss', - array('action' => $a.'rss'), - array('nickname' => Nickname::DISPLAY_FMT)); + foreach (['subscriptions', 'subscribers'] as $a) { + $m->connect($a.'/:tag', + ['action' => $a], + ['tag' => self::REGEX_TAG]); } + } - $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('rss', ['action' => 'publicrss']); + $m->connect('featuredrss', ['action' => 'featuredrss']); + $m->connect('featured/', ['action' => 'featured']); + $m->connect('featured', ['action' => 'featured']); + $m->connect('rsd.xml', ['action' => 'rsd']); + + foreach (['subscriptions', 'subscribers', + 'nudge', 'all', 'foaf', 'replies', + 'inbox', 'outbox'] as $a) { + $m->connect(':nickname/'.$a, + ['action' => $a], + ['nickname' => Nickname::DISPLAY_FMT]); + } + + $m->connect(':nickname/subscribers/pending', + ['action' => 'subqueue'], + ['nickname' => Nickname::DISPLAY_FMT]); + + // some targeted RSS 1.0 actions (extends TargetedRss10Action) + foreach (['all', 'replies'] as $a) { + $m->connect(':nickname/'.$a.'/rss', + ['action' => $a.'rss'], + ['nickname' => Nickname::DISPLAY_FMT]); + } - $m->connect(':nickname/rsd.xml', - array('action' => 'rsd'), - array('nickname' => Nickname::DISPLAY_FMT)); + // people tags + + $m->connect(':nickname/peopletags', + ['action' => 'peopletagsbyuser'], + ['nickname' => Nickname::DISPLAY_FMT]); + + $m->connect(':nickname/peopletags/private', + ['action' => 'peopletagsbyuser', + 'private' => 1], + ['nickname' => Nickname::DISPLAY_FMT]); + + $m->connect(':nickname/peopletags/public', + ['action' => 'peopletagsbyuser', + 'public' => 1], + ['nickname' => Nickname::DISPLAY_FMT]); + + $m->connect(':nickname/othertags', + ['action' => 'peopletagsforuser'], + ['nickname' => Nickname::DISPLAY_FMT]); + + $m->connect(':nickname/peopletagsubscriptions', + ['action' => 'peopletagsubscriptions'], + ['nickname' => Nickname::DISPLAY_FMT]); + + $m->connect(':tagger/all/:tag/subscribers', + ['action' => 'peopletagsubscribers'], + ['tagger' => Nickname::DISPLAY_FMT, + 'tag' => self::REGEX_TAG]); + + $m->connect(':tagger/all/:tag/tagged', + ['action' => 'peopletagged'], + ['tagger' => Nickname::DISPLAY_FMT, + 'tag' => self::REGEX_TAG]); + + $m->connect(':tagger/all/:tag/edit', + ['action' => 'editpeopletag'], + ['tagger' => Nickname::DISPLAY_FMT, + 'tag' => self::REGEX_TAG]); + + foreach (['subscribe', 'unsubscribe'] as $v) { + $m->connect('peopletag/:id/'.$v, + ['action' => $v.'peopletag'], + ['id' => '[0-9]{1,64}']); + } + + $m->connect('user/:tagger_id/profiletag/:id/id', + ['action' => 'profiletagbyid'], + ['tagger_id' => '[0-9]+', + 'id' => '[0-9]+']); + + $m->connect(':nickname/all/:tag', + ['action' => 'showprofiletag'], + ['nickname' => Nickname::DISPLAY_FMT, + 'tag' => self::REGEX_TAG]); + + foreach (['subscriptions', 'subscribers'] as $a) { + $m->connect(':nickname/'.$a.'/:tag', + ['action' => $a], + ['tag' => self::REGEX_TAG, + 'nickname' => Nickname::DISPLAY_FMT]); + } - $m->connect(':nickname', - array('action' => 'showstream'), - array('nickname' => Nickname::DISPLAY_FMT)); + foreach (['rss', 'groups'] as $a) { + $m->connect(':nickname/'.$a, + ['action' => 'user'.$a], + ['nickname' => Nickname::DISPLAY_FMT]); } + $m->connect(':nickname/avatar', + ['action' => 'avatarbynickname'], + ['nickname' => Nickname::DISPLAY_FMT]); + + $m->connect(':nickname/avatar/:size', + ['action' => 'avatarbynickname'], + ['size' => '(|original|\d+)', + 'nickname' => Nickname::DISPLAY_FMT]); + + $m->connect(':nickname/tag/:tag/rss', + ['action' => 'userrss'], + ['nickname' => Nickname::DISPLAY_FMT, + 'tag' => self::REGEX_TAG]); + + $m->connect(':nickname/tag/:tag', + ['action' => 'showstream'], + ['nickname' => Nickname::DISPLAY_FMT, + 'tag' => self::REGEX_TAG]); + + $m->connect(':nickname/rsd.xml', + ['action' => 'rsd'], + ['nickname' => Nickname::DISPLAY_FMT]); + + $m->connect(':nickname', + ['action' => 'showstream'], + ['nickname' => Nickname::DISPLAY_FMT]); + + $m->connect(':nickname/', + ['action' => 'showstream'], + ['nickname' => Nickname::DISPLAY_FMT]); + // AtomPub API $m->connect('api/statusnet/app/service/:id.xml', - array('action' => 'ApiAtomService'), - array('id' => Nickname::DISPLAY_FMT)); + ['action' => 'ApiAtomService'], + ['id' => Nickname::DISPLAY_FMT]); $m->connect('api/statusnet/app/service.xml', - array('action' => 'ApiAtomService')); + ['action' => 'ApiAtomService']); $m->connect('api/statusnet/app/subscriptions/:subscriber/:subscribed.atom', - array('action' => 'AtomPubShowSubscription'), - array('subscriber' => '[0-9]+', - 'subscribed' => '[0-9]+')); + ['action' => 'AtomPubShowSubscription'], + ['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]+')); + ['action' => 'AtomPubSubscriptionFeed'], + ['subscriber' => '[0-9]+']); $m->connect('api/statusnet/app/memberships/:profile/:group.atom', - array('action' => 'AtomPubShowMembership'), - array('profile' => '[0-9]+', - 'group' => '[0-9]+')); + ['action' => 'AtomPubShowMembership'], + ['profile' => '[0-9]+', + 'group' => '[0-9]+']); $m->connect('api/statusnet/app/memberships/:profile.atom', - array('action' => 'AtomPubMembershipFeed'), - array('profile' => '[0-9]+')); + ['action' => 'AtomPubMembershipFeed'], + ['profile' => '[0-9]+']); // URL shortening $m->connect('url/:id', - array('action' => 'redirecturl', - 'id' => '[0-9]+')); + ['action' => 'redirecturl'], + ['id' => '[0-9]+']); // user stuff - Event::handle('RouterInitialized', array($m)); + Event::handle('RouterInitialized', [$m]); } return $m; @@ -1133,16 +1110,12 @@ class Router function map($path) { try { - $match = $this->m->match($path); - } catch (Net_URL_Mapper_InvalidException $e) { - common_log(LOG_ERR, "Problem getting route for $path - " . - $e->getMessage()); + return $this->m->match($path); + } catch (NoRouteMapException $e) { + common_debug($e->getMessage()); // TRANS: Client error on action trying to visit a non-existing page. - $cac = new ClientErrorAction(_('Page not found.'), 404); - $cac->showPage(); + throw new ClientException(_('Page not found.'), 404); } - - return $match; } function build($action, $args=null, $params=null, $fragment=null) @@ -1156,7 +1129,6 @@ class Router } $url = $this->m->generate($args, $params, $fragment); - // Due to a bug in the Net_URL_Mapper code, the returned URL may // contain a malformed query of the form ?p1=v1?p2=v2?p3=v3. We // repair that here rather than modifying the upstream code...