Commit a453828f authored by Ad Schellevis's avatar Ad Schellevis

(legacy) cleanup system_gateways.php, correct hanlding of post/get, proper code ordering.

Not perfect, but at least makes it readable.
Things to correct at some point in time: very obscure return_gateways_array and move route delete actions to configd
parent 2c45ccb1
......@@ -35,44 +35,16 @@ require_once("system.inc");
require_once("pfsense-utils.inc");
require_once("rrd.inc");
$a_gateways = return_gateways_array(true, false, true);
$a_gateways_arr = array();
foreach ($a_gateways as $gw) {
$a_gateways_arr[] = $gw;
}
$a_gateways = $a_gateways_arr;
if (!is_array($config['gateways'])) {
$config['gateways'] = array();
}
if (!is_array($config['gateways']['gateway_item'])) {
$config['gateways']['gateway_item'] = array();
}
$a_gateway_item = &$config['gateways']['gateway_item'];
if ($_POST) {
$pconfig = $_POST;
if ($_POST['apply']) {
$retval = 0;
$retval = system_routing_configure();
$retval |= filter_configure();
/* reconfigure our gateway monitor */
setup_gateways_monitor();
$savemsg = get_std_save_message();
if ($retval == 0) {
clear_subsystem_dirty('staticroutes');
}
}
}
function can_delete_gateway_item($id)
/**
* check if gateway_item can be deleted
* @param int $id sequence item in $a_gateways
* @param array $a_gateways gateway list
* @param array $input_errors input errors
* @return bool has errors
*/
function can_delete_gateway_item($id, $a_gateways, &$input_errors)
{
global $config, $input_errors, $a_gateways;
global $config;
if (!isset($a_gateways[$id])) {
return false;
......@@ -105,10 +77,14 @@ function can_delete_gateway_item($id)
return true;
}
function delete_gateway_item($id)
/**
* delete gateway
* @param int $id sequence item in $a_gateways
* @param array $a_gateways gateway list
*/
function delete_gateway_item($id, $a_gateways)
{
global $config, $a_gateways;
global $config;
if (!isset($a_gateways[$id])) {
return;
......@@ -132,289 +108,299 @@ function delete_gateway_item($id)
unset($config['gateways']['gateway_item'][$a_gateways[$id]['attribute']]);
}
unset($input_errors);
if ($_GET['act'] == "del") {
if (can_delete_gateway_item($_GET['id'])) {
$realid = $a_gateways[$_GET['id']]['attribute'];
delete_gateway_item($_GET['id']);
write_config("Gateways: removed gateway {$realid}");
mark_subsystem_dirty('staticroutes');
header("Location: system_gateways.php");
exit;
}
// fetch gateways and let's pretend the order is safe to use...
$a_gateways = return_gateways_array(true, false, true);
$a_gateways_arr = array();
foreach ($a_gateways as $gw) {
$a_gateways_arr[] = $gw;
}
$a_gateways = $a_gateways_arr;
if (isset($_POST['del_x'])) {
/* delete selected items */
if (is_array($_POST['rule']) && count($_POST['rule'])) {
foreach ($_POST['rule'] as $rulei) {
if (!can_delete_gateway_item($rulei)) {
break;
}
// form processing
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$pconfig = $_POST;
$input_errors = array();
if (isset($pconfig['id']) && isset($a_gateways[$pconfig['id']])) {
// id found and valid
$id = $pconfig['id'];
}
if (isset($pconfig['apply'])) {
// apply changes, reconfigure
$retval = 0;
$retval = system_routing_configure();
filter_configure();
/* reconfigure our gateway monitor */
setup_gateways_monitor();
if ($retval == 0) {
clear_subsystem_dirty('staticroutes');
}
if (!isset($input_errors)) {
$items_deleted = "";
foreach ($_POST['rule'] as $rulei) {
delete_gateway_item($rulei);
$items_deleted .= "{$rulei} ";
}
if (!empty($items_deleted)) {
write_config("Gateways: removed gateways {$items_deleted}");
mark_subsystem_dirty('staticroutes');
}
header("Location: system_gateways.php?displaysave=true");
exit;
} elseif (isset($id) && isset($pconfig['act']) && $pconfig['act'] == "del") {
// delete single entry
$input_errors = array();
if (can_delete_gateway_item($id, $a_gateways, $input_errors)) {
$realid = $a_gateways[$id]['attribute'];
delete_gateway_item($id, $a_gateways);
write_config("Gateways: removed gateway {$realid}");
mark_subsystem_dirty('staticroutes');
header("Location: system_gateways.php");
exit;
}
}
} elseif (isset($id) && isset($pconfig['act']) && $pconfig['act'] == "toggle") {
// Toggle active/in-active
$realid = $a_gateways[$id]['attribute'];
if (!is_array($config['gateways'])) {
$config['gateways'] = array();
}
if (!is_array($config['gateways']['gateway_item'])) {
$config['gateways']['gateway_item'] = array();
}
$a_gateway_item = &$config['gateways']['gateway_item'];
} elseif ($_GET['act'] == "toggle" && $a_gateways[$_GET['id']]) {
$realid = $a_gateways[$_GET['id']]['attribute'];
if (isset($a_gateway_item[$realid]['disabled'])) {
unset($a_gateway_item[$realid]['disabled']);
} else {
$a_gateway_item[$realid]['disabled'] = true;
}
if (isset($a_gateway_item[$realid]['disabled'])) {
unset($a_gateway_item[$realid]['disabled']);
} else {
$a_gateway_item[$realid]['disabled'] = true;
}
if (write_config("Gateways: enable/disable")) {
mark_subsystem_dirty('staticroutes');
}
if (write_config("Gateways: enable/disable")) {
mark_subsystem_dirty('staticroutes');
}
header("Location: system_gateways.php");
exit;
} elseif (!empty($pconfig['rule']) && isset($pconfig['act']) && $pconfig['act'] == "del_x") {
// delete selected items
$input_errors = array();
if (is_array($pconfig['rule']) && count($pconfig['rule'])) {
foreach ($pconfig['rule'] as $rulei) {
if (!can_delete_gateway_item($rulei, $a_gateways, $input_errors)) {
break;
}
}
header("Location: system_gateways.php");
exit;
if (count($input_errors) == 0) {
$items_deleted = "";
foreach ($_POST['rule'] as $rulei) {
delete_gateway_item($rulei, $a_gateways);
$items_deleted .= "{$rulei} ";
}
if (!empty($items_deleted)) {
write_config("Gateways: removed gateways {$items_deleted}");
mark_subsystem_dirty('staticroutes');
}
header("Location: system_gateways.php");
exit;
}
}
}
} elseif ($_SERVER['REQUEST_METHOD'] === 'GET') {
// set save message
if (!empty($_GET['displaysave'])) {
$savemsg = get_std_save_message();
}
}
legacy_html_escape_form_data($a_gateways);
$pgtitle = array(gettext('System'), gettext('Gateways'));
$shortcut_section = "gateways";
include("head.inc");
$main_buttons = array(
array('label'=> gettext('Add gateway'), 'href'=>'system_gateways_edit.php'),
);
?>
<body>
<?php include("fbegin.inc"); ?>
<!-- row -->
<script type="text/javascript">
$( document ).ready(function() {
// link delete single item buttons (by class)
$(".act_delete").click(function(event){
event.preventDefault();
var id = $(this).data('id');
BootstrapDialog.show({
type:BootstrapDialog.TYPE_INFO,
title: "<?= gettext("Gateways");?>",
message: "<?=gettext("Do you really want to delete this gateway?");?>",
buttons: [{
label: "<?= gettext("No");?>",
action: function(dialogRef) {
dialogRef.close();
}}, {
label: "<?= gettext("Yes");?>",
action: function(dialogRef) {
$("#id").val(id);
$("#action").val("del");
$("#iform").submit()
}
}]
});
});
// link toggle buttons (by class)
$(".act_toggle").click(function(event){
event.preventDefault();
var id = $(this).data('id');
$("#id").val(id);
$("#action").val("toggle");
$("#iform").submit();
});
// link delete selected
$("#btn_delete").click(function(event){
event.preventDefault();
var id = $(this).data('id');
BootstrapDialog.show({
type:BootstrapDialog.TYPE_INFO,
title: "<?= gettext("Gateways");?>",
message: "<?=gettext("Do you really want to delete the selected gateway items?");?>",
buttons: [{
label: "<?= gettext("No");?>",
action: function(dialogRef) {
dialogRef.close();
}}, {
label: "<?= gettext("Yes");?>",
action: function(dialogRef) {
$("#action").val("del_x");
$("#iform").submit()
}
}]
});
});
});
</script>
<body>
<?php include("fbegin.inc"); ?>
<section class="page-content-main">
<div class="container-fluid">
<div class="row">
<?php
if (isset($input_errors) && count($input_errors) > 0) {
print_input_errors($input_errors);
}
if (isset($savemsg)) {
print_info_box($savemsg);
}
if (is_subsystem_dirty('staticroutes')) {
print_info_box_apply(gettext("The gateway configuration has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."));
}
?>
<section class="col-xs-12">
<div class="content-box">
<div class="table-responsive">
<form action="system_gateways.php" method="post">
<table class="table table-striped table-sort sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
<thead>
<tr id="frheader">
<th width="4%" colspan="2" class="list">&nbsp;</th>
<th width="15%" class="listhdrr"><?=gettext("Name"); ?></th>
<th width="10%" class="listhdrr"><?=gettext("Interface"); ?></th>
<th width="15%" class="listhdrr"><?=gettext("Gateway"); ?></th>
<th width="15%" class="listhdrr"><?=gettext("Monitor IP"); ?></th>
<th width="31%" class="listhdr"><?=gettext("Description"); ?></th>
<th width="10%" class="list">
</th>
</tr>
</thead>
<tbody>
<?php
$textse = "</span>";
$i = 0;
foreach ($a_gateways as $gateway) :
if (isset($gateway['disabled']) || isset($gateway['inactive'])) {
$textss = "<span class=\"text-muted\">";
$iconfn = "glyphicon glyphicon-play text-muted";
} else {
$textss = "<span>";
$iconfn = "glyphicon glyphicon-play text-success";
}
?>
<tr valign="top" id="fr<?=$i;?>">
<td class="listt">
<?php
if (is_numeric($gateway['attribute'])) :
?>
<input type="checkbox" id="frc<?=$i;
?>" name="rule[]" value="<?=$i;
?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
<?php
else :
?>
&nbsp;
<?php
endif;
?>
</td>
<td class="listt" align="center">
<?php
if (isset($gateway['inactive'])) :
?>
<span class="glyphicon glyphicon-remove text-muted" data-toggle="tooltip" data-placement="left" title="<?=gettext("This gateway is inactive because interface is missing");?>"></span>
<?php
elseif (is_numeric($gateway['attribute'])) :
?>
<a href="?act=toggle&amp;id=<?=$i;
?>" data-toggle="tooltip" data-placement="left" title="<?=gettext("click to toggle enabled/disabled status");?>" >
<span class="glyphicon <?php echo $iconfn;?>"></span>
</a>
<?php
else :
?>
<span class="glyphicon <?php echo $iconfn;
?>" data-toggle="tooltip" data-placement="left" title="<?=gettext("click to toggle enabled/disabled status");?>"></span>
<?php
endif;
?>
</td>
<td class="listlr" onclick="fr_toggle(<?=$i;
?>)" id="frd<?=$i;
?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
<?php
echo $textss;
echo $gateway['name'];
if (isset($gateway['defaultgw'])) {
echo " <strong>(default)</strong>";
}
echo $textse;
?>
</td>
<td class="listr" onclick="fr_toggle(<?=$i;
?>)" id="frd<?=$i;
?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
<?php
echo $textss;
echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($gateway['friendlyiface']));
echo $textse;
?>
</td>
<td class="listr" onclick="fr_toggle(<?=$i;
?>)" id="frd<?=$i;
?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
<?php
echo $textss;
echo $gateway['gateway'] . " ";
echo $textse;
?>
</td>
<td class="listr" onclick="fr_toggle(<?=$i;
?>)" id="frd<?=$i;
?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
<?php
echo $textss;
echo htmlspecialchars($gateway['monitor']) . " ";
echo $textse;
?>
</td>
<?php
if (is_numeric($gateway['attribute'])) :
?>
<td class="listbg" onclick="fr_toggle(<?=$i;
?>)" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
<?php
else :
?>
<td class="listbgns" onclick="fr_toggle(<?=$i;
?>)" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
<?php
endif;
echo $textss;
echo htmlspecialchars($gateway['descr']) . "&nbsp;";
echo $textse;
?>
</td>
<td valign="middle" class="list nowrap">
<a href="system_gateways_edit.php?id=<?=$i;
?>" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left" title="<?=gettext("Edit Gateway");?>">
<span class="glyphicon glyphicon-pencil"></span>
</a>
<?php
if (is_numeric($gateway['attribute'])) :
?>
<a href="system_gateways.php?act=del&amp;id=<?=$i;
?>" onclick="return confirm('<?=gettext("Do you really want to delete this gateway?");
?>')" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left" title="<?=gettext("Delete Gateway");?>">
<span class="glyphicon glyphicon-remove"></span>
</a>
<?php
endif;
?>
<a href="system_gateways_edit.php?dup=<?=$i;
?>" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left" title="<?=gettext("Add Gateway based on this one");?>">
<span class="glyphicon glyphicon-plus"></span>
</a>
</td>
</tr>
<?php
$i++;
endforeach;
?>
<tr>
<td class="list" colspan="7"></td>
<td class="list">
<table border="0" cellspacing="0" cellpadding="1" summary="edit">
<tr>
<td>
<?php
if ($i > 0) :
?>
<button type="submit" name="del_x" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left"
title="<?=gettext("delete selected items");?>"
onclick="return confirm('<?=gettext("Do you really want to delete the selected gateway items?");?>')">
<span class="glyphicon glyphicon-remove"></span>
</button>
<?php
endif;
?>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</form>
</div>
</div>
</section>
<div class="container-fluid">
<div class="row">
<?php
if (isset($input_errors) && count($input_errors) > 0) {
print_input_errors($input_errors);
}
if (isset($savemsg)) {
print_info_box($savemsg);
}
if (is_subsystem_dirty('staticroutes')) {
print_info_box_apply(gettext("The gateway configuration has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."));
}
?>
<section class="col-xs-12">
<div class="content-box">
<div class="table-responsive">
<form action="system_gateways.php" method="post" name="iform" id="iform">
<input type="hidden" id="id" name="id" value="" />
<input type="hidden" id="action" name="act" value="" />
<table class="table table-striped">
<thead>
<tr>
<th>&nbsp;</th>
<th><?=gettext("Name"); ?></th>
<th><?=gettext("Interface"); ?></th>
<th><?=gettext("Gateway"); ?></th>
<th><?=gettext("Monitor IP"); ?></th>
<th><?=gettext("Description"); ?></th>
<th></th>
</tr>
</thead>
<tbody>
<?php
$i = 0;
foreach ($a_gateways as $gateway) :?>
<tr class="<?=isset($gateway['disabled']) || isset($gateway['inactive']) ? "text-muted" : "";?>">
<td>
<?php
if (is_numeric($gateway['attribute'])) :?>
<input type="checkbox" name="rule[]" value="<?=$i;?>"/>
<?php
else :?>
&nbsp;
<?php
endif;?>
</td>
<td>
<?php
if (isset($gateway['inactive'])) :?>
<span class="glyphicon glyphicon-remove text-muted" data-toggle="tooltip" data-placement="left" title="<?=gettext("This gateway is inactive because interface is missing");?>"></span>
<?php
elseif (is_numeric($gateway['attribute'])) :?>
<a href="#" class="act_toggle" data-id="<?=$i;?>" data-toggle="tooltip" data-placement="left" title="<?=gettext("click to toggle enabled/disabled status");?>" >
<span class="glyphicon glyphicon-play <?=isset($gateway['disabled']) || isset($gateway['inactive']) ? "text-muted" : "text-success";?>"></span>
</a>
<?php
else :?>
<span class="glyphicon glyphicon-play <?=isset($gateway['disabled']) || isset($gateway['inactive']) ? "text-muted" : "text-success";?>" data-toggle="tooltip" data-placement="left" title="<?=gettext("click to toggle enabled/disabled status");?>"></span>
<?php
endif;?>
</td>
<td>
<?=$gateway['name'];?>
<?=isset($gateway['defaultgw']) ? "<strong>(default)</strong>" : "";?>
</td>
<td>
<?=convert_friendly_interface_to_friendly_descr($gateway['friendlyiface']);?>
</td>
<td>
<?=$gateway['gateway'];?>
</td>
<td>
<?=$gateway['monitor'];?>
</td>
<td>
<?php
if (!is_numeric($gateway['attribute'])) :?>
<?=$gateway['descr'];?>
<?php
endif;?>
</td>
<td>
<a href="system_gateways_edit.php?id=<?=$i;?>" class="btn btn-default btn-xs"
data-toggle="tooltip" data-placement="left" title="<?=gettext("Edit Gateway");?>">
<span class="glyphicon glyphicon-pencil"></span>
</a>
<?php
if (is_numeric($gateway['attribute'])) :?>
<button data-id="<?=$i;?>" title="<?=gettext("Delete Gateway"); ?>" data-toggle="tooltip"
class="act_delete btn btn-default btn-xs">
<span class="glyphicon glyphicon-remove"></span>
</button>
<?php
endif;?>
<a href="system_gateways_edit.php?dup=<?=$i;?>" class="btn btn-default btn-xs"
data-toggle="tooltip" data-placement="left" title="<?=gettext("Add Gateway based on this one");?>">
<span class="glyphicon glyphicon-plus"></span>
</a>
</td>
</tr>
<?php
$i++;
endforeach;?>
<tr>
<td colspan="7"></td>
<td>
<?php
if ($i > 0) :
?>
<button type="submit" id="btn_delete" name="del_x" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left"
title="<?=gettext("delete selected items");?>">
<span class="glyphicon glyphicon-remove"></span>
</button>
<?php
endif;?>
</td>
</tr>
</tbody>
</table>
</form>
</div>
</div>
</div>
</section>
</div>
</div>
</section>
<?php include("foot.inc");
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment