summaryrefslogtreecommitdiff
path: root/src/Agent.Windows/Network/NetworkAllowanceSnapshot.cs
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();
    }
}