From 89a2a8d51bf20f765adf8275de3c4ff66ac04c8c Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Tue, 27 Apr 2021 22:38:52 +0200 Subject: [PATCH] Firewall / Aliases - Dynamic Ipv6 fw rules handling for https://github.com/opnsense/core/issues/4923 , https://github.com/opnsense/core/pull/4941 o add validations for new type o rename dyninterface to interface to make the attribute more generic (in case of future use) o move address logic to interface class --- .../app/models/OPNsense/Firewall/Alias.xml | 19 ++++- .../Firewall/FieldTypes/AliasContentField.php | 26 +++++++ .../app/views/OPNsense/Firewall/alias.volt | 29 ++++---- src/opnsense/scripts/filter/lib/alias.py | 39 ++-------- src/opnsense/scripts/filter/lib/interface.py | 74 +++++++++++++++++++ .../OPNsense/Filter/filter_tables.conf | 8 +- 6 files changed, 144 insertions(+), 51 deletions(-) create mode 100644 src/opnsense/scripts/filter/lib/interface.py diff --git a/src/opnsense/mvc/app/models/OPNsense/Firewall/Alias.xml b/src/opnsense/mvc/app/models/OPNsense/Firewall/Alias.xml index edd60c21d..d2eb93119 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Firewall/Alias.xml +++ b/src/opnsense/mvc/app/models/OPNsense/Firewall/Alias.xml @@ -37,8 +37,13 @@ Network group MAC address External (advanced) - IPv6 Dynamic Host + IPv6 Dynamic Host + + + interface.check001 + + Y @@ -47,8 +52,16 @@ IPv6 - - + + + + IPv6 Dynamic Host require an interface to track. + SetIfConstraint + type + dynipv6host + + + 0 diff --git a/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/AliasContentField.php b/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/AliasContentField.php index 7c49a8d3a..60432c2b6 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/AliasContentField.php +++ b/src/opnsense/mvc/app/models/OPNsense/Firewall/FieldTypes/AliasContentField.php @@ -218,6 +218,26 @@ class AliasContentField extends BaseField return $messages; } + /** + * Validate partial ipv6 network definition + * @param array $data to validate + * @return bool|Callback + * @throws \OPNsense\Base\ModelException + */ + private function validatePartialIPv6Network($data) + { + $messages = array(); + foreach ($this->getItems($data) as $pnetwork) { + if (!Util::isSubnet("0000".$pnetwork)) { + $messages[] = sprintf( + gettext('Entry "%s" is not a valid partial ipv6 net definition (e.g. ::1000/64).'), + $pnetwork + ); + } + } + return $messages; + } + /** * Validate host options * @param array $data to validate @@ -300,6 +320,12 @@ class AliasContentField extends BaseField } ]); break; + case "dynipv6host": + $validators[] = new CallbackValidator(["callback" => function ($data) { + return $this->validatePartialIPv6Network($data); + } + ]); + break; default: break; } diff --git a/src/opnsense/mvc/app/views/OPNsense/Firewall/alias.volt b/src/opnsense/mvc/app/views/OPNsense/Firewall/alias.volt index d7e779291..64bebd0b9 100644 --- a/src/opnsense/mvc/app/views/OPNsense/Firewall/alias.volt +++ b/src/opnsense/mvc/app/views/OPNsense/Firewall/alias.volt @@ -195,6 +195,7 @@ $("#alias\\.type").change(function(){ $(".alias_type").hide(); $("#row_alias\\.updatefreq").hide(); + $("#row_alias\\.interface").hide(); $("#copy-paste").hide(); switch ($(this).val()) { case 'geoip': @@ -207,19 +208,19 @@ $("#alias_type_networkgroup").show(); $("#alias\\.proto").selectpicker('hide'); break; + case 'dynipv6host': + $("#row_alias\\.interface").show(); + $("#alias_type_default").show(); + break; case 'urltable': $("#row_alias\\.updatefreq").show(); + /* FALLTROUGH */ default: $("#alias_type_default").show(); $("#alias\\.proto").selectpicker('hide'); $("#copy-paste").show(); break; } - if ($(this).val() === 'dynipv6host') { - $("#row_alias\\.dyninterface").show(); - } else { - $("#row_alias\\.dyninterface").hide(); - } if ($(this).val() === 'port') { $("#row_alias\\.counters").hide(); } else { @@ -477,7 +478,7 @@ - + @@ -697,21 +698,21 @@ - + -
- - {{lang._('dyninterface')}} +
+ + {{lang._('Interface')}}
- -