X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FWebRequest.php;h=3fce584527e679833f6687a0c5b8fc2d29f1ad6a;hb=d2a23a17dbdd336330906d393ff1bfcec72bd1a4;hp=e603d4547db5dcc8d60c8d0cb9b230a8d8c7ffe8;hpb=f2c29baf9f0438c11e4c72f814cd77b05aac77ae;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/WebRequest.php b/includes/WebRequest.php index e603d4547d..3fce584527 100644 --- a/includes/WebRequest.php +++ b/includes/WebRequest.php @@ -1,7 +1,6 @@ @@ -22,6 +21,15 @@ # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # http://www.gnu.org/copyleft/gpl.html + +/** + * Some entry points may use this file without first enabling the + * autoloader. + */ +if ( !function_exists( '__autoload' ) ) { + require_once( dirname(__FILE__) . '/normal/UtfNormal.php' ); +} + /** * The WebRequest class encapsulates getting at data passed in the * URL or via a POSTed form, handling remove of "magic quotes" slashes, @@ -32,25 +40,127 @@ * you want to pass arbitrary data to some function in place of the web * input. * - * @package MediaWiki */ class WebRequest { - function WebRequest() { + var $data = array(); + var $headers; + private $_response; + + function __construct() { + /// @fixme This preemptive de-quoting can interfere with other web libraries + /// and increases our memory footprint. It would be cleaner to do on + /// demand; but currently we have no wrapper for $_SERVER etc. $this->checkMagicQuotes(); + + // POST overrides GET data + // We don't use $_REQUEST here to avoid interference from cookies... + $this->data = wfArrayMerge( $_GET, $_POST ); + } + + /** + * Check for title, action, and/or variant data in the URL + * and interpolate it into the GET variables. + * This should only be run after $wgContLang is available, + * as we may need the list of language variants to determine + * available variant URLs. + */ + function interpolateTitle() { global $wgUsePathInfo; - if( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != '') && $wgUsePathInfo ) { - # Stuff it! - $_GET['title'] = $_REQUEST['title'] = - substr( $_SERVER['PATH_INFO'], 1 ); + if ( $wgUsePathInfo ) { + // PATH_INFO is mangled due to http://bugs.php.net/bug.php?id=31892 + // And also by Apache 2.x, double slashes are converted to single slashes. + // So we will use REQUEST_URI if possible. + $matches = array(); + if ( !empty( $_SERVER['REQUEST_URI'] ) ) { + // Slurp out the path portion to examine... + $url = $_SERVER['REQUEST_URI']; + if ( !preg_match( '!^https?://!', $url ) ) { + $url = 'http://unused' . $url; + } + $a = parse_url( $url ); + if( $a ) { + $path = isset( $a['path'] ) ? $a['path'] : ''; + + global $wgScript; + if( $path == $wgScript ) { + // Script inside a rewrite path? + // Abort to keep from breaking... + return; + } + // Raw PATH_INFO style + $matches = $this->extractTitle( $path, "$wgScript/$1" ); + + global $wgArticlePath; + if( !$matches && $wgArticlePath ) { + $matches = $this->extractTitle( $path, $wgArticlePath ); + } + + global $wgActionPaths; + if( !$matches && $wgActionPaths ) { + $matches = $this->extractTitle( $path, $wgActionPaths, 'action' ); + } + + global $wgVariantArticlePath, $wgContLang; + if( !$matches && $wgVariantArticlePath ) { + $variantPaths = array(); + foreach( $wgContLang->getVariants() as $variant ) { + $variantPaths[$variant] = + str_replace( '$2', $variant, $wgVariantArticlePath ); + } + $matches = $this->extractTitle( $path, $variantPaths, 'variant' ); + } + } + } elseif ( isset( $_SERVER['ORIG_PATH_INFO'] ) && $_SERVER['ORIG_PATH_INFO'] != '' ) { + // Mangled PATH_INFO + // http://bugs.php.net/bug.php?id=31892 + // Also reported when ini_get('cgi.fix_pathinfo')==false + $matches['title'] = substr( $_SERVER['ORIG_PATH_INFO'], 1 ); + + } elseif ( isset( $_SERVER['PATH_INFO'] ) && ($_SERVER['PATH_INFO'] != '') ) { + // Regular old PATH_INFO yay + $matches['title'] = substr( $_SERVER['PATH_INFO'], 1 ); + } + foreach( $matches as $key => $val) { + $this->data[$key] = $_GET[$key] = $_REQUEST[$key] = $val; + } } } + /** + * Internal URL rewriting function; tries to extract page title and, + * optionally, one other fixed parameter value from a URL path. + * + * @param $path string: the URL path given from the client + * @param $bases array: one or more URLs, optionally with $1 at the end + * @param $key string: if provided, the matching key in $bases will be + * passed on as the value of this URL parameter + * @return array of URL variables to interpolate; empty if no match + */ + private function extractTitle( $path, $bases, $key=false ) { + foreach( (array)$bases as $keyValue => $base ) { + // Find the part after $wgArticlePath + $base = str_replace( '$1', '', $base ); + $baseLen = strlen( $base ); + if( substr( $path, 0, $baseLen ) == $base ) { + $raw = substr( $path, $baseLen ); + if( $raw !== '' ) { + $matches = array( 'title' => rawurldecode( $raw ) ); + if( $key ) { + $matches[$key] = $keyValue; + } + return $matches; + } + } + } + return array(); + } + /** * Recursively strips slashes from the given array; * used for undoing the evil that is magic_quotes_gpc. - * @param array &$arr will be modified + * @param $arr array: will be modified * @return array the original array - * @access private + * @private */ function &fix_magic_quotes( &$arr ) { foreach( $arr as $key => $val ) { @@ -68,10 +178,10 @@ class WebRequest { * through fix_magic_quotes to strip out the stupid slashes. * WARNING: This should only be done once! Running a second * time could damage the values. - * @access private + * @private */ function checkMagicQuotes() { - if ( get_magic_quotes_gpc() ) { + if ( function_exists( 'get_magic_quotes_gpc' ) && get_magic_quotes_gpc() ) { $this->fix_magic_quotes( $_COOKIE ); $this->fix_magic_quotes( $_ENV ); $this->fix_magic_quotes( $_GET ); @@ -83,9 +193,9 @@ class WebRequest { /** * Recursively normalizes UTF-8 strings in the given array. - * @param array $data string or array + * @param $data string or array * @return cleaned-up version of the given - * @access private + * @private */ function normalizeUnicode( $data ) { if( is_array( $data ) ) { @@ -101,11 +211,11 @@ class WebRequest { /** * Fetch a value from the given array or return $default if it's not set. * - * @param array $arr - * @param string $name - * @param mixed $default + * @param $arr array + * @param $name string + * @param $default mixed * @return mixed - * @access private + * @private */ function getGPCVal( $arr, $name, $default ) { if( isset( $arr[$name] ) ) { @@ -117,7 +227,6 @@ class WebRequest { $data = $wgContLang->checkTitleEncoding( $data ); } } - require_once( 'normal/UtfNormal.php' ); $data = $this->normalizeUnicode( $data ); return $data; } else { @@ -127,14 +236,16 @@ class WebRequest { /** * Fetch a scalar from the input or return $default if it's not set. - * Returns a string. Arrays are discarded. + * Returns a string. Arrays are discarded. Useful for + * non-freeform text inputs (e.g. predefined internal text keys + * selected by a drop-down menu). For freeform input, see getText(). * - * @param string $name - * @param string $default optional default (or NULL) + * @param $name string + * @param $default string: optional default (or NULL) * @return string */ function getVal( $name, $default = NULL ) { - $val = $this->getGPCVal( $_REQUEST, $name, $default ); + $val = $this->getGPCVal( $this->data, $name, $default ); if( is_array( $val ) ) { $val = $default; } @@ -150,27 +261,27 @@ class WebRequest { * If source was scalar, will return an array with a single element. * If no source and no default, returns NULL. * - * @param string $name - * @param array $default optional default (or NULL) + * @param $name string + * @param $default array: optional default (or NULL) * @return array */ function getArray( $name, $default = NULL ) { - $val = $this->getGPCVal( $_REQUEST, $name, $default ); + $val = $this->getGPCVal( $this->data, $name, $default ); if( is_null( $val ) ) { return null; } else { return (array)$val; } } - + /** * Fetch an array of integers, or return $default if it's not set. * If source was scalar, will return an array with a single element. * If no source and no default, returns NULL. * If an array is returned, contents are guaranteed to be integers. * - * @param string $name - * @param array $default option default (or NULL) + * @param $name string + * @param $default array: option default (or NULL) * @return array of ints */ function getIntArray( $name, $default = NULL ) { @@ -185,8 +296,8 @@ class WebRequest { * Fetch an integer value from the input or return $default if not set. * Guaranteed to return an integer; non-numeric input will typically * return 0. - * @param string $name - * @param int $default + * @param $name string + * @param $default int * @return int */ function getInt( $name, $default = 0 ) { @@ -197,7 +308,7 @@ class WebRequest { * Fetch an integer value from the input or return null if empty. * Guaranteed to return an integer or null; non-numeric input will * typically return null. - * @param string $name + * @param $name string * @return int */ function getIntOrNull( $name ) { @@ -211,8 +322,8 @@ class WebRequest { * Fetch a boolean value from the input or return $default if not set. * Guaranteed to return true or false, with normal PHP semantics for * boolean interpretation of strings. - * @param string $name - * @param bool $default + * @param $name string + * @param $default bool * @return bool */ function getBool( $name, $default = false ) { @@ -223,7 +334,7 @@ class WebRequest { * Return true if the named value is set in the input, whatever that * value is (even "0"). Return false if the named value is not set. * Example use is checking for the presence of check boxes in forms. - * @param string $name + * @param $name string * @return bool */ function getCheck( $name ) { @@ -237,10 +348,12 @@ class WebRequest { * Fetch a text string from the given array or return $default if it's not * set. \r is stripped from the text, and with some language modules there * is an input transliteration applied. This should generally be used for - * form