diff --git a/actions/showstream.php b/actions/showstream.php index ca7af0f2ed..ee8bc18e72 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -92,9 +92,6 @@ class ShowstreamAction extends ProfileAction // For YADIS discovery, we also have a tag - header('X-XRDS-Location: '. common_local_url('xrds', array('nickname' => - $this->user->nickname))); - $this->showPage(); } @@ -171,11 +168,6 @@ class ShowstreamAction extends ProfileAction function extraHead() { - // for remote subscriptions etc. - $this->element('meta', array('http-equiv' => 'X-XRDS-Location', - 'content' => common_local_url('xrds', array('nickname' => - $this->user->nickname)))); - if ($this->profile->bio) { $this->element('meta', array('name' => 'description', 'content' => $this->profile->bio)); diff --git a/extlib/Net/URL/Mapper.php b/extlib/Net/URL/Mapper.php deleted file mode 100644 index 009c135214..0000000000 --- a/extlib/Net/URL/Mapper.php +++ /dev/null @@ -1,324 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Mapper.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL/Mapper/Path.php'; -require_once 'Net/URL/Mapper/Exception.php'; - -/** - * URL parser and mapper class - * - * This class takes an URL and a configuration and returns formatted data - * about the request according to a configuration parameter - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @version Release: @package_version@ - */ -class Net_URL_Mapper -{ - /** - * Array of Net_URL_Mapper instances - * @var array - */ - private static $instances = array(); - - /** - * Mapped paths collection - * @var array - */ - protected $paths = array(); - - /** - * Prefix used for url mapping - * @var string - */ - protected $prefix = ''; - - /** - * Optional scriptname if mod_rewrite is not available - * @var string - */ - protected $scriptname = ''; - - /** - * Mapper instance id - * @var string - */ - protected $id = '__default__'; - - /** - * Class constructor - * Constructor is private, you should use getInstance() instead. - */ - private function __construct() { } - - /** - * Returns a singleton object corresponding to the requested instance id - * @param string Requested instance name - * @return Object Net_URL_Mapper Singleton - */ - public static function getInstance($id = '__default__') - { - if (!isset(self::$instances[$id])) { - $m = new Net_URL_Mapper(); - $m->id = $id; - self::$instances[$id] = $m; - } - return self::$instances[$id]; - } - - /** - * Returns the instance id - * @return string Mapper instance id - */ - public function getId() - { - return $this->id; - } - - /** - * Parses a path and creates a connection - * @param string The path to connect - * @param array Default values for path parts - * @param array Regular expressions for path parts - * @return object Net_URL_Mapper_Path - */ - public function connect($path, $defaults = array(), $rules = array()) - { - $pathObj = new Net_URL_Mapper_Path($path, $defaults, $rules); - $this->addPath($pathObj); - return $pathObj; - } - - /** - * Set the url prefix if needed - * - * Example: using the prefix to differenciate mapper instances - * - * $fr = Net_URL_Mapper::getInstance('fr'); - * $fr->setPrefix('/fr'); - * $en = Net_URL_Mapper::getInstance('en'); - * $en->setPrefix('/en'); - * - * - * @param string URL prefix - */ - public function setPrefix($prefix) - { - $this->prefix = '/'.trim($prefix, '/'); - } - - /** - * Set the scriptname if mod_rewrite not available - * - * Example: will match and generate url like - * - index.php/view/product/1 - * - * $m = Net_URL_Mapper::getInstance(); - * $m->setScriptname('index.php'); - * - * @param string URL prefix - */ - public function setScriptname($scriptname) - { - $this->scriptname = $scriptname; - } - - /** - * Will attempt to match an url with a defined path - * - * If an url corresponds to a path, the resulting values are returned - * in an array. If none is found, null is returned. In case an url is - * matched but its content doesn't validate the path rules, an exception is - * thrown. - * - * @param string URL - * @return array|null array if match found, null otherwise - * @throws Net_URL_Mapper_InvalidException - */ - public function match($url) - { - $nurl = '/'.trim($url, '/'); - - // Remove scriptname if needed - - if (!empty($this->scriptname) && - strpos($nurl, $this->scriptname) === 0) { - $nurl = substr($nurl, strlen($this->scriptname)); - if (empty($nurl)) { - $nurl = '/'; - } - } - - // Remove prefix - - if (!empty($this->prefix)) { - if (strpos($nurl, $this->prefix) !== 0) { - return null; - } - $nurl = substr($nurl, strlen($this->prefix)); - if (empty($nurl)) { - $nurl = '/'; - } - } - - // Remove query string - - if (($pos = strpos($nurl, '?')) !== false) { - $nurl = substr($nurl, 0, $pos); - } - - $paths = array(); - $values = null; - - // Make a list of paths that conform to route format - - foreach ($this->paths as $path) { - $regex = $path->getFormat(); - if (preg_match($regex, $nurl)) { - $paths[] = $path; - } - } - - // Make sure one of the paths found is valid - - foreach ($paths as $path) { - $regex = $path->getRule(); - if (preg_match($regex, $nurl, $matches)) { - $values = $path->getDefaults(); - array_shift($matches); - $clean = array(); - foreach ($matches as $k => $v) { - $v = trim($v, '/'); - if (!is_int($k) && $v !== '') { - $values[$k] = $v; - } - } - break; - } - } - - // A path conforms but does not validate - - if (is_null($values) && !empty($paths)) { - $e = new Net_URL_Mapper_InvalidException('A path was found but is invalid.'); - $e->setPath($paths[0]); - $e->setUrl($url); - throw $e; - } - - return $values; - } - - /** - * Generate an url based on given parameters - * - * Will attempt to find a path definition that matches the given parameters and - * will generate an url based on this path. - * - * @param array Values to be used for the url generation - * @param array Key/value pairs for query string if needed - * @param string Anchor (fragment) if needed - * @return string|false String if a rule was found, false otherwise - */ - public function generate($values = array(), $qstring = array(), $anchor = '') - { - // Use root path if any - - if (empty($values) && isset($this->paths['/'])) { - return $this->scriptname.$this->prefix.$this->paths['/']->generate($values, $qstring, $anchor); - } - - foreach ($this->paths as $path) { - $set = array(); - foreach ($values as $k => $v) { - if ($path->hasKey($k, $v)) { - $set[$k] = $v; - } - } - - if (count($set) == count($values) && - count($set) <= $path->getMaxKeys()) { - - $req = $path->getRequired(); - if (count(array_intersect(array_keys($set), $req)) != count($req)) { - continue; - } - $gen = $path->generate($set, $qstring, $anchor); - return $this->scriptname.$this->prefix.$gen; - } - } - return false; - } - - /** - * Returns defined paths - * @return array Array of paths - */ - public function getPaths() - { - return $this->paths; - } - - /** - * Reset all paths - * This is probably only useful for testing - */ - public function reset() - { - $this->paths = array(); - $this->prefix = ''; - } - - /** - * Add a new path to the mapper - * @param object Net_URL_Mapper_Path object - */ - public function addPath(Net_URL_Mapper_Path $path) - { - $this->paths[$path->getPath()] = $path; - } - -} -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Exception.php b/extlib/Net/URL/Mapper/Exception.php deleted file mode 100644 index 1915ad9782..0000000000 --- a/extlib/Net/URL/Mapper/Exception.php +++ /dev/null @@ -1,104 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Exception.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -/** - * Base class for exceptions in PEAR - */ -require_once 'PEAR/Exception.php'; - -/** - * Base class for exceptions in Net_URL_Mapper package - * - * Such a base class is required by the Exception RFC: - * http://pear.php.net/pepr/pepr-proposal-show.php?id=132 - * It will rarely be thrown directly, its specialized subclasses will be - * thrown most of the time. - * - * @category Net - * @package Net_URL_Mapper - * @version Release: @package_version@ - */ -class Net_URL_Mapper_Exception extends PEAR_Exception -{ -} - -/** - * Exception thrown when a path is invalid - * - * A path can conform to a given structure, but contain invalid parameters. - * - * $m = Net_URL_Mapper::getInstance(); - * $m->connect('hi/:name', null, array('name'=>'[a-z]+')); - * $m->match('/hi/FOXY'); // Will throw the exception - * - * - * @category Net - * @package Net_URL_Mapper - * @version Release: @package_version@ - */ -class Net_URL_Mapper_InvalidException extends Net_URL_Mapper_Exception -{ - protected $path; - protected $url; - - public function setPath($path) - { - $this->path = $path; - } - - public function getPath() - { - return $this->path; - } - - public function setUrl($url) - { - $this->url = $url; - } - - public function getUrl() - { - return $this->url; - } -} -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Part.php b/extlib/Net/URL/Mapper/Part.php deleted file mode 100644 index 087c368eea..0000000000 --- a/extlib/Net/URL/Mapper/Part.php +++ /dev/null @@ -1,142 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Part.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -abstract class Net_URL_Mapper_Part -{ - protected $defaults; - protected $rule; - protected $public; - protected $type; - protected $required = false; - - /** - * Part name if dynamic or content, generated from path - * @var string - */ - public $content; - - const DYNAMIC = 1; - const WILDCARD = 2; - const FIXED = 3; - - public function __construct($content, $path) - { - $this->content = $content; - $this->path = $path; - } - - public function setRule($rule) - { - $this->rule = $rule; - } - - abstract public function getFormat(); - - abstract public function getRule(); - - public function addSlash($str) - { - $str = trim($str, '/'); - if (($pos = strpos($this->path, '/')) !== false) { - if ($pos == 0) { - $str = '/'.$str; - } else { - $str .= '/'; - } - } - return $str; - } - - public function addSlashRegex($str) - { - $str = trim($str, '/'); - if (($pos = strpos($this->path, '/')) !== false) { - if ($pos == 0) { - $str = '\/'.$str; - } else { - $str .= '\/'; - } - } - if (!$this->isRequired()) { - $str = '('.$str.'|)'; - } - return $str; - } - - public function setDefaults($defaults) - { - $this->defaults = (string)$defaults; - } - - public function getType() - { - return $this->type; - } - - public function accept($visitor, $method = null) - { - $args = func_get_args(); - $visitor->$method($this, $args); - } - - public function setRequired($required) - { - $this->required = $required; - } - - public function isRequired() - { - return $this->required; - } - - abstract public function generate($value = null); - - public function match($value) - { - $rule = $this->getRule(); - return preg_match('/^'.$rule.'$/', $this->addSlash($value)); - } - -} - -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Part/Dynamic.php b/extlib/Net/URL/Mapper/Part/Dynamic.php deleted file mode 100644 index 914afa4211..0000000000 --- a/extlib/Net/URL/Mapper/Part/Dynamic.php +++ /dev/null @@ -1,81 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Dynamic.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL/Mapper/Part.php'; - -class Net_URL_Mapper_Part_Dynamic extends Net_URL_Mapper_Part -{ - - public function __construct($content, $path) - { - $this->type = Net_URL_Mapper_Part::DYNAMIC; - $this->setRequired(true); - parent::__construct($content, $path); - } - - public function getFormat() - { - return $this->addSlashRegex('[^\/]+'); - } - - public function getRule() - { - if (!empty($this->rule)) { - return '(?P<'.$this->content.'>'.$this->addSlashRegex($this->rule).')'; - } - return '(?P<'.$this->content.'>'.$this->addSlashRegex('[^\/]+').')'; - } - - public function generate($value = null) - { - if (is_array($value) && isset($value[$this->content])) { - $val = $value[$this->content]; - } elseif (!is_array($value) && !is_null($value)) { - $val = $value; - } else { - $val = $this->defaults; - } - return $this->addSlash(urlencode($val)); - } -} -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Part/Fixed.php b/extlib/Net/URL/Mapper/Part/Fixed.php deleted file mode 100644 index 7d94973eac..0000000000 --- a/extlib/Net/URL/Mapper/Part/Fixed.php +++ /dev/null @@ -1,70 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Fixed.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL/Mapper/Part.php'; - -class Net_URL_Mapper_Part_Fixed extends Net_URL_Mapper_Part -{ - - public function __construct($content, $path) - { - $this->type = Net_URL_Mapper_Part::FIXED; - parent::__construct($content, $path); - } - - public function getFormat() - { - return $this->getRule(); - } - - public function getRule() - { - return preg_quote($this->path, '/'); - } - - public function generate($value = null) - { - return $this->path; - } -} -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Part/Wildcard.php b/extlib/Net/URL/Mapper/Part/Wildcard.php deleted file mode 100644 index 84e29e1306..0000000000 --- a/extlib/Net/URL/Mapper/Part/Wildcard.php +++ /dev/null @@ -1,80 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Wildcard.php 232857 2007-03-28 10:23:04Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL/Mapper/Part.php'; - -class Net_URL_Mapper_Part_Wildcard extends Net_URL_Mapper_Part -{ - - public function __construct($content, $path) - { - $this->type = Net_URL_Mapper_Part::WILDCARD; - $this->setRequired(true); - parent::__construct($content, $path); - } - - public function getFormat() - { - return $this->addSlashRegex('.*');; - } - - public function getRule() - { - return '(?P<'.$this->content.'>'.$this->addSlashRegex('.*').')'; - } - - public function generate($value = null) - { - if (is_array($value) && isset($value[$this->content])) { - $val = $value[$this->content]; - } elseif (!is_array($value) && !is_null($value)) { - $val = $value; - } else { - $val = $this->defaults; - } - return $this->addSlash(str_replace( - array('%2F', '%23'), - array('/', '#'), urlencode($val))); - } -} -?> \ No newline at end of file diff --git a/extlib/Net/URL/Mapper/Path.php b/extlib/Net/URL/Mapper/Path.php deleted file mode 100644 index b459fa1fd3..0000000000 --- a/extlib/Net/URL/Mapper/Path.php +++ /dev/null @@ -1,451 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Path.php 296456 2010-03-20 00:41:08Z kguest $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL.php'; -require_once 'Net/URL/Mapper/Part/Dynamic.php'; -require_once 'Net/URL/Mapper/Part/Wildcard.php'; -require_once 'Net/URL/Mapper/Part/Fixed.php'; - -class Net_URL_Mapper_Path -{ - private $path = ''; - private $N = 0; - public $token; - public $value; - private $line = 1; - private $state = 1; - - - protected $alias; - protected $rules = array(); - protected $defaults = array(); - protected $parts = array(); - protected $rule; - protected $format; - protected $minKeys; - protected $maxKeys; - protected $fixed = true; - protected $required; - - public function __construct($path = '', $defaults = array(), $rules = array()) - { - $this->path = '/'.trim(Net_URL::resolvePath($path), '/'); - $this->setDefaults($defaults); - $this->setRules($rules); - - try { - $this->parsePath(); - } catch (Exception $e) { - // The path could not be parsed correctly, treat it as fixed - $this->fixed = true; - $part = self::createPart(Net_URL_Mapper_Part::FIXED, $this->path, $this->path); - $this->parts = array($part); - } - $this->getRequired(); - } - - /** - * Called when the object is serialized - * Make sure we do not store too much info when the object is serialized - * and call the regular expressions generator functions so that they will - * not need to be generated again on wakeup. - * - * @return array Name of properties to store when serialized - */ - public function __sleep() - { - $this->getFormat(); - $this->getRule(); - return array('alias', 'path', 'defaults', 'rule', 'format', - 'parts', 'minKeys', 'maxKeys', 'fixed', 'required'); - } - - public function getPath() - { - return $this->path; - } - - protected function parsePath() - { - while ($this->yylex()) { } - } - - /** - * Get the path alias - * Path aliases can be used instead of full path - * @return null|string - */ - public function getAlias() - { - return $this->alias; - } - - /** - * Set the path name - * @param string Set the path name - * @see getAlias() - */ - public function setAlias($alias) - { - $this->alias = $alias; - return $this; - } - - /** - * Get the path parts default values - * @return null|array - */ - public function getDefaults() - { - return $this->defaults; - } - - /** - * Set the path parts default values - * @param array Associative array with format partname => value - */ - public function setDefaults($defaults) - { - if (is_array($defaults)) { - $this->defaults = $defaults; - } else { - $this->defaults = array(); - } - } - - /** - * Set the path parts default values - * @param array Associative array with format partname => value - */ - public function setRules($rules) - { - if (is_array($rules)) { - $this->rules = $rules; - } else { - $this->rules = array(); - } - } - - /** - * Returns the regular expression used to match this path - * @return string PERL Regular expression - */ - public function getRule() - { - if (is_null($this->rule)) { - $this->rule = '/^'; - foreach ($this->parts as $path => $part) { - $this->rule .= $part->getRule(); - } - $this->rule .= '$/'; - } - return $this->rule; - } - - public function getFormat() - { - if (is_null($this->format)) { - $this->format = '/^'; - foreach ($this->parts as $path => $part) { - $this->format .= $part->getFormat(); - } - $this->format .= '$/'; - } - return $this->format; - } - - protected function addPart($part) - { - if (array_key_exists($part->content, $this->defaults)) { - $part->setRequired(false); - $part->setDefaults($this->defaults[$part->content]); - } - if (isset($this->rules[$part->content])) { - $part->setRule($this->rules[$part->content]); - } - $this->rule = null; - if ($part->getType() != Net_URL_Mapper_Part::FIXED) { - $this->fixed = false; - $this->parts[$part->content] = $part; - } else { - $this->parts[] = $part; - } - return $part; - } - - public static function createPart($type, $content, $path) - { - switch ($type) { - case Net_URL_Mapper_Part::DYNAMIC: - return new Net_URL_Mapper_Part_Dynamic($content, $path); - break; - case Net_URL_Mapper_Part::WILDCARD: - return new Net_URL_Mapper_Part_Wildcard($content, $path); - break; - default: - return new Net_URL_Mapper_Part_Fixed($content, $path); - } - } - - /** - * Checks whether the path contains the given part by name - * If value parameter is given, the part also checks if the - * given value conforms to the part rule. - * @param string Part name - * @param mixed The value to check against - */ - public function hasKey($partName, $value = null) - { - if (array_key_exists($partName, $this->parts)) { - if (!is_null($value) && $value !== false) { - return $this->parts[$partName]->match($value); - } else { - return true; - } - } elseif (array_key_exists($partName, $this->defaults) && - $value == $this->defaults[$partName]) { - return true; - } - return false; - } - - public function generate($values = array(), $qstring = array(), $anchor = '') - { - $path = ''; - foreach ($this->parts as $part) { - $path .= $part->generate($values); - } - $path = '/'.trim(Net_URL::resolvePath($path), '/'); - if (!empty($qstring)) { - if(strpos($path, '?') === false) { - $path .= '?'; - } else { - $path .= '&'; - } - $path .= http_build_query($qstring); - } - if (!empty($anchor)) { - $path .= '#'.ltrim($anchor, '#'); - } - return $path; - } - - public function getRequired() - { - if (!isset($this->required)) { - $req = array(); - foreach ($this->parts as $part) { - if ($part->isRequired()) { - $req[] = $part->content; - } - } - $this->required = $req; - } - return $this->required; - } - - public function getMaxKeys() - { - if (is_null($this->maxKeys)) { - $this->maxKeys = count($this->required); - $this->maxKeys += count($this->defaults); - } - return $this->maxKeys; - } - - - - - private $_yy_state = 1; - private $_yy_stack = array(); - - function yylex() - { - return $this->{'yylex' . $this->_yy_state}(); - } - - function yypushstate($state) - { - array_push($this->_yy_stack, $this->_yy_state); - $this->_yy_state = $state; - } - - function yypopstate() - { - $this->_yy_state = array_pop($this->_yy_stack); - } - - function yybegin($state) - { - $this->_yy_state = $state; - } - - - - function yylex1() - { - $tokenMap = array ( - 1 => 1, - 3 => 1, - 5 => 1, - 7 => 1, - 9 => 1, - ); - if ($this->N >= strlen($this->path)) { - return false; // end of input - } - $yy_global_pattern = "/^(\/?:\/?\\(([a-zA-Z0-9_]+)\\))|^(\/?\\*\/?\\(([a-zA-Z0-9_]+)\\))|^(\/?:([a-zA-Z0-9_]+))|^(\/?\\*([a-zA-Z0-9_]+))|^(\/?([^\/:*]+))/"; - - do { - if (preg_match($yy_global_pattern, substr($this->path, $this->N), $yymatches)) { - $yysubmatches = $yymatches; - $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns - if (!count($yymatches)) { - throw new Exception('Error: lexing failed because a rule matched' . - 'an empty string. Input "' . substr($this->path, - $this->N, 5) . '... state START'); - } - next($yymatches); // skip global match - $this->token = key($yymatches); // token number - if ($tokenMap[$this->token]) { - // extract sub-patterns for passing to lex function - $yysubmatches = array_slice($yysubmatches, $this->token + 1, - $tokenMap[$this->token]); - } else { - $yysubmatches = array(); - } - $this->value = current($yymatches); // token value - $r = $this->{'yy_r1_' . $this->token}($yysubmatches); - if ($r === null) { - $this->N += strlen($this->value); - $this->line += substr_count("\n", $this->value); - // accept this token - return true; - } elseif ($r === true) { - // we have changed state - // process this token in the new state - return $this->yylex(); - } elseif ($r === false) { - $this->N += strlen($this->value); - $this->line += substr_count("\n", $this->value); - if ($this->N >= strlen($this->path)) { - return false; // end of input - } - // skip this token - continue; - } else { $yy_yymore_patterns = array( - 1 => "^(\/?\\*\/?\\(([a-zA-Z0-9_]+)\\))|^(\/?:([a-zA-Z0-9_]+))|^(\/?\\*([a-zA-Z0-9_]+))|^(\/?([^\/:*]+))", - 3 => "^(\/?:([a-zA-Z0-9_]+))|^(\/?\\*([a-zA-Z0-9_]+))|^(\/?([^\/:*]+))", - 5 => "^(\/?\\*([a-zA-Z0-9_]+))|^(\/?([^\/:*]+))", - 7 => "^(\/?([^\/:*]+))", - 9 => "", - ); - - // yymore is needed - do { - if (!strlen($yy_yymore_patterns[$this->token])) { - throw new Exception('cannot do yymore for the last token'); - } - if (preg_match($yy_yymore_patterns[$this->token], - substr($this->path, $this->N), $yymatches)) { - $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns - next($yymatches); // skip global match - $this->token = key($yymatches); // token number - $this->value = current($yymatches); // token value - $this->line = substr_count("\n", $this->value); - } - } while ($this->{'yy_r1_' . $this->token}() !== null); - // accept - $this->N += strlen($this->value); - $this->line += substr_count("\n", $this->value); - return true; - } - } else { - throw new Exception('Unexpected input at line' . $this->line . - ': ' . $this->path[$this->N]); - } - break; - } while (true); - } // end function - - - const START = 1; - function yy_r1_1($yy_subpatterns) - { - - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::DYNAMIC, $c, $this->value); - $this->addPart($part); - } - function yy_r1_3($yy_subpatterns) - { - - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::WILDCARD, $c, $this->value); - $this->addPart($part); - } - function yy_r1_5($yy_subpatterns) - { - - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::DYNAMIC, $c, $this->value); - $this->addPart($part); - } - function yy_r1_7($yy_subpatterns) - { - - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::WILDCARD, $c, $this->value); - $this->addPart($part); - } - function yy_r1_9($yy_subpatterns) - { - - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::FIXED, $c, $this->value); - $this->addPart($part); - } - -} - -?> diff --git a/extlib/Net/URL/Mapper/Path.plex b/extlib/Net/URL/Mapper/Path.plex deleted file mode 100644 index c5ef1f88ea..0000000000 --- a/extlib/Net/URL/Mapper/Path.plex +++ /dev/null @@ -1,334 +0,0 @@ - - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * The names of the authors may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS - * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category Net - * @package Net_URL_Mapper - * @author Bertrand Mansion - * @license http://opensource.org/licenses/bsd-license.php New BSD License - * @version CVS: $Id: Path.plex 283937 2009-07-12 11:37:21Z mansion $ - * @link http://pear.php.net/package/Net_URL_Mapper - */ - -require_once 'Net/URL/Mapper/Part/Dynamic.php'; -require_once 'Net/URL/Mapper/Part/Wildcard.php'; -require_once 'Net/URL/Mapper/Part/Fixed.php'; - -class Net_URL_Mapper_Path -{ - private $path = ''; - private $N = 0; - public $token; - public $value; - private $line = 1; - private $state = 1; - - - protected $alias; - protected $rules = array(); - protected $defaults = array(); - protected $parts = array(); - protected $rule; - protected $format; - protected $minKeys; - protected $maxKeys; - protected $fixed = true; - protected $required; - - public function __construct($path = '', $defaults = array(), $rules = array()) - { - $this->path = '/'.trim(Net_URL::resolvePath($path), '/'); - $this->setDefaults($defaults); - $this->setRules($rules); - - try { - $this->parsePath(); - } catch (Exception $e) { - // The path could not be parsed correctly, treat it as fixed - $this->fixed = true; - $part = self::createPart(Net_URL_Mapper_Part::FIXED, $this->path, $this->path); - $this->parts = array($part); - } - $this->getRequired(); - } - - /** - * Called when the object is serialized - * Make sure we do not store too much info when the object is serialized - * and call the regular expressions generator functions so that they will - * not need to be generated again on wakeup. - * - * @return array Name of properties to store when serialized - */ - public function __sleep() - { - $this->getFormat(); - $this->getRule(); - return array('alias', 'path', 'defaults', 'rule', 'format', - 'parts', 'minKeys', 'maxKeys', 'fixed', 'required'); - } - - public function getPath() - { - return $this->path; - } - - protected function parsePath() - { - while ($this->yylex()) { } - } - - /** - * Get the path alias - * Path aliases can be used instead of full path - * @return null|string - */ - public function getAlias() - { - return $this->alias; - } - - /** - * Set the path name - * @param string Set the path name - * @see getAlias() - */ - public function setAlias($alias) - { - $this->alias = $alias; - return $this; - } - - /** - * Get the path parts default values - * @return null|array - */ - public function getDefaults() - { - return $this->defaults; - } - - /** - * Set the path parts default values - * @param array Associative array with format partname => value - */ - public function setDefaults($defaults) - { - if (is_array($defaults)) { - $this->defaults = $defaults; - } else { - $this->defaults = array(); - } - } - - /** - * Set the path parts default values - * @param array Associative array with format partname => value - */ - public function setRules($rules) - { - if (is_array($rules)) { - $this->rules = $rules; - } else { - $this->rules = array(); - } - } - - /** - * Returns the regular expression used to match this path - * @return string PERL Regular expression - */ - public function getRule() - { - if (is_null($this->rule)) { - $this->rule = '/^'; - foreach ($this->parts as $path => $part) { - $this->rule .= $part->getRule(); - } - $this->rule .= '$/'; - } - return $this->rule; - } - - public function getFormat() - { - if (is_null($this->format)) { - $this->format = '/^'; - foreach ($this->parts as $path => $part) { - $this->format .= $part->getFormat(); - } - $this->format .= '$/'; - } - return $this->format; - } - - protected function addPart($part) - { - if (array_key_exists($part->content, $this->defaults)) { - $part->setRequired(false); - $part->setDefaults($this->defaults[$part->content]); - } - if (isset($this->rules[$part->content])) { - $part->setRule($this->rules[$part->content]); - } - $this->rule = null; - if ($part->getType() != Net_URL_Mapper_Part::FIXED) { - $this->fixed = false; - $this->parts[$part->content] = $part; - } else { - $this->parts[] = $part; - } - return $part; - } - - public static function createPart($type, $content, $path) - { - switch ($type) { - case Net_URL_Mapper_Part::DYNAMIC: - return new Net_URL_Mapper_Part_Dynamic($content, $path); - break; - case Net_URL_Mapper_Part::WILDCARD: - return new Net_URL_Mapper_Part_Wildcard($content, $path); - break; - default: - return new Net_URL_Mapper_Part_Fixed($content, $path); - } - } - - /** - * Checks whether the path contains the given part by name - * If value parameter is given, the part also checks if the - * given value conforms to the part rule. - * @param string Part name - * @param mixed The value to check against - */ - public function hasKey($partName, $value = null) - { - if (array_key_exists($partName, $this->parts)) { - if (!is_null($value) && $value !== false) { - return $this->parts[$partName]->match($value); - } else { - return true; - } - } elseif (array_key_exists($partName, $this->defaults) && - $value == $this->defaults[$partName]) { - return true; - } - return false; - } - - public function generate($values = array(), $qstring = array(), $anchor = '') - { - $path = ''; - foreach ($this->parts as $part) { - $path .= $part->generate($values); - } - $path = '/'.trim(Net_URL::resolvePath($path), '/'); - if (!empty($qstring)) { - $path .= '?'.http_build_query($qstring); - } - if (!empty($anchor)) { - $path .= '#'.ltrim($anchor, '#'); - } - return $path; - } - - public function getRequired() - { - if (!isset($this->required)) { - $req = array(); - foreach ($this->parts as $part) { - if ($part->isRequired()) { - $req[] = $part->content; - } - } - $this->required = $req; - } - return $this->required; - } - - public function getMaxKeys() - { - if (is_null($this->maxKeys)) { - $this->maxKeys = count($this->required); - $this->maxKeys += count($this->defaults); - } - return $this->maxKeys; - } - - - -/*!lex2php -%input $this->path -%counter $this->N -%token $this->token -%value $this->value -%line $this->line -static = /\/?([^\/:\*]+)/ -variable = /([a-zA-Z0-9_]+)/ -dynamic = /\/?:/ -wildcard = @/?\*@ -grouping = /\/?\(([a-zA-Z0-9_]+)\)/ -*/ -/*!lex2php -%statename START -dynamic grouping { - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::DYNAMIC, $c, $this->value); - $this->addPart($part); -} -wildcard grouping { - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::WILDCARD, $c, $this->value); - $this->addPart($part); -} -dynamic variable { - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::DYNAMIC, $c, $this->value); - $this->addPart($part); -} -wildcard variable { - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::WILDCARD, $c, $this->value); - $this->addPart($part); -} -static { - $c = $yy_subpatterns[0]; - $part = self::createPart(Net_URL_Mapper_Part::FIXED, $c, $this->value); - $this->addPart($part); -} -*/ -} - -?> \ No newline at end of file diff --git a/lib/router.php b/lib/router.php index 180d8f791b..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 * @@ -136,19 +69,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 +80,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,7 +104,7 @@ class Router function initialize() { - $m = StatusNet_URL_Mapper::getInstance(); + $m = new URLMapper(); if (Event::handle('StartInitializeRouter', array(&$m))) { @@ -1139,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. @@ -1161,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... diff --git a/lib/urlmapper.php b/lib/urlmapper.php new file mode 100644 index 0000000000..f16bf128ef --- /dev/null +++ b/lib/urlmapper.php @@ -0,0 +1,249 @@ +. + * + * @category Cache + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * URL mapper + * + * Converts a path into a set of parameters, and vice versa + * + * We used to use Net_URL_Mapper, so there's a wrapper class at Router, q.v. + * + * NUM's vagaries are the main reason we have weirdnesses here. + * + * @category URL + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class URLMapper +{ + const ACTION = 'action'; + + protected $statics = array(); + protected $variables = array(); + protected $reverse = array(); + + function connect($path, $args, $paramPatterns=array()) + { + if (!array_key_exists(self::ACTION, $args)) { + throw new Exception(sprintf("Can't connect %s; path has no action.", $path)); + } + + $action = $args[self::ACTION]; + + $paramNames = $this->getParamNames($path); + + if (empty($paramNames)) { + $this->statics[$path] = $args; + if (array_key_exists($action, $this->reverse)) { + $this->reverse[$args[self::ACTION]][] = array($args, $path); + } else { + $this->reverse[$args[self::ACTION]] = array(array($args, $path)); + } + } else { + + // Eff if I understand why some go here and some go there. + // Anyways, fixup my preconceptions + + foreach ($paramNames as $name) { + if (!array_key_exists($name, $paramPatterns) && + array_key_exists($name, $args)) { + $paramPatterns[$name] = $args[$name]; + unset($args[$name]); + } + } + + $regex = $this->makeRegex($path, $paramPatterns); + + $this->variables[] = array($args, $regex, $paramNames); + + $format = $this->makeFormat($path, $paramPatterns); + + if (array_key_exists($action, $this->reverse)) { + $this->reverse[$args[self::ACTION]][] = array($args, $format, $paramNames); + } else { + $this->reverse[$args[self::ACTION]] = array(array($args, $format, $paramNames)); + } + } + } + + function match($path) + { + if (array_key_exists($path, $this->statics)) { + return $this->statics[$path]; + } + + foreach ($this->variables as $pattern) { + list($args, $regex, $paramNames) = $pattern; + if (preg_match($regex, $path, $match)) { + $results = $args; + foreach ($paramNames as $name) { + $results[$name] = $match[$name]; + } + return $results; + } + } + + throw new Exception(sprintf('No match for path "%s"', $path)); + } + + function generate($args, $qstring, $fragment) + { + if (!array_key_exists(self::ACTION, $args)) { + throw new Exception("Every path needs an action."); + } + + $action = $args[self::ACTION]; + + if (!array_key_exists($action, $this->reverse)) { + throw new Exception(sprintf('No candidate paths for action "%s"', $action)); + } + + $candidates = $this->reverse[$action]; + + foreach ($candidates as $candidate) { + if (count($candidate) == 2) { // static + list($tryArgs, $tryPath) = $candidate; + foreach ($tryArgs as $key => $value) { + if (!array_key_exists($key, $args) || $args[$key] != $value) { + // next candidate + continue 2; + } + } + // success + $path = $tryPath; + } else { + list($tryArgs, $format, $paramNames) = $candidate; + + foreach ($tryArgs as $key => $value) { + if (!array_key_exists($key, $args) || $args[$key] != $value) { + // next candidate + continue 2; + } + } + + // success + + $toFormat = array(); + + foreach ($paramNames as $name) { + if (!array_key_exists($name, $args)) { + // next candidate + continue 2; + } + $toFormat[] = $args[$name]; + } + + $path = vsprintf($format, $toFormat); + } + + if (!empty($qstring)) { + $formatted = http_build_query($qstring); + $path .= '?' . $formatted; + } + + return $path; + } + + // failure; some reporting twiddles + + unset($args['action']); + + if (empty($args)) { + throw new Exception(sprintf('No matches for action "%s"', $action)); + } + + $argstring = ''; + + foreach ($args as $key => $value) { + $argstring .= "$key=$value "; + } + + throw new Exception(sprintf('No matches for action "%s" with arguments "%s"', $action, $argstring)); + } + + protected function getParamNames($path) + { + preg_match_all('/:(?P\w+)/', $path, $match); + return $match['name']; + } + + protected function makeRegex($path, $paramPatterns) + { + $pr = new PatternReplacer($paramPatterns); + + $regex = preg_replace_callback('/:(\w+)/', + array($pr, 'toPattern'), + $path); + + $regex = '#' . str_replace('#', '\#', $regex) . '#'; + + return $regex; + } + + protected function makeFormat($path, $paramPatterns) + { + $format = preg_replace('/(:\w+)/', '%s', $path); + + return $format; + } +} + +class PatternReplacer +{ + private $patterns; + + function __construct($patterns) + { + $this->patterns = $patterns; + } + + function toPattern($matches) + { + // trim out the : + $name = $matches[1]; + if (array_key_exists($name, $this->patterns)) { + $pattern = $this->patterns[$name]; + } else { + // ??? + $pattern = '\w+'; + } + return '(?P<'.$name.'>'.$pattern.')'; + } +} diff --git a/lib/util.php b/lib/util.php index ba705eb7fa..49764f86a5 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1237,12 +1237,12 @@ function common_local_url($action, $args=null, $params=null, $fragment=null, $ad $ssl = common_is_sensitive($action); if (common_config('site','fancy')) { - $url = common_path(mb_substr($path, 1), $ssl, $addSession); + $url = common_path($path, $ssl, $addSession); } else { if (mb_strpos($path, '/index.php') === 0) { - $url = common_path(mb_substr($path, 1), $ssl, $addSession); + $url = common_path($path, $ssl, $addSession); } else { - $url = common_path('index.php'.$path, $ssl, $addSession); + $url = common_path('index.php/'.$path, $ssl, $addSession); } } Event::handle('EndLocalURL', array(&$action, &$params, &$fragment, &$addSession, &$url)); @@ -2312,3 +2312,31 @@ function common_is_email($str) { return (strpos($str, '@') !== false); } + +function common_init_stats() +{ + global $_mem, $_ts; + + $_mem = memory_get_usage(true); + $_ts = microtime(true); +} + +function common_log_delta($comment=null) +{ + global $_mem, $_ts; + + $mold = $_mem; + $told = $_ts; + + $_mem = memory_get_usage(true); + $_ts = microtime(true); + + $mtotal = $_mem - $mold; + $ttotal = $_ts - $told; + + if (empty($comment)) { + $comment = 'Delta'; + } + + common_debug(sprintf("%s: %d %d", $comment, $mtotal, round($ttotal * 1000000))); +} diff --git a/plugins/Directory/DirectoryPlugin.php b/plugins/Directory/DirectoryPlugin.php index ad7fc82049..06cfca02ef 100644 --- a/plugins/Directory/DirectoryPlugin.php +++ b/plugins/Directory/DirectoryPlugin.php @@ -132,6 +132,11 @@ class DirectoryPlugin extends Plugin array('filter' => '([0-9a-zA-Z_]{1,64}|0-9)') ); + $m->connect( + 'groups', + array('action' => 'groupdirectory') + ); + return true; }