using System.Net; using PrivaPub.Infrastructure.Http; namespace PrivaPub.Tests.Infrastructure { public class IpRangeGuardTests { [Theory] [InlineData("1.1.1.1")] [InlineData("8.8.8.8")] [InlineData("93.184.215.14")] [InlineData("172.15.255.255")] [InlineData("172.32.0.1")] [InlineData("100.63.255.255")] [InlineData("100.128.0.0")] [InlineData("2a01:4f8::1")] [InlineData("2606:4700:4700::1111")] [InlineData("::ffff:1.1.1.1")] public void Public_addresses_are_allowed(string address) => Assert.True(IpRangeGuard.IsPublic(IPAddress.Parse(address))); [Theory] [InlineData("0.0.0.0")] [InlineData("10.1.2.3")] [InlineData("100.64.0.1")] [InlineData("100.127.255.255")] [InlineData("127.0.0.1")] [InlineData("127.255.255.254")] [InlineData("169.254.169.254")] [InlineData("172.16.0.1")] [InlineData("172.31.255.255")] [InlineData("192.0.0.170")] [InlineData("192.0.2.1")] [InlineData("192.88.99.1")] [InlineData("192.168.1.1")] [InlineData("198.18.0.1")] [InlineData("198.51.100.7")] [InlineData("203.0.113.9")] [InlineData("224.0.0.251")] [InlineData("239.255.255.250")] [InlineData("240.0.0.1")] [InlineData("255.255.255.255")] [InlineData("::")] [InlineData("::1")] [InlineData("::127.0.0.1")] [InlineData("::ffff:127.0.0.1")] [InlineData("::ffff:10.0.0.1")] [InlineData("::ffff:169.254.169.254")] [InlineData("64:ff9b::7f00:1")] [InlineData("64:ff9b::808:808")] [InlineData("64:ff9b:1::1")] [InlineData("100::1")] [InlineData("2001::1")] [InlineData("2001:0:4136:e378:8000:63bf:3fff:fdd2")] [InlineData("2001:db8::1")] [InlineData("2001:10::1")] [InlineData("2002:7f00:1::1")] [InlineData("2002:c0a8:101::1")] [InlineData("3fff::1")] [InlineData("fc00::1")] [InlineData("fd12:3456:789a::1")] [InlineData("fe80::1")] [InlineData("fec0::1")] [InlineData("ff02::1")] public void Private_and_special_addresses_are_refused(string address) => Assert.False(IpRangeGuard.IsPublic(IPAddress.Parse(address))); [Fact] public async Task Connect_refuses_a_name_that_resolves_to_loopback() { await Assert.ThrowsAsync(async () => await SafeHttpHandlerFactory.Connect(new DnsEndPoint("localhost", 443), allowPrivateNetworks: false, TestContext.Current.CancellationToken)); } [Theory] [InlineData("127.0.0.1")] [InlineData("[::1]")] [InlineData("169.254.169.254")] public async Task Connect_refuses_a_private_literal(string host) { await Assert.ThrowsAsync(async () => await SafeHttpHandlerFactory.Connect(new DnsEndPoint(host, 443), allowPrivateNetworks: false, TestContext.Current.CancellationToken)); } } }