define( 'RE_IPV6_GAP', ':(?:0+:)*(?::(?:0+:)*)?' );
define( 'RE_IPV6_V4_PREFIX', '0*' . RE_IPV6_GAP . '(?:ffff:)?' );
-// This might be useful for regexps used elsewhere, matches any IPv6 or IPv6 address or network
+// This might be useful for regexps used elsewhere, matches any IPv4 or IPv6 address or network
define( 'IP_ADDRESS_STRING',
'(?:' .
RE_IP_ADD . '(?:\/' . RE_IP_PREFIX . ')?' . // IPv4
/**
* Determine if a string is as valid IP address or network (CIDR prefix).
* SIIT IPv4-translated addresses are rejected.
- * Note: canonicalize() tries to convert translated addresses to IPv4.
+ * @note canonicalize() tries to convert translated addresses to IPv4.
*
* @param string $ip Possible IP address
* @return bool
/**
* Given a string, determine if it as valid IP in IPv6 only.
- * Note: Unlike isValid(), this looks for networks too.
+ * @note Unlike isValid(), this looks for networks too.
*
* @param string $ip Possible IP address
* @return bool
/**
* Given a string, determine if it as valid IP in IPv4 only.
- * Note: Unlike isValid(), this looks for networks too.
+ * @note Unlike isValid(), this looks for networks too.
*
* @param string $ip Possible IP address
* @return bool
/**
* Validate an IP address. Ranges are NOT considered valid.
* SIIT IPv4-translated addresses are rejected.
- * Note: canonicalize() tries to convert translated addresses to IPv4.
+ * @note canonicalize() tries to convert translated addresses to IPv4.
*
* @param string $ip
* @return bool True if it is valid
/**
* Validate an IP Block (valid address WITH a valid prefix).
* SIIT IPv4-translated addresses are rejected.
- * Note: canonicalize() tries to convert translated addresses to IPv4.
+ * @note canonicalize() tries to convert translated addresses to IPv4.
*
* @param string $ipblock
* @return bool True if it is valid
if ( strpos( $ip, '/' ) !== false ) {
list( $ip, $cidr ) = explode( '/', $ip, 2 );
} else {
- list( $ip, $cidr ) = array( $ip, '' );
+ list( $ip, $cidr ) = [ $ip, '' ];
}
// Get the largest slice of words with multiple zeros
$offset = 0;
if ( substr( $both, 0, 1 ) === '[' ) {
if ( preg_match( '/^\[(' . RE_IPV6_ADD . ')\](?::(?P<port>\d+))?$/', $both, $m ) ) {
if ( isset( $m['port'] ) ) {
- return array( $m[1], intval( $m['port'] ) );
+ return [ $m[1], intval( $m['port'] ) ];
} else {
- return array( $m[1], false );
+ return [ $m[1], false ];
}
} else {
// Square bracket found but no IPv6
if ( $numColons >= 2 ) {
// Is it a bare IPv6 address?
if ( preg_match( '/^' . RE_IPV6_ADD . '$/', $both ) ) {
- return array( $both, false );
+ return [ $both, false ];
} else {
// Not valid IPv6, but too many colons for anything else
return false;
// Host:port?
$bits = explode( ':', $both );
if ( preg_match( '/^\d+/', $bits[1] ) ) {
- return array( $bits[0], intval( $bits[1] ) );
+ return [ $bits[0], intval( $bits[1] ) ];
} else {
// Not a valid port
return false;
}
// Plain hostname
- return array( $both, false );
+ return [ $both, false ];
}
/**
public static function isPublic( $ip ) {
static $privateSet = null;
if ( !$privateSet ) {
- $privateSet = new IPSet( array(
+ $privateSet = new IPSet( [
'10.0.0.0/8', # RFC 1918 (private)
'172.16.0.0/12', # RFC 1918 (private)
'192.168.0.0/16', # RFC 1918 (private)
'0:0:0:0:0:0:0:1', # loopback
'169.254.0.0/16', # link-local
'fe80::/10', # link-local
- ) );
+ ] );
}
return !$privateSet->match( $ip );
}
}
$parts = explode( '/', $range, 2 );
if ( count( $parts ) != 2 ) {
- return array( false, false );
+ return [ false, false ];
}
list( $network, $bits ) = $parts;
$network = ip2long( $network );
$bits = false;
}
- return array( $network, $bits );
+ return [ $network, $bits ];
}
/**
$start = $end = self::toHex( $range );
}
if ( $start === false || $end === false ) {
- return array( false, false );
+ return [ false, false ];
} else {
- return array( $start, $end );
+ return [ $start, $end ];
}
}
# Explode into <expanded IP,range>
$parts = explode( '/', IP::sanitizeIP( $range ), 2 );
if ( count( $parts ) != 2 ) {
- return array( false, false );
+ return [ false, false ];
}
list( $network, $bits ) = $parts;
$network = self::IPv6ToRawHex( $network );
$bits = false;
}
- return array( $network, (int)$bits );
+ return [ $network, (int)$bits ];
}
/**
$start = $end = self::toHex( $range );
}
if ( $start === false || $end === false ) {
- return array( false, false );
+ return [ false, false ];
} else {
- return array( $start, $end );
+ return [ $start, $end ];
}
}
* @param string $addr The address to check against the given range.
* @param string $range The range to check the given address against.
* @return bool Whether or not the given address is in the given range.
+ *
+ * @note This can return unexpected results for invalid arguments!
+ * Make sure you pass a valid IP address and IP range.
*/
public static function isInRange( $addr, $range ) {
$hexIP = self::toHex( $addr );
}
}
// IPv6 loopback address
- $m = array();
+ $m = [];
if ( preg_match( '/^0*' . RE_IPV6_GAP . '1$/', $addr, $m ) ) {
return '127.0.0.1';
}
*/
public static function isTrustedProxy( $ip ) {
$trusted = self::isConfiguredProxy( $ip );
- Hooks::run( 'IsTrustedProxy', array( &$ip, &$trusted ) );
+ Hooks::run( 'IsTrustedProxy', [ &$ip, &$trusted ] );
return $trusted;
}
* @return string|false
*/
public static function getSubnet( $ip ) {
- $matches = array();
+ $matches = [];
$subnet = false;
if ( IP::isIPv6( $ip ) ) {
$parts = IP::parseRange( "$ip/64" );