Esempio n. 1
0
        public async Task TestLookupDomainDontFollowReferrer()
        {
            var request = new WhoisRequest {
                Query = "google.com", FollowReferrer = false
            };
            var intermediateResult = sampleReader.Read("whois.verisign-grs.com", "com", "found_status_registered.txt");

            var rootServer = new WhoisResponse
            {
                DomainName = new HostName("com"),
                Registrar  = new Registrar {
                    WhoisServer = new HostName("whois.verisign-grs.com")
                }
            };

            whoisServerLookup
            .Setup(call => call.LookupAsync(request))
            .Returns(Task.FromResult(rootServer));

            tcpReader
            .Setup(call => call.Read("whois.verisign-grs.com", 43, "google.com", Encoding.UTF8, 10))
            .Returns(Task.FromResult(intermediateResult));

            var result = await lookup.LookupAsync(request);

            Assert.AreEqual("google.com", result.DomainName.ToString());
            Assert.AreEqual(WhoisStatus.Found, result.Status);

            Assert.AreEqual(intermediateResult, result.Content);
            Assert.AreEqual(rootServer, result.Referrer);
        }
Esempio n. 2
0
        public async Task TestLookupDomain()
        {
            var request = new WhoisRequest("google.com");

            var rootServer = new WhoisResponse
            {
                DomainName = new HostName("com"),
                Registrar  = new Registrar {
                    WhoisServer = new HostName("whois.markmonitor.com")
                }
            };

            whoisServerLookup
            .Setup(call => call.LookupAsync(request))
            .Returns(Task.FromResult(rootServer));

            tcpReader
            .Setup(call => call.Read("whois.markmonitor.com", 43, "google.com", Encoding.UTF8, 10))
            .Returns(Task.FromResult(sampleReader.Read("whois.markmonitor.com", "com", "found.txt")));

            var result = await lookup.LookupAsync(request);

            Assert.AreEqual("google.com", result.DomainName.ToString());
            Assert.AreEqual(WhoisStatus.Found, result.Status);
        }
Esempio n. 3
0
        public async Task TestLookupDomainUseBestResponse()
        {
            // Setup our initial request
            var request = new WhoisRequest {
                Query = "fark.co", FollowReferrer = true
            };

            // Setup the inital root server response
            var rootServer = new WhoisResponse
            {
                DomainName = new HostName("co"),
                Registrar  = new Registrar {
                    WhoisServer = new HostName("whois.nic.co")
                }
            };

            whoisServerLookup
            .Setup(call => call.LookupAsync(request))
            .Returns(Task.FromResult(rootServer));

            // Setup the intermediate server response
            var intermediateResult = sampleReader.Read("whois.nic.co", "co", "fark.co.txt");

            tcpReader
            .Setup(call => call.Read("whois.nic.co", 43, "fark.co", Encoding.UTF8, 10))
            .Returns(Task.FromResult(intermediateResult));

            // Setup the authoritative server response
            // Note: this contains less data than the intermediate response, so should be ignored
            var authoritativeResult = sampleReader.Read("whois.dynadot.com", "co", "fark.co.txt");

            tcpReader
            .Setup(call => call.Read("whois.dynadot.com", 43, "fark.co", Encoding.UTF8, 10))
            .Returns(Task.FromResult(authoritativeResult));

            var result = await lookup.LookupAsync(request);

            Assert.AreEqual("fark.co", result.DomainName.ToString());
            Assert.AreEqual(WhoisStatus.Found, result.Status);

            Assert.AreEqual(intermediateResult, result.Content);
            Assert.AreEqual(rootServer, result.Referrer);
        }
Esempio n. 4
0
        public async Task TestLookupTld()
        {
            var request = new WhoisRequest(".com");

            var rootServer = new WhoisResponse
            {
                DomainName = new HostName("com"),
                Registrar  = new Registrar {
                    WhoisServer = new HostName("whois.markmonitor.com")
                }
            };

            whoisServerLookup
            .Setup(call => call.LookupAsync(request))
            .Returns(Task.FromResult(rootServer));

            var result = await lookup.LookupAsync(request);

            Assert.AreEqual(rootServer, result);
        }
Esempio n. 5
0
        public async Task <WhoisResponse> LookupAsync(string domain, Encoding encoding)
        {
            if (string.IsNullOrEmpty(domain))
            {
                throw new ArgumentNullException("domain");
            }

            if (IsValidDomainName(domain) == false)
            {
                throw new WhoisException($"Domain Name is invalid: {domain}");
            }

            Log.Debug("Looking up WHOIS response for: {0}", domain);

            var tld = GetTld(domain);

            var whoisServer = await ServerLookup.LookupAsync(tld);

            var response       = new WhoisResponse();
            var whoisServerUrl = whoisServer.Url;

            while (string.IsNullOrEmpty(whoisServerUrl) == false)
            {
                var content = await Download(whoisServerUrl, domain, encoding);

                response = whoisParser.Parse(whoisServerUrl, tld, content);

                response.Content = content;

                if (response.Registrar?.WhoisServerUrl == whoisServerUrl)
                {
                    break;
                }

                whoisServerUrl = response.Registrar?.WhoisServerUrl;
            }

            return(response);
        }
Esempio n. 6
0
        public void TestDownloadSampleDomainsSingleThreaded()
        {
            var domains = new SampleReader().ReadSampleDomains();

            foreach (var domain in domains)
            {
                Console.WriteLine($"Looking Up: {domain.DomainName}");

                WhoisResponse response = null;

                try
                {
                    response = lookup.Lookup(domain.DomainName);

                    Console.WriteLine($"Looked Up: {domain.DomainName}, Status: {response.Status}, Size: {response.Content.Length}");
                }
                catch (Exception e)
                {
                    Console.WriteLine($"FAIL: {response?.DomainName}: {e.Message}");
                }
                Thread.Sleep(1000);
            }
        }
Esempio n. 7
0
        public static void Write(WhoisResponse response)
        {
            sb.Clear();

            Write(nameof(response.ParsingErrors), response.ParsingErrors);
            Write(nameof(response.TemplateName), response.TemplateName);

            sb.AppendLine();

            Write(nameof(response.DomainName), response.DomainName);
            Write(nameof(response.RegistryDomainId), response.RegistryDomainId);

            if (response.Registrar != null)
            {
                sb.AppendLine();
                sb.AppendLine("            // Registrar Details");

                Write(nameof(response.Registrar) + "." + nameof(response.Registrar.Name), response.Registrar?.Name);
                Write(nameof(response.Registrar) + "." + nameof(response.Registrar.IanaId), response.Registrar?.IanaId);
                Write(nameof(response.Registrar) + "." + nameof(response.Registrar.Url), response.Registrar?.Url);
                Write(nameof(response.Registrar) + "." + nameof(response.Registrar.WhoisServerUrl), response.Registrar?.WhoisServerUrl);
                Write(nameof(response.Registrar) + "." + nameof(response.Registrar.AbuseEmail), response.Registrar?.AbuseEmail);
                Write(nameof(response.Registrar) + "." + nameof(response.Registrar.AbuseTelephoneNumber), response.Registrar?.AbuseTelephoneNumber);
            }

            sb.AppendLine();

            Write(nameof(response.Updated), response.Updated);
            Write(nameof(response.Registered), response.Registered);
            Write(nameof(response.Expiration), response.Expiration);

            Write(nameof(response.Registrant), response.Registrant);
            Write(nameof(response.AdminContact), response.AdminContact);
            Write(nameof(response.BillingContact), response.BillingContact);
            Write(nameof(response.TechnicalContact), response.TechnicalContact);

            sb.AppendLine();

            if (response.NameServers.Any())
            {
                sb.AppendLine("            // Nameservers");
                Write($"{nameof(response.NameServers)}.Count", response.NameServers.Count);

                for (var i = 0; i < response.NameServers.Count; i++)
                {
                    var nameServer = response.NameServers[i];

                    Write($"{nameof(response.NameServers)}[{i}]", nameServer);
                }
                sb.AppendLine();
            }

            if (response.DomainStatus.Any())
            {
                sb.AppendLine("            // Domain Status");
                Write($"{nameof(response.DomainStatus)}.Count", response.DomainStatus.Count);

                for (var i = 0; i < response.DomainStatus.Count; i++)
                {
                    var status = response.DomainStatus[i];

                    Write($"{nameof(response.DomainStatus)}[{i}]", status);
                }
                sb.AppendLine();
            }

            Write(nameof(response.DnsSecStatus), response.DnsSecStatus);

            Write(nameof(response.FieldsParsed), response.FieldsParsed);

            Console.WriteLine(sb.ToString());
            WindowsClipboard.SetText(sb.ToString());
        }
Esempio n. 8
0
        /// <summary>
        /// Performs a WHOIS lookup for the given request.
        /// </summary>
        public async Task <WhoisResponse> LookupAsync(WhoisRequest request)
        {
            if (string.IsNullOrEmpty(request.Query))
            {
                throw new ArgumentNullException("domain");
            }

            // Trim leading '.'
            if (request.Query.StartsWith("."))
            {
                request.Query = request.Query.Substring(1);
            }

            // Validate domain name
            if (HostName.TryParse(request.Query, out var hostName) == false)
            {
                throw new WhoisException($"WHOIS Query Format Error: {request.Query}");
            }

            Log.Debug("Looking up WHOIS response for: {0}", hostName.Value);

            // Set our starting point
            WhoisResponse response;

            if (string.IsNullOrEmpty(request.WhoisServerUrl))
            {
                // Lookup root WHOIS server for the TLD
                response = await ServerLookup.LookupAsync(request);
            }
            else
            {
                // Use the given WHOIS server
                response = WhoisResponse.WithServerUrl(request.WhoisServerUrl);
            }

            // Main loop: download & parse WHOIS data and follow the referrer chain
            var whoisServerUrl = response?.WhoisServerUrl;

            while (string.IsNullOrEmpty(whoisServerUrl) == false && !hostName.IsTld)
            {
                // Download
                var content = await Download(whoisServerUrl, request);

                // Parse result
                var parsed = whoisParser.Parse(whoisServerUrl, content);

                // Build referrer chain
                response = response.Chain(parsed);

                // Check for referral loop
                if (request.FollowReferrer == false)
                {
                    break;
                }
                if (response.SeenServer(response.WhoisServerUrl))
                {
                    break;
                }

                // Lookup result in referral server
                whoisServerUrl = response.WhoisServerUrl;
            }

            return(response);
        }
Esempio n. 9
0
        /// <summary>
        /// Performs a WHOIS lookup for the given request.
        /// </summary>
        public async Task <WhoisResponse> LookupAsync(WhoisRequest request)
        {
            if (string.IsNullOrEmpty(request.Query))
            {
                throw new ArgumentNullException($"{nameof(request)}.{nameof(request.Query)}");
            }

            // Trim leading '.'
            if (request.Query.StartsWith("."))
            {
                request.Query = request.Query.Substring(1);
            }

            // Validate domain name
            if (HostName.TryParse(request.Query, out var hostName) == false)
            {
                throw new WhoisException($"WHOIS Query Format Error: {request.Query}");
            }

            Log.Debug("Looking up WHOIS response for: {0}", hostName.Value);

            // Set our starting point
            WhoisResponse response;

            if (string.IsNullOrEmpty(request.WhoisServer))
            {
                // Lookup root WHOIS server for the TLD
                response = await ServerLookup.LookupAsync(request);
            }
            else
            {
                // Use the given WHOIS server
                response = WhoisResponse.WithServerUrl(request.WhoisServer);
            }

            // If query is for a top level domain, we're finished
            if (hostName.IsTld)
            {
                return(response);
            }

            // Main loop: download & parse WHOIS data and follow the referrer chain
            var whoisServer = response?.WhoisServer;

            while (whoisServer != null)
            {
                // Download
                var content = await Download(whoisServer.Value, request);

                // Parse result
                var parsed = Parser.Parse(whoisServer.Value, content);

                // Sanity check: ensure the last response has some data
                if (parsed.FieldsParsed == 0 && response.FieldsParsed > 0)
                {
                    break;
                }

                // Build referrer chain
                response = response.Chain(parsed);

                // Check for referral loop
                if (request.FollowReferrer == false)
                {
                    break;
                }
                if (response.SeenServer(response.WhoisServer))
                {
                    break;
                }

                // Lookup result in referral server
                whoisServer = response.WhoisServer;
            }

            return(response);
        }
Esempio n. 10
0
        /// <summary>
        /// Sets the WHOIS referrer on this instance
        /// </summary>
        internal WhoisResponse Chain(WhoisResponse response)
        {
            response.Referrer = this;

            return(response);
        }