diff --git a/plist b/plist index 23eb787ab..5d143df17 100644 --- a/plist +++ b/plist @@ -738,6 +738,7 @@ /usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.xml /usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/AliasesField.php /usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/DomainIPField.php +/usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/RangeAddressField.php /usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/Menu/Menu.xml /usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/Migrations/M1_0_0.php /usr/local/opnsense/mvc/app/models/OPNsense/Firewall/ACL/ACL.xml diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Dnsmasq/forms/dialogDHCPrange.xml b/src/opnsense/mvc/app/controllers/OPNsense/Dnsmasq/forms/dialogDHCPrange.xml index bb9535afd..846de8a9b 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/Dnsmasq/forms/dialogDHCPrange.xml +++ b/src/opnsense/mvc/app/controllers/OPNsense/Dnsmasq/forms/dialogDHCPrange.xml @@ -15,7 +15,7 @@ range.start_addr text - Start of the range. + Start of the range, e.g. 192.168.1.100, 2000::1 or when constructor is used a partial like ::1. range.end_addr @@ -23,6 +23,19 @@ text End of the range. + + range.constructor + + dropdown + Interface to use to calculate the proper range, when selected, a range maybe specified as partial (e.g. ::1, ::400) + + + range.prefix_len + + text + 64 + Prefix lenght offered to the client. + range.mode diff --git a/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.php b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.php index db2946dbf..ef6841e65 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.php +++ b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.php @@ -83,6 +83,8 @@ class Dnsmasq extends BaseModel if (!$validateFullModel && !$range->isFieldChanged()) { continue; } + $start_inet = strpos($range->start_addr, ':') !== false ? 'inet6' : 'inet'; + $end_inet = strpos($range->end_addr, ':') !== false ? 'inet6' : 'inet'; $key = $range->__reference; if (!$range->domain->isEmpty() && $range->end_addr->isEmpty()) { $messages->appendMessage( @@ -92,6 +94,71 @@ class Dnsmasq extends BaseModel ) ); } + + if ($start_inet != $end_inet && !$range->end_addr->isEmpty()) { + $messages->appendMessage( + new Message( + gettext("Protocol family doesn't match."), + $key . ".end_addr" + ) + ); + } + + if (!$range->constructor->isEmpty()) { + if ($start_inet == 'inet') { + $messages->appendMessage( + new Message( + gettext("A constructor can only be configured for ipv6."), + $key . ".constructor" + ) + ); + } + if (!str_starts_with($range->start_addr, '::')) { + $messages->appendMessage( + new Message( + gettext("A constructor expects a partial address (e.g. ::1)."), + $key . ".start_addr" + ) + ); + } + if (!$range->end_addr->isEmpty() && !str_starts_with($range->end_addr, '::')) { + $messages->appendMessage( + new Message( + gettext("A constructor expects a partial address (e.g. ::1)."), + $key . ".end_addr" + ) + ); + } + } + + if ($range->constructor->isEmpty() && + (str_starts_with($range->start_addr, '::') || str_starts_with($range->end_addr, '::')) + ) { + $messages->appendMessage( + new Message( + gettext("Partial addresses can only be used with a constructor."), + $key . ".start_addr" + ) + ); + } + + if (!$range->prefix_len->isEmpty() && $start_inet != 'inet6') { + $messages->appendMessage( + new Message( + gettext("Prefix length can only be used for IPv6."), + $key . ".prefix_len" + ) + ); + } + + if (in_array('static', explode(',', $range->mode)) && $start_inet == 'inet6') { + $messages->appendMessage( + new Message( + gettext("Static is only available IPv4."), + $key . ".mode" + ) + ); + } } if ( diff --git a/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.xml b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.xml index 6973113b9..2c735dff1 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.xml +++ b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.xml @@ -134,21 +134,24 @@ - + N - ipv4 Y - + N - ipv4 + static Y + + 1 + 64 + 1 diff --git a/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/RangeAddressField.php b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/RangeAddressField.php new file mode 100644 index 000000000..48be19db3 --- /dev/null +++ b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/RangeAddressField.php @@ -0,0 +1,44 @@ +