From 340b314f57fd3bc943ee8951fec4c723cdfa95f4 Mon Sep 17 00:00:00 2001 From: Stephan de Wit Date: Thu, 11 Jan 2024 13:08:15 +0100 Subject: [PATCH] MVC: migrate CSVListField types to more sensible fields where possible (#7118) Extend the MacAddressField as a list type for usage in Captive Portal. Also set MaskPerItem to "Y" on Netflow destinations for now. --- .../Base/FieldTypes/MacAddressField.php | 60 ++++++++++++++++++- .../OPNsense/CaptivePortal/CaptivePortal.xml | 13 ++-- .../models/OPNsense/Diagnostics/Netflow.xml | 3 +- .../mvc/app/models/OPNsense/Monit/Monit.xml | 7 +-- .../app/models/OPNsense/Wireguard/Server.xml | 7 ++- 5 files changed, 73 insertions(+), 17 deletions(-) diff --git a/src/opnsense/mvc/app/models/OPNsense/Base/FieldTypes/MacAddressField.php b/src/opnsense/mvc/app/models/OPNsense/Base/FieldTypes/MacAddressField.php index 88e5a6b89..7fe4ff17c 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Base/FieldTypes/MacAddressField.php +++ b/src/opnsense/mvc/app/models/OPNsense/Base/FieldTypes/MacAddressField.php @@ -33,8 +33,60 @@ use OPNsense\Base\Validators\CallbackValidator; /** * Class MacAddressField */ -class MacAddressField extends TextField +class MacAddressField extends BaseField { + /** + * @var bool marks if this is a data node or a container + */ + protected $internalIsContainer = false; + + /** + * @var string when multiple values could be provided at once, specify the split character + */ + protected $internalFieldSeparator = ','; + + /** + * @var bool when set, results are returned as list (with all options enabled) + */ + protected $internalAsList = false; + + /** + * trim MAC addresses + * @param string $value + */ + public function setValue($value) + { + parent::setValue(trim($value)); + } + + /** + * get valid options, descriptions and selected value + * @return array + */ + public function getNodeData() + { + if ($this->internalAsList) { + // return result as list + $result = array(); + foreach (explode($this->internalFieldSeparator, $this->internalValue) as $address) { + $result[$address] = array("value" => $address, "selected" => 1); + } + return $result; + } else { + // normal, single field response + return $this->internalValue; + } + } + + /** + * select if multiple addresses may be selected at once + * @param $value string value Y/N + */ + public function setAsList($value) + { + $this->internalAsList = trim(strtoupper($value)) == "Y"; + } + /** * {@inheritdoc} */ @@ -51,8 +103,10 @@ class MacAddressField extends TextField $validators = parent::getValidators(); if ($this->internalValue != null) { $validators[] = new CallbackValidator(["callback" => function ($data) { - if (empty(filter_var($data, FILTER_VALIDATE_MAC))) { - return [$this->getValidationMessage()]; + foreach ($this->internalAsList ? explode($this->internalFieldSeparator, $data) : [$data] as $address) { + if (empty(filter_var($address, FILTER_VALIDATE_MAC))) { + return [$this->getValidationMessage()]; + } } return []; } diff --git a/src/opnsense/mvc/app/models/OPNsense/CaptivePortal/CaptivePortal.xml b/src/opnsense/mvc/app/models/OPNsense/CaptivePortal/CaptivePortal.xml index ff420c563..15a33bd17 100644 --- a/src/opnsense/mvc/app/models/OPNsense/CaptivePortal/CaptivePortal.xml +++ b/src/opnsense/mvc/app/models/OPNsense/CaptivePortal/CaptivePortal.xml @@ -58,14 +58,13 @@ /^([0-9a-zA-Z.,_\-]){0,1024}$/u Please enter a valid servername, ip address or leave this option blank - - /^([\/0-9.,])*/u - Please enter valid addresses + + , + Y + N - - lower - /^((([0-9a-fA-F]{2}:){5}([0-9a-fA-F]{2})([,]){0,1}))*/u - Please enter valid mac addresses + + Y 0 diff --git a/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Netflow.xml b/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Netflow.xml index 71153ecbc..a4b7f3373 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Netflow.xml +++ b/src/opnsense/mvc/app/models/OPNsense/Diagnostics/Netflow.xml @@ -25,8 +25,9 @@ - /^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):(6553[0-5]|655[0-2][0-9]|65[0-4](\d){2}|6[0-4](\d){3}|[1-5](\d){4}|[1-9](\d){0,3})([,]){0,1})*/u + /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):(6553[0-5]|655[0-2][0-9]|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3})$/u Please enter valid targets (e.g. 192.168.0.1:2055). + Y diff --git a/src/opnsense/mvc/app/models/OPNsense/Monit/Monit.xml b/src/opnsense/mvc/app/models/OPNsense/Monit/Monit.xml index dcb473f09..804bd8e68 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Monit/Monit.xml +++ b/src/opnsense/mvc/app/models/OPNsense/Monit/Monit.xml @@ -22,12 +22,11 @@ 86400 Start Delay needs to be an integer value between 0 and 86400 - + 127.0.0.1 Y - Y - /^([0-9a-zA-Z\.,_\-:]){0,1024}$/u - lower + Y + , Please specify a valid servername or IP address. diff --git a/src/opnsense/mvc/app/models/OPNsense/Wireguard/Server.xml b/src/opnsense/mvc/app/models/OPNsense/Wireguard/Server.xml index a8df0c459..e8d958c81 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Wireguard/Server.xml +++ b/src/opnsense/mvc/app/models/OPNsense/Wireguard/Server.xml @@ -39,8 +39,11 @@ 1 9300 - - /^([a-fA-F0-9\.:\[\]]*?,)*([a-fA-F0-9\.:\[\]]*)$/ + + , + Y + N + N Please use valid IPv4 or IPv6 addresses.