public async Task PublicIPResolverOverDns_ResolveIPv4_ReturnsAnIPv4Address()
        {
            // Given
            var mockResponse = new Mock <IDnsQueryResponse>();
            var addresses    = new List <IPAddress> {
                IPAddress.Parse("1.1.1.1")
            };
            var options = new PublicIPResolverOverDnsOptions("myip.test.com", QueryType.TXT, QueryClass.CH, addresses, addresses);

            mockResponse
            .SetupGet(r => r.Answers)
            .Returns(new List <DnsResourceRecord>
            {
                new TxtRecord(
                    info: new ResourceRecordInfo("myip.test.com", ResourceRecordType.TXT, QueryClass.CH, 5000, 0),
                    values: Array.Empty <string>(),
                    utf8Values: new string[] { "10.0.0.1" }
                    )
            });

            _mockLookupClient
            .Setup(dns => dns.QueryAsync(It.IsAny <DnsQuestion>(), It.IsAny <DnsQueryAndServerOptions>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(mockResponse.Object);

            // When
            var resolver = new PublicIPResolverOverDns(_mockLookupClient.Object, _mockLogger.Object, options);
            var ip       = await resolver.ResolveIPv4();

            // Then
            ip.Should().BeEquivalentTo(IPAddress.Parse("10.0.0.1"));
        }
        public async Task PublicIPResolverOverDns_ResolveIPv6_ReturnsNullWhenDnsLookupThrowsAnException()
        {
            // Given
            var mockResponse = new Mock <IDnsQueryResponse>();
            var addresses    = new List <IPAddress> {
                IPAddress.Parse("2606:4700:4700::1111")
            };
            var options = new PublicIPResolverOverDnsOptions("myip.test.com", QueryType.TXT, QueryClass.IN, addresses, addresses);

            mockResponse
            .SetupGet(r => r.Answers)
            .Throws(new Exception("Some exception"));

            _mockLookupClient
            .Setup(dns => dns.QueryAsync(It.IsAny <DnsQuestion>(), It.IsAny <DnsQueryAndServerOptions>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(mockResponse.Object);

            // When
            var resolver = new PublicIPResolverOverDns(_mockLookupClient.Object, _mockLogger.Object, options);
            var ip       = await resolver.ResolveIPv6();

            // Then
            _mockLogger.Verify(l => l.Verbose("Error resolving {ip} over dns: {message}", "ipv6", "Some exception"));
            Assert.Null(ip);
        }
        public async Task PublicIPResolverOverDns_ResolveIPv4_ReturnsNullWhenNoTxtRecordsAreReturned()
        {
            // Given
            var mockResponse = new Mock <IDnsQueryResponse>();
            var addresses    = new List <IPAddress> {
                IPAddress.Parse("1.1.1.1")
            };
            var options = new PublicIPResolverOverDnsOptions("myip.test.com", QueryType.TXT, QueryClass.CH, addresses, addresses);

            mockResponse
            .SetupGet(r => r.Answers)
            .Returns(new List <DnsResourceRecord>
            {
            });

            _mockLookupClient
            .Setup(dns => dns.QueryAsync(It.IsAny <DnsQuestion>(), It.IsAny <DnsQueryAndServerOptions>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(mockResponse.Object);

            // When
            var resolver = new PublicIPResolverOverDns(_mockLookupClient.Object, _mockLogger.Object, options);
            var ip       = await resolver.ResolveIPv4();

            // Then
            Assert.Null(ip);
        }
Ejemplo n.º 4
0
        static async Task ExecuteAsync(string configFile, string logLevel)
        {
            var config = await Config.LoadFromAsync(configFile);

            using var client = new HttpClient();
            var logger = new LoggerConfiguration()
                         .WriteTo.Console()
                         .MinimumLevel.Is(Utils.MapToLogEventLevel(logLevel))
                         .CreateLogger();

            var resolvers = new Dictionary <string, IPublicIPResolver>
            {
                {
                    "http",
                    new PublicIPResolverOverHttp(client, logger, new PublicIPResolverOverHttpOptions(
                                                     ipv4Endpoint: config.Resolvers.Http.IPv4Endpoint,
                                                     ipv6Endpoint: config.Resolvers.Http.IPv6Endpoint
                                                     ))
                },
                {
                    "dns",
                    new PublicIPResolverOverDns(
                        client: new LookupClient(),
                        logger: logger,
                        options: PublicIPResolverOverDns.GetOptionsForDnsServer(config.Resolvers.DnsServer)
                        )
                }
            };

            var resolver   = new PublicIPResolver(config.Resolvers.Order.Select(r => resolvers[r]).ToArray());
            var cloudflare = new CloudflareApi(client, new CloudflareApiOptions(config.ApiToken));
            var ddns       = new DynamicDnsService(logger, cloudflare);

            await SyncDNSCommand(logger, resolver, ddns, config);
        }
        public void PublicIPResolverOverDns_GetOptionsForDnsServer_ThrowsAnExceptionForAnUnknownServer()
        {
            // Given, When
            var exception = Assert.Throws <Exception>(() => PublicIPResolverOverDns.GetOptionsForDnsServer("unknown"));

            // Then
            Assert.Equal("Unknown server!", exception.Message);
        }
        public void PublicIPResolverOverDns_GetOptionsForDnsServer_ReturnTheCorrectOptionsForTheRequestedServer()
        {
            // Given, When
            var cf     = PublicIPResolverOverDns.GetOptionsForDnsServer("cloudflare");
            var google = PublicIPResolverOverDns.GetOptionsForDnsServer("google");

            // Then
            Assert.Equal("whoami.cloudflare", cf.Query);
            Assert.Equal("o-o.myaddr.l.google.com", google.Query);
        }