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=';"> + " data-category="" ondblclick="document.location='firewall_nat_edit.php?id=';"> 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"); ?> + + +