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 `