]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - html/cgi-bin/firewall.cgi
firewall.cgi: Map rule if manual target address belongs to IPFire
[ipfire-2.x.git] / html / cgi-bin / firewall.cgi
index 4f4d63cc8dd45666ba27aedb5206c86e898b398e..d8adb19f836d9c4c43daf8c19b6dc21aad6b92e8 100644 (file)
@@ -38,11 +38,11 @@ require "${General::swroot}/header.pl";
 require "${General::swroot}/location-functions.pl";
 require "/usr/lib/firewall/firewall-lib.pl";
 
-unless (-d "${General::swroot}/firewall")                      { system("mkdir ${General::swroot}/firewall"); }
-unless (-e "${General::swroot}/firewall/settings")     { system("touch ${General::swroot}/firewall/settings"); }
-unless (-e "${General::swroot}/firewall/config")       { system("touch ${General::swroot}/firewall/config"); }
-unless (-e "${General::swroot}/firewall/input")                { system("touch ${General::swroot}/firewall/input"); }
-unless (-e "${General::swroot}/firewall/outgoing")     { system("touch ${General::swroot}/firewall/outgoing"); }
+unless (-d "${General::swroot}/firewall")                      { &General::system("mkdir", "${General::swroot}/firewall"); }
+unless (-e "${General::swroot}/firewall/settings")     { &General::system("touch", "${General::swroot}/firewall/settings"); }
+unless (-e "${General::swroot}/firewall/config")       { &General::system("touch", "${General::swroot}/firewall/config"); }
+unless (-e "${General::swroot}/firewall/input")                { &General::system("touch", "${General::swroot}/firewall/input"); }
+unless (-e "${General::swroot}/firewall/outgoing")     { &General::system("touch", "${General::swroot}/firewall/outgoing"); }
 
 my %fwdfwsettings=();
 my %selected=() ;
@@ -213,6 +213,7 @@ if ($fwdfwsettings{'ACTION'} eq 'saverule')
        &General::readhasharray("$configfwdfw", \%configfwdfw);
        &General::readhasharray("$configinput", \%configinputfw);
        &General::readhasharray("$configoutgoing", \%configoutgoingfw);
+       &General::readhash("/var/ipfire/ethernet/settings", \%netsettings);
        my $maxkey;
        #Set Variables according to the JQuery code in protocol section
        if ($fwdfwsettings{'PROT'} eq 'TCP' || $fwdfwsettings{'PROT'} eq 'UDP')
@@ -231,6 +232,38 @@ if ($fwdfwsettings{'ACTION'} eq 'saverule')
        {
                $fwdfwsettings{'USESRV'} = 'ON';
        }
+
+       # Check if a manual target IP is one of the IPFire's addresses.
+       if ($fwdfwsettings{'grp2'} eq 'tgt_addr') {
+               # Grab all available network zones.
+               my @network_zones = &Network::get_available_network_zones();
+
+               # Loop through the array of network zones.
+               foreach my $zone (@network_zones) {
+                       # Skip red network zone.
+                       next if $zone eq "red";
+
+                       # Convert current zone name into upper case.
+                       $zone = uc($zone);
+
+                       # Generate key to access the required data from the netsettings hash.
+                       my $key = $zone . "_ADDRESS";
+
+                       # Obtain the configured address for the current zone from the netsettings hash.
+                       my $zone_address = $netsettings{$key};
+
+                       # Check if the given address and the current processed zone address are the same.
+                       if ($fwdfwsettings{$fwdfwsettings{'grp2'}} eq $zone_address) {
+                               # Map the type and target.
+                               $fwdfwsettings{'grp2'} = 'ipfire';
+                               $fwdfwsettings{$fwdfwsettings{'grp2'}} = $zone;
+
+                               # End loop.
+                               last;
+                       }
+               }
+       }
+
        $errormessage=&checksource;
        if(!$errormessage){&checktarget;}
        if(!$errormessage){&checkrule;}
@@ -247,7 +280,7 @@ if ($fwdfwsettings{'ACTION'} eq 'saverule')
                $errormessage=$Lang::tr{'fwdfw err same'};
        }
        # INPUT part
-       if ($fwdfwsettings{'grp2'} eq 'ipfire' && $fwdfwsettings{$fwdfwsettings{'grp1'}} ne 'ORANGE'){
+       if ($fwdfwsettings{'grp2'} eq 'ipfire'{
                $fwdfwsettings{'config'}=$configinput;
                $fwdfwsettings{'chain'} = 'INPUTFW';
                $maxkey=&General::findhasharraykey(\%configinputfw);
@@ -1005,6 +1038,10 @@ sub gen_dd_block
        my $grp=shift;
        my $helper='';
        my $show='';
+
+       my %checked = ();
+       my %selected = ();
+
        $checked{'grp1'}{$fwdfwsettings{'grp1'}}                                = 'CHECKED';
        $checked{'grp2'}{$fwdfwsettings{'grp2'}}                                = 'CHECKED';
        $checked{'grp3'}{$fwdfwsettings{'grp3'}}                                = 'CHECKED';
@@ -1022,8 +1059,6 @@ sub gen_dd_block
        $checked{'TIME_SUN'}{$fwdfwsettings{'TIME_SUN'}}                = 'CHECKED';
        $selected{'TIME_FROM'}{$fwdfwsettings{'TIME_FROM'}}             = 'selected';
        $selected{'TIME_TO'}{$fwdfwsettings{'TIME_TO'}}                 = 'selected';
-       $selected{'ipfire'}{$fwdfwsettings{$fwdfwsettings{'grp1'}}} ='selected';
-       $selected{'ipfire'}{$fwdfwsettings{$fwdfwsettings{'grp2'}}} ='selected';
 print<<END;
                <table width='100%' border='0'>
                <tr><td width='50%' valign='top'>
@@ -1034,7 +1069,12 @@ END
                {
                        next if($defaultNetworks{$network}{'NAME'} eq "IPFire");
                        print "<option value='$defaultNetworks{$network}{'NAME'}'";
-                       print " selected='selected'" if ($fwdfwsettings{$fwdfwsettings{$grp}} eq $defaultNetworks{$network}{'NAME'});
+
+                       # Check if the the key handles a standard network.
+                       if ( grep(/std_net_/, $fwdfwsettings{$grp}) ) {
+                               print " selected='selected'" if ($fwdfwsettings{$fwdfwsettings{$grp}} eq $defaultNetworks{$network}{'NAME'});
+                       }
+
                        my $defnet="$defaultNetworks{$network}{'NAME'}_NETADDRESS";
                        my $defsub="$defaultNetworks{$network}{'NAME'}_NETMASK";
                        my $defsub1=&General::subtocidr($ifaces{$defsub});
@@ -1479,7 +1519,10 @@ sub newrule
        &General::readhasharray("$configlocationgrp", \%customlocationgrp);
        &General::readhasharray("$configipsec", \%ipsecconf);
        &General::get_aliases(\%aliases);
-       my %checked=();
+
+       my %checked = ();
+       my %selected = ();
+
        my $helper;
        my $sum=0;
        if($fwdfwsettings{'config'} eq ''){$fwdfwsettings{'config'}=$configfwdfw;}
@@ -1512,8 +1555,8 @@ sub newrule
        $checked{'USE_NAT'}{$fwdfwsettings{'USE_NAT'}}                  = 'CHECKED';
        $selected{'TIME_FROM'}{$fwdfwsettings{'TIME_FROM'}}             = 'selected';
        $selected{'TIME_TO'}{$fwdfwsettings{'TIME_TO'}}                 = 'selected';
-       $selected{'ipfire'}{$fwdfwsettings{$fwdfwsettings{'grp2'}}} ='selected';
-       $selected{'ipfire_src'}{$fwdfwsettings{$fwdfwsettings{'grp1'}}} ='selected';
+       $selected{'ipfire'}{$fwdfwsettings{$fwdfwsettings{'grp2'}}} = 'selected' if ($fwdfwsettings{'grp2'} eq "ipfire");
+       $selected{'ipfire_src'}{$fwdfwsettings{$fwdfwsettings{'grp1'}}} = 'selected' if ($fwdfwsettings{'grp1'} eq "ipfire_src");
        #check if update and get values
        if($fwdfwsettings{'updatefwrule'} eq 'on' || $fwdfwsettings{'copyfwrule'} eq 'on' && !$errormessage){
                &General::readhasharray("$config", \%hash);
@@ -1584,8 +1627,8 @@ sub newrule
                                $checked{'RATE_LIMIT'}{$fwdfwsettings{'RATE_LIMIT'}}    = 'CHECKED';
                                $selected{'TIME_FROM'}{$fwdfwsettings{'TIME_FROM'}}             = 'selected';
                                $selected{'TIME_TO'}{$fwdfwsettings{'TIME_TO'}}                 = 'selected';
-                               $selected{'ipfire'}{$fwdfwsettings{$fwdfwsettings{'grp2'}}} ='selected';
-                               $selected{'ipfire_src'}{$fwdfwsettings{$fwdfwsettings{'grp1'}}} ='selected';
+                               $selected{'ipfire'}{$fwdfwsettings{$fwdfwsettings{'grp2'}}} = 'selected' if ($fwdfwsettings{'grp2'} eq "ipfire");
+                               $selected{'ipfire_src'}{$fwdfwsettings{$fwdfwsettings{'grp1'}}} = 'selected' if ($fwdfwsettings{'grp1'} eq "ipfire_src");
                                $selected{'dnat'}{$fwdfwsettings{'dnat'}}                               ='selected';
                                $selected{'snat'}{$fwdfwsettings{'snat'}}                               ='selected';
                                $selected{'RATETIME'}{$fwdfwsettings{'RATETIME'}}               ='selected';