diff --git a/src/etc/inc/filter.lib.inc b/src/etc/inc/filter.lib.inc index fe7d4d1e273..44250a2f0a6 100644 --- a/src/etc/inc/filter.lib.inc +++ b/src/etc/inc/filter.lib.inc @@ -644,7 +644,7 @@ function filter_core_rules_system($fw, $defaults) /* auto-generated DNAT rules */ foreach ((new OPNsense\Firewall\DNat(false))->rule->sortedBy(['sequence']) as $key => $rule) { - if ($rule->disabled->isEmpty() && $rule->pass == 'rule') { + if (!$rule->enabled->isEmpty() && $rule->pass == 'rule') { $dnatrule = $rule->getNodeContent(); $tmprule = [ 'ipprotocol' => $dnatrule['ipprotocol'], diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/DNatController.php b/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/DNatController.php index b42556fee4e..95bc4c79cee 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/DNatController.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/DNatController.php @@ -91,7 +91,7 @@ public function searchRuleAction() 'ipprotocol' => '', /* renders as asterisk */ 'protocol' => 'tcp', '%protocol' => 'TCP', - 'disabled' => '0', + 'enabled' => '1', 'nordr' => '1', 'interface' => $if, '%interface' => $ifname, @@ -140,26 +140,9 @@ public function delRuleAction($uuid) return $this->delBase("rule", $uuid); } - /** - * opposite toggle (disable instead of enable) - */ - public function toggleRuleAction($uuid, $disabled = null) + public function toggleRuleAction($uuid, $enabled = null) { - $result = ['result' => 'failed']; - if ($this->request->isPost() && $uuid != null) { - Config::getInstance()->lock(); - $node = $this->getModel()->getNodeByReference('rule.' . $uuid); - if ($node != null) { - if (in_array($disabled, ['0', '1'])) { - $node->disabled = (string)$disabled; - } else { - $node->disabled = (string)$node->disabled == '1' ? '0' : '1'; - } - $result['result'] = $node->disabled->isEmpty() ? 'Enabled' : 'Disabled'; - $this->save(false, true); - } - } - return $result; + return $this->toggleBase("rule", $uuid, $enabled); } public function moveRuleBeforeAction($selected_uuid, $target_uuid) diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Firewall/forms/dialogDNatRule.xml b/src/opnsense/mvc/app/controllers/OPNsense/Firewall/forms/dialogDNatRule.xml index 461590f879e..cd07322e892 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Firewall/forms/dialogDNatRule.xml +++ b/src/opnsense/mvc/app/controllers/OPNsense/Firewall/forms/dialogDNatRule.xml @@ -4,10 +4,10 @@ - rule.disabled - + rule.enabled + checkbox - Disable this rule so it will not be used. + Enable this rule. boolean rowtoggle @@ -77,7 +77,7 @@ rule.ipprotocol dropdown - Select IPv4, IPv6 or both. + Select IPv4 or IPv6 any 30 diff --git a/src/opnsense/mvc/app/models/OPNsense/Firewall/DNat.xml b/src/opnsense/mvc/app/models/OPNsense/Firewall/DNat.xml index ac6f35ff87e..65d3d41df3c 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Firewall/DNat.xml +++ b/src/opnsense/mvc/app/models/OPNsense/Firewall/DNat.xml @@ -11,7 +11,9 @@ Y + + Y @@ -27,7 +29,6 @@ IPv4 IPv6 - IPv4+IPv6 any diff --git a/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/DNatEnabledField.php b/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/DNatEnabledField.php new file mode 100644 index 00000000000..7541d625024 --- /dev/null +++ b/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/DNatEnabledField.php @@ -0,0 +1,54 @@ +getParentNode()->disabled = $value === '1' ? '0' : '1'; + return parent::setValue($value); + } + + public function getValue(): string + { + $parent = $this->getParentNode(); + if ($parent !== null && isset($parent->disabled)) { + return (string)$parent->disabled === '1' ? '0' : '1'; + } + return parent::getValue(); + } +} diff --git a/src/opnsense/mvc/app/models/OPNsense/Firewall/Migrations/MFP1_0_5.php b/src/opnsense/mvc/app/models/OPNsense/Firewall/Migrations/MFP1_0_5.php new file mode 100644 index 00000000000..7cdbdb361da --- /dev/null +++ b/src/opnsense/mvc/app/models/OPNsense/Firewall/Migrations/MFP1_0_5.php @@ -0,0 +1,48 @@ +object(); + if ($model instanceof Filter && isset($cfgObj->nat->rule)) { + foreach ($cfgObj->nat->rule as $rule) { + if ((string)$rule->ipprotocol === 'inet46') { + $rule->ipprotocol = ''; + } + } + } + } +} \ No newline at end of file diff --git a/src/opnsense/mvc/app/views/OPNsense/Firewall/nat_rule.volt b/src/opnsense/mvc/app/views/OPNsense/Firewall/nat_rule.volt index ca19562934c..cb13620c6b1 100644 --- a/src/opnsense/mvc/app/views/OPNsense/Firewall/nat_rule.volt +++ b/src/opnsense/mvc/app/views/OPNsense/Firewall/nat_rule.volt @@ -192,11 +192,7 @@ const data = row.getData(); const $element = $(row.getElement()); - // XXX: d_nat model provides a disabled key - if ( - ('enabled' in data && data.enabled == "0") || - ('disabled' in data && data.disabled == "1") - ) { + if ('enabled' in data && data.enabled == "0") { $element.addClass('row-disabled'); } @@ -299,10 +295,7 @@ if (row.isGroup || !rowId.includes('-')) { return ''; } - const isEnabled = - entrypoint === 'd_nat' /* flag is inverted in model */ - ? row[column.id] === "0" - : row[column.id] === "1"; + const isEnabled = row[column.id] === "1"; return `