fixed subnet check (2903267)

This commit is contained in:
Roland Gruber 2009-11-24 21:37:36 +00:00
parent 56abe4267d
commit b0e57a1de9
2 changed files with 51 additions and 57 deletions

View File

@ -170,7 +170,9 @@ class fixed_ip extends baseModule {
$ex_subnet = explode(".", $this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0]); $ex_subnet = explode(".", $this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0]);
$ip_edit = false; // Range were edit? $ip_edit = false; // Range were edit?
foreach ($this->fixed_ip AS $id=>$arr) { foreach ($this->fixed_ip AS $id=>$arr) {
if (!empty($this->fixed_ip[$id]['ip']) && !$this->getAccountContainer()->getAccountModule('range')->check_subnet_range($this->fixed_ip[$id]['ip'],$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0])) { if (!empty($this->fixed_ip[$id]['ip']) && !range::check_subnet_range($this->fixed_ip[$id]['ip'],
$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0],
$this->getAccountContainer()->getAccountModule('dhcp_settings')->getDHCPOption('subnet-mask'))) {
// Range anpassen: // Range anpassen:
$ex = explode(".", $this->fixed_ip[$id]['ip']); $ex = explode(".", $this->fixed_ip[$id]['ip']);
$tmp = $this->fixed_ip[$id]['ip']; $tmp = $this->fixed_ip[$id]['ip'];
@ -271,7 +273,9 @@ class fixed_ip extends baseModule {
} }
// Is ip correct with subnet: // Is ip correct with subnet:
if (check_ip($_POST['ip_'.$id]) && !$this->getAccountContainer()->getAccountModule('range')->check_subnet_range($_POST['ip_'.$id], $this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0]) ) { if (check_ip($_POST['ip_'.$id]) && !range::check_subnet_range($_POST['ip_'.$id],
$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0],
$this->getAccountContainer()->getAccountModule('dhcp_settings')->getDHCPOption('subnet-mask'))) {
$error = true; $error = true;
} }
@ -386,7 +390,9 @@ class fixed_ip extends baseModule {
elseif (($this->fixed_ip[$id]['ip'] == '') || !check_ip($this->fixed_ip[$id]['ip'])) { elseif (($this->fixed_ip[$id]['ip'] == '') || !check_ip($this->fixed_ip[$id]['ip'])) {
$ipError = _("The IP address is invalid."); $ipError = _("The IP address is invalid.");
} }
elseif (!$this->getAccountContainer()->getAccountModule('range')->check_subnet_range($this->fixed_ip[$id]['ip'], $this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0]) ) { elseif (!range::check_subnet_range($this->fixed_ip[$id]['ip'],
$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0],
$this->getAccountContainer()->getAccountModule('dhcp_settings')->getDHCPOption('subnet-mask'))) {
$ipError = _("The IP address does not match the subnet."); $ipError = _("The IP address does not match the subnet.");
} }
elseif (!$this->overlapd_ip($this->fixed_ip[$id]['ip'])) { elseif (!$this->overlapd_ip($this->fixed_ip[$id]['ip'])) {

View File

@ -49,14 +49,10 @@ class range extends baseModule {
// Range -> Function attibute_processed already running? // Range -> Function attibute_processed already running?
public $processed; public $processed;
// Are the ranges ok???
public $ranges_ok;
// For check, if IPs overlaped. // For check, if IPs overlaped.
public $overlaped; public $overlaped;
public function get_metaData() { public function get_metaData() {
$return = array(); $return = array();
// manages dhcp accounts // manages dhcp accounts
$return["account_types"] = array("dhcp"); $return["account_types"] = array("dhcp");
@ -102,56 +98,50 @@ class range extends baseModule {
} }
/** /**
* Calculates the subnet for a given IP and netmask.
* *
* Checked, if it's a valid range * @param String $ip IP address
* @param String $mask network mask
*/
private static function calculateSubnet($ip, $mask) {
return long2ip(ip2long($ip) & ip2long($mask));
}
/**
* Checks if the first IP is smaller than the second IP.
* *
* @param first ip * @param String $first_ip first ip
* @param second ip * @param String $second_ip second ip
* *
* @return true, if it's a valid Range, else false; * @return true, if it's a valid Range, else false;
**/ **/
public function check_range($first_ip,$second_ip) { public function check_range($first_ip, $second_ip) {
$ex_first = explode(".", $first_ip); $ex_first = explode(".", $first_ip);
$ex_second = explode(".", $second_ip); $ex_second = explode(".", $second_ip);
if ($ex_first[0]<$ex_second[0])
if ($ex_first[0]!=$ex_second[0]) return true;
return false; if ($ex_first[1]<$ex_second[1])
return true;
if ($ex_first[1]!=$ex_second[1]) if ($ex_first[2]<$ex_second[2])
return false; return true;
if ($ex_first[3]<$ex_second[3]) {
if ($ex_first[2]!=$ex_second[2]) return true;
return false;
if ($ex_first[3]>$ex_second[3]) {
return false;
} }
return true; return false;
} }
/** /**
* Check if an IP address is in the correct subnet.
* *
* Check if the range and subnet are valid. * @param String $ip IP address
* * @param String $subnet subnet
* @param IP * @param String $mask network mask
* @param Subnet * @return true if the range and subnet valid, else false
*
* @return true if the range and subnet valid, else false!
*
**/ **/
public static function check_subnet_range($ip, $subnet, $mask) {
public function check_subnet_range($ip,$subnet) { $ipSubnet = range::calculateSubnet($ip, $mask);
// Check if the range was valid with the subnet: return ($subnet == $ipSubnet);
$ex = explode(".", $ip);
$ex_subnet = explode(".", $subnet);
if ($ex[0]==$ex_subnet[0] && $ex[1]==$ex_subnet[1] && $ex[2]==$ex_subnet[2]) {
return true;
}
else {
return false;
}
} }
/** /**
@ -175,8 +165,7 @@ class range extends baseModule {
if (in_array($n, $this->overlaped)) { if (in_array($n, $this->overlaped)) {
return false; return false;
} }
else else {
{
$this->overlaped[] = $n; $this->overlaped[] = $n;
} }
} }
@ -244,8 +233,9 @@ class range extends baseModule {
$ex_subnet = explode(".", $this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0]); $ex_subnet = explode(".", $this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0]);
$range_edit = false; // Range were edit? $range_edit = false; // Range were edit?
$dhcpAttrs = $this->getAccountContainer()->getAccountModule('dhcp_settings')->getAttributes(); $dhcpAttrs = $this->getAccountContainer()->getAccountModule('dhcp_settings')->getAttributes();
$mask = $this->getAccountContainer()->getAccountModule('dhcp_settings')->getDHCPOption('subnet-mask');
foreach ($this->ranges AS $id=>$arr) { foreach ($this->ranges AS $id=>$arr) {
if (!empty($this->ranges[$id]['range_start']) && !$this->check_subnet_range($this->ranges[$id]['range_start'],$dhcpAttrs['cn'][0])) { if (!empty($this->ranges[$id]['range_start']) && !range::check_subnet_range($this->ranges[$id]['range_start'],$dhcpAttrs['cn'][0], $mask)) {
// Range anpassen: // Range anpassen:
$ex = explode(".", $this->ranges[$id]['range_start']); $ex = explode(".", $this->ranges[$id]['range_start']);
$tmp = $this->ranges[$id]['range_start']; $tmp = $this->ranges[$id]['range_start'];
@ -253,7 +243,7 @@ class range extends baseModule {
if($tmp!=$this->ranges[$id]['range_start']) if($tmp!=$this->ranges[$id]['range_start'])
$range_edit = true; $range_edit = true;
} }
if (!empty($this->ranges[$id]['range_end']) && !$this->check_subnet_range($this->ranges[$id]['range_end'],$dhcpAttrs['cn'][0])) { if (!empty($this->ranges[$id]['range_end']) && !range::check_subnet_range($this->ranges[$id]['range_end'],$dhcpAttrs['cn'][0], $mask)) {
// Range anpassen: // Range anpassen:
$ex = explode(".", $this->ranges[$id]['range_end']); $ex = explode(".", $this->ranges[$id]['range_end']);
$tmp = $this->ranges[$id]['range_end']; $tmp = $this->ranges[$id]['range_end'];
@ -302,8 +292,8 @@ class range extends baseModule {
if ($_POST['range_start_'.$id]=="" && $_POST['range_end_'.$id]=="") { if ($_POST['range_start_'.$id]=="" && $_POST['range_end_'.$id]=="") {
unset($this->attributes['dhcpRange'][$id]); unset($this->attributes['dhcpRange'][$id]);
} }
else else {
{ $mask = $this->getAccountContainer()->getAccountModule('dhcp_settings')->getDHCPOption('subnet-mask');
// Check range_start: // Check range_start:
$_POST['range_start_'.$id] = trim($_POST['range_start_'.$id]); $_POST['range_start_'.$id] = trim($_POST['range_start_'.$id]);
if (!check_ip($_POST['range_start_'.$id])) { if (!check_ip($_POST['range_start_'.$id])) {
@ -332,12 +322,12 @@ class range extends baseModule {
} }
// Check if Subnet and range first are valid: // Check if Subnet and range first are valid:
if (!$this->check_subnet_range($_POST['range_start_'.$id],$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0])) { if (!range::check_subnet_range($_POST['range_start_'.$id],$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0], $mask)) {
$was_a_error = true; $was_a_error = true;
} }
// Check if Subnet and range last are valid: // Check if Subnet and range last are valid:
if (!$this->check_subnet_range($_POST['range_end_'.$id],$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0])) { if (!range::check_subnet_range($_POST['range_end_'.$id],$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0], $mask)) {
$was_a_error = true; $was_a_error = true;
} }
@ -349,12 +339,9 @@ class range extends baseModule {
// Check, if range_start and range_end are ok! // Check, if range_start and range_end are ok!
if (!$was_a_error) { if (!$was_a_error) {
$this->attributes['dhcpRange'][$id] = $_POST['range_start_'.$id]." ".$_POST['range_end_'.$id]; $this->attributes['dhcpRange'][$id] = $_POST['range_start_'.$id]." ".$_POST['range_end_'.$id];
$this->ranges_ok = true;
} }
else else {
{
unset($this->attributes['dhcpRange'][$id]); unset($this->attributes['dhcpRange'][$id]);
$this->ranges_ok = false;
} }
} }
} }
@ -402,6 +389,7 @@ class range extends baseModule {
$this->ranges[] = array(); $this->ranges[] = array();
} }
$this->reset_overlaped_range(); $this->reset_overlaped_range();
$mask = $this->getAccountContainer()->getAccountModule('dhcp_settings')->getDHCPOption('subnet-mask');
foreach($this->ranges AS $id=>$arr) { foreach($this->ranges AS $id=>$arr) {
// Range start // Range start
@ -409,7 +397,7 @@ class range extends baseModule {
$error = "&laquo;&laquo; " . _("The IP address is invalid."); $error = "&laquo;&laquo; " . _("The IP address is invalid.");
} elseif($this->processed && !$this->check_range($this->ranges[$id]['range_start'],$this->ranges[$id]['range_end'])) { } elseif($this->processed && !$this->check_range($this->ranges[$id]['range_start'],$this->ranges[$id]['range_end'])) {
$error = "&laquo;&laquo; " . _("The range end needs to be greater than the range start."); $error = "&laquo;&laquo; " . _("The range end needs to be greater than the range start.");
} elseif ($this->processed && !$this->check_subnet_range($this->ranges[$id]['range_start'],$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0])) { } elseif ($this->processed && !range::check_subnet_range($this->ranges[$id]['range_start'],$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0], $mask)) {
$error = "&laquo;&laquo; " . _("The IP does not match the subnet."); $error = "&laquo;&laquo; " . _("The IP does not match the subnet.");
} elseif ($this->processed && !$this->overlaped_range($this->ranges[$id]['range_start'],$this->ranges[$id]['range_end']) ) { } elseif ($this->processed && !$this->overlaped_range($this->ranges[$id]['range_start'],$this->ranges[$id]['range_end']) ) {
$error = "&laquo;&laquo; " . _("The range conflicts with another range."); $error = "&laquo;&laquo; " . _("The range conflicts with another range.");
@ -425,7 +413,7 @@ class range extends baseModule {
// Range end // Range end
if ($this->processed && !check_ip($this->ranges[$id]['range_end'])) { if ($this->processed && !check_ip($this->ranges[$id]['range_end'])) {
$error = "&laquo;&laquo; " . _("The IP address is invalid."); $error = "&laquo;&laquo; " . _("The IP address is invalid.");
} elseif ($this->processed && !$this->check_subnet_range($this->ranges[$id]['range_end'],$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0])) { } elseif ($this->processed && !range::check_subnet_range($this->ranges[$id]['range_end'],$this->getAccountContainer()->getAccountModule('dhcp_settings')->attributes['cn'][0], $mask)) {
$error = "&laquo;&laquo; " . _("The IP does not match the subnet."); $error = "&laquo;&laquo; " . _("The IP does not match the subnet.");
} else { } else {
$error = ""; $error = "";