From efcad843cf799882ed2d0699ec5b41a62fc4da8b Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Mon, 14 Jul 2025 23:54:32 +0200 Subject: [PATCH 1/2] Feature: Replace IPv6 Regex with IPAddress Parse --- Source/NETworkManager.Models/Network/SNTPLookup.cs | 10 ++++------ .../NETworkManager.Validators/IPv6AddressValidator.cs | 3 ++- Source/global.json | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Source/NETworkManager.Models/Network/SNTPLookup.cs b/Source/NETworkManager.Models/Network/SNTPLookup.cs index 6f6b8d351c..586550adfe 100644 --- a/Source/NETworkManager.Models/Network/SNTPLookup.cs +++ b/Source/NETworkManager.Models/Network/SNTPLookup.cs @@ -1,10 +1,9 @@ -using System; +using NETworkManager.Utilities; +using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; -using System.Text.RegularExpressions; using System.Threading.Tasks; -using NETworkManager.Utilities; namespace NETworkManager.Models.Network; @@ -102,10 +101,9 @@ public void QueryAsync(IEnumerable servers, bool dnsResolv // NTP requires an IP address to connect to IPAddress serverIP = null; - if (Regex.IsMatch(server.Server, RegexHelper.IPv4AddressRegex) || - Regex.IsMatch(server.Server, RegexHelper.IPv6AddressRegex)) + if (IPAddress.TryParse(server.Server, out var address) && (address.AddressFamily == AddressFamily.InterNetwork || address.AddressFamily == AddressFamily.InterNetworkV6)) { - serverIP = IPAddress.Parse(server.Server); + serverIP = address; } else { diff --git a/Source/NETworkManager.Validators/IPv6AddressValidator.cs b/Source/NETworkManager.Validators/IPv6AddressValidator.cs index 1087fd7eff..2eed34ccb5 100644 --- a/Source/NETworkManager.Validators/IPv6AddressValidator.cs +++ b/Source/NETworkManager.Validators/IPv6AddressValidator.cs @@ -1,5 +1,6 @@ using NETworkManager.Localization.Resources; using System.Globalization; +using System.Net; using System.Net.Sockets; using System.Windows.Controls; @@ -11,7 +12,7 @@ public override ValidationResult Validate(object value, CultureInfo cultureInfo) { var input = (value as string); - if (System.Net.IPAddress.TryParse(input, out var address) && address.AddressFamily == AddressFamily.InterNetworkV6) + if (IPAddress.TryParse(input, out var address) && address.AddressFamily == AddressFamily.InterNetworkV6) return ValidationResult.ValidResult; return new ValidationResult(false, Strings.EnterValidIPv6Address); diff --git a/Source/global.json b/Source/global.json index ddd365c066..73e9d246ce 100644 --- a/Source/global.json +++ b/Source/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.412", + "version": "8.0.411", "rollForward": "latestFeature", "allowPrerelease": false } From 68f0aa903b053783606cec823d653b22b6928a2d Mon Sep 17 00:00:00 2001 From: BornToBeRoot <16019165+BornToBeRoot@users.noreply.github.com> Date: Tue, 22 Jul 2025 23:38:59 +0200 Subject: [PATCH 2/2] Chore: Add validation --- .../Network/SNTPLookup.cs | 2 +- .../IPAddressOrHostnameAsRangeValidator.cs | 8 ++++---- .../MultipleIPAddressesValidator.cs | 18 ++++++++---------- .../Views/SettingsNetworkView.xaml | 1 + 4 files changed, 14 insertions(+), 15 deletions(-) diff --git a/Source/NETworkManager.Models/Network/SNTPLookup.cs b/Source/NETworkManager.Models/Network/SNTPLookup.cs index 586550adfe..2157c5ffe6 100644 --- a/Source/NETworkManager.Models/Network/SNTPLookup.cs +++ b/Source/NETworkManager.Models/Network/SNTPLookup.cs @@ -101,7 +101,7 @@ public void QueryAsync(IEnumerable servers, bool dnsResolv // NTP requires an IP address to connect to IPAddress serverIP = null; - if (IPAddress.TryParse(server.Server, out var address) && (address.AddressFamily == AddressFamily.InterNetwork || address.AddressFamily == AddressFamily.InterNetworkV6)) + if (IPAddress.TryParse(server.Server, out var address) && address.AddressFamily is AddressFamily.InterNetwork or AddressFamily.InterNetworkV6) { serverIP = address; } diff --git a/Source/NETworkManager.Validators/IPAddressOrHostnameAsRangeValidator.cs b/Source/NETworkManager.Validators/IPAddressOrHostnameAsRangeValidator.cs index 8392c450dc..8d9a8742ca 100644 --- a/Source/NETworkManager.Validators/IPAddressOrHostnameAsRangeValidator.cs +++ b/Source/NETworkManager.Validators/IPAddressOrHostnameAsRangeValidator.cs @@ -1,4 +1,5 @@ using System.Globalization; +using System.Net; using System.Text.RegularExpressions; using System.Windows.Controls; using NETworkManager.Localization.Resources; @@ -19,11 +20,10 @@ public override ValidationResult Validate(object value, CultureInfo cultureInfo) { var localItem = item.Trim(); - // Check if it is a valid IPv4 address like 192.168.0.1, a valid IPv6 address like ::1 or a valid hostname like server-01 or server-01.example.com - var isValid = Regex.IsMatch(localItem, RegexHelper.IPv4AddressRegex) || - Regex.IsMatch(localItem, RegexHelper.IPv6AddressRegex) || + // Check if it is a valid IPv4 address like 192.168.0.1, a valid IPv6 address like "::1" or a valid hostname like "server-01" or "server-01.example.com" + var isValid = (IPAddress.TryParse(localItem, out var ipAddress) && ipAddress.AddressFamily is System.Net.Sockets.AddressFamily.InterNetwork or System.Net.Sockets.AddressFamily.InterNetworkV6) || Regex.IsMatch(localItem, RegexHelper.HostnameOrDomainRegex); - + if (!isValid) return new ValidationResult(false, Strings.EnterValidHostnameOrIPAddress); } diff --git a/Source/NETworkManager.Validators/MultipleIPAddressesValidator.cs b/Source/NETworkManager.Validators/MultipleIPAddressesValidator.cs index 9089606473..f9f7b04ef4 100644 --- a/Source/NETworkManager.Validators/MultipleIPAddressesValidator.cs +++ b/Source/NETworkManager.Validators/MultipleIPAddressesValidator.cs @@ -1,8 +1,7 @@ using System.Globalization; -using System.Text.RegularExpressions; +using System.Net; using System.Windows.Controls; using NETworkManager.Localization.Resources; -using NETworkManager.Utilities; namespace NETworkManager.Validators; @@ -10,15 +9,14 @@ public class MultipleIPAddressesValidator : ValidationRule { public override ValidationResult Validate(object value, CultureInfo cultureInfo) { - if (value == null) - return ValidationResult.ValidResult; - - for (var index = 0; index < ((string)value).Split(';').Length; index++) + var ipAddresses = (value as string)?.Split(';'); + + if (ipAddresses == null || ipAddresses.Length == 0) + return new ValidationResult(false, Strings.EnterOneOrMoreValidIPAddresses); + + foreach (var ipAddress in ipAddresses) { - var ipAddress = ((string)value).Split(';')[index]; - - if (!Regex.IsMatch(ipAddress.Trim(), RegexHelper.IPv4AddressRegex) && - !Regex.IsMatch(ipAddress.Trim(), RegexHelper.IPv6AddressRegex)) + if(!(IPAddress.TryParse(ipAddress, out var ip) && ip.AddressFamily is System.Net.Sockets.AddressFamily.InterNetwork or System.Net.Sockets.AddressFamily.InterNetworkV6)) return new ValidationResult(false, Strings.EnterOneOrMoreValidIPAddresses); } diff --git a/Source/NETworkManager/Views/SettingsNetworkView.xaml b/Source/NETworkManager/Views/SettingsNetworkView.xaml index 52dd23a682..54d6f0c534 100644 --- a/Source/NETworkManager/Views/SettingsNetworkView.xaml +++ b/Source/NETworkManager/Views/SettingsNetworkView.xaml @@ -20,6 +20,7 @@ +