X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Frouter.php;h=606b30e91640dc53930183a1c0f2225351b0c4ef;hb=670288e68fefbb3357f0eebfbde1a1939617e2ac;hp=156bc10c7f1e2bb3950e8231f7d9f5a1c0db1347;hpb=e862dcdb8a9cfc21cf00513d76f40d20dd3b1b7a;p=quix0rs-gnu-social.git diff --git a/lib/router.php b/lib/router.php index 156bc10c7f..606b30e916 100644 --- a/lib/router.php +++ b/lib/router.php @@ -31,73 +31,6 @@ 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; - } -} - /** * URL Router * @@ -113,8 +46,6 @@ class Router { var $m = null; static $inst = null; - static $bare = array('requesttoken', 'accesstoken', 'userauthorization', - 'postnotice', 'updateprofile', 'finishremotesubscribe'); const REGEX_TAG = '[^\/]+'; // [\pL\pN_\-\.]{1,64} better if we can do unicode regexes @@ -126,40 +57,37 @@ class Router return Router::$inst; } + /** + * Clear the global singleton instance for this class. + * Needed to ensure reset when switching site configurations. + */ + static function clear() + { + Router::$inst = null; + } + 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(); } } /** * Create a unique hashkey for the router. - * + * * The router's url map can change based on the version of the software * 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. - * + * * @return string cache key string that should uniquely identify a router */ - + static function cacheKey() { $parts = array('router'); @@ -173,10 +101,10 @@ class Router return Cache::codeKey(implode(':', $parts)); } - + function initialize() { - $m = StatusNet_URL_Mapper::getInstance(); + $m = new URLMapper(); if (Event::handle('StartInitializeRouter', array(&$m))) { @@ -228,7 +156,9 @@ class Router $m->connect('main/sup/:seconds', array('action' => 'sup'), array('seconds' => '[0-9]+')); - $m->connect('main/tagother/:id', array('action' => 'tagother')); + $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')); @@ -246,19 +176,10 @@ class Router $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', 'userdesign', 'url') as $s) { + 'oauthapps', 'email', 'sms', 'url') as $s) { $m->connect('settings/'.$s, array('action' => $s.'settings')); } @@ -359,10 +280,6 @@ class Router array('action' => 'tag'), array('tag' => self::REGEX_TAG)); - $m->connect('peopletag/:tag', - array('action' => 'peopletag'), - array('tag' => self::REGEX_TAG)); - // groups $m->connect('group/new', array('action' => 'newgroup')); @@ -376,7 +293,7 @@ class Router array('id' => '[0-9]+')); } - foreach (array('members', 'logo', 'rss', 'designsettings') as $n) { + foreach (array('members', 'logo', 'rss') as $n) { $m->connect('group/:nickname/'.$n, array('action' => 'group'.$n), array('nickname' => Nickname::DISPLAY_FMT)); @@ -619,12 +536,6 @@ class Router $m->connect('api/account/update_profile_image.:format', array('action' => 'ApiAccountUpdateProfileImage')); - $m->connect('api/account/update_profile_background_image.:format', - array('action' => 'ApiAccountUpdateProfileBackgroundImage')); - - $m->connect('api/account/update_profile_colors.:format', - array('action' => 'ApiAccountUpdateProfileColors')); - $m->connect('api/account/update_delivery_device.:format', array('action' => 'ApiAccountUpdateDeliveryDevice')); @@ -773,6 +684,77 @@ class Router array('action' => 'ApiGroupProfileUpdate', 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json)')); + + $m->connect('api/statusnet/conversation/:id.:format', + array('action' => 'apiconversation', + 'id' => '[0-9]+', + 'format' => '(xml|json|rss|atom|as)')); + + // 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', @@ -802,7 +784,6 @@ class Router // Admin $m->connect('panel/site', array('action' => 'siteadminpanel')); - $m->connect('panel/design', array('action' => 'designadminpanel')); $m->connect('panel/user', array('action' => 'useradminpanel')); $m->connect('panel/access', array('action' => 'accessadminpanel')); $m->connect('panel/paths', array('action' => 'pathsadminpanel')); @@ -830,8 +811,8 @@ class Router $nickname = User::singleUserNickname(); foreach (array('subscriptions', 'subscribers', - 'all', 'foaf', 'xrds', - 'replies', 'microsummary', 'hcard') as $a) { + 'all', 'foaf', 'replies', + 'microsummary', 'hcard') as $a) { $m->connect($a, array('action' => $a, 'nickname' => $nickname)); @@ -898,8 +879,8 @@ class Router $m->connect('rsd.xml', array('action' => 'rsd')); foreach (array('subscriptions', 'subscribers', - 'nudge', 'all', 'foaf', 'xrds', - 'replies', 'inbox', 'outbox', 'microsummary', 'hcard') as $a) { + 'nudge', 'all', 'foaf', 'replies', + 'inbox', 'outbox', 'microsummary', 'hcard') as $a) { $m->connect(':nickname/'.$a, array('action' => $a), array('nickname' => Nickname::DISPLAY_FMT)); @@ -908,6 +889,76 @@ class Router 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), @@ -1009,7 +1060,7 @@ class Router { try { $match = $this->m->match($path); - } catch (Net_URL_Mapper_InvalidException $e) { + } catch (Exception $e) { common_log(LOG_ERR, "Problem getting route for $path - " . $e->getMessage()); // TRANS: Client error on action trying to visit a non-existing page. @@ -1031,7 +1082,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...