This reverts commit dca7570b32
.
tags/vichan-4.9.91
@@ -254,9 +254,7 @@ class CIDR | |||||
* and the starting IP is not on a valid network boundrary (eg: Displaying | * and the starting IP is not on a valid network boundrary (eg: Displaying | ||||
* an IP from an interface). | * an IP from an interface). | ||||
* | * | ||||
* <b>Note: The CIDR block returned is NOT always bit aligned.</b> | |||||
* | |||||
* @return string IP in CIDR notation "start_ip/prefix" | |||||
* @return string IP in CIDR notation "ipaddr/prefix" | |||||
*/ | */ | ||||
public function getCidr() | public function getCidr() | ||||
{ | { | ||||
@@ -264,22 +262,6 @@ class CIDR | |||||
} | } | ||||
/** | /** | ||||
* Get the TRUE cidr notation for the subnet block. | |||||
* | |||||
* This is useful for when you want a string representation of the IP/prefix | |||||
* and the starting IP is not on a valid network boundrary (eg: Displaying | |||||
* an IP from an interface). | |||||
* | |||||
* <b>Note: The CIDR block returned is ALWAYS bit aligned.</b> | |||||
* | |||||
* @return string IP in CIDR notation "network/prefix" | |||||
*/ | |||||
public function getTrueCidr() | |||||
{ | |||||
return $this->getNetwork() . '/' . $this->prefix; | |||||
} | |||||
/** | |||||
* Get the [low,high] range of the CIDR block | * Get the [low,high] range of the CIDR block | ||||
* | * | ||||
* Prefix sensitive. | * Prefix sensitive. | ||||
@@ -400,9 +382,8 @@ class CIDR | |||||
{ | { | ||||
// use fixed length HEX strings so we can easily do STRING comparisons | // use fixed length HEX strings so we can easily do STRING comparisons | ||||
// instead of using slower bccomp() math. | // instead of using slower bccomp() math. | ||||
$map = function($v){ return sprintf("%032s", IP::inet_ptoh($v)); }; | |||||
list($lo,$hi) = array_map($map, CIDR::cidr_to_range($ip)); | |||||
list($min,$max) = array_map($map, CIDR::cidr_to_range($cidr)); | |||||
list($lo,$hi) = array_map(function($v){ return sprintf("%032s", IP::inet_ptoh($v)); }, CIDR::cidr_to_range($ip)); | |||||
list($min,$max) = array_map(function($v){ return sprintf("%032s", IP::inet_ptoh($v)); }, CIDR::cidr_to_range($cidr)); | |||||
/** visualization of logic used below | /** visualization of logic used below | ||||
lo-hi = $ip to check | lo-hi = $ip to check | ||||
@@ -466,8 +447,7 @@ class CIDR | |||||
} | } | ||||
// force bit length to 32 or 128 depending on type of IP | // force bit length to 32 or 128 depending on type of IP | ||||
$version = IP::isIPv4($ip) ? 4 : 6; | |||||
$bitlen = $version == 4 ? 32 : 128; | |||||
$bitlen = (false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) ? 128 : 32; | |||||
if ($bits === null) { | if ($bits === null) { | ||||
// if no prefix is given use the length of the binary string which | // if no prefix is given use the length of the binary string which | ||||
@@ -489,7 +469,7 @@ class CIDR | |||||
// calculate "broadcast" (not technically a broadcast in IPv6) | // calculate "broadcast" (not technically a broadcast in IPv6) | ||||
$ip2 = BC::bcor($ip1, BC::bcnot($netmask)); | $ip2 = BC::bcor($ip1, BC::bcnot($netmask)); | ||||
return array(IP::inet_dtop($ip1, $version), IP::inet_dtop($ip2, $version)); | |||||
return array(IP::inet_dtop($ip1), IP::inet_dtop($ip2)); | |||||
} | } | ||||
/** | /** | ||||
@@ -26,10 +26,6 @@ abstract class IP | |||||
{ | { | ||||
// shortcut for IPv4 addresses | // shortcut for IPv4 addresses | ||||
if (strpos($ip, ':') === false && strpos($ip, '.') !== false) { | if (strpos($ip, ':') === false && strpos($ip, '.') !== false) { | ||||
// remove any cidr block notation | |||||
if (($o = strpos($ip, '/')) !== false) { | |||||
$ip = substr($ip, 0, $o); | |||||
} | |||||
return sprintf('%u', ip2long($ip)); | return sprintf('%u', ip2long($ip)); | ||||
} | } | ||||
@@ -59,11 +55,8 @@ abstract class IP | |||||
/** | /** | ||||
* Convert a decimal string into a human readable IP address. | * Convert a decimal string into a human readable IP address. | ||||
* | |||||
* @param decimal $decimal Decimal number to convert into presentational IP string. | |||||
* @param integer $version Force IP version to 4 or 6. Leave null for automatic. | |||||
*/ | */ | ||||
public static function inet_dtop($decimal, $version = null) | |||||
public static function inet_dtop($decimal, $expand = false) | |||||
{ | { | ||||
$parts = array(); | $parts = array(); | ||||
$parts[1] = bcdiv($decimal, '79228162514264337593543950336', 0); // >> 96 | $parts[1] = bcdiv($decimal, '79228162514264337593543950336', 0); // >> 96 | ||||
@@ -81,27 +74,25 @@ abstract class IP | |||||
$part = (int) $part; | $part = (int) $part; | ||||
} | } | ||||
if (!$version) { | |||||
// if the first 96bits is all zeros then we can safely assume we | |||||
// actually have an IPv4 address. Even though it's technically possible | |||||
// you're not really ever going to see an IPv6 address in the range: | |||||
// ::0 - ::ffff | |||||
// It's feasible to see an IPv6 address of "::", in which case the | |||||
// caller is going to have to account for that on their own (or | |||||
// pass $version to this function). | |||||
if (($parts[1] | $parts[2] | $parts[3]) == 0) { | |||||
$version = 4; | |||||
} | |||||
} | |||||
if ($version == 4) { | |||||
// if the first 96bits is all zeros then we can safely assume we | |||||
// actually have an IPv4 address. Even though it's technically possible | |||||
// you're not really ever going to see an IPv6 address in the range: | |||||
// ::0 - ::ffff | |||||
// It's feasible to see an IPv6 address of "::", in which case the | |||||
// caller is going to have to account for that on their own. | |||||
if (($parts[1] | $parts[2] | $parts[3]) == 0) { | |||||
$ip = long2ip($parts[4]); | $ip = long2ip($parts[4]); | ||||
} else { | } else { | ||||
$packed = pack('N4', $parts[1], $parts[2], $parts[3], $parts[4]); | $packed = pack('N4', $parts[1], $parts[2], $parts[3], $parts[4]); | ||||
$ip = inet_ntop($packed); | $ip = inet_ntop($packed); | ||||
} | } | ||||
return $ip; | |||||
// Turn IPv6 to IPv4 if it's IPv4 | |||||
if (preg_match('/^::\d+\./', $ip)) { | |||||
return substr($ip, 2); | |||||
} | |||||
return $expand ? self::inet_expand($ip) : $ip; | |||||
} | } | ||||
/** | /** | ||||
@@ -116,11 +107,8 @@ abstract class IP | |||||
/** | /** | ||||
* Convert a human readable (presentational) IP address into a BINARY string. | * Convert a human readable (presentational) IP address into a BINARY string. | ||||
*/ | */ | ||||
public static function inet_ptob($ip, $bits = null) | |||||
public static function inet_ptob($ip, $bits = 128) | |||||
{ | { | ||||
if ($bits === null) { | |||||
$bits = self::isIPv4($ip) ? 32 : 128; | |||||
} | |||||
return BC::bcdecbin(self::inet_ptod($ip), $bits); | return BC::bcdecbin(self::inet_ptod($ip), $bits); | ||||
} | } | ||||
@@ -169,7 +157,7 @@ abstract class IP | |||||
* One use-case for this is IP 6to4 tunnels used in networking. | * One use-case for this is IP 6to4 tunnels used in networking. | ||||
* | * | ||||
* @example | * @example | ||||
* to_ipv6("10.10.10.10") == a0a:a0a | |||||
* to_ipv4("10.10.10.10") == a0a:a0a | |||||
* | * | ||||
* @param string $ip IPv4 address. | * @param string $ip IPv4 address. | ||||
* @param boolean $mapped If true a Full IPv6 address is returned within the | * @param boolean $mapped If true a Full IPv6 address is returned within the | ||||
@@ -0,0 +1,5 @@ | |||||
/*! jQuery UI - v1.10.4 - 2014-02-09 | |||||
* http://jqueryui.com | |||||
* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ | |||||
.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%} |
@@ -0,0 +1,5 @@ | |||||
/*! jQuery UI - v1.10.4 - 2014-02-09 | |||||
* http://jqueryui.com | |||||
* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ | |||||
.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px} |
@@ -0,0 +1,5 @@ | |||||
/*! jQuery UI - v1.10.4 - 2014-02-09 | |||||
* http://jqueryui.com | |||||
* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ | |||||
.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black} |
@@ -0,0 +1,5 @@ | |||||
/*! jQuery UI - v1.10.4 - 2014-02-11 | |||||
* http://jqueryui.com | |||||
* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ | |||||
.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black} |