|
@@ -1,4 +1,5 @@
|
|
|
using System.Globalization;
|
|
using System.Globalization;
|
|
|
|
|
+using System.Net;
|
|
|
using System.Collections.ObjectModel;
|
|
using System.Collections.ObjectModel;
|
|
|
using System.ComponentModel;
|
|
using System.ComponentModel;
|
|
|
using System.Runtime.CompilerServices;
|
|
using System.Runtime.CompilerServices;
|
|
@@ -543,6 +544,12 @@ public partial class DeviceDetailsWindow : Window
|
|
|
error = $"地址格式不正确:{ip}";
|
|
error = $"地址格式不正确:{ip}";
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (IsNetworkOrBroadcastAddress(parts[0], cidrPrefix))
|
|
|
|
|
+ {
|
|
|
|
|
+ addresses = [];
|
|
|
|
|
+ error = $"IP 地址不能是网络地址或广播地址:{parts[0]}/{cidrPrefix}";
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
row.IP = parts[0];
|
|
row.IP = parts[0];
|
|
|
row.Mask = PrefixToMask(cidrPrefix);
|
|
row.Mask = PrefixToMask(cidrPrefix);
|
|
|
result.Add(new RemoteInterfaceAddressConfig { IP = parts[0], Prefix = cidrPrefix });
|
|
result.Add(new RemoteInterfaceAddressConfig { IP = parts[0], Prefix = cidrPrefix });
|
|
@@ -560,6 +567,12 @@ public partial class DeviceDetailsWindow : Window
|
|
|
error = $"子网掩码格式不正确:{ip} {maskText}";
|
|
error = $"子网掩码格式不正确:{ip} {maskText}";
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (IsNetworkOrBroadcastAddress(ip, prefix))
|
|
|
|
|
+ {
|
|
|
|
|
+ addresses = [];
|
|
|
|
|
+ error = $"IP 地址不能是网络地址或广播地址:{ip}/{prefix}";
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
row.Mask = PrefixToMask(prefix);
|
|
row.Mask = PrefixToMask(prefix);
|
|
|
result.Add(new RemoteInterfaceAddressConfig { IP = ip, Prefix = prefix });
|
|
result.Add(new RemoteInterfaceAddressConfig { IP = ip, Prefix = prefix });
|
|
|
}
|
|
}
|
|
@@ -675,6 +688,12 @@ public partial class DeviceDetailsWindow : Window
|
|
|
error = $"地址格式不正确:{line}";
|
|
error = $"地址格式不正确:{line}";
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (IsNetworkOrBroadcastAddress(cidrParts[0], prefix))
|
|
|
|
|
+ {
|
|
|
|
|
+ addresses = [];
|
|
|
|
|
+ error = $"IP 地址不能是网络地址或广播地址:{cidrParts[0]}/{prefix}";
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
result.Add(new RemoteInterfaceAddressConfig { IP = cidrParts[0], Prefix = prefix });
|
|
result.Add(new RemoteInterfaceAddressConfig { IP = cidrParts[0], Prefix = prefix });
|
|
|
continue;
|
|
continue;
|
|
|
}
|
|
}
|
|
@@ -691,6 +710,12 @@ public partial class DeviceDetailsWindow : Window
|
|
|
error = $"子网掩码或前缀格式不正确:{line}";
|
|
error = $"子网掩码或前缀格式不正确:{line}";
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
|
|
+ if (IsNetworkOrBroadcastAddress(parts[0], parsedPrefix))
|
|
|
|
|
+ {
|
|
|
|
|
+ addresses = [];
|
|
|
|
|
+ error = $"IP 地址不能是网络地址或广播地址:{parts[0]}/{parsedPrefix}";
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
result.Add(new RemoteInterfaceAddressConfig { IP = parts[0], Prefix = parsedPrefix });
|
|
result.Add(new RemoteInterfaceAddressConfig { IP = parts[0], Prefix = parsedPrefix });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -731,6 +756,26 @@ public partial class DeviceDetailsWindow : Window
|
|
|
return text.Split(['\r', '\n', ',', ';'], StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
|
return text.Split(['\r', '\n', ',', ';'], StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private static bool IsNetworkOrBroadcastAddress(string ipText, int prefix)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (prefix > 30 || !IPAddress.TryParse(ipText, out var parsed))
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var bytes = parsed.GetAddressBytes();
|
|
|
|
|
+ if (bytes.Length != 4)
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ var ip = ((uint)bytes[0] << 24) | ((uint)bytes[1] << 16) | ((uint)bytes[2] << 8) | bytes[3];
|
|
|
|
|
+ var mask = prefix == 0 ? 0u : uint.MaxValue << (32 - prefix);
|
|
|
|
|
+ var network = ip & mask;
|
|
|
|
|
+ var broadcast = network | ~mask;
|
|
|
|
|
+ return ip == network || ip == broadcast;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private static bool TryMaskOrPrefixToPrefix(string text, out int prefix)
|
|
private static bool TryMaskOrPrefixToPrefix(string text, out int prefix)
|
|
|
{
|
|
{
|
|
|
if (int.TryParse(text, out prefix) && prefix >= 0 && prefix <= 32)
|
|
if (int.TryParse(text, out prefix) && prefix >= 0 && prefix <= 32)
|