<?php
/**
* Functions for dealing with proxies
+ * @file
*/
/**
$index = 'HTTP_X_FORWARDED_FOR';
$index2 = 'CLIENT-IP';
}
-
+
#Try a couple of headers
if( isset( $set[$index] ) ) {
return $set[$index];
* @return string
*/
function wfGetIP() {
- global $wgIP;
+ global $wgIP, $wgUsePrivateIPs, $wgCommandLineMode;
# Return cached result
if ( !empty( $wgIP ) ) {
return $wgIP;
}
+ $ipchain = array();
+ $ip = false;
+
/* collect the originating ips */
# Client connecting to this webserver
if ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
- $ipchain = array( IP::canonicalize( $_SERVER['REMOTE_ADDR'] ) );
- } else {
- # Running on CLI?
- $ipchain = array( '127.0.0.1' );
+ $ip = IP::canonicalize( $_SERVER['REMOTE_ADDR'] );
+ } elseif( $wgCommandLineMode ) {
+ $ip = '127.0.0.1';
+ }
+ if( $ip ) {
+ $ipchain[] = $ip;
}
- $ip = $ipchain[0];
# Append XFF on to $ipchain
$forwardedFor = wfGetForwardedFor();
$xff = array_reverse( $xff );
$ipchain = array_merge( $ipchain, $xff );
}
-
+
# Step through XFF list and find the last address in the list which is a trusted server
# Set $ip to the IP address given by that trusted server, unless the address is not sensible (e.g. private)
foreach ( $ipchain as $i => $curIP ) {
$curIP = IP::canonicalize( $curIP );
if ( wfIsTrustedProxy( $curIP ) ) {
- if ( isset( $ipchain[$i + 1] ) && IP::isPublic( $ipchain[$i + 1] ) ) {
- $ip = $ipchain[$i + 1];
+ if ( isset( $ipchain[$i + 1] ) ) {
+ if( $wgUsePrivateIPs || IP::isPublic( $ipchain[$i + 1 ] ) ) {
+ $ip = $ipchain[$i + 1];
+ }
}
} else {
break;
}
}
+ if( !$ip ) {
+ throw new MWException( "Unable to determine IP" );
+ }
+
wfDebug( "IP: $ip\n" );
$wgIP = $ip;
return $ip;
* Checks if an IP is a trusted proxy providor
* Useful to tell if X-Fowarded-For data is possibly bogus
* Squid cache servers for the site and AOL are whitelisted
- * @param string $ip
+ * @param $ip String
* @return bool
*/
function wfIsTrustedProxy( $ip ) {
global $wgSquidServers, $wgSquidServersNoPurge;
- if ( in_array( $ip, $wgSquidServers ) ||
- in_array( $ip, $wgSquidServersNoPurge ) ||
- wfIsAOLProxy( $ip )
+ if ( in_array( $ip, $wgSquidServers ) ||
+ in_array( $ip, $wgSquidServersNoPurge )
) {
$trusted = true;
} else {
escapeshellarg( $port ),
escapeshellarg( $url )
));
- exec( "php $params &>/dev/null &" );
+ exec( "php $params >" . wfGetNull() . " 2>&1 &" );
}
# Set MemCached key
$wgMemc->set( $mcKey, 1, $wgProxyMemcExpiry );
*/
function wfIsLocallyBlockedProxy( $ip ) {
global $wgProxyList;
- $fname = 'wfIsLocallyBlockedProxy';
if ( !$wgProxyList ) {
return false;
}
- wfProfileIn( $fname );
+ wfProfileIn( __METHOD__ );
if ( !is_array( $wgProxyList ) ) {
# Load from the specified file
} else {
$ret = false;
}
- wfProfileOut( $fname );
+ wfProfileOut( __METHOD__ );
return $ret;
}
-/**
- * TODO: move this list to the database in a global IP info table incorporating
- * trusted ISP proxies, blocked IP addresses and open proxies.
- * @return bool
- */
-function wfIsAOLProxy( $ip ) {
- $ranges = array(
- '64.12.96.0/19',
- '149.174.160.0/20',
- '152.163.240.0/21',
- '152.163.248.0/22',
- '152.163.252.0/23',
- '152.163.96.0/22',
- '152.163.100.0/23',
- '195.93.32.0/22',
- '195.93.48.0/22',
- '195.93.64.0/19',
- '195.93.96.0/19',
- '195.93.16.0/20',
- '198.81.0.0/22',
- '198.81.16.0/20',
- '198.81.8.0/23',
- '202.67.64.128/25',
- '205.188.192.0/20',
- '205.188.208.0/23',
- '205.188.112.0/20',
- '205.188.146.144/30',
- '207.200.112.0/21',
- );
-
- static $parsedRanges;
- if ( is_null( $parsedRanges ) ) {
- $parsedRanges = array();
- foreach ( $ranges as $range ) {
- $parsedRanges[] = IP::parseRange( $range );
- }
- }
-
- $hex = IP::toHex( $ip );
- foreach ( $parsedRanges as $range ) {
- if ( $hex >= $range[0] && $hex <= $range[1] ) {
- return true;
- }
- }
- return false;
-}
-
-
-
-