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 | |||
* 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() | |||
{ | |||
@@ -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 | |||
* | |||
* Prefix sensitive. | |||
@@ -400,9 +382,8 @@ class CIDR | |||
{ | |||
// use fixed length HEX strings so we can easily do STRING comparisons | |||
// 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 | |||
lo-hi = $ip to check | |||
@@ -466,8 +447,7 @@ class CIDR | |||
} | |||
// 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 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) | |||
$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 | |||
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)); | |||
} | |||
@@ -59,11 +55,8 @@ abstract class IP | |||
/** | |||
* 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[1] = bcdiv($decimal, '79228162514264337593543950336', 0); // >> 96 | |||
@@ -81,27 +74,25 @@ abstract class IP | |||
$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]); | |||
} else { | |||
$packed = pack('N4', $parts[1], $parts[2], $parts[3], $parts[4]); | |||
$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. | |||
*/ | |||
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); | |||
} | |||
@@ -169,7 +157,7 @@ abstract class IP | |||
* One use-case for this is IP 6to4 tunnels used in networking. | |||
* | |||
* @example | |||
* to_ipv6("10.10.10.10") == a0a:a0a | |||
* to_ipv4("10.10.10.10") == a0a:a0a | |||
* | |||
* @param string $ip IPv4 address. | |||
* @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} |