blob: 5feb4570cc336c7b8f50fff15d0c59c63d1d028e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
using System.Net;
namespace Agent.Windows.Network;
public sealed record NetworkEndpoint(IPAddress Address, ushort Port);
public static class NetworkAllowanceSnapshot
{
public static async Task<IReadOnlyList<NetworkEndpoint>> ResolveAsync(IEnumerable<(string Host, IReadOnlyList<int> Ports)> allowances,
CancellationToken cancellationToken)
{
var endpoints = new HashSet<NetworkEndpoint>();
foreach ((string host, IReadOnlyList<int> ports) in allowances)
{
IPAddress[] addresses = await Dns.GetHostAddressesAsync(host, cancellationToken).ConfigureAwait(false);
foreach (int port in ports)
{
if (port is < 1 or > 65535) throw new ArgumentOutOfRangeException(nameof(allowances), $"Invalid network port {port}.");
foreach (IPAddress address in addresses.Where(static item => item.AddressFamily is
System.Net.Sockets.AddressFamily.InterNetwork or System.Net.Sockets.AddressFamily.InterNetworkV6))
endpoints.Add(new(address, (ushort)port));
}
}
return endpoints.OrderBy(static item => item.Address.ToString(), StringComparer.Ordinal)
.ThenBy(static item => item.Port).ToArray();
}
}
|