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
*
{
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
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');
return Cache::codeKey(implode(':', $parts));
}
-
+
function initialize()
{
- $m = StatusNet_URL_Mapper::getInstance();
+ $m = new URLMapper();
if (Event::handle('StartInitializeRouter', array(&$m))) {
// main stuff is repetitive
$main = array('login', 'logout', 'register', 'subscribe',
- 'unsubscribe', 'confirmaddress', 'recoverpassword',
+ 'unsubscribe', 'cancelsubscription', 'approvesub',
+ 'confirmaddress', 'recoverpassword',
'invite', 'favor', 'disfavor', 'sup',
'block', 'unblock', 'subedit',
'groupblock', 'groupunblock',
$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'));
}
$m->connect('group/new', array('action' => 'newgroup'));
- foreach (array('edit', 'join', 'leave', 'delete') as $v) {
+ foreach (array('edit', 'join', 'leave', 'delete', 'cancel', 'approve') as $v) {
$m->connect('group/:nickname/'.$v,
array('action' => $v.'group'),
array('nickname' => Nickname::DISPLAY_FMT));
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));
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('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'));
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)
// 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'));
$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));
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,
$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));
}
+ $m->connect(':nickname/subscribers/pending',
+ array('action' => 'subqueue'),
+ array('nickname' => Nickname::DISPLAY_FMT));
// people tags
{
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.
}
$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...