/Source/NETworkManager.Validators/MultipleHostsRangeValidator.cs

https://github.com/BornToBeRoot/NETworkManager · C# · 93 lines · 62 code · 20 blank · 11 comment · 15 complexity · c454b5bddd0ddc69bef50336dba51c5a MD5 · raw file

  1. using System.Globalization;
  2. using System.Text.RegularExpressions;
  3. using System.Windows.Controls;
  4. using NETworkManager.Utilities;
  5. using System.Net;
  6. using NETworkManager.Models.Network;
  7. namespace NETworkManager.Validators
  8. {
  9. public class MultipleHostsRangeValidator : ValidationRule
  10. {
  11. public override ValidationResult Validate(object value, CultureInfo cultureInfo)
  12. {
  13. var isValid = true;
  14. if (value == null)
  15. return new ValidationResult(false, Localization.Resources.Strings.EnterValidIPScanRange);
  16. foreach (var ipHostOrRange in ((string)value).Replace(" ", "").Split(';'))
  17. {
  18. // 192.168.0.1
  19. if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressRegex))
  20. continue;
  21. // 192.168.0.0/24
  22. if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressCidrRegex))
  23. continue;
  24. // 192.168.0.0/255.255.255.0
  25. if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressSubnetmaskRegex))
  26. continue;
  27. // 192.168.0.0 - 192.168.0.100
  28. if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressRangeRegex))
  29. {
  30. var range = ipHostOrRange.Split('-');
  31. if (IPv4Address.ToInt32(IPAddress.Parse(range[0])) > IPv4Address.ToInt32(IPAddress.Parse(range[1])))
  32. isValid = false;
  33. continue;
  34. }
  35. // 192.168.[50-100].1
  36. if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv4AddressSpecialRangeRegex))
  37. {
  38. var octets = ipHostOrRange.Split('.');
  39. foreach (var octet in octets)
  40. {
  41. // Match [50-100]
  42. if (!Regex.IsMatch(octet, RegexHelper.SpecialRangeRegex))
  43. continue;
  44. foreach (var numberOrRange in octet.Substring(1, octet.Length - 2).Split(','))
  45. {
  46. if (!numberOrRange.Contains("-"))
  47. continue;
  48. // 50-100 --> {50, 100}
  49. var rangeNumber = numberOrRange.Split('-');
  50. if (int.Parse(rangeNumber[0]) > int.Parse(rangeNumber[1]))
  51. isValid = false;
  52. }
  53. }
  54. continue;
  55. }
  56. // 2001:db8:85a3::8a2e:370:7334
  57. if (Regex.IsMatch(ipHostOrRange, RegexHelper.IPv6AddressRegex))
  58. continue;
  59. // server-01.example.com
  60. if (Regex.IsMatch(ipHostOrRange, RegexHelper.HostnameRegex))
  61. continue;
  62. // server-01.example.com/24
  63. if (Regex.IsMatch(ipHostOrRange, RegexHelper.HostnameCidrRegex))
  64. continue;
  65. // server-01.example.com/255.255.255.0
  66. if (Regex.IsMatch(ipHostOrRange, RegexHelper.HostnameSubnetmaskRegex))
  67. continue;
  68. isValid = false;
  69. }
  70. return isValid ? ValidationResult.ValidResult : new ValidationResult(false, Localization.Resources.Strings.EnterValidIPScanRange);
  71. }
  72. }
  73. }