Query() 공개 메소드

Do Query on specified DNS servers
public Query ( string name, DNSQType qtype, QClass qclass, int timeout ) : Heijden.DNS.DNSResponse
name string Name to query
qtype DNSQType Question type
qclass QClass Class type
timeout int Timeout for lookup in seconds.
리턴 Heijden.DNS.DNSResponse
예제 #1
0
        async Task<bool> GetHostEntry(string name, bool replicas)
        {
            HostName hostName = new HostName(name);

            // Get initial Master server to do direct queries
            HostName hostDomain = hostName.GetParent();
            if (hostDomain == null)
            {
                throw new ArgumentException(string.Format("'{0}' is not a valid host name", name));
            }
            var soaRecords = localResolver.Query(hostDomain.Name, QType.SOA);
            if (soaRecords != null && soaRecords.RecordsSOA.Length > 0)
            {
                // Some local servers provide truncated SOA list, so query authority
                var hostDomainIps = await localResolver.ResolveAsync(soaRecords.RecordsSOA[0].MNAME);
                var remoteResolver = new Resolver(GetIpV4Address(hostDomainIps));

                var soaMessage = remoteResolver.Query(hostDomain.Name, QType.SOA);

                if (soaMessage != null && soaRecords.RecordsSOA.Length > 0)
                {
                    // Search each SOA record
                    bool foundInReplicas = true;
                    foreach (var server in soaMessage.RecordsSOA)
                    {
                        // Search each IP associated with NS Server
                        hostDomainIps = localResolver.GetHostByName(server.MNAME);
                        foreach (var ipEndpoint in GetIpV4Address(hostDomainIps))
                        {
                            remoteResolver = new Resolver(ipEndpoint);
                            remoteResolver.Recursion = true;
                            remoteResolver.UseCache = false;
                            var dnsMessage = remoteResolver.Query(hostName.Name, QType.A);
                            if (dnsMessage == null || !string.IsNullOrEmpty(dnsMessage.Error) || dnsMessage.Answers.Count == 0)
                            {
                                // Record not found
                                Console.WriteLine("Record not found in NS server '{0}'", server.MNAME);
                                foundInReplicas = false;
                            }

                            // If we aren't checking all replica's, return true from first result
                            if (!replicas)
                            {
                                return foundInReplicas;
                            }
                        }
                    }

                    // All SOA servers returned a record
                    return foundInReplicas;
                }
            }

            // No SOA record found
            return false;
        }
예제 #2
0
파일: DNSCache.cs 프로젝트: timfplab/fp
        /// <summary>
        /// Checks if a domain exists in the DNS server's cache
        /// </summary>
        /// <params>
        /// <param name="dnsIp">DNS server's IP address</param>
        /// <param name="query">Query to be executed</param>
        /// </params>
        /// <returns>True if it exists</returns>
        private bool ExistsInDnsServerCache(string dnsIp, string query)
        {
            var r = new Heijden.DNS.Resolver(dnsIp)
            {
                Recursion = false
            };

            if (r.Query(query, Heijden.DNS.QType.A, Heijden.DNS.QClass.IN).Answers.Count > 0)
            {
                Found?.Invoke(query, null);
                return(true);
            }
            return(false);
        }
예제 #3
0
        /// <summary>
        /// Button "check DNS" in domain configuration have been click
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btDomainCheckDNS_Click(object sender, EventArgs e)
        {
            string sFullDomain = this.txtDomainSelector.Text + "._domainkey." + this.txtDomainName.Text;

            try
            {
                Resolver oResolver = new Resolver();
                oResolver.Recursion = true;
                oResolver.UseCache = false;

                // Get the name server for the domain to avoid DNS caching
                Response oResponse = oResolver.Query(sFullDomain, QType.NS, QClass.IN);
                if (oResponse.RecordsRR.GetLength(0) > 0)
                {
                    RR oNsRecord = oResponse.RecordsRR[0];
                    if (oNsRecord.RECORD.RR.RECORD.GetType() == typeof(RecordSOA))
                    {
                        RecordSOA oSoaRecord = (RecordSOA)oNsRecord.RECORD.RR.RECORD;
                        oResolver.DnsServer = oSoaRecord.MNAME;
                    }
                }

                // Get the TXT record for DKIM
                oResponse = oResolver.Query(sFullDomain, QType.TXT, QClass.IN);
                if (oResponse.RecordsTXT.GetLength(0) > 0)
                {
                    RecordTXT oTxtRecord = oResponse.RecordsTXT[0];
                    this.txtDomainDNS.Text = oTxtRecord.TXT.Count > 0 ? oTxtRecord.TXT[0] : "No record found for " + sFullDomain;
                }
                else
                {
                    this.txtDomainDNS.Text = "No record found for " + sFullDomain;
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show("Coldn't get DNS record:\n" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.txtDomainDNS.Text = "Error getting record.";
            }
        }
예제 #4
0
		public void TestNaptr()
		{
			string TelephoneNumber = "+1 800-555-5555";
			//string TelephoneNumber = "+1 567-459-0088";
			Resolver resolver1 = new Resolver();
			resolver1.DnsServer = "E164.org";
			string strEnum = Resolver.GetArpaFromEnum(TelephoneNumber);

			Assert.AreEqual(strEnum, "5.5.5.5.5.5.5.0.0.8.1.e164.arpa.");
			//Assert.AreEqual(strEnum, "8.8.0.0.9.5.4.7.6.5.1.e164.arpa.");
			
			Response response = resolver1.Query(strEnum, QType.NAPTR, QClass.IN);
			foreach (RR rr in response.Answers)
				Console.WriteLine(rr.ToString());
		}
예제 #5
0
        public Boolean Init()
        {
            this.Hostname = Util.checkregstring("HKLM", @"SOFTWARE\dagent\messagebroker", "hostname", this.Hostname);
            this.Password = Util.checkregstring("HKLM", @"SOFTWARE\dagent\messagebroker", "password", this.Password);
            this.Username = Util.checkregstring("HKLM", @"SOFTWARE\dagent\messagebroker", "username", this.Username);
            this.UUID = Util.checkregstring("HKLM", @"SOFTWARE\dagent\messagebroker", "uuid", this.UUID);
            this.Port = Util.checkregint("HKLM", @"SOFTWARE\dagent\messagebroker", "port", this.Port);
            this.Vhost = Util.checkregstring("HKLM", @"SOFTWARE\dagent\messagebroker", "vhost", this.Vhost);
            this.RootKey = Util.checkregstring("HKLM", @"SOFTWARE\dagent\messagebroker", "rootkey", this.RootKey);
            /*
             * Look for TXT records defining all the possible access methods which are available.
             */
            Resolver Resolver = new Resolver();
            Response response = Resolver.Query(this.Hostname,QType.TXT,QClass.ANY);
            LinkedList<Connector> AnyConnector = new LinkedList<Connector>();
            LinkedList<Connector> MacConnector = new LinkedList<Connector>();
            LinkedList<Connector> RouterIPConnector = new LinkedList<Connector>();
            foreach (AnswerRR answerRR in response.Answers)
            {
                switch (answerRR.Type)
                {
                    case Heijden.DNS.Type.TXT:
                        String[] strippedresponse = answerRR.RECORD.ToString().Split('\"');
                        String[] value = strippedresponse[1].Split('!');
                        if (value[0].ToLower().Equals("dagent"))
                        {
                            switch (value[1].ToLower())
                            {
                                case "connector":
                                    Connector conn = new Connector(value, 2);
                                    Util.log(this.ToString(), 99, conn.ToString());
                                    switch (conn.Match)
                                    {
                                        case "any":
                                            AnyConnector.AddLast(conn);
                                            break;
                                    }
                                    break;
                                case "rootkey":
                                    break;
                            }
                        }
                        break;
                }
            }
            /*
             * Fallback method to use DNS A Records
             */
            if (this._connection == null)
            {
                IPHostEntry ipentry = Dns.GetHostEntry(this.Hostname);
                foreach (IPAddress ip in ipentry.AddressList)
                {
                    try
                    {
                        Util.log(this.ToString(), 99, "Attempting connection to " + ip.ToString() + ":" + this.Port.ToString());
                        var factory = new ConnectionFactory()
                        {
                            HostName = ip.ToString(),
                            Password = this.Password,
                            UserName = this.Username,
                            Port = this.Port,
                            VirtualHost = this.Vhost
                        };
                        this._connection = factory.CreateConnection();
                        break;
                    }
                    catch (Exception e)
                    {
                        Util.log(this.ToString(), 1, e.ToString());
                    }

                }
                if (this._connection == null)
                {
                    Util.log(this.ToString(), 0, "Unable to connect to " + this.Hostname);
                    return false;
                }

                this.persistant = this.NewChannel();
                String queuename = "persist." + this.UUID + ".control";
                this.persistant.QueueDeclare(queuename,true);
                this.persistant.QueueBind(queuename, "dagent.control", "");
                return true;
            }
            return false;
        }
예제 #6
0
        public static IEnumerable<IPAddress> ResolveUri(Resolver resolver, Uri uri)
        {
            var response = resolver.Query(uri.Host, QType.A, QClass.IN);

            return response.Answers.Where(a => a.Type == Heijden.DNS.Type.A).Select(a => IPAddress.Parse(a.RECORD.ToString()));
        }
예제 #7
0
        /// <summary>
        /// Button "check DNS" in domain configuration have been click
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btDomainCheckDNS_Click(object sender, EventArgs e)
        {
            string sFullDomain = txtDomainSelector.Text + "._domainkey." + txtDomainName.Text;
            lblDomainDNSCheckResult.Visible = false;

            try
            {
                Resolver oResolver = new Resolver();
                oResolver.Recursion = true;
                oResolver.UseCache = false;

                // Get the name server for the domain to avoid DNS caching
                Response oResponse = oResolver.Query(sFullDomain, QType.NS, QClass.IN);
                if (oResponse.RecordsRR.GetLength(0) > 0)
                {
                    RR oNsRecord = oResponse.RecordsRR[0];
                    if (oNsRecord.RECORD.RR.RECORD.GetType() == typeof(RecordSOA))
                    {
                        RecordSOA oSoaRecord = (RecordSOA)oNsRecord.RECORD.RR.RECORD;
                        oResolver.DnsServer = oSoaRecord.MNAME;
                    }
                }

                // Get the TXT record for DKIM
                oResponse = oResolver.Query(sFullDomain, QType.TXT, QClass.IN);
                if (oResponse.RecordsTXT.GetLength(0) > 0)
                {
                    RecordTXT oTxtRecord = oResponse.RecordsTXT[0];
                    txtDomainDNS.Text = oTxtRecord.TXT.Count > 0 ? string.Join(string.Empty, oTxtRecord.TXT) : "No record found for " + sFullDomain;
                    if (oTxtRecord.TXT.Count > 0)
                    {
                        //check if public key matches suggested
                        var matchesDns = Regex.Matches(txtDomainDNS.Text, @";\s*p=([^\s]+)");
                        var matchesSuggested = Regex.Matches(txtDNSRecord.Text, @";\s*p=([^\s]+)");
                        if (matchesDns.Count == 0 || matchesDns[0].Groups.Count <= 1)
                        {
                            lblDomainDNSCheckResult.Text = "Could not extract public key from DNS record.";
                            lblDomainDNSCheckResult.ForeColor = Color.Firebrick;
                        }
                        else if (matchesSuggested.Count == 0 || matchesSuggested[0].Groups.Count <= 1)
                        {
                            lblDomainDNSCheckResult.Text = "Could not extract public key from suggested DNS record.";
                            lblDomainDNSCheckResult.ForeColor = Color.Firebrick;
                        }
                        else if (String.Compare(matchesDns[0].Groups[1].ToString(), matchesSuggested[0].Groups[1].ToString(), StringComparison.Ordinal) == 0)
                        {
                            lblDomainDNSCheckResult.Text = "DNS record public key is correct";
                            lblDomainDNSCheckResult.ForeColor = Color.Green;
                        }
                        else
                        {
                            lblDomainDNSCheckResult.Text = "DNS record public key does not match";
                            lblDomainDNSCheckResult.ForeColor = Color.Firebrick;
                        }

                        lblDomainDNSCheckResult.Visible = true;
                    }
                }
                else
                {
                    txtDomainDNS.Text = "No record found for " + sFullDomain;
                }
            }
            catch (Exception ex)
            {
                ShowMessageBox("Error", "Coldn't get DNS record:\n" + ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtDomainDNS.Text = "Error getting record.";
            }
        }
#pragma warning disable 1998
        public async Task<LookupResponse[]> LookupAsync(string product, params string[] phoneNumbers)
#pragma warning restore 1998
        {
            if (phoneNumbers.Length != 1)
            {
                throw new NotImplementedException(); //TODO: Import modified Heijden
            }

            var resolver = new Resolver(Address)
            {
                TransportType = TransportType.Udp,
                UseCache = false,
                TimeOut = 20,
                Retries = 1
            };

            var strName = Resolver.GetArpaFromEnum(phoneNumbers.Single());
            if (strName.EndsWith(".e164.arpa.") && !string.IsNullOrEmpty(product))
            {
                strName = strName.Insert(strName.Length - ".e164.arpa.".Length, "." + product.ToLower());
            }
            var response = resolver.Query(strName, QType.NAPTR, QClass.IN);
            var naptrRecord = response.Answers.Select(answer => answer.RECORD).OfType<RecordNAPTR>().FirstOrDefault();

            // ReSharper disable once PossibleNullReferenceException
            var responseParts = naptrRecord.REGEXP.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);

            if (responseParts.Length == 0) return null;
            // ReSharper disable once PossibleNullReferenceException
            var match = _resultRegex.Value.Match(responseParts[0]);

            var lookupResponse = new LookupResponse
            {
                InputPhoneNumber = phoneNumbers.Single(),
                MSISDN = match.Success ? match.Groups[1].Value : null,
                MobileCountryCode = match.Success ? match.Groups[3].Value : null,
                MobileNetworkCode = match.Success ? match.Groups[2].Value : null
            };

            for (var i = 1; i < responseParts.Length; i++)
            {
                var fieldMatch = _resultValueRegex.Value.Match(responseParts[i]);
                if (!fieldMatch.Success) continue;

                switch (fieldMatch.Groups[1].Value)
                {
                    case "npdi":
                        lookupResponse.NPDI = Convert.ToBoolean(int.Parse(fieldMatch.Groups[2].Value));
                        break;
                    case "price":
                        lookupResponse.Price = decimal.Parse(fieldMatch.Groups[2].Value, CultureInfo.InvariantCulture.NumberFormat);
                        break;

                    case "nrhmnc":
                        lookupResponse.PortedSourceMobileNetworkCode = fieldMatch.Groups[2].Value;
                        break;
                    case "imsi":
                        lookupResponse.IMSI = fieldMatch.Groups[2].Value;
                        break;
                    case "msc":
                        lookupResponse.MSC = fieldMatch.Groups[2].Value;
                        break;
                    case "isroaming":
                        lookupResponse.IsRoaming = Convert.ToBoolean(int.Parse(fieldMatch.Groups[2].Value));
                        break;
                    case "rmcc":
                        lookupResponse.RoamingMobileCountryCode = fieldMatch.Groups[2].Value;
                        break;
                    case "isabsent":
                        lookupResponse.IsAbsent = Convert.ToBoolean(int.Parse(fieldMatch.Groups[2].Value));
                        break;
                }
            }

            return new[] { lookupResponse }; //TODO: Make async response from Task.Factory.FromAsync(resolver.BeginResolve, resolver.EndResolve)
            // https://blog.justjuzzy.com/2012/10/turn-iasyncresult-code-into-await-keyword/
        }