diff --git a/src/opnsense/mvc/app/models/OPNsense/Firewall/Category.php b/src/opnsense/mvc/app/models/OPNsense/Firewall/Category.php
index 0df6f1288..92c6564f2 100644
--- a/src/opnsense/mvc/app/models/OPNsense/Firewall/Category.php
+++ b/src/opnsense/mvc/app/models/OPNsense/Firewall/Category.php
@@ -67,7 +67,7 @@ class Category extends BaseModel
{
$has_changed = false;
$cfgObj = Config::getInstance()->object();
- $source = [array('filter', 'rule')];
+ $source = [['filter', 'rule'], ['nat', 'rule']];
$used_categories = [];
foreach ($source as $aliasref) {
$cfgsection = $cfgObj;
@@ -96,6 +96,7 @@ class Category extends BaseModel
unset($used_categories[array_search((string)$category->name, $used_categories)]);
}
}
+
foreach ($used_categories as $name) {
$node = $this->categories->category->add();
$node->name = $name;
diff --git a/src/www/firewall_nat.php b/src/www/firewall_nat.php
index 68a58756b..12f6aab01 100644
--- a/src/www/firewall_nat.php
+++ b/src/www/firewall_nat.php
@@ -271,11 +271,42 @@ $( document ).ready(function() {
$(".rule_select").prop("checked", $(this).prop("checked"));
});
+ // move category block
+ $("#category_block").detach().appendTo($(".page-content-head > .container-fluid > .list-inline"));
+ $("#category_block").addClass("pull-right");
+
+ // our usual zebra striping doesn't respect hidden rows, hook repaint on .opnsense-rules change() and fire initially
+ $(".opnsense-rules > tbody > tr").each(function(){
+ // save zebra color
+ let tr_color = $(this).children(0).css("background-color");
+ if (tr_color != 'transparent' && !tr_color.includes('(0, 0, 0')) {
+ $("#fw_category").data('stripe_color', tr_color);
+ }
+ });
+ $(".opnsense-rules").removeClass("table-striped");
+ $(".opnsense-rules").change(function(){
+ $(".opnsense-rules > tbody > tr:visible").each(function (index) {
+ $(this).css("background-color", "inherit");
+ if ( index % 2 == 0) {
+ $(this).css("background-color", $("#fw_category").data('stripe_color'));
+ }
+ });
+ });
+
+ // hook category functionality
+ hook_firewall_categories();
+
// watch scroll position and set to last known on page load
watchScrollPosition();
});
+
+
+
+
+
@@ -290,7 +321,7 @@ $( document ).ready(function() {
-
+
| |
@@ -338,7 +369,7 @@ $( document ).ready(function() {
-
ondblclick="document.location='firewall_nat_edit.php?id==$nnats;?>';">
+
" data-category="=!empty($natent['category']) ? $natent['category'] : "";?>" ondblclick="document.location='firewall_nat_edit.php?id==$nnats;?>';">
|
|
diff --git a/src/www/firewall_nat_edit.php b/src/www/firewall_nat_edit.php
index c92741aa9..9691399fe 100644
--- a/src/www/firewall_nat_edit.php
+++ b/src/www/firewall_nat_edit.php
@@ -58,7 +58,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
if (isset($configId)) {
// copy 1-on-1
foreach (array('protocol','target','local-port','descr','interface','associated-rule-id','nosync','log',
- 'natreflection','created','updated','ipprotocol','tag','tagged','poolopts') as $fieldname) {
+ 'natreflection','created','updated','ipprotocol','tag','tagged','poolopts', 'category') as $fieldname) {
if (isset($a_nat[$configId][$fieldname])) {
$pconfig[$fieldname] = $a_nat[$configId][$fieldname];
} else {
@@ -124,6 +124,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$pconfig[$fieldname] = null;
}
}
+ $pconfig['category'] = !empty($pconfig['category']) ? explode(",", $pconfig['category']) : [];
} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') {
$pconfig = $_POST;
$input_errors = array();
@@ -212,6 +213,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$natent['protocol'] = $pconfig['protocol'];
}
$natent['interface'] = implode(",", $pconfig['interface']);
+ $natent['category'] = implode(",", $pconfig['category']);
$natent['ipprotocol'] = $pconfig['ipprotocol'];
$natent['descr'] = $pconfig['descr'];
$natent['tag'] = $pconfig['tag'];
@@ -327,6 +329,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
}
$filterent['descr'] = $pconfig['descr'];
+ $filterent['category'] = $natent['category'];
// If this is a new rule, create an ID and add the rule
if (!empty($pconfig['filter-rule-association']) && $pconfig['filter-rule-association'] != 'pass') {
@@ -356,6 +359,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') {
}
}
+ OPNsense\Core\Config::getInstance()->fromArray($config);
+ $catmdl = new OPNsense\Firewall\Category();
+ if ($catmdl->sync()) {
+ $catmdl->serializeToConfig();
+ $config = OPNsense\Core\Config::getInstance()->toArray(listtags());
+ }
write_config();
mark_subsystem_dirty('natconf');
@@ -370,6 +379,9 @@ include("head.inc");
?>
+
+
+