[ROUTES] Allow accept-header specification during router creation

Router:
- Fix calls to connect, most of them were misusing the function's params

URLMapper:
- Minor fixes
- Documentation
- Add support for accept-header specification

Plugins/*:
- Fix calls to connect
This commit is contained in:
brunoccast 2019-07-11 19:14:03 +01:00 committed by Diogo Cordeiro
parent 2032c7c1f7
commit 5c0a3102ff
48 changed files with 1023 additions and 871 deletions

116
extlib/AcceptHeader.php Normal file
View File

@ -0,0 +1,116 @@
<?php
/**
* Note : Code is released under the GNU LGPL
*
* Please do not change the header of this file
*
* This library is free software; you can redistribute it and/or modify it under the terms of the GNU
* Lesser General Public License as published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* See the GNU Lesser General Public License for more details.
*/
/**
* The AcceptHeader page will parse and sort the different
* allowed types for the content negociations
*
* @author Pierrick Charron <pierrick@webstart.fr>
*/
class AcceptHeader extends \ArrayObject
{
/**
* Constructor
*
* @param string $header Value of the Accept header
* @return void
*/
public function __construct($header)
{
$acceptedTypes = $this->_parse($header);
usort($acceptedTypes, [$this, '_compare']);
parent::__construct($acceptedTypes);
}
/**
* Parse the accept header and return an array containing
* all the informations about the Accepted types
*
* @param string $data Value of the Accept header
* @return array
*/
private function _parse($data)
{
$array = [];
$items = explode(',', $data);
foreach ($items as $item) {
$elems = explode(';', $item);
$acceptElement = [];
$mime = current($elems);
list($type, $subtype) = explode('/', $mime);
$acceptElement['type'] = trim($type);
$acceptElement['subtype'] = trim($subtype);
$acceptElement['raw'] = $mime;
$acceptElement['params'] = [];
while (next($elems)) {
list($name, $value) = explode('=', current($elems));
$acceptElement['params'][trim($name)] = trim($value);
}
$array[] = $acceptElement;
}
return $array;
}
/**
* Compare two Accepted types with their parameters to know
* if one media type should be used instead of an other
*
* @param array $a The first media type and its parameters
* @param array $b The second media type and its parameters
* @return int
*/
private function _compare($a, $b)
{
$a_q = isset($a['params']['q']) ? floatval($a['params']['q']) : 1.0;
$b_q = isset($b['params']['q']) ? floatval($b['params']['q']) : 1.0;
if ($a_q === $b_q) {
$a_count = count($a['params']);
$b_count = count($b['params']);
if ($a_count === $b_count) {
if ($r = $this->_compareSubType($a['subtype'], $b['subtype'])) {
return $r;
} else {
return $this->_compareSubType($a['type'], $b['type']);
}
} else {
return $a_count < $b_count;
}
} else {
return $a_q < $b_q;
}
}
/**
* Compare two subtypes
*
* @param string $a First subtype to compare
* @param string $b Second subtype to compare
* @return int
*/
private function _compareSubType($a, $b)
{
if ($a === '*' && $b !== '*') {
return 1;
} elseif ($b === '*' && $a !== '*') {
return -1;
} else {
return 0;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -60,12 +60,35 @@ class URLMapper
protected $reverse = [];
protected $allpaths = [];
public function connect($path, $args, $paramPatterns = array())
/**
* Route creation.
* $acceptHeaders should be set to true when, for whatever reason,
* a path is being re-connected. The $headers list is still optional,
* in this case, given that being empty means "accept everything".
*
* @author Evan Prodromou <evan@status.net>
* @author Bruno Casteleiro <brunoccast@fc.up.pt>
* @param string $path route path
* @param array $args route action and, if needed, action settings
* @param array $paramPatterns regex patterns for path's parameters
* @param bool $acceptHeaders whether a path is being re-connected
* @param array $headers headers that should be set for route creation
* @return void
*/
public function connect(string $path, array $args, array $paramPatterns = [], bool $acceptHeaders = false, array $headers = [])
{
if (!array_key_exists(self::ACTION, $args)) {
throw new Exception(sprintf("Can't connect %s; path has no action.", $path));
}
$should = true;
if ($acceptHeaders) {
// even if it shouldn't be used as a route, we still want
// to store some information to allow common_local_url
// to generate urls
$should = empty($headers) || self::should($headers);
}
$this->allpaths[] = $path;
$action = $args[self::ACTION];
@ -75,15 +98,12 @@ class URLMapper
if (empty($paramNames)) {
$this->statics[$path] = $args;
if (array_key_exists($action, $this->reverse)) {
$this->reverse[$args[self::ACTION]][] = [$args, $path];
$this->reverse[$action][] = [$args, $path];
} else {
$this->reverse[$args[self::ACTION]] = [[$args, $path]];
$this->reverse[$action] = [[$args, $path]];
}
} else {
// Eff if I understand why some go here and some go there.
// Anyways, fixup my preconceptions
// fix for the code that still make improper use of this function's params
foreach ($paramNames as $name) {
if (!array_key_exists($name, $paramPatterns) &&
array_key_exists($name, $args)) {
@ -92,16 +112,26 @@ class URLMapper
}
}
// $variables is used for path matching, so we can't store invalid routes
if ($should) {
$regex = self::makeRegex($path, $paramPatterns);
$this->variables[] = [$args, $regex, $paramNames];
if (isset($this->variables[$regex]) || !$acceptHeaders) {
$this->variables[$regex] = [$args, $paramNames];
} else {
// URLs that differ only in the attribute names will generate
// different regexes, so in order to avoid the wrong one (oldest)
// to be matched first, fresh regexes are stored at the front
$this->variables = [$regex => [$args, $paramNames]] + $this->variables;
}
}
$format = $this->makeFormat($path, $paramPatterns);
$format = $this->makeFormat($path);
if (array_key_exists($action, $this->reverse)) {
$this->reverse[$args[self::ACTION]][] = [$args, $format, $paramNames];
$this->reverse[$action][] = [$args, $format, $paramNames];
} else {
$this->reverse[$args[self::ACTION]] = [[$args, $format, $paramNames]];
$this->reverse[$action] = [[$args, $format, $paramNames]];
}
}
}
@ -112,8 +142,8 @@ class URLMapper
return $this->statics[$path];
}
foreach ($this->variables as $pattern) {
list($args, $regex, $paramNames) = $pattern;
foreach ($this->variables as $regex => $pattern) {
list($args, $paramNames) = $pattern;
if (preg_match($regex, $path, $match)) {
$results = $args;
foreach ($paramNames as $name) {
@ -220,7 +250,7 @@ class URLMapper
return $regex;
}
protected function makeFormat($path, $paramPatterns)
protected function makeFormat($path)
{
$format = preg_replace('/(:\w+)/', '%s', $path);
@ -229,7 +259,33 @@ class URLMapper
public function getPaths()
{
return $this->allpaths;
return array_unique($this->allpaths);
}
/**
* Determines whether the route should or not be overwrited.
* If ACCEPT header isn't set, false will be returned.
*
* @author Diogo Cordeiro <diogo@fc.up.pt>
* @param array $headers accept-headers that should be set to
* mark the route for overwrite. This array must be associative
* and contain the headers in the value-set.
* @return bool true if should overwrite, false otherwise
*/
public static function should(array $headers): bool
{
if (!isset($_SERVER['HTTP_ACCEPT'])) {
return false;
}
$acceptHeader = new AcceptHeader($_SERVER['HTTP_ACCEPT']);
foreach ($acceptHeader as $ah) {
if (isset($headers[$ah['raw']])) {
return true;
}
}
return false;
}
}

View File

@ -52,9 +52,9 @@ class AccountManagerPlugin extends Plugin
{
// Discovery actions
$m->connect('main/amcd.json',
array('action' => 'AccountManagementControlDocument'));
['action' => 'AccountManagementControlDocument']);
$m->connect('main/amsessionstatus',
array('action' => 'AccountManagementSessionStatus'));
['action' => 'AccountManagementSessionStatus']);
return true;
}

View File

@ -185,11 +185,13 @@ class ActivitySpamPlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('main/train/spam',
array('action' => 'train', 'category' => 'spam'));
['action' => 'train',
'category' => 'spam']);
$m->connect('main/train/ham',
array('action' => 'train', 'category' => 'ham'));
['action' => 'train',
'category' => 'ham']);
$m->connect('main/spam',
array('action' => 'spam'));
['action' => 'spam']);
return true;
}

View File

@ -50,7 +50,8 @@ class AutocompletePlugin extends Plugin
function onRouterInitialized($m)
{
$m->connect('main/autocomplete/suggest', array('action'=>'autocomplete'));
$m->connect('main/autocomplete/suggest',
['action' => 'autocomplete']);
}
function onPluginVersion(array &$versions)

View File

@ -169,7 +169,7 @@ class BitlyUrlPlugin extends UrlShortenerPlugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('panel/bitly',
array('action' => 'bitlyadminpanel'));
['action' => 'bitlyadminpanel']);
return true;
}

View File

@ -251,7 +251,8 @@ class BlacklistPlugin extends Plugin
*/
public function onRouterInitialized(URLMapper $m)
{
$m->connect('panel/blacklist', array('action' => 'blacklistadminpanel'));
$m->connect('panel/blacklist',
['action' => 'blacklistadminpanel']);
return true;
}

View File

@ -114,43 +114,44 @@ class BookmarkPlugin extends MicroAppPlugin
if (common_config('singleuser', 'enabled')) {
$nickname = User::singleUserNickname();
$m->connect('bookmarks',
array('action' => 'bookmarks', 'nickname' => $nickname));
['action' => 'bookmarks',
'nickname' => $nickname]);
$m->connect('bookmarks/rss',
array('action' => 'bookmarksrss', 'nickname' => $nickname));
['action' => 'bookmarksrss',
'nickname' => $nickname]);
} else {
$m->connect(':nickname/bookmarks',
array('action' => 'bookmarks'),
array('nickname' => Nickname::DISPLAY_FMT));
['action' => 'bookmarks'],
['nickname' => Nickname::DISPLAY_FMT]);
$m->connect(':nickname/bookmarks/rss',
array('action' => 'bookmarksrss'),
array('nickname' => Nickname::DISPLAY_FMT));
['action' => 'bookmarksrss'],
['nickname' => Nickname::DISPLAY_FMT]);
}
$m->connect('api/bookmarks/:id.:format',
array('action' => 'ApiTimelineBookmarks',
'id' => Nickname::INPUT_FMT,
'format' => '(xml|json|rss|atom|as)'));
['action' => 'ApiTimelineBookmarks'],
['id' => Nickname::INPUT_FMT,
'format' => '(xml|json|rss|atom|as)']);
$m->connect('main/bookmark/new',
array('action' => 'newbookmark'),
array('id' => '[0-9]+'));
['action' => 'newbookmark']);
$m->connect('main/bookmark/popup',
array('action' => 'bookmarkpopup'));
['action' => 'bookmarkpopup']);
$m->connect('main/bookmark/import',
array('action' => 'importdelicious'));
['action' => 'importdelicious']);
$m->connect('main/bookmark/forurl',
array('action' => 'bookmarkforurl'));
['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}'));
['action' => 'showbookmark'],
['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]+'));
['action' => 'noticebyurl'],
['id' => '[0-9]+']);
return true;
}

View File

@ -26,7 +26,7 @@ class ChooseThemePlugin extends Plugin {
const PLUGIN_VERSION = '0.1.0';
public function onRouterInitialized(URLMapper $m) {
$m->connect('main/choosethemesettings', array('action' => 'choosethemesettings'));
$m->connect('main/choosethemesettings', ['action' => 'choosethemesettings']);
}
public function onPluginVersion(array &$versions) {

View File

@ -51,7 +51,8 @@ class ClientSideShortenPlugin extends Plugin
function onRouterInitialized($m)
{
if (common_logged_in()) {
$m->connect('plugins/ClientSideShorten/shorten', array('action'=>'shorten'));
$m->connect('plugins/ClientSideShorten/shorten',
['action'=>'shorten']);
}
}

View File

@ -36,23 +36,25 @@ class DirectMessagePlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
// web front-end actions
$m->connect('message/new', array('action' => 'newmessage'));
$m->connect('message/new?to=:to', array('action' => 'newmessage'), array('to' => Nickname::DISPLAY_FMT));
$m->connect('message/new', ['action' => 'newmessage']);
$m->connect('message/new?to=:to',
['action' => 'newmessage'],
['to' => Nickname::DISPLAY_FMT]);
$m->connect('message/:message',
array('action' => 'showmessage'),
array('message' => '[0-9]+'));
['action' => 'showmessage'],
['message' => '[0-9]+']);
// direct messages
$m->connect('api/direct_messages.:format',
array('action' => 'ApiDirectMessage',
'format' => '(xml|json|rss|atom)'));
['action' => 'ApiDirectMessage'],
['format' => '(xml|json|rss|atom)']);
$m->connect('api/direct_messages/sent.:format',
array('action' => 'ApiDirectMessage',
'format' => '(xml|json|rss|atom)',
'sent' => true));
['action' => 'ApiDirectMessage',
'sent' => true],
['format' => '(xml|json|rss|atom)']);
$m->connect('api/direct_messages/new.:format',
array('action' => 'ApiDirectMessageNew',
'format' => '(xml|json)'));
['action' => 'ApiDirectMessageNew'],
['format' => '(xml|json)']);
return true;
}

View File

@ -81,62 +81,42 @@ class DirectoryPlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect(
'directory/users/:filter/sort_by/:sort/reverse/:reverse',
array('action' => 'userdirectory'),
array('filter' => '[0-9a-zA-Z]|(0-9)'),
array('sort' => '[a-z]+'),
array('reverse' => '[0-9]')
);
$m->connect('directory/users/:filter/sort_by/:sort/reverse/:reverse',
['action' => 'userdirectory'],
['filter' => '[0-9a-zA-Z]|(0-9)',
'sort' => '[a-z]+',
'reverse' => '[0-9]']);
$m->connect(
'directory/users/:filter/sort_by/:sort',
array('action' => 'userdirectory'),
array('filter' => '[0-9a-zA-Z]|(0-9)'),
array('sort' => '[a-z]+')
);
$m->connect('directory/users/:filter/sort_by/:sort',
['action' => 'userdirectory'],
['filter' => '[0-9a-zA-Z]|(0-9)',
'sort' => '[a-z]+']);
$m->connect('directory/users/:filter',
['action' => 'userdirectory'],
['filter' => '[0-9a-zA-Z]|(0-9)']);
$m->connect(
'directory/users/:filter',
array('action' => 'userdirectory'),
array('filter' => '[0-9a-zA-Z]|(0-9)')
);
$m->connect('directory/users/sort_by/:sort/reverse/:reverse',
['action' => 'userdirectory'],
['sort' => '[a-z]+',
'reverse' => '[0-9]']);
$m->connect(
'directory/users/sort_by/:sort/reverse/:reverse',
array('action' => 'userdirectory'),
array('sort' => '[a-z]+'),
array('reverse' => '[0-9]')
);
$m->connect('directory/users/sort_by/:sort',
['action' => 'userdirectory'],
['sort' => '[a-z]+']);
$m->connect(
'directory/users/sort_by/:sort',
array('action' => 'userdirectory'),
array('sort' => '[a-z]+')
);
$m->connect('directory/users',
['action' => 'userdirectory']);
$m->connect(
'directory/users',
array('action' => 'userdirectory')
);
$m->connect('groups/:filter',
['action' => 'groupdirectory'],
['filter' => '[0-9a-zA-Z]|(0-9)']);
$m->connect(
'groups/:filter',
array('action' => 'groupdirectory'),
array('filter' => '[0-9a-zA-Z]|(0-9)')
);
$m->connect(
'groups',
array('action' => 'groupdirectory')
);
$m->connect(
'groups/all',
array('action' => 'groupdirectory')
);
$m->connect('groups',
['action' => 'groupdirectory']);
$m->connect('groups/all',
['action' => 'groupdirectory']);
return true;
}

View File

@ -131,7 +131,7 @@ class DomainStatusNetworkPlugin extends Plugin
if (common_config('globalapi', 'enabled')) {
foreach (array('register', 'login', 'recover') as $method) {
$m->connect('api/statusnet/global/'.$method,
array('action' => 'global'.$method));
['action' => 'global'.$method]);
}
}
return true;

View File

@ -78,24 +78,24 @@ class EventPlugin extends ActivityVerbHandlerPlugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('main/event/new',
array('action' => 'newevent'));
['action' => 'newevent']);
$m->connect('main/event/rsvp',
array('action' => 'rsvp'));
['action' => 'rsvp']);
$m->connect('main/event/rsvp/:rsvp', // this will probably change to include event notice id
array('action' => 'rsvp'),
array('rsvp' => '[a-z]+'));
['action' => 'rsvp'],
['rsvp' => '[a-z]+']);
$m->connect('event/:id',
array('action' => 'showevent'),
array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'));
['action' => 'showevent'],
['id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}']);
$m->connect('rsvp/:id',
array('action' => 'showrsvp'),
array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'));
['action' => 'showrsvp'],
['id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}']);
$m->connect('main/event/updatetimes',
array('action' => 'timelist'));
['action' => 'timelist']);
$m->connect(':nickname/events',
array('action' => 'events'),
array('nickname' => Nickname::DISPLAY_FMT));
['action' => 'events'],
['nickname' => Nickname::DISPLAY_FMT]);
return true;
}

View File

@ -114,72 +114,77 @@ class FavoritePlugin extends ActivityVerbHandlerPlugin
public function onRouterInitialized(URLMapper $m)
{
// Web UI actions
$m->connect('main/favor', array('action' => 'favor'));
$m->connect('main/disfavor', array('action' => 'disfavor'));
$m->connect('main/favor',
['action' => 'favor']);
$m->connect('main/disfavor',
['action' => 'disfavor']);
if (common_config('singleuser', 'enabled')) {
$nickname = User::singleUserNickname();
$m->connect('favorites',
array('action' => 'showfavorites',
'nickname' => $nickname));
['action' => 'showfavorites',
'nickname' => $nickname]);
$m->connect('favoritesrss',
array('action' => 'favoritesrss',
'nickname' => $nickname));
['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('favoritedrss',
['action' => 'favoritedrss']);
$m->connect('favorited/',
['action' => 'favorited']);
$m->connect('favorited',
['action' => 'favorited']);
$m->connect(':nickname/favorites',
array('action' => 'showfavorites'),
array('nickname' => Nickname::DISPLAY_FMT));
['action' => 'showfavorites'],
['nickname' => Nickname::DISPLAY_FMT]);
$m->connect(':nickname/favorites/rss',
array('action' => 'favoritesrss'),
array('nickname' => Nickname::DISPLAY_FMT));
['action' => 'favoritesrss'],
['nickname' => Nickname::DISPLAY_FMT]);
}
// Favorites for API
$m->connect('api/favorites/create.:format',
array('action' => 'ApiFavoriteCreate'),
array('format' => '(xml|json)'));
['action' => 'ApiFavoriteCreate'],
['format' => '(xml|json)']);
$m->connect('api/favorites/destroy.:format',
array('action' => 'ApiFavoriteDestroy'),
array('format' => '(xml|json)'));
['action' => 'ApiFavoriteDestroy'],
['format' => '(xml|json)']);
$m->connect('api/favorites/list.:format',
array('action' => 'ApiTimelineFavorites'),
array('format' => '(xml|json|rss|atom|as)'));
['action' => 'ApiTimelineFavorites'],
['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)'));
['action' => 'ApiTimelineFavorites'],
['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)'));
['action' => 'ApiTimelineFavorites'],
['format' => '(xml|json|rss|atom|as)']);
$m->connect('api/favorites/create/:id.:format',
array('action' => 'ApiFavoriteCreate'),
array('id' => '[0-9]+',
'format' => '(xml|json)'));
['action' => 'ApiFavoriteCreate'],
['id' => '[0-9]+',
'format' => '(xml|json)']);
$m->connect('api/favorites/destroy/:id.:format',
array('action' => 'ApiFavoriteDestroy'),
array('id' => '[0-9]+',
'format' => '(xml|json)'));
['action' => 'ApiFavoriteDestroy'],
['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]+'));
['action' => 'AtomPubShowFavorite'],
['profile' => '[0-9]+',
'notice' => '[0-9]+']);
$m->connect('api/statusnet/app/favorites/:profile.atom',
array('action' => 'AtomPubFavoriteFeed'),
array('profile' => '[0-9]+'));
['action' => 'AtomPubFavoriteFeed'],
['profile' => '[0-9]+']);
// Required for qvitter API
$m->connect('api/statuses/favs/:id.:format',
array('action' => 'ApiStatusesFavs'),
array('id' => '[0-9]+',
'format' => '(xml|json)'));
['action' => 'ApiStatusesFavs'],
['id' => '[0-9]+',
'format' => '(xml|json)']);
}
// FIXME: Set this to abstract public in lib/activityhandlerplugin.php ddwhen all plugins have migrated!

View File

@ -46,8 +46,8 @@ class GNUsocialPhotoPlugin extends MicroAppPlugin
function onRouterInitialized($m)
{
$m->connect('main/photo/new', array('action' => 'newphoto'));
$m->connect('main/photo/:id', array('action' => 'showphoto'));
$m->connect('main/photo/new', ['action' => 'newphoto']);
$m->connect('main/photo/:id', ['action' => 'showphoto']);
return true;
}

View File

@ -46,11 +46,11 @@ class GNUsocialPhotosPlugin extends Plugin
function onRouterInitialized($m)
{
$m->connect(':nickname/photos', array('action' => 'photos'));
$m->connect(':nickname/photos/:albumid', array('action' => 'photos'));
$m->connect('main/uploadphoto', array('action' => 'photoupload'));
$m->connect('photo/:photoid', array('action' => 'photo'));
$m->connect('editphoto/:photoid', array('action' => 'editphoto'));
$m->connect(':nickname/photos', ['action' => 'photos']);
$m->connect(':nickname/photos/:albumid', ['action' => 'photos']);
$m->connect('main/uploadphoto', ['action' => 'photoupload']);
$m->connect('photo/:photoid', ['action' => 'photo']);
$m->connect('editphoto/:photoid', ['action' => 'editphoto']);
return true;
}

View File

@ -45,9 +45,9 @@ class GNUsocialProfileExtensionsPlugin extends Plugin
function onRouterInitialized($m)
{
$m->connect(':nickname/bio', array('action' => 'bio'));
$m->connect('admin/profilefields', array('action' => 'profilefieldsAdminPanel'));
$m->connect('notice/respond', array('action' => 'newresponse'));
$m->connect(':nickname/bio', ['action' => 'bio']);
$m->connect('admin/profilefields', ['action' => 'profilefieldsAdminPanel']);
$m->connect('notice/respond', ['action' => 'newresponse']);
return true;
}

View File

@ -46,8 +46,8 @@ class GNUsocialVideoPlugin extends MicroAppPlugin
function onRouterInitialized($m)
{
$m->connect('main/postvideo', array('action' => 'postvideo'));
$m->connect('showvideo/:id', array('action' => 'showvideo'));
$m->connect('main/postvideo', ['action' => 'postvideo']);
$m->connect('showvideo/:id', ['action' => 'showvideo']);
return true;
}

View File

@ -37,8 +37,8 @@ class GroupFavoritedPlugin extends Plugin
function onRouterInitialized(URLMapper $m)
{
$m->connect('group/:nickname/favorited',
array('action' => 'groupfavorited'),
array('nickname' => '[a-zA-Z0-9]+'));
['action' => 'groupfavorited'],
['nickname' => '[a-zA-Z0-9]+']);
return true;
}

View File

@ -79,16 +79,16 @@ class GroupPrivateMessagePlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('group/:nickname/inbox',
array('action' => 'groupinbox'),
array('nickname' => Nickname::DISPLAY_FMT));
['action' => 'groupinbox'],
['nickname' => Nickname::DISPLAY_FMT]);
$m->connect('group/message/:id',
array('action' => 'showgroupmessage'),
array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'));
['action' => 'showgroupmessage'],
['id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}']);
$m->connect('group/:nickname/message/new',
array('action' => 'newgroupmessage'),
array('nickname' => Nickname::DISPLAY_FMT));
['action' => 'newgroupmessage'],
['nickname' => Nickname::DISPLAY_FMT]);
return true;
}

View File

@ -338,8 +338,10 @@ class LinkbackPlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('main/linkback/webmention', array('action' => 'webmention'));
$m->connect('main/linkback/pingback', array('action' => 'pingback'));
$m->connect('main/linkback/webmention',
['action' => 'webmention']);
$m->connect('main/linkback/pingback',
['action' => 'pingback']);
}
public function onStartShowHTML($action)

View File

@ -66,11 +66,11 @@ class MapstractionPlugin extends Plugin
function onRouterInitialized($m)
{
$m->connect(':nickname/all/map',
array('action' => 'allmap'),
array('nickname' => Nickname::DISPLAY_FMT));
['action' => 'allmap'],
['nickname' => Nickname::DISPLAY_FMT]);
$m->connect(':nickname/map',
array('action' => 'usermap'),
array('nickname' => Nickname::DISPLAY_FMT));
['action' => 'usermap'],
['nickname' => Nickname::DISPLAY_FMT]);
return true;
}

View File

@ -10,19 +10,11 @@ class NodeinfoPlugin extends Plugin
public function onRouterInitialized($m)
{
$m->connect(
'.well-known/nodeinfo',
array(
'action' => 'nodeinfojrd'
)
);
$m->connect('.well-known/nodeinfo',
['action' => 'nodeinfojrd']);
$m->connect(
'main/nodeinfo/2.0',
array(
'action' => 'nodeinfo_2_0'
)
);
$m->connect('main/nodeinfo/2.0',
['action' => 'nodeinfo_2_0']);
return true;
}

View File

@ -42,44 +42,48 @@ class OStatusPlugin extends Plugin
{
// Discovery actions
$m->connect('main/ostatustag',
array('action' => 'ostatustag'));
['action' => 'ostatustag']);
$m->connect('main/ostatustag?nickname=:nickname',
array('action' => 'ostatustag'), array('nickname' => '[A-Za-z0-9_-]+'));
['action' => 'ostatustag'],
['nickname' => '[A-Za-z0-9_-]+']);
$m->connect('main/ostatus/nickname/:nickname',
array('action' => 'ostatusinit'), array('nickname' => '[A-Za-z0-9_-]+'));
['action' => 'ostatusinit'],
['nickname' => '[A-Za-z0-9_-]+']);
$m->connect('main/ostatus/group/:group',
array('action' => 'ostatusinit'), array('group' => '[A-Za-z0-9_-]+'));
['action' => 'ostatusinit'],
['group' => '[A-Za-z0-9_-]+']);
$m->connect('main/ostatus/peopletag/:peopletag/tagger/:tagger',
array('action' => 'ostatusinit'), array('tagger' => '[A-Za-z0-9_-]+',
'peopletag' => '[A-Za-z0-9_-]+'));
['action' => 'ostatusinit'],
['tagger' => '[A-Za-z0-9_-]+',
'peopletag' => '[A-Za-z0-9_-]+']);
$m->connect('main/ostatus',
array('action' => 'ostatusinit'));
['action' => 'ostatusinit']);
// Remote subscription actions
$m->connect('main/ostatussub',
array('action' => 'ostatussub'));
['action' => 'ostatussub']);
$m->connect('main/ostatusgroup',
array('action' => 'ostatusgroup'));
['action' => 'ostatusgroup']);
$m->connect('main/ostatuspeopletag',
array('action' => 'ostatuspeopletag'));
['action' => 'ostatuspeopletag']);
// WebSub actions
$m->connect('main/push/hub', array('action' => 'pushhub'));
$m->connect('main/push/hub', ['action' => 'pushhub']);
$m->connect('main/push/callback/:feed',
array('action' => 'pushcallback'),
array('feed' => '[0-9]+'));
['action' => 'pushcallback'],
['feed' => '[0-9]+']);
// Salmon endpoint
$m->connect('main/salmon/user/:id',
array('action' => 'usersalmon'),
array('id' => '[0-9]+'));
['action' => 'usersalmon'],
['id' => '[0-9]+']);
$m->connect('main/salmon/group/:id',
array('action' => 'groupsalmon'),
array('id' => '[0-9]+'));
['action' => 'groupsalmon'],
['id' => '[0-9]+']);
$m->connect('main/salmon/peopletag/:id',
array('action' => 'peopletagsalmon'),
array('id' => '[0-9]+'));
['action' => 'peopletagsalmon'],
['id' => '[0-9]+']);
return true;
}

View File

@ -84,7 +84,7 @@ class OembedPlugin extends Plugin
*/
public function onRouterInitialized(URLMapper $m)
{
$m->connect('main/oembed', array('action' => 'oembed'));
$m->connect('main/oembed', ['action' => 'oembed']);
}
/**

View File

@ -54,7 +54,7 @@ class OfflineBackupPlugin extends Plugin
function onRouterInitialized($m)
{
$m->connect('main/backupaccount',
array('action' => 'offlinebackup'));
['action' => 'offlinebackup']);
return true;
}

View File

@ -178,7 +178,7 @@ ENDOFSCRIPT;
function onRouterInitialized($m)
{
$m->connect('panel/openx',
array('action' => 'openxadminpanel'));
['action' => 'openxadminpanel']);
return true;
}

View File

@ -10,7 +10,8 @@ class OpportunisticQMPlugin extends Plugin {
public function onRouterInitialized($m)
{
$m->connect('main/runqueue', array('action' => 'runqueue'));
$m->connect('main/runqueue',
['action' => 'runqueue']);
}
/**

View File

@ -92,33 +92,23 @@ class PollPlugin extends MicroAppPlugin
*/
public function onRouterInitialized(URLMapper $m)
{
$m->connect(
'main/poll/new',
array('action' => 'newpoll')
);
$m->connect('main/poll/new',
['action' => 'newpoll']);
$m->connect(
'main/poll/:id',
array('action' => 'showpoll'),
array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')
);
$m->connect('main/poll/:id',
['action' => 'showpoll'],
['id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}']);
$m->connect(
'main/poll/response/:id',
array('action' => 'showpollresponse'),
array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')
);
$m->connect('main/poll/response/:id',
['action' => 'showpollresponse'],
['id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}']);
$m->connect(
'main/poll/:id/respond',
array('action' => 'respondpoll'),
array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')
);
$m->connect('main/poll/:id/respond',
['action' => 'respondpoll'],
['id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}']);
$m->connect(
'settings/poll',
array('action' => 'pollsettings')
);
$m->connect('settings/poll',
['action' => 'pollsettings']);
return true;
}

View File

@ -85,42 +85,35 @@ class QnAPlugin extends MicroAppPlugin
{
$UUIDregex = '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}';
$m->connect(
'main/qna/newquestion',
array('action' => 'qnanewquestion')
);
$m->connect(
'answer/qna/closequestion',
array('action' => 'qnaclosequestion')
);
$m->connect(
'main/qna/newanswer',
array('action' => 'qnanewanswer')
);
$m->connect(
'main/qna/reviseanswer',
array('action' => 'qnareviseanswer')
);
$m->connect(
'question/vote/:id',
array('action' => 'qnavote', 'type' => 'question'),
array('id' => $UUIDregex)
);
$m->connect(
'question/:id',
array('action' => 'qnashowquestion'),
array('id' => $UUIDregex)
);
$m->connect(
'answer/vote/:id',
array('action' => 'qnavote', 'type' => 'answer'),
array('id' => $UUIDregex)
);
$m->connect(
'answer/:id',
array('action' => 'qnashowanswer'),
array('id' => $UUIDregex)
);
$m->connect('main/qna/newquestion',
['action' => 'qnanewquestion']);
$m->connect('answer/qna/closequestion',
['action' => 'qnaclosequestion']);
$m->connect('main/qna/newanswer',
['action' => 'qnanewanswer']);
$m->connect('main/qna/reviseanswer',
['action' => 'qnareviseanswer']);
$m->connect('question/vote/:id',
['action' => 'qnavote',
'type' => 'question'],
['id' => $UUIDregex]);
$m->connect('question/:id',
['action' => 'qnashowquestion'],
['id' => $UUIDregex]);
$m->connect('answer/vote/:id',
['action' => 'qnavote',
'type' => 'answer'],
['id' => $UUIDregex]);
$m->connect('answer/:id',
['action' => 'qnashowanswer'],
['id' => $UUIDregex]);
return true;
}

View File

@ -105,7 +105,7 @@ class RSSCloudPlugin extends Plugin
function onRouterInitialized($m)
{
$m->connect('/main/rsscloud/request_notify',
array('action' => 'RSSCloudRequestNotify'));
['action' => 'RSSCloudRequestNotify']);
// XXX: This is just for end-to-end testing. Uncomment if you need to pretend
// to be a cloud hub for some reason.

View File

@ -77,11 +77,11 @@ class RealtimePlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('main/channel/:channelkey/keepalive',
array('action' => 'keepalivechannel'),
array('channelkey' => '[a-z0-9]{32}'));
['action' => 'keepalivechannel'],
['channelkey' => '[a-z0-9]{32}']);
$m->connect('main/channel/:channelkey/close',
array('action' => 'closechannel'),
array('channelkey' => '[a-z0-9]{32}'));
['action' => 'closechannel'],
['channelkey' => '[a-z0-9]{32}']);
return true;
}

View File

@ -94,8 +94,8 @@ class RegisterThrottlePlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('main/ipregistrations/:ipaddress',
array('action' => 'ipregistrations'),
array('ipaddress' => '[0-9a-f\.\:]+'));
['action' => 'ipregistrations'],
['ipaddress' => '[0-9a-f\.\:]+']);
}
/**

View File

@ -84,8 +84,8 @@ class RequireValidatedEmailPlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('main/confirmfirst/:code',
array('action' => 'confirmfirstemail'));
$m->('main/confirmfirst/:code',
['action' => 'confirmfirstemail']);
return true;
}

View File

@ -191,7 +191,7 @@ class SamplePlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('main/hello',
array('action' => 'hello'));
['action' => 'hello']);
return true;
}

View File

@ -70,14 +70,14 @@ class SearchSubPlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('search/:search/subscribe',
array('action' => 'searchsub'),
array('search' => Router::REGEX_TAG));
['action' => 'searchsub'],
['search' => Router::REGEX_TAG]);
$m->connect('search/:search/unsubscribe',
array('action' => 'searchunsub'),
array('search' => Router::REGEX_TAG));
['action' => 'searchunsub'],
['search' => Router::REGEX_TAG]);
$m->connect(':nickname/search-subscriptions',
array('action' => 'searchsubs'),
array('nickname' => Nickname::DISPLAY_FMT));
['action' => 'searchsubs'],
['nickname' => Nickname::DISPLAY_FMT]);
return true;
}

View File

@ -49,7 +49,7 @@ class SensitiveContentPlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('settings/sensitivecontent',
array('action' => 'sensitivecontentsettings'));
['action' => 'sensitivecontentsettings']);
}

View File

@ -53,30 +53,30 @@ class SharePlugin extends ActivityVerbHandlerPlugin
public function onRouterInitialized(URLMapper $m)
{
// Web UI actions
$m->connect('main/repeat', array('action' => 'repeat'));
$m->connect('main/repeat', ['action' => 'repeat']);
// Share for Twitter API ("Retweet")
$m->connect('api/statuses/retweeted_by_me.:format',
array('action' => 'ApiTimelineRetweetedByMe',
'format' => '(xml|json|atom|as)'));
['action' => 'ApiTimelineRetweetedByMe'],
['format' => '(xml|json|atom|as)']);
$m->connect('api/statuses/retweeted_to_me.:format',
array('action' => 'ApiTimelineRetweetedToMe',
'format' => '(xml|json|atom|as)'));
['action' => 'ApiTimelineRetweetedToMe'],
['format' => '(xml|json|atom|as)']);
$m->connect('api/statuses/retweets_of_me.:format',
array('action' => 'ApiTimelineRetweetsOfMe',
'format' => '(xml|json|atom|as)'));
['action' => 'ApiTimelineRetweetsOfMe'],
['format' => '(xml|json|atom|as)']);
$m->connect('api/statuses/retweet/:id.:format',
array('action' => 'ApiStatusesRetweet',
'id' => '[0-9]+',
'format' => '(xml|json)'));
['action' => 'ApiStatusesRetweet'],
['id' => '[0-9]+',
'format' => '(xml|json)']);
$m->connect('api/statuses/retweets/:id.:format',
array('action' => 'ApiStatusesRetweets',
'id' => '[0-9]+',
'format' => '(xml|json)'));
['action' => 'ApiStatusesRetweets'],
['id' => '[0-9]+',
'format' => '(xml|json)']);
}
// FIXME: Set this to abstract public in lib/activityhandlerplugin.php when all plugins have migrated!

View File

@ -77,24 +77,24 @@ class SitemapPlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('sitemapindex.xml',
array('action' => 'sitemapindex'));
['action' => 'sitemapindex']);
$m->connect('notice-sitemap-:year-:month-:day-:index.xml',
array('action' => 'noticesitemap'),
array('year' => '[0-9]{4}',
['action' => 'noticesitemap'],
['year' => '[0-9]{4}',
'month' => '[01][0-9]',
'day' => '[0123][0-9]',
'index' => '[1-9][0-9]*'));
'index' => '[1-9][0-9]*']);
$m->connect('user-sitemap-:year-:month-:day-:index.xml',
array('action' => 'usersitemap'),
array('year' => '[0-9]{4}',
['action' => 'usersitemap'),
['year' => '[0-9]{4}',
'month' => '[01][0-9]',
'day' => '[0123][0-9]',
'index' => '[1-9][0-9]*'));
'index' => '[1-9][0-9]*']);
$m->connect('panel/sitemap',
array('action' => 'sitemapadminpanel'));
['action' => 'sitemapadminpanel']);
return true;
}

View File

@ -60,8 +60,8 @@ class SlicedFavoritesPlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('favorited/:slice',
array('action' => 'favoritedslice'),
array('slice' => '[a-zA-Z0-9]+'));
['action' => 'favoritedslice'],
['slice' => '[a-zA-Z0-9]+']);
return true;
}

View File

@ -36,14 +36,14 @@ class SubMirrorPlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('settings/mirror',
array('action' => 'mirrorsettings'));
['action' => 'mirrorsettings']);
$m->connect('settings/mirror/add/:provider',
array('action' => 'mirrorsettings'),
array('provider' => '[A-Za-z0-9_-]+'));
['action' => 'mirrorsettings'],
['provider' => '[A-Za-z0-9_-]+']);
$m->connect('settings/mirror/add',
array('action' => 'addmirror'));
['action' => 'addmirror']);
$m->connect('settings/mirror/edit',
array('action' => 'editmirror'));
['action' => 'editmirror']);
return true;
}

View File

@ -17,10 +17,10 @@ class TagCloudPlugin extends Plugin {
public function onRouterInitialized(URLMapper $m)
{
$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('tags/', ['action' => 'publictagcloud']);
$m->connect('tag/', ['action' => 'publictagcloud']);
$m->connect('tags', ['action' => 'publictagcloud']);
$m->connect('tag', ['action' => 'publictagcloud']);
}
public function onEndPublicGroupNav(Menu $menu)

View File

@ -69,22 +69,18 @@ class TagSubPlugin extends Plugin
*/
public function onRouterInitialized(URLMapper $m)
{
$m->connect(
'tag/:tag/subscribe',
array('action' => 'tagsub'),
array('tag' => Router::REGEX_TAG)
);
$m->connect(
'tag/:tag/unsubscribe',
array('action' => 'tagunsub'),
array('tag' => Router::REGEX_TAG)
);
$m->connect('tag/:tag/subscribe',
['action' => 'tagsub'],
['tag' => Router::REGEX_TAG]);
$m->connect('tag/:tag/unsubscribe',
['action' => 'tagunsub'],
['tag' => Router::REGEX_TAG]);
$m->connect(':nickname/tag-subscriptions',
['action' => 'tagsubs'],
['nickname' => Nickname::DISPLAY_FMT]);
$m->connect(
':nickname/tag-subscriptions',
array('action' => 'tagsubs'),
array('nickname' => Nickname::DISPLAY_FMT)
);
return true;
}

View File

@ -111,23 +111,17 @@ class TwitterBridgePlugin extends Plugin
*/
public function onRouterInitialized(URLMapper $m)
{
$m->connect('panel/twitter', array('action' => 'twitteradminpanel'));
$m->connect('panel/twitter', ['action' => 'twitteradminpanel']);
if (self::hasKeys()) {
$m->connect(
'twitter/authorization',
array('action' => 'twitterauthorization')
);
$m->connect(
'settings/twitter', array(
'action' => 'twittersettings'
)
);
$m->connect('twitter/authorization',
['action' => 'twitterauthorization']);
$m->connect('settings/twitter',
['action' => 'twittersettings']);
if (common_config('twitter', 'signin')) {
$m->connect(
'main/twitterlogin',
array('action' => 'twitterlogin')
);
$m->connect('main/twitterlogin',
['action' => 'twitterlogin']);
}
}

View File

@ -75,9 +75,9 @@ class UserFlagPlugin extends Plugin
*/
public function onRouterInitialized(URLMapper $m)
{
$m->connect('main/flag/profile', array('action' => 'flagprofile'));
$m->connect('main/flag/clear', array('action' => 'clearflag'));
$m->connect('panel/profile/flag', array('action' => 'adminprofileflag'));
$m->connect('main/flag/profile', ['action' => 'flagprofile']);
$m->connect('main/flag/clear', ['action' => 'clearflag']);
$m->connect('panel/profile/flag', ['action' => 'adminprofileflag']);
return true;
}

View File

@ -39,16 +39,16 @@ class WebFingerPlugin extends Plugin
public function onRouterInitialized(URLMapper $m)
{
$m->connect('.well-known/host-meta', array('action' => 'hostmeta'));
$m->connect('.well-known/host-meta', ['action' => 'hostmeta']);
$m->connect('.well-known/host-meta.:format',
array('action' => 'hostmeta',
'format' => '(xml|json)'));
['action' => 'hostmeta'],
['format' => '(xml|json)']);
// the resource GET parameter can be anywhere, so don't mention it here
$m->connect('.well-known/webfinger', array('action' => 'webfinger'));
$m->connect('.well-known/webfinger', ['action' => 'webfinger']);
$m->connect('.well-known/webfinger.:format',
array('action' => 'webfinger',
'format' => '(xml|json)'));
$m->connect('main/ownerxrd', array('action' => 'ownerxrd'));
['action' => 'webfinger'],
['format' => '(xml|json)']);
$m->connect('main/ownerxrd', ['action' => 'ownerxrd']);
return true;
}