From 13978ece6478442f7b2da76c1080492034bbdec7 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Mon, 30 Mar 2020 19:00:01 +0200 Subject: [PATCH] os-firewall: initial wireframe for https://github.com/opnsense/plugins/issues/1749 - reuse filter template, link endpoint to selected controller (filter/snat) - push shared code to FilterBaseController --- .../Firewall/Api/FilterBaseController.php | 99 +++++++++++++++++++ .../Firewall/Api/FilterController.php | 65 +----------- .../Firewall/Api/SourceNatController.php | 62 ++++++++++++ .../OPNsense/Firewall/FilterController.php | 1 + .../OPNsense/Firewall/SourceNatController.php | 38 +++++++ .../Firewall/forms/dialogSNatRule.xml | 88 +++++++++++++++++ .../app/models/OPNsense/Firewall/ACL/ACL.xml | 7 ++ .../app/models/OPNsense/Firewall/Filter.xml | 75 ++++++++++++++ .../models/OPNsense/Firewall/Menu/Menu.xml | 3 + .../app/views/OPNsense/Firewall/filter.volt | 20 ++-- 10 files changed, 384 insertions(+), 74 deletions(-) create mode 100644 net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/FilterBaseController.php create mode 100644 net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/SourceNatController.php create mode 100644 net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/SourceNatController.php create mode 100644 net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/forms/dialogSNatRule.xml diff --git a/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/FilterBaseController.php b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/FilterBaseController.php new file mode 100644 index 000000000..d939a990d --- /dev/null +++ b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/FilterBaseController.php @@ -0,0 +1,99 @@ +request->isPost()) { + if ($rollback_revision != null) { + // background rollback timer + (new Backend())->configdpRun('pfplugin rollback_timer', [$rollback_revision], true); + } + return array("status" => (new Backend())->configdRun('filter reload')); + } else { + return array("status" => "error"); + } + } + + public function cancelRollbackAction($rollback_revision) + { + if ($this->request->isPost()) { + return array( + "status" => (new Backend())->configdpRun('pfplugin cancel_rollback', [$rollback_revision]) + ); + } else { + return array("status" => "error"); + } + } + + public function savepointAction() + { + if ($this->request->isPost()) { + // trigger a save, so we know revision->time matches our running config + Config::getInstance()->save(); + return array( + "status" => "ok", + "retention" => (string)Config::getInstance()->backupCount(), + "revision" => (string)Config::getInstance()->object()->revision->time + ); + } else { + return array("status" => "error"); + } + } + + public function revertAction($revision) + { + if ($this->request->isPost()) { + Config::getInstance()->lock(); + $filename = Config::getInstance()->getBackupFilename($revision); + if (!$filename) { + Config::getInstance()->unlock(); + return ["status" => gettext("unknown (or removed) savepoint")]; + } + $this->getModel()->rollback($revision); + Config::getInstance()->unlock(); + (new Backend())->configdRun('filter reload'); + return ["status" => "ok"]; + } else { + return array("status" => "error"); + } + } +} diff --git a/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/FilterController.php b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/FilterController.php index 2ab47ee69..28e4151a7 100644 --- a/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/FilterController.php +++ b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/FilterController.php @@ -27,15 +27,9 @@ */ namespace OPNsense\Firewall\Api; -use OPNsense\Base\ApiMutableModelControllerBase; -use OPNsense\Core\Backend; -use OPNsense\Core\Config; -class FilterController extends ApiMutableModelControllerBase +class FilterController extends FilterBaseController { - protected static $internalModelName = 'filter'; - protected static $internalModelClass = 'OPNsense\Firewall\Filter'; - public function searchRuleAction() { return $this->searchBase("rules.rule", array('enabled', 'sequence', 'description'), "sequence"); @@ -65,61 +59,4 @@ class FilterController extends ApiMutableModelControllerBase { return $this->toggleBase("rules.rule", $uuid, $enabled); } - - public function applyAction($rollback_revision = null) - { - if ($this->request->isPost()) { - if ($rollback_revision != null) { - // background rollback timer - (new Backend())->configdpRun('pfplugin rollback_timer', [$rollback_revision], true); - } - return array("status" => (new Backend())->configdRun('filter reload')); - } else { - return array("status" => "error"); - } - } - - public function cancelRollbackAction($rollback_revision) - { - if ($this->request->isPost()) { - return array( - "status" => (new Backend())->configdpRun('pfplugin cancel_rollback', [$rollback_revision]) - ); - } else { - return array("status" => "error"); - } - } - - public function savepointAction() - { - if ($this->request->isPost()) { - // trigger a save, so we know revision->time matches our running config - Config::getInstance()->save(); - return array( - "status" => "ok", - "retention" => (string)Config::getInstance()->backupCount(), - "revision" => (string)Config::getInstance()->object()->revision->time - ); - } else { - return array("status" => "error"); - } - } - - public function revertAction($revision) - { - if ($this->request->isPost()) { - Config::getInstance()->lock(); - $filename = Config::getInstance()->getBackupFilename($revision); - if (!$filename) { - Config::getInstance()->unlock(); - return ["status" => gettext("unknown (or removed) savepoint")]; - } - $this->getModel()->rollback($revision); - Config::getInstance()->unlock(); - (new Backend())->configdRun('filter reload'); - return ["status" => "ok"]; - } else { - return array("status" => "error"); - } - } } diff --git a/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/SourceNatController.php b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/SourceNatController.php new file mode 100644 index 000000000..f55640e98 --- /dev/null +++ b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/Api/SourceNatController.php @@ -0,0 +1,62 @@ +searchBase("snatrules.rule", array('enabled', 'sequence', 'description'), "sequence"); + } + + public function setRuleAction($uuid) + { + return $this->setBase("rule", "snatrules.rule", $uuid); + } + + public function addRuleAction() + { + return $this->addBase("rule", "snatrules.rule"); + } + + public function getRuleAction($uuid = null) + { + return $this->getBase("rule", "snatrules.rule", $uuid); + } + + public function delRuleAction($uuid) + { + return $this->delBase("snatrules.rule", $uuid); + } + + public function toggleRuleAction($uuid, $enabled = null) + { + return $this->toggleBase("snatrules.rule", $uuid, $enabled); + } +} 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 a3b711e8f..74c0479b3 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->ruleController = "filter"; $this->view->formDialogFilterRule = $this->getForm("dialogFilterRule"); } } 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 new file mode 100644 index 000000000..5b5927a06 --- /dev/null +++ b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/SourceNatController.php @@ -0,0 +1,38 @@ +view->pick('OPNsense/Firewall/filter'); + $this->view->ruleController = "source_nat"; + $this->view->formDialogFilterRule = $this->getForm("dialogSNatRule"); + } +} diff --git a/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/forms/dialogSNatRule.xml b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/forms/dialogSNatRule.xml new file mode 100644 index 000000000..48e1b9a5f --- /dev/null +++ b/net/firewall/src/opnsense/mvc/app/controllers/OPNsense/Firewall/forms/dialogSNatRule.xml @@ -0,0 +1,88 @@ +
+ + rule.enabled + + checkbox + Enable this rule + + + rule.sequence + + text + + + rule.interface + + dropdown + + + rule.ipprotocol + + dropdown + + + rule.protocol + + dropdown + + + rule.source_net + + text + + + rule.source_port + + text + true + Source port number or well known name (imap, imaps, http, https, ...), for ranges use a dash + + + rule.source_not + + checkbox + Use this option to invert the sense of the match. + + + rule.destination_net + + text + + + rule.destination_not + + checkbox + Use this option to invert the sense of the match. + + + rule.destination_port + + text + Destination port number or well known name (imap, imaps, http, https, ...), for ranges use a dash + + + rule.target + + text + + Packets matching this rule will be mapped to the IP address given here. + + + + rule.target_port + + text + Destination port number or well known name (imap, imaps, http, https, ...) + + + rule.log + + checkbox + Log packets that are handled by this rule + + + rule.description + + text + +
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 e063715bd..070ce99e9 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 @@ -6,4 +6,11 @@ api/firewall/filter/* + + Firewall: SourceNat: API + + ui/firewall/source_nat/* + api/firewall/source_nat/* + + 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 378926025..a9961b45a 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 @@ -106,5 +106,80 @@ + + + + 1 + Y + + + 1 + 99999 + provide a valid sequence for sorting + Y + 1 + + + Y + lan + Y + + + Y + inet + + IPv4 + IPv6 + + + + Y + any + + + any + Y + + + 0 + Y + + + N + Y + Y + + + any + Y + + + 0 + Y + + + N + Y + Y + + + wanip + Y + + + N + Y + + + 0 + Y + + + N + /^([\t\n\v\f\r 0-9a-zA-Z.\-,_\x{00A0}-\x{FFFF}]){0,255}$/u + Description should be a string between 1 and 255 characters + + + 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 366704120..a55165254 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 @@ -4,6 +4,9 @@ + + + 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 b49837244..567eff336 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 @@ -2,12 +2,12 @@ $( document ).ready(function() { let initial_load = true; let grid = $("#grid-rules").UIBootgrid({ - search:'/api/firewall/filter/searchRule/', - get:'/api/firewall/filter/getRule/', - set:'/api/firewall/filter/setRule/', - add:'/api/firewall/filter/addRule/', - del:'/api/firewall/filter/delRule/', - toggle:'/api/firewall/filter/toggleRule/' + search:'/api/firewall/{{ruleController}}/searchRule/', + get:'/api/firewall/{{ruleController}}/getRule/', + set:'/api/firewall/{{ruleController}}/setRule/', + add:'/api/firewall/{{ruleController}}/addRule/', + del:'/api/firewall/{{ruleController}}/delRule/', + toggle:'/api/firewall/{{ruleController}}/toggleRule/' }); // open edit dialog when opened with a uuid reference @@ -44,7 +44,7 @@ label: "{{ lang._('Revert') }}", cssClass: 'btn-primary', action: function(dialogRef) { - ajaxCall("/api/firewall/filter/revert/" + $("#revertToTime").val(), {}, function (data, status) { + ajaxCall("/api/firewall/{{ruleController}}/revert/" + $("#revertToTime").val(), {}, function (data, status) { if (data.status !== "ok") { $("#revertToTime").parent().addClass("has-error"); $("#revertToTimeError").html(data.status); @@ -71,7 +71,7 @@
- + @@ -100,7 +100,7 @@