diff options
author | Renato Botelho <garga@FreeBSD.org> | 2013-11-20 15:20:01 -0200 |
---|---|---|
committer | Renato Botelho <garga@FreeBSD.org> | 2013-11-20 15:20:01 -0200 |
commit | e924cd7eb2457e7fd7122aecc1f2887824229edb (patch) | |
tree | 3e7ff684e874de59cdb3b0e8e50632d4e02f006b /usr/local/www | |
parent | a0e1f0f1e3a50b3f1675d977ca16fdd123c7e857 (diff) | |
download | pfsense-e924cd7eb2457e7fd7122aecc1f2887824229edb.zip pfsense-e924cd7eb2457e7fd7122aecc1f2887824229edb.tar.gz |
Add hability to insert after, reorder, batch delete and enable/disable to 1:1 NAT rules. It fixes #3327
Diffstat (limited to 'usr/local/www')
-rwxr-xr-x | usr/local/www/firewall_nat_1to1.php | 193 | ||||
-rwxr-xr-x | usr/local/www/firewall_nat_1to1_edit.php | 20 |
2 files changed, 182 insertions, 31 deletions
diff --git a/usr/local/www/firewall_nat_1to1.php b/usr/local/www/firewall_nat_1to1.php index 238f160..e38c797 100755 --- a/usr/local/www/firewall_nat_1to1.php +++ b/usr/local/www/firewall_nat_1to1.php @@ -74,6 +74,75 @@ if ($_GET['act'] == "del") { } } +if (isset($_POST['del_x'])) { + /* delete selected rules */ + if (is_array($_POST['rule']) && count($_POST['rule'])) { + foreach ($_POST['rule'] as $rulei) { + unset($a_1to1[$rulei]); + } + if (write_config()) + mark_subsystem_dirty('natconf'); + header("Location: firewall_nat_1to1.php"); + exit; + } + +} else if ($_GET['act'] == "toggle") { + if ($a_1to1[$_GET['id']]) { + if(isset($a_1to1[$_GET['id']]['disabled'])) + unset($a_1to1[$_GET['id']]['disabled']); + else + $a_1to1[$_GET['id']]['disabled'] = true; + if (write_config("Firewall: NAT: Outbound, enable/disable NAT rule")) + mark_subsystem_dirty('natconf'); + header("Location: firewall_nat_1to1.php"); + exit; + } +} else { + /* yuck - IE won't send value attributes for image buttons, while Mozilla does - so we use .x/.y to find move button clicks instead... */ + unset($movebtn); + foreach ($_POST as $pn => $pd) { + if (preg_match("/move_(\d+)_x/", $pn, $matches)) { + $movebtn = $matches[1]; + break; + } + } + /* move selected rules before this rule */ + if (isset($movebtn) && is_array($_POST['rule']) && count($_POST['rule'])) { + $a_1to1_new = array(); + + /* copy all rules < $movebtn and not selected */ + for ($i = 0; $i < $movebtn; $i++) { + if (!in_array($i, $_POST['rule'])) + $a_1to1_new[] = $a_1to1[$i]; + } + + /* copy all selected rules */ + for ($i = 0; $i < count($a_1to1); $i++) { + if ($i == $movebtn) + continue; + if (in_array($i, $_POST['rule'])) + $a_1to1_new[] = $a_1to1[$i]; + } + + /* copy $movebtn rule */ + if ($movebtn < count($a_1to1)) + $a_1to1_new[] = $a_1to1[$movebtn]; + + /* copy all rules > $movebtn and not selected */ + for ($i = $movebtn+1; $i < count($a_1to1); $i++) { + if (!in_array($i, $_POST['rule'])) + $a_1to1_new[] = $a_1to1[$i]; + } + if (count($a_1to1_new) > 0) + $a_1to1 = $a_1to1_new; + + if (write_config()) + mark_subsystem_dirty('natconf'); + header("Location: firewall_nat_1to1.php"); + exit; + } +} + $pgtitle = array(gettext("Firewall"),gettext("NAT"),gettext("1:1")); include("head.inc"); @@ -81,10 +150,16 @@ include("head.inc"); <body link="#0000CC" vlink="#0000CC" alink="#0000CC"> <?php include("fbegin.inc"); ?> <form action="firewall_nat_1to1.php" method="post"> -<?php if ($savemsg) print_info_box($savemsg); ?> -<?php if (is_subsystem_dirty('natconf')): ?> -<?php print_info_box_np(gettext("The NAT configuration has been changed") . ".<br/>" . gettext("You must apply the changes in order for them to take effect."));?><br/> -<?php endif; ?> +<script type="text/javascript" language="javascript" src="/javascript/row_toggle.js"></script> +<?php +if ($savemsg) + print_info_box($savemsg); +if (is_subsystem_dirty('natconf')) + print_info_box_np(gettext("The NAT configuration has been changed.") . + "<br/>" . + gettext("You must apply the changes in order for them to take effect.")); +?> +<br/> <table width="100%" border="0" cellpadding="0" cellspacing="0" summary="fireall nat 1to1"> <tr><td> <?php @@ -99,12 +174,14 @@ include("head.inc"); <tr><td> <div id="mainarea"> <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area"> - <tr> + <tr id="frheader"> + <td width="3%" class="list"> </td> + <td width="3%" class="list"> </td> <td width="10%" class="listhdrr"><?=gettext("Interface"); ?></td> - <td width="20%" class="listhdrr"><?=gettext("External IP"); ?></td> + <td width="15%" class="listhdrr"><?=gettext("External IP"); ?></td> <td width="15%" class="listhdrr"><?=gettext("Internal IP"); ?></td> <td width="15%" class="listhdrr"><?=gettext("Destination IP"); ?></td> - <td width="30%" class="listhdr"><?=gettext("Description"); ?></td> + <td width="29%" class="listhdr"><?=gettext("Description"); ?></td> <td width="10%" class="list"> <table border="0" cellspacing="0" cellpadding="1" summary="edit"> <tr> @@ -122,13 +199,25 @@ include("head.inc"); $textse = "</span>"; $i = 0; foreach ($a_1to1 as $natent): - if (isset($natent['disabled'])) + if (isset($natent['disabled'])) { $textss = "<span class=\"gray\">"; - else + $iconfn = "pass_d"; + } else { $textss = "<span>"; + $iconfn = "pass"; + } ?> - <tr> - <td class="listlr" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';"> + <tr valign="top" id="fr<?=$i;?>"> + <td class="listt"> + <input type="checkbox" id="frc<?=$i;?>" name="rule[]" value="<?=$i;?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" /> + </td> + <td class="listt" align="center"> + <a href="?act=toggle&id=<?=$i;?>"> + <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_<?=$iconfn;?>.gif" width="11" height="11" border="0" + title="<?=gettext("click to toggle enabled/disabled status");?>" alt="icon" /> + </a> + </td> + <td class="listlr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';"> <?php echo $textss; if (!$natent['interface']) @@ -138,39 +227,52 @@ include("head.inc"); echo $textse; ?> </td> - <td class="listr" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';"> + <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';"> <?php $source_net = pprint_address($natent['source']); $source_cidr = strstr($source_net, '/'); echo $textss . $natent['external'] . $source_cidr . $textse; ?> </td> - <td class="listr" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';"> + <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';"> <?php echo $textss . $source_net . $textse; ?> </td> - <td class="listr" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';"> + <td class="listr" onclick="fr_toggle(<?=$i;?>)" id="frd<?=$i;?>" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';"> <?php echo $textss . pprint_address($natent['destination']) . $textse; ?> </td> - <td class="listbg" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';"> + <td class="listbg" onclick="fr_toggle(<?=$i;?>)" ondblclick="document.location='firewall_nat_1to1_edit.php?id=<?=$i;?>';"> <?php echo $textss . htmlspecialchars($natent['descr']) . ' ' . $textse; ?> </td> - <td class="list nowrap"> - <table border="0" cellspacing="0" cellpadding="1" summary="edit"> + <td class="list nowrap" valign="middle"> + <table border="0" cellspacing="0" cellpadding="1" summary="move"> <tr> - <td valign="middle"> + <td> + <input onmouseover="fr_insline(<?=$i;?>, true)" onmouseout="fr_insline(<?=$i;?>, false)" name="move_<?=$i;?>" + src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" + title="<?=gettext("move selected rules before this rule");?>" + type="image" style="height:17;width:17;border:0" /> + </td> + <td> <a href="firewall_nat_1to1_edit.php?id=<?=$i;?>"> - <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit rule"); ?>" alt="edit" /> + <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_e.gif" width="17" height="17" border="0" title="<?=gettext("edit rule");?>" alt="edit" /> </a> </td> - <td valign="middle"> - <a href="firewall_nat_1to1.php?act=del&id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this mapping?");?>')"> - <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule"); ?>" alt="delete" /> + </tr> + <tr> + <td align="center" valign="middle"> + <a href="firewall_nat_1to1.php?act=del&id=<?=$i;?>" onclick="return confirm('<?=gettext("Do you really want to delete this rule?");?>')"> + <img src="./themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" width="17" height="17" border="0" title="<?=gettext("delete rule");?>" alt="delete" /> + </a> + </td> + <td> + <a href="firewall_nat_1to1_edit.php?dup=<?=$i;?>"> + <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("add a new rule based on this one");?>" width="17" height="17" border="0" alt="duplicate" /> </a> </td> </tr> @@ -182,22 +284,55 @@ include("head.inc"); endforeach; ?> <tr> - <td class="list" colspan="5"></td> - <td class="list"> - <table border="0" cellspacing="0" cellpadding="1" summary="add"> + <td class="list" colspan="7"></td> + <td class="list nowrap" valign="middle"> + <table border="0" cellspacing="0" cellpadding="1" summary="edit"> <tr> - <td width="17"></td> - <td valign="middle"> + <td> +<?php + if ($i == 0): +?> + <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_left_d.gif" width="17" height="17" + title="<?=gettext("move selected mappings to end");?>" border="0" alt="move" /> +<?php + else: +?> + <input name="move_<?=$i;?>" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_left.gif" + style="width:17;height:17;border:0" title="<?=gettext("move selected mappings to end");?>" /> +<?php + endif; +?> + </td> + <td> <a href="firewall_nat_1to1_edit.php"> - <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" title="<?=gettext("add rule"); ?>" alt="add" /> + <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" width="17" height="17" border="0" + title="<?=gettext("add new mapping");?>" alt="add" /> </a> </td> </tr> + <tr> + <td> +<?php + if ($i == 0): +?> + <img src="/themes/<?= $g['theme']; ?>/images/icons/icon_x_d.gif" width="17" height="17" + title="<?=gettext("delete selected rules");?>" border="0" alt="delete" /> +<?php + else: +?> + <input name="del" type="image" src="/themes/<?= $g['theme']; ?>/images/icons/icon_x.gif" + style="width:17;height:17" title="<?=gettext("delete selected mappings");?>" + onclick="return confirm('<?=gettext("Do you really want to delete the selected mappings?");?>')" /> +<?php + endif; +?> + </td> + </tr> </table> </td> </tr> <tr> - <td colspan="5"> + <td colspan="7"> <p><span class="vexpl"> <span class="red"><strong><?=gettext("Note:"); ?><br/></strong></span> <?=gettext("Depending on the way your WAN connection is setup, you may also need a"); ?> diff --git a/usr/local/www/firewall_nat_1to1_edit.php b/usr/local/www/firewall_nat_1to1_edit.php index f8ad813..679df94 100755 --- a/usr/local/www/firewall_nat_1to1_edit.php +++ b/usr/local/www/firewall_nat_1to1_edit.php @@ -73,6 +73,15 @@ $id = $_GET['id']; if (isset($_POST['id'])) $id = $_POST['id']; +$after = $_GET['after']; +if (isset($_POST['after'])) + $after = $_POST['after']; + +if (isset($_GET['dup'])) { + $id = $_GET['dup']; + $after = $_GET['dup']; +} + if (isset($id) && $a_1to1[$id]) { $pconfig['disabled'] = isset($a_1to1[$id]['disabled']); @@ -94,6 +103,9 @@ if (isset($id) && $a_1to1[$id]) { } else $pconfig['interface'] = "wan"; +if (isset($_GET['dup'])) + unset($id); + if ($_POST) { unset($input_errors); @@ -206,8 +218,12 @@ if ($_POST) { if (isset($id) && $a_1to1[$id]) $a_1to1[$id] = $natent; - else - $a_1to1[] = $natent; + else { + if (is_numeric($after)) + array_splice($a_1to1, $after+1, 0, array($natent)); + else + $a_1to1[] = $natent; + } nat_1to1_rules_sort(); if (write_config()) |