mbox

BUG10940: remove leading zeros in ip address

Message ID 1447069367-7823-1-git-send-email-alexander.marx@ipfire.org
State Accepted
Commit f770b72899bcd7977a83e0237c9840804f6a46ca
Headers

Message

Alexander Marx Nov. 9, 2015, 10:42 p.m. UTC
  in firewallgroups (hosts) an error was created when using ip adresses
like 192.168.000.008. Now all leading zeros are deleted in
firewallgroups and in the firewall itself when using single ip addresses
as source or target.

Signed-off-by: Alexander Marx <alexander.marx@ipfire.org>
---
 config/cfgroot/network-functions.pl | 13 +++++++++++++
 html/cgi-bin/firewall.cgi           |  8 ++++++++
 html/cgi-bin/fwhosts.cgi            | 13 +++++++------
 3 files changed, 28 insertions(+), 6 deletions(-)
  

Comments

Michael Tremer Nov. 10, 2015, 5:33 a.m. UTC | #1
Hi,

this does not look like the cleanest solution to be honest, but I guess
this is acceptable. It solves the issue at hand, but generally I would
like to have this solved one time so that one does not have to keep
this problem in mind when writing new code.

Merged.

Best,
-Michael

On Mon, 2015-11-09 at 12:42 +0100, Alexander Marx wrote:
> in firewallgroups (hosts) an error was created when using ip adresses
> like 192.168.000.008. Now all leading zeros are deleted in
> firewallgroups and in the firewall itself when using single ip
> addresses
> as source or target.
> 
> Signed-off-by: Alexander Marx <alexander.marx@ipfire.org>
> ---
>  config/cfgroot/network-functions.pl | 13 +++++++++++++
>  html/cgi-bin/firewall.cgi           |  8 ++++++++
>  html/cgi-bin/fwhosts.cgi            | 13 +++++++------
>  3 files changed, 28 insertions(+), 6 deletions(-)
> 
> diff --git a/config/cfgroot/network-functions.pl
> b/config/cfgroot/network-functions.pl
> index cb4ca3d..70fa5ed 100644
> --- a/config/cfgroot/network-functions.pl
> +++ b/config/cfgroot/network-functions.pl
> @@ -122,6 +122,19 @@ sub network2bin($) {
>  	return ($network_start, $netmask_bin);
>  }
>  
> +# Deletes leading zeros in ip address
> +sub ip_remove_zero{
> +	my $address = shift;
> +	my @ip = split (/\./, $address);
> +
> +	foreach my $octet (@ip) {
> +		$octet = int($octet);
> +	}
> +
> +	$address = join (".", @ip);
> +
> +	return $address;
> +}
>  # Returns True for all valid IP addresses
>  sub check_ip_address($) {
>  	my $address = shift;
> diff --git a/html/cgi-bin/firewall.cgi b/html/cgi-bin/firewall.cgi
> index 682c285..8007182 100644
> --- a/html/cgi-bin/firewall.cgi
> +++ b/html/cgi-bin/firewall.cgi
> @@ -31,6 +31,7 @@ no warnings 'uninitialized';
>  #use CGI::Carp 'fatalsToBrowser';
>  
>  require '/var/ipfire/general-functions.pl';
> +require '/var/ipfire/network-functions.pl';
>  require "${General::swroot}/lang.pl";
>  require "${General::swroot}/header.pl";
>  require "${General::swroot}/geoip-functions.pl";
> @@ -465,6 +466,9 @@ sub checksource
>  			}
>  		}
>  		if ($fwdfwsettings{'isip'} eq 'on'){
> +			#remove leading zero
> +			$ip = &Network::ip_remove_zero($ip);
> +
>  			##check if ip is valid
>  			if (! &General::validip($ip)){
>  				$errormessage.=$Lang::tr{'fwdfw err
> src_addr'}."<br>";
> @@ -569,11 +573,15 @@ sub checktarget
>  			($ip,$subnet)=split
> (/\//,$fwdfwsettings{'tgt_addr'});
>  			$subnet = &General::iporsubtocidr($subnet);
>  		}
> +
>  		#check if only ip
>  		if($fwdfwsettings{'tgt_addr'}=~/^(\d{1,3})\.(\d{1,3}
> )\.(\d{1,3})\.(\d{1,3})$/){
>  			$ip=$fwdfwsettings{'tgt_addr'};
>  			$subnet='32';
>  		}
> +		#remove leading zero
> +		$ip = &Network::ip_remove_zero($ip);
> +
>  		#check if ip is valid
>  		if (! &General::validip($ip)){
>  			$errormessage.=$Lang::tr{'fwdfw err
> tgt_addr'}."<br>";
> diff --git a/html/cgi-bin/fwhosts.cgi b/html/cgi-bin/fwhosts.cgi
> index 994a50a..35afad3 100644
> --- a/html/cgi-bin/fwhosts.cgi
> +++ b/html/cgi-bin/fwhosts.cgi
> @@ -27,6 +27,7 @@ use Sort::Naturally;
>  use CGI::Carp 'fatalsToBrowser';
>  no warnings 'uninitialized';
>  require '/var/ipfire/general-functions.pl';
> +require '/var/ipfire/network-functions.pl';
>  require "/var/ipfire/geoip-functions.pl";
>  require "/usr/lib/firewall/firewall-lib.pl";
>  require "${General::swroot}/lang.pl";
> @@ -277,6 +278,9 @@ if ($fwhostsettings{'ACTION'} eq 'savenet' )
>  		&addnet;
>  		&viewtablenet;
>  	}else{
> +		#convert ip if leading '0' exists
> +		$fwhostsettings{'IP'} =
> &Network::ip_remove_zero($fwhostsettings{'IP'});
> +
>  		#check valid ip 
>  		if
> (!&General::validipandmask($fwhostsettings{'IP'}."/".$fwhostsettings{
> 'SUBNET'}))
>  		{
> @@ -372,9 +376,6 @@ if ($fwhostsettings{'ACTION'} eq 'savenet' )
>  			foreach my $i (0 .. 3) {
> $customnetwork{$key}[$i] = "";}
>  			$fwhostsettings{'SUBNET'}	=
> &General::iporsubtocidr($fwhostsettings{'SUBNET'});
>  			$customnetwork{$key}[0] 	=
> $fwhostsettings{'HOSTNAME'};
> -			#convert ip when leading '0' in byte
> -			$fwhostsettings{'IP'}		=&Gener
> al::ip2dec($fwhostsettings{'IP'});
> -			$fwhostsettings{'IP'}		=&Gener
> al::dec2ip($fwhostsettings{'IP'});
>  			$customnetwork{$key}[1] 	=
> &General::getnetworkip($fwhostsettings{'IP'},$fwhostsettings{'SUBNET'
> }) ;
>  			$customnetwork{$key}[2] 	=
> &General::iporsubtodec($fwhostsettings{'SUBNET'}) ;
>  			$customnetwork{$key}[3] 	=
> $fwhostsettings{'NETREMARK'};
> @@ -423,6 +424,9 @@ if ($fwhostsettings{'ACTION'} eq 'savehost')
>  		}
>  		#CHECK IP-PART
>  		if ($fwhostsettings{'type'} eq 'ip'){
> +			#convert ip if leading '0' exists
> +			$fwhostsettings{'IP'} =
> &Network::ip_remove_zero($fwhostsettings{'IP'});
> +
>  			#check for subnet
>  			if (rindex($fwhostsettings{'IP'},'/') eq '
> -1' ){
>  				if($fwhostsettings{'type'} eq 'ip'
> && !&General::validipandmask($fwhostsettings{'IP'}."/32"))
> @@ -503,9 +507,6 @@ if ($fwhostsettings{'ACTION'} eq 'savehost')
>  			$customhost{$key}[0] =
> $fwhostsettings{'HOSTNAME'} ;
>  			$customhost{$key}[1] =
> $fwhostsettings{'type'} ;
>  			if ($fwhostsettings{'type'} eq 'ip'){
> -				#convert ip when leading '0' in byte
> -				$fwhostsettings{'IP'}=&General::ip2d
> ec($fwhostsettings{'IP'});
> -				$fwhostsettings{'IP'}=&General::dec2
> ip($fwhostsettings{'IP'});
>  				$customhost{$key}[2] =
> $fwhostsettings{'IP'}."/".&General::iporsubtodec($fwhostsettings{'SUB
> NET'});
>  			}else{
>  				$customhost{$key}[2] =
> $fwhostsettings{'IP'};
  
Michael Tremer Nov. 10, 2015, 9:16 a.m. UTC | #2
On Mon, 2015-11-09 at 20:14 +0100, Alexander Marx wrote:
> 
> FULL ACK, Michael.
> 
> But unfortunately it seems not to be possible to catch that issue
> with modification of central functions like check_ip_address, becaus
> ethat functions only return true or false not the "normalized ip"
> without zero's.
> 
> I am open for better solutions....  anyone ideas?!

It is too late for that now. I think the best option would simply to
consider those inputs as invalid and maybe fix this at some places
where we can and where we find this makes sense.

-Michael

P.S. Please make sure to reply to the list. Especially if you are
asking a question to the group :)

> 
> cheers,
> 
> Alex
> 
> Am 09.11.2015 um 19:33 schrieb Michael Tremer:
> > Hi,
> > 
> > this does not look like the cleanest solution to be honest, but I
> > guess
> > this is acceptable. It solves the issue at hand, but generally I
> > would
> > like to have this solved one time so that one does not have to keep
> > this problem in mind when writing new code.
> > 
> > Merged.
> > 
> > Best,
> > -Michael
> > 
> > On Mon, 2015-11-09 at 12:42 +0100, Alexander Marx wrote:
> > > in firewallgroups (hosts) an error was created when using ip
> > > adresses
> > > like 192.168.000.008. Now all leading zeros are deleted in
> > > firewallgroups and in the firewall itself when using single ip
> > > addresses
> > > as source or target.
> > > 
> > > Signed-off-by: Alexander Marx <alexander.marx@ipfire.org>
> > > ---
> > >  config/cfgroot/network-functions.pl | 13 +++++++++++++
> > >  html/cgi-bin/firewall.cgi           |  8 ++++++++
> > >  html/cgi-bin/fwhosts.cgi            | 13 +++++++------
> > >  3 files changed, 28 insertions(+), 6 deletions(-)
> > > 
> > > diff --git a/config/cfgroot/network-functions.pl
> > > b/config/cfgroot/network-functions.pl
> > > index cb4ca3d..70fa5ed 100644
> > > --- a/config/cfgroot/network-functions.pl
> > > +++ b/config/cfgroot/network-functions.pl
> > > @@ -122,6 +122,19 @@ sub network2bin($) {
> > >  	return ($network_start, $netmask_bin);
> > >  }
> > >  
> > > +# Deletes leading zeros in ip address
> > > +sub ip_remove_zero{
> > > +	my $address = shift;
> > > +	my @ip = split (/\./, $address);
> > > +
> > > +	foreach my $octet (@ip) {
> > > +		$octet = int($octet);
> > > +	}
> > > +
> > > +	$address = join (".", @ip);
> > > +
> > > +	return $address;
> > > +}
> > >  # Returns True for all valid IP addresses
> > >  sub check_ip_address($) {
> > >  	my $address = shift;
> > > diff --git a/html/cgi-bin/firewall.cgi b/html/cgi
> > > -bin/firewall.cgi
> > > index 682c285..8007182 100644
> > > --- a/html/cgi-bin/firewall.cgi
> > > +++ b/html/cgi-bin/firewall.cgi
> > > @@ -31,6 +31,7 @@ no warnings 'uninitialized';
> > >  #use CGI::Carp 'fatalsToBrowser';
> > >  
> > >  require '/var/ipfire/general-functions.pl';
> > > +require '/var/ipfire/network-functions.pl';
> > >  require "${General::swroot}/lang.pl";
> > >  require "${General::swroot}/header.pl";
> > >  require "${General::swroot}/geoip-functions.pl";
> > > @@ -465,6 +466,9 @@ sub checksource
> > >  			}
> > >  		}
> > >  		if ($fwdfwsettings{'isip'} eq 'on'){
> > > +			#remove leading zero
> > > +			$ip = &Network::ip_remove_zero($ip);
> > > +
> > >  			##check if ip is valid
> > >  			if (! &General::validip($ip)){
> > >  				$errormessage.=$Lang::tr{'fwdfw
> > > err
> > > src_addr'}."<br>";
> > > @@ -569,11 +573,15 @@ sub checktarget
> > >  			($ip,$subnet)=split
> > > (/\//,$fwdfwsettings{'tgt_addr'});
> > >  			$subnet =
> > > &General::iporsubtocidr($subnet);
> > >  		}
> > > +
> > >  		#check if only ip
> > >  		if($fwdfwsettings{'tgt_addr'}=~/^(\d{1,3})\.(\d{
> > > 1,3}
> > > )\.(\d{1,3})\.(\d{1,3})$/){
> > >  			$ip=$fwdfwsettings{'tgt_addr'};
> > >  			$subnet='32';
> > >  		}
> > > +		#remove leading zero
> > > +		$ip = &Network::ip_remove_zero($ip);
> > > +
> > >  		#check if ip is valid
> > >  		if (! &General::validip($ip)){
> > >  			$errormessage.=$Lang::tr{'fwdfw err
> > > tgt_addr'}."<br>";
> > > diff --git a/html/cgi-bin/fwhosts.cgi b/html/cgi-bin/fwhosts.cgi
> > > index 994a50a..35afad3 100644
> > > --- a/html/cgi-bin/fwhosts.cgi
> > > +++ b/html/cgi-bin/fwhosts.cgi
> > > @@ -27,6 +27,7 @@ use Sort::Naturally;
> > >  use CGI::Carp 'fatalsToBrowser';
> > >  no warnings 'uninitialized';
> > >  require '/var/ipfire/general-functions.pl';
> > > +require '/var/ipfire/network-functions.pl';
> > >  require "/var/ipfire/geoip-functions.pl";
> > >  require "/usr/lib/firewall/firewall-lib.pl";
> > >  require "${General::swroot}/lang.pl";
> > > @@ -277,6 +278,9 @@ if ($fwhostsettings{'ACTION'} eq 'savenet' )
> > >  		&addnet;
> > >  		&viewtablenet;
> > >  	}else{
> > > +		#convert ip if leading '0' exists
> > > +		$fwhostsettings{'IP'} =
> > > &Network::ip_remove_zero($fwhostsettings{'IP'});
> > > +
> > >  		#check valid ip 
> > >  		if
> > > (!&General::validipandmask($fwhostsettings{'IP'}."/".$fwhostsetti
> > > ngs{
> > > 'SUBNET'}))
> > >  		{
> > > @@ -372,9 +376,6 @@ if ($fwhostsettings{'ACTION'} eq 'savenet' )
> > >  			foreach my $i (0 .. 3) {
> > > $customnetwork{$key}[$i] = "";}
> > >  			$fwhostsettings{'SUBNET'}	=
> > > &General::iporsubtocidr($fwhostsettings{'SUBNET'});
> > >  			$customnetwork{$key}[0] 	=
> > > $fwhostsettings{'HOSTNAME'};
> > > -			#convert ip when leading '0' in byte
> > > -			$fwhostsettings{'IP'}		=&G
> > > ener
> > > al::ip2dec($fwhostsettings{'IP'});
> > > -			$fwhostsettings{'IP'}		=&G
> > > ener
> > > al::dec2ip($fwhostsettings{'IP'});
> > >  			$customnetwork{$key}[1] 	=
> > > &General::getnetworkip($fwhostsettings{'IP'},$fwhostsettings{'SUB
> > > NET'
> > > }) ;
> > >  			$customnetwork{$key}[2] 	=
> > > &General::iporsubtodec($fwhostsettings{'SUBNET'}) ;
> > >  			$customnetwork{$key}[3] 	=
> > > $fwhostsettings{'NETREMARK'};
> > > @@ -423,6 +424,9 @@ if ($fwhostsettings{'ACTION'} eq 'savehost')
> > >  		}
> > >  		#CHECK IP-PART
> > >  		if ($fwhostsettings{'type'} eq 'ip'){
> > > +			#convert ip if leading '0' exists
> > > +			$fwhostsettings{'IP'} =
> > > &Network::ip_remove_zero($fwhostsettings{'IP'});
> > > +
> > >  			#check for subnet
> > >  			if (rindex($fwhostsettings{'IP'},'/') eq
> > > '
> > > -1' ){
> > >  				if($fwhostsettings{'type'} eq
> > > 'ip'
> > > && !&General::validipandmask($fwhostsettings{'IP'}."/32"))
> > > @@ -503,9 +507,6 @@ if ($fwhostsettings{'ACTION'} eq 'savehost')
> > >  			$customhost{$key}[0] =
> > > $fwhostsettings{'HOSTNAME'} ;
> > >  			$customhost{$key}[1] =
> > > $fwhostsettings{'type'} ;
> > >  			if ($fwhostsettings{'type'} eq 'ip'){
> > > -				#convert ip when leading '0' in
> > > byte
> > > -				$fwhostsettings{'IP'}=&General::
> > > ip2d
> > > ec($fwhostsettings{'IP'});
> > > -				$fwhostsettings{'IP'}=&General::
> > > dec2
> > > ip($fwhostsettings{'IP'});
> > >  				$customhost{$key}[2] =
> > > $fwhostsettings{'IP'}."/".&General::iporsubtodec($fwhostsettings{
> > > 'SUB
> > > NET'});
> > >  			}else{
> > >  				$customhost{$key}[2] =
> > > $fwhostsettings{'IP'};