chg: [metafield-type:ipv4] Usage of Cdir tool
parent
97501642b8
commit
0363a91310
|
@ -8,6 +8,7 @@ use Cake\ORM\Query;
|
||||||
|
|
||||||
use MetaFieldsTypes\TextType;
|
use MetaFieldsTypes\TextType;
|
||||||
use TypeError;
|
use TypeError;
|
||||||
|
use App\Lib\Tools\CidrTool;
|
||||||
|
|
||||||
class IPv4Type extends TextType
|
class IPv4Type extends TextType
|
||||||
{
|
{
|
||||||
|
@ -44,7 +45,8 @@ class IPv4Type extends TextType
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($allMetaValues as $fieldID => $ip) {
|
foreach ($allMetaValues as $fieldID => $ip) {
|
||||||
if (!$this->IPInCidrBlock($searchValue, $ip)) {
|
$cidrTool = new CidrTool([$ip]);
|
||||||
|
if ($cidrTool->contains($searchValue) === false) {
|
||||||
if (!$isNegation) {
|
if (!$isNegation) {
|
||||||
unset($allMetaValues[$fieldID]);
|
unset($allMetaValues[$fieldID]);
|
||||||
}
|
}
|
||||||
|
@ -89,92 +91,8 @@ class IPv4Type extends TextType
|
||||||
return $allMetaValues;
|
return $allMetaValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a CIDR block to an array containing the minimum and maximum IP address for this block
|
|
||||||
*
|
|
||||||
* @param string $cidr an CIDR block with the form x.x.x.x/yy
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
protected function cidrToRange($cidr): array
|
|
||||||
{
|
|
||||||
$range = array();
|
|
||||||
$cidr = explode('/', $cidr);
|
|
||||||
if (count($cidr) == 1) { // No mask passed
|
|
||||||
$cidr[1] = '32';
|
|
||||||
}
|
|
||||||
$range[0] = long2ip((ip2long($cidr[0])) & ((-1 << (32 - (int)$cidr[1]))));
|
|
||||||
$range[1] = long2ip((ip2long($range[0])) + pow(2, (32 - (int)$cidr[1])) - 1);
|
|
||||||
return $range;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the provided IP in contained by the CIDR block
|
|
||||||
*
|
|
||||||
* @param string $ip
|
|
||||||
* @param string $cidr an CIDR block with the form x.x.x.x/yy
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
protected function _IPInCidrBlock(string $ip, string $cidr): bool
|
|
||||||
{
|
|
||||||
$range = $this->cidrToRange($cidr);
|
|
||||||
return ip2long($range[0]) <= ip2long($ip) && ip2long($ip) <= ip2long($range[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the provided cidr block in contained by the CIDR block
|
|
||||||
*
|
|
||||||
* @param string $cidr1 an CIDR block with the form x.x.x.x/yy
|
|
||||||
* @param string $cidr2 an CIDR block with the form x.x.x.x/yy
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
protected function _cidrInCidrBlock(string $cidr1, string $cidr2): bool
|
|
||||||
{
|
|
||||||
$range = $this->cidrToRange($cidr1);
|
|
||||||
return $this->_IPInCidrBlock($range[0], $cidr2) && $this->_IPInCidrBlock($range[1], $cidr2);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function _isValidIP(string $value): bool
|
protected function _isValidIP(string $value): bool
|
||||||
{
|
{
|
||||||
return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
|
return filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function _isValidCidrBlock(string $value): bool
|
|
||||||
{
|
|
||||||
$explodedValue = explode('/', $value);
|
|
||||||
return $this->_isValidIP($explodedValue[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function _isValidIPOrCidrBlock(string $value): bool
|
|
||||||
{
|
|
||||||
$explodedValue = explode('/', $value);
|
|
||||||
if (count($explodedValue) == 1) {
|
|
||||||
return $this->_isValidIP($value);
|
|
||||||
} else if (count($explodedValue) == 2) {
|
|
||||||
return $this->_isValidCidrBlock($value);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function IPInCidrBlock(string $ip, string $cidr, bool $throw=false): bool
|
|
||||||
{
|
|
||||||
if (!$this->_isValidCidrBlock($cidr)) {
|
|
||||||
if ($throw) {
|
|
||||||
throw new TypeError("Invalid CDIR block.");
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!$this->_isValidIPOrCidrBlock($ip)) {
|
|
||||||
if ($throw) {
|
|
||||||
throw new TypeError("Invalid IP.");
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$explodedIp = explode('/', $ip);
|
|
||||||
if (count($explodedIp) == 1) {
|
|
||||||
return $this->_IPInCidrBlock($ip, $cidr);
|
|
||||||
} else {
|
|
||||||
return $this->_cidrInCidrBlock($ip, $cidr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue