Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /**
- * @version $Id: uri.php 19058 2010-10-08 04:15:39Z dextercowley $
- * @package Joomla.Framework
- * @subpackage Environment
- * @copyright Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
- * @license GNU/GPL, see LICENSE.php
- * Joomla! is free software. This version may have been modified pursuant
- * to the GNU General Public License, and as distributed it includes or
- * is derivative of works licensed under the GNU General Public License or
- * other free or open source software licenses.
- * See COPYRIGHT.php for copyright notices and details.
- */
- // Check to ensure this file is within the rest of the framework
- defined('JPATH_BASE') or die();
- /**
- * JURI Class
- *
- * This class serves two purposes. First to parse a URI and provide a common interface
- * for the Joomla Framework to access and manipulate a URI. Second to attain the URI of
- * the current executing script from the server regardless of server.
- *
- * @package Joomla.Framework
- * @subpackage Environment
- * @since 1.5
- */
- class JURI extends JObject
- {
- /**
- * Original URI
- *
- * @var string
- */
- var $_uri = null;
- /**
- * Protocol
- *
- * @var string
- */
- var $_scheme = null;
- /**
- * Host
- *
- * @var string
- */
- var $_host = null;
- /**
- * Port
- *
- * @var integer
- */
- var $_port = null;
- /**
- * Username
- *
- * @var string
- */
- var $_user = null;
- /**
- * Password
- *
- * @var string
- */
- var $_pass = null;
- /**
- * Path
- *
- * @var string
- */
- var $_path = null;
- /**
- * Query
- *
- * @var string
- */
- var $_query = null;
- /**
- * Anchor
- *
- * @var string
- */
- var $_fragment = null;
- /**
- * Query variable hash
- *
- * @var array
- */
- var $_vars = array ();
- /**
- * Constructor.
- * You can pass a URI string to the constructor to initialize a specific URI.
- *
- * @param string $uri The optional URI string
- */
- function __construct($uri = null)
- {
- if ($uri !== null) {
- $this->parse($uri);
- }
- }
- /**
- * Returns a reference to a global JURI object, only creating it
- * if it doesn't already exist.
- *
- * This method must be invoked as:
- * <pre> $uri =& JURI::getInstance([$uri]);</pre>
- *
- * @static
- * @param string $uri The URI to parse. [optional: if null uses script URI]
- * @return JURI The URI object.
- * @since 1.5
- */
- function &getInstance($uri = 'SERVER')
- {
- static $instances = array();
- if (!isset ($instances[$uri]))
- {
- // Are we obtaining the URI from the server?
- if ($uri == 'SERVER')
- {
- // Determine if the request was over SSL (HTTPS)
- if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off')) {
- $https = 's://';
- } else {
- $https = '://';
- }
- /*
- * Since we are assigning the URI from the server variables, we first need
- * to determine if we are running on apache or IIS. If PHP_SELF and REQUEST_URI
- * are present, we will assume we are running on apache.
- */
- if (!empty ($_SERVER['PHP_SELF']) && !empty ($_SERVER['REQUEST_URI'])) {
- /*
- * To build the entire URI we need to prepend the protocol, and the http host
- * to the URI string.
- */
- $theURI = 'http' . $https . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
- /*
- * Since we do not have REQUEST_URI to work with, we will assume we are
- * running on IIS and will therefore need to work some magic with the SCRIPT_NAME and
- * QUERY_STRING environment variables.
- */
- if (strlen($_SERVER['QUERY_STRING']) && strpos($_SERVER['REQUEST_URI'], $_SERVER['QUERY_STRING']) === false) {
- $theURI .= '?'.$_SERVER['QUERY_STRING'];
- }
- }
- else
- {
- // IIS uses the SCRIPT_NAME variable instead of a REQUEST_URI variable... thanks, MS
- $theURI = 'http' . $https . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];
- // If the query string exists append it to the URI string
- if (isset($_SERVER['QUERY_STRING']) && !empty($_SERVER['QUERY_STRING'])) {
- $theURI .= '?' . $_SERVER['QUERY_STRING'];
- }
- }
- // Now we need to clean what we got since we can't trust the server var
- // Need to check that the URI is fully decoded in case of multiple-encoded attack vectors.
- $halt = 0;
- while (true)
- {
- $last = $theURI;
- $theURI = urldecode($theURI);
- // Check whether the last decode is equal to the first.
- if ($theURI == $last) {
- // Break out of the while if the URI is stable.
- break;
- }
- else if (++$halt > 10) {
- // Runaway check. URI has been seriously compromised.
- jexit();
- }
- }
- $theURI = str_replace('"', '"',$theURI);
- $theURI = str_replace('<', '<',$theURI);
- $theURI = str_replace('>', '>',$theURI);
- $theURI = preg_replace('/eval\((.*)\)/', '', $theURI);
- $theURI = preg_replace('/[\\\"\\\'][\\s]*javascript:(.*)[\\\"\\\']/', '""', $theURI);
- }
- else
- {
- // We were given a URI
- $theURI = $uri;
- }
- // Create the new JURI instance
- $instances[$uri] = new JURI($theURI);
- }
- return $instances[$uri];
- }
- /**
- * Returns the base URI for the request.
- *
- * @access public
- * @static
- * @param boolean $pathonly If false, prepend the scheme, host and port information. Default is false.
- * @return string The base URI string
- * @since 1.5
- */
- function base($pathonly = false)
- {
- static $base;
- // Get the base request path
- if (!isset($base))
- {
- $config =& JFactory::getConfig();
- $live_site = $config->getValue('config.live_site');
- if(trim($live_site) != '') {
- $uri =& JURI::getInstance($live_site);
- $base['prefix'] = $uri->toString( array('scheme', 'host', 'port'));
- $base['path'] = rtrim($uri->toString( array('path')), '/\\');
- if(JPATH_BASE == JPATH_ADMINISTRATOR) {
- $base['path'] .= '/administrator';
- }
- } else {
- $uri =& JURI::getInstance();
- $base['prefix'] = $uri->toString( array('scheme', 'host', 'port'));
- if (strpos(php_sapi_name(), 'cgi') !== false && !empty($_SERVER['REQUEST_URI'])) {
- //Apache CGI
- $base['path'] = rtrim(dirname(str_replace(array('"', '<', '>', "'"), '', $_SERVER["PHP_SELF"])), '/\\');
- } else {
- //Others
- $base['path'] = rtrim(dirname($_SERVER['SCRIPT_NAME']), '/\\');
- }
- }
- }
- return $pathonly === false ? $base['prefix'].$base['path'].'/' : $base['path'];
- }
- /**
- * Returns the root URI for the request.
- *
- * @access public
- * @static
- * @param boolean $pathonly If false, prepend the scheme, host and port information. Default is false.
- * @return string The root URI string
- * @since 1.5
- */
- function root($pathonly = false, $path = null)
- {
- static $root;
- // Get the scheme
- if(!isset($root))
- {
- $uri =& JURI::getInstance(JURI::base());
- $root['prefix'] = $uri->toString( array('scheme', 'host', 'port') );
- $root['path'] = rtrim($uri->toString( array('path') ), '/\\');
- }
- // Get the scheme
- if(isset($path)) {
- $root['path'] = $path;
- }
- return $pathonly === false ? $root['prefix'].$root['path'].'/' : $root['path'];
- }
- /**
- * Returns the URL for the request, minus the query
- *
- * @access public
- * @return string
- * @since 1.5
- */
- function current()
- {
- static $current;
- // Get the current URL
- if (!isset($current))
- {
- $uri = & JURI::getInstance();
- $current = $uri->toString( array('scheme', 'host', 'port', 'path'));
- }
- return $current;
- }
- /**
- * Parse a given URI and populate the class fields
- *
- * @access public
- * @param string $uri The URI string to parse
- * @return boolean True on success
- * @since 1.5
- */
- function parse($uri)
- {
- //Initialize variables
- $retval = false;
- // Set the original URI to fall back on
- $this->_uri = $uri;
- /*
- * Parse the URI and populate the object fields. If URI is parsed properly,
- * set method return value to true.
- */
- if ($_parts = $this->_parseURL($uri)) {
- $retval = true;
- }
- //We need to replace & with & for parse_str to work right...
- if(isset ($_parts['query']) && strpos($_parts['query'], '&')) {
- $_parts['query'] = str_replace('&', '&', $_parts['query']);
- }
- $this->_scheme = isset ($_parts['scheme']) ? $_parts['scheme'] : null;
- $this->_user = isset ($_parts['user']) ? $_parts['user'] : null;
- $this->_pass = isset ($_parts['pass']) ? $_parts['pass'] : null;
- $this->_host = isset ($_parts['host']) ? $_parts['host'] : null;
- $this->_port = isset ($_parts['port']) ? $_parts['port'] : null;
- $this->_path = isset ($_parts['path']) ? $_parts['path'] : null;
- $this->_query = isset ($_parts['query'])? $_parts['query'] : null;
- $this->_fragment = isset ($_parts['fragment']) ? $_parts['fragment'] : null;
- //parse the query
- if(isset ($_parts['query'])) parse_str($_parts['query'], $this->_vars);
- return $retval;
- }
- /**
- * Returns full uri string
- *
- * @access public
- * @param array $parts An array specifying the parts to render
- * @return string The rendered URI string
- * @since 1.5
- */
- function toString($parts = array('scheme', 'user', 'pass', 'host', 'port', 'path', 'query', 'fragment'))
- {
- $query = $this->getQuery(); //make sure the query is created
- $uri = '';
- $uri .= in_array('scheme', $parts) ? (!empty($this->_scheme) ? $this->_scheme.'://' : '') : '';
- $uri .= in_array('user', $parts) ? $this->_user : '';
- $uri .= in_array('pass', $parts) ? (!empty ($this->_pass) ? ':' : '') .$this->_pass. (!empty ($this->_user) ? '@' : '') : '';
- $uri .= in_array('host', $parts) ? $this->_host : '';
- $uri .= in_array('port', $parts) ? (!empty ($this->_port) ? ':' : '').$this->_port : '';
- $uri .= in_array('path', $parts) ? $this->_path : '';
- $uri .= in_array('query', $parts) ? (!empty ($query) ? '?'.$query : '') : '';
- $uri .= in_array('fragment', $parts)? (!empty ($this->_fragment) ? '#'.$this->_fragment : '') : '';
- return $uri;
- }
- /**
- * Adds a query variable and value, replacing the value if it
- * already exists and returning the old value.
- *
- * @access public
- * @param string $name Name of the query variable to set
- * @param string $value Value of the query variable
- * @return string Previous value for the query variable
- * @since 1.5
- */
- function setVar($name, $value)
- {
- $tmp = @$this->_vars[$name];
- $this->_vars[$name] = $value;
- //empty the query
- $this->_query = null;
- return $tmp;
- }
- /**
- * Returns a query variable by name
- *
- * @access public
- * @param string $name Name of the query variable to get
- * @return array Query variables
- * @since 1.5
- */
- function getVar($name = null, $default=null)
- {
- if(isset($this->_vars[$name])) {
- return $this->_vars[$name];
- }
- return $default;
- }
- /**
- * Removes an item from the query string variables if it exists
- *
- * @access public
- * @param string $name Name of variable to remove
- * @since 1.5
- */
- function delVar($name)
- {
- if (in_array($name, array_keys($this->_vars)))
- {
- unset ($this->_vars[$name]);
- //empty the query
- $this->_query = null;
- }
- }
- /**
- * Sets the query to a supplied string in format:
- * foo=bar&x=y
- *
- * @access public
- * @param mixed (array|string) $query The query string
- * @since 1.5
- */
- function setQuery($query)
- {
- if(!is_array($query)) {
- if(strpos($query, '&') !== false)
- {
- $query = str_replace('&','&',$query);
- }
- parse_str($query, $this->_vars);
- }
- if(is_array($query)) {
- $this->_vars = $query;
- }
- //empty the query
- $this->_query = null;
- }
- /**
- * Returns flat query string
- *
- * @access public
- * @return string Query string
- * @since 1.5
- */
- function getQuery($toArray = false)
- {
- if($toArray) {
- return $this->_vars;
- }
- //If the query is empty build it first
- if(is_null($this->_query)) {
- $this->_query = $this->buildQuery($this->_vars);
- }
- return $this->_query;
- }
- /**
- * Build a query from a array (reverse of the PHP parse_str())
- *
- * @access public
- * @return string The resulting query string
- * @since 1.5
- * @see parse_str()
- */
- function buildQuery ($params, $akey = null)
- {
- if ( !is_array($params) || count($params) == 0 ) {
- return false;
- }
- $out = array();
- //reset in case we are looping
- if( !isset($akey) && !count($out) ) {
- unset($out);
- $out = array();
- }
- foreach ( $params as $key => $val )
- {
- if ( is_array($val) ) {
- $out[] = JURI::buildQuery($val,$key);
- continue;
- }
- $thekey = ( !$akey ) ? $key : $akey.'['.$key.']';
- $out[] = $thekey."=".urlencode($val);
- }
- return implode("&",$out);
- }
- /**
- * Get URI scheme (protocol)
- * ie. http, https, ftp, etc...
- *
- * @access public
- * @return string The URI scheme
- * @since 1.5
- */
- function getScheme() {
- return $this->_scheme;
- }
- /**
- * Set URI scheme (protocol)
- * ie. http, https, ftp, etc...
- *
- * @access public
- * @param string $scheme The URI scheme
- * @since 1.5
- */
- function setScheme($scheme) {
- $this->_scheme = $scheme;
- }
- /**
- * Get URI username
- * returns the username, or null if no username was specified
- *
- * @access public
- * @return string The URI username
- * @since 1.5
- */
- function getUser() {
- return $this->_user;
- }
- /**
- * Set URI username
- *
- * @access public
- * @param string $user The URI username
- * @since 1.5
- */
- function setUser($user) {
- $this->_user = $user;
- }
- /**
- * Get URI password
- * returns the password, or null if no password was specified
- *
- * @access public
- * @return string The URI password
- * @since 1.5
- */
- function getPass() {
- return $this->_pass;
- }
- /**
- * Set URI password
- *
- * @access public
- * @param string $pass The URI password
- * @since 1.5
- */
- function setPass($pass) {
- $this->_pass = $pass;
- }
- /**
- * Get URI host
- * returns the hostname/ip, or null if no hostname/ip was specified
- *
- * @access public
- * @return string The URI host
- * @since 1.5
- */
- function getHost() {
- return $this->_host;
- }
- /**
- * Set URI host
- *
- * @access public
- * @param string $host The URI host
- * @since 1.5
- */
- function setHost($host) {
- $this->_host = $host;
- }
- /**
- * Get URI port
- * returns the port number, or null if no port was specified
- *
- * @access public
- * @return int The URI port number
- */
- function getPort() {
- return (isset ($this->_port)) ? $this->_port : null;
- }
- /**
- * Set URI port
- *
- * @access public
- * @param int $port The URI port number
- * @since 1.5
- */
- function setPort($port) {
- $this->_port = $port;
- }
- /**
- * Gets the URI path string
- *
- * @access public
- * @return string The URI path string
- * @since 1.5
- */
- function getPath() {
- return $this->_path;
- }
- /**
- * Set the URI path string
- *
- * @access public
- * @param string $path The URI path string
- * @since 1.5
- */
- function setPath($path) {
- $this->_path = $this->_cleanPath($path);
- }
- /**
- * Get the URI archor string
- * everything after the "#"
- *
- * @access public
- * @return string The URI anchor string
- * @since 1.5
- */
- function getFragment() {
- return $this->_fragment;
- }
- /**
- * Set the URI anchor string
- * everything after the "#"
- *
- * @access public
- * @param string $anchor The URI anchor string
- * @since 1.5
- */
- function setFragment($anchor) {
- $this->_fragment = $anchor;
- }
- /**
- * Checks whether the current URI is using HTTPS
- *
- * @access public
- * @return boolean True if using SSL via HTTPS
- * @since 1.5
- */
- function isSSL() {
- return $this->getScheme() == 'https' ? true : false;
- }
- /**
- * Checks if the supplied URL is internal
- *
- * @access public
- * @param string $url The URL to check
- * @return boolean True if Internal
- * @since 1.5
- */
- function isInternal($url) {
- $uri =& JURI::getInstance($url);
- $base = $uri->toString(array('scheme', 'host', 'port', 'path'));
- $host = $uri->toString(array('scheme', 'host', 'port'));
- if(stripos($base, JURI::base()) !== 0 && !empty($host)) {
- return false;
- }
- return true;
- }
- /**
- * Resolves //, ../ and ./ from a path and returns
- * the result. Eg:
- *
- * /foo/bar/../boo.php => /foo/boo.php
- * /foo/bar/../../boo.php => /boo.php
- * /foo/bar/.././/boo.php => /foo/boo.php
- *
- * @access private
- * @param string $uri The URI path to clean
- * @return string Cleaned and resolved URI path
- * @since 1.5
- */
- function _cleanPath($path)
- {
- $path = explode('/', preg_replace('#(/+)#', '/', $path));
- for ($i = 0; $i < count($path); $i ++) {
- if ($path[$i] == '.') {
- unset ($path[$i]);
- $path = array_values($path);
- $i --;
- }
- elseif ($path[$i] == '..' AND ($i > 1 OR ($i == 1 AND $path[0] != ''))) {
- unset ($path[$i]);
- unset ($path[$i -1]);
- $path = array_values($path);
- $i -= 2;
- }
- elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') {
- unset ($path[$i]);
- $path = array_values($path);
- $i --;
- } else {
- continue;
- }
- }
- return implode('/', $path);
- }
- /**
- * Backwards compatibility function for parse_url function
- *
- * This function solves different bugs in PHP versions lower then
- * 4.4, will be deprecated in future versions.
- *
- * @access private
- * @return array Associative array containing the URL parts
- * @since 1.5
- * @see parse_url()
- */
- function _parseURL($uri)
- {
- $parts = array();
- if (version_compare( phpversion(), '4.4' ) < 0)
- {
- $regex = "<^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?>";
- $matches = array();
- preg_match($regex, $uri, $matches, PREG_OFFSET_CAPTURE);
- $authority = @$matches[4][0];
- if (strpos($authority, '@') !== false) {
- $authority = explode('@', $authority);
- @list($parts['user'], $parts['pass']) = explode(':', $authority[0]);
- $authority = $authority[1];
- }
- if (strpos($authority, ':') !== false) {
- $authority = explode(':', $authority);
- $parts['host'] = $authority[0];
- $parts['port'] = $authority[1];
- } else {
- $parts['host'] = $authority;
- }
- $parts['scheme'] = @$matches[2][0];
- $parts['path'] = @$matches[5][0];
- $parts['query'] = @$matches[7][0];
- $parts['fragment'] = @$matches[9][0];
- }
- else
- {
- $parts = @parse_url($uri);
- }
- return $parts;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement