From 3d4673df1f0651cc21ec2c014847b81851ee3e98 Mon Sep 17 00:00:00 2001 From: Franco Fichtner Date: Tue, 16 Jan 2024 09:07:37 +0100 Subject: [PATCH] net/firewall: adjust the code almost as bundled in core One point of contention in releasing this is how npt rules will be added from the old layout to the new if new rules have already been added. --- net/firewall/Makefile | 3 +- .../OPNsense/Firewall/FilterController.php | 1 + .../OPNsense/Firewall/NptController.php | 1 - .../OPNsense/Firewall/SourceNatController.php | 1 + .../app/models/OPNsense/Firewall/ACL/ACL.xml | 11 ++++- .../Firewall/FieldTypes/FilterRuleField.php | 42 +++++++++---------- .../FieldTypes/SourceNatRuleField.php | 42 +++++++++---------- .../app/models/OPNsense/Firewall/Filter.php | 35 ++++++++++++---- .../app/models/OPNsense/Firewall/Filter.xml | 11 +---- .../models/OPNsense/Firewall/Menu/Menu.xml | 4 +- .../app/views/OPNsense/Firewall/filter.volt | 2 +- 11 files changed, 84 insertions(+), 69 deletions(-) diff --git a/net/firewall/Makefile b/net/firewall/Makefile index eec978a63..4b2543eaa 100644 --- a/net/firewall/Makefile +++ b/net/firewall/Makefile @@ -1,6 +1,5 @@ PLUGIN_NAME= firewall -PLUGIN_VERSION= 1.4 -PLUGIN_REVISION= 3 +PLUGIN_VERSION= 1.5 PLUGIN_COMMENT= Firewall API supplemental package PLUGIN_OBSOLETE= yes PLUGIN_MAINTAINER= ad@opnsense.org diff --git a/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/FilterController.php b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/FilterController.php index 461f990a5..e558fe813 100644 --- a/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/FilterController.php +++ b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/FilterController.php @@ -32,6 +32,7 @@ class FilterController extends \OPNsense\Base\IndexController public function indexAction() { $this->view->pick('OPNsense/Firewall/filter'); + $this->view->SavePointBtns = true; $this->view->ruleController = "filter"; $this->view->gridFields = [ [ diff --git a/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/NptController.php b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/NptController.php index 0e69ca4fe..d701a8003 100644 --- a/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/NptController.php +++ b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/NptController.php @@ -33,7 +33,6 @@ class NptController extends \OPNsense\Base\IndexController { $this->view->pick('OPNsense/Firewall/filter'); $this->view->ruleController = "npt"; - $this->view->hideSavePointBtns = true; $this->view->gridFields = [ [ 'id' => 'enabled', 'formatter' => 'rowtoggle' ,'width' => '6em', 'heading' => gettext('Enabled') diff --git a/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/SourceNatController.php b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/SourceNatController.php index 7bc2c632f..9e24cc700 100644 --- a/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/SourceNatController.php +++ b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/SourceNatController.php @@ -32,6 +32,7 @@ class SourceNatController extends \OPNsense\Base\IndexController public function indexAction() { $this->view->pick('OPNsense/Firewall/filter'); + $this->view->SavePointBtns = true; $this->view->ruleController = "source_nat"; $this->view->gridFields = [ [ diff --git a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/ACL/ACL.xml b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/ACL/ACL.xml index 070ce99e9..c8a66f358 100644 --- a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/ACL/ACL.xml +++ b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/ACL/ACL.xml @@ -1,16 +1,23 @@ - Firewall: Rules: API + Firewall: Automation: Filter ui/firewall/filter/* api/firewall/filter/* - Firewall: SourceNat: API + Firewall: Automation: Source NAT ui/firewall/source_nat/* api/firewall/source_nat/* + + Firewall: Automation: NPTv6 + + ui/firewall/npt/* + api/firewall/npt/* + + diff --git a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php index 70996125e..a3c69c53c 100644 --- a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php +++ b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/FilterRuleField.php @@ -1,31 +1,29 @@ object(); + // standard model validations $messages = parent::performValidation($validateFullModel); foreach ([$this->rules->rule, $this->snatrules->rule] as $rules) { @@ -95,18 +97,35 @@ class Filter extends BaseModel } } } + foreach ($this->npt->rule->iterateItems() as $rule) { if ($validateFullModel || $rule->isFieldChanged()) { - if (!empty((string)$rule->destination_net) && !empty((string)$rule->trackif)) { - $messages->appendMessage(new Message( - gettext("A track interface is only allowed without an extrenal prefix."), - $rule->trackif->__reference - )); + if (!empty((string)$rule->trackif)) { + if (!empty((string)$rule->destination_net)) { + $messages->appendMessage(new Message( + gettext('A track interface is only allowed without an external prefix.'), + $rule->trackif->__reference + )); + } + + if ( + (empty($config->interfaces->{$rule->interface}->ipaddrv6) || + $config->interfaces->{$rule->interface}->ipaddrv6 != 'dhcp6') || + empty($config->interfaces->{$rule->trackif}->{'track6-interface'}) || + $config->interfaces->{$rule->trackif}->{'track6-interface'} != (string)$rule->interface + ) { + $messages->appendMessage(new Message( + gettext('This interface is not tracking the current rule interface.'), + $rule->trackif->__reference + )); + } } + if (!empty((string)$rule->destination_net) && !empty((string)$rule->source_net)) { - $dparts = explode('/', (string)$rule->destination_net); - $sparts = explode('/', (string)$rule->source_net); - if (count($dparts) == 2 && count($sparts) == 2 && $dparts[1] != $sparts[1]) { + /* defaults to /128 */ + $dparts = explode('/', (string)$rule->destination_net . '/128'); + $sparts = explode('/', (string)$rule->source_net . '/128'); + if ($dparts[1] != $sparts[1]) { $messages->appendMessage(new Message( gettext("External subnet should match internal subnet."), $rule->destination_net->__reference diff --git a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml index 3e93bded0..dc7399beb 100644 --- a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml +++ b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Filter.xml @@ -33,7 +33,6 @@ Y - N Y Y @@ -67,7 +66,6 @@ Y - N Y Y Y @@ -83,14 +81,12 @@ Y - N Y Y Y Please specify a valid portnumber, name, alias or range - N interface gateways list /tmp/gateway_list.json 20 @@ -161,7 +157,6 @@ Y - N Y Y Y @@ -176,7 +171,6 @@ Y - N Y Y Y @@ -187,7 +181,6 @@ Y - N Y Y @@ -238,12 +231,12 @@ Y ipv6 - Y + N N ipv6 - Y + N N diff --git a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Menu/Menu.xml b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Menu/Menu.xml index 476e1f38b..455d06546 100644 --- a/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Menu/Menu.xml +++ b/net/firewall/src/opnsense/mvc/app/models/OPNsense/Firewall/Menu/Menu.xml @@ -1,13 +1,13 @@ - + - + diff --git a/net/firewall/src/opnsense/mvc/app/views/OPNsense/Firewall/filter.volt b/net/firewall/src/opnsense/mvc/app/views/OPNsense/Firewall/filter.volt index 717453fe9..1b3abb397 100644 --- a/net/firewall/src/opnsense/mvc/app/views/OPNsense/Firewall/filter.volt +++ b/net/firewall/src/opnsense/mvc/app/views/OPNsense/Firewall/filter.volt @@ -213,7 +213,7 @@ data-error-title="{{ lang._('Filter load error') }}" type="button" > -{% if not hideSavePointBtns|default(false) %} +{% if SavePointBtns is defined %}