/// <summary> /// Parses specified count of answers from query. /// </summary> /// <param name="reply">Server returned query.</param> /// <param name="answerCount">Number of answers to parse.</param> /// <param name="offset">Position from where to start parsing answers.</param> /// <returns></returns> private List <DNS_rr> ParseAnswers(byte[] reply, int answerCount, ref int offset) { /* RFC 1035 4.1.3. Resource record format * * 1 1 1 1 1 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | | / / | / NAME / | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | TYPE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | CLASS | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | TTL | | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | RDLENGTH | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| | / RDATA / | / / +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ */ List <DNS_rr> answers = new List <DNS_rr>(); //---- Start parsing answers ------------------------------------------------------------------// for (int i = 0; i < answerCount; i++) { string name = ""; if (!GetQName(reply, ref offset, ref name)) { break; } int type = reply[offset++] << 8 | reply[offset++]; int rdClass = reply[offset++] << 8 | reply[offset++]; int ttl = reply[offset++] << 24 | reply[offset++] << 16 | reply[offset++] << 8 | reply[offset++]; int rdLength = reply[offset++] << 8 | reply[offset++]; if ((DNS_QType)type == DNS_QType.A) { answers.Add(DNS_rr_A.Parse(name, reply, ref offset, rdLength, ttl)); } else if ((DNS_QType)type == DNS_QType.NS) { answers.Add(DNS_rr_NS.Parse(name, reply, ref offset, rdLength, ttl)); } else if ((DNS_QType)type == DNS_QType.CNAME) { answers.Add(DNS_rr_CNAME.Parse(name, reply, ref offset, rdLength, ttl)); } else if ((DNS_QType)type == DNS_QType.SOA) { answers.Add(DNS_rr_SOA.Parse(name, reply, ref offset, rdLength, ttl)); } else if ((DNS_QType)type == DNS_QType.PTR) { answers.Add(DNS_rr_PTR.Parse(name, reply, ref offset, rdLength, ttl)); } else if ((DNS_QType)type == DNS_QType.HINFO) { answers.Add(DNS_rr_HINFO.Parse(name, reply, ref offset, rdLength, ttl)); } else if ((DNS_QType)type == DNS_QType.MX) { answers.Add(DNS_rr_MX.Parse(name, reply, ref offset, rdLength, ttl)); } else if ((DNS_QType)type == DNS_QType.TXT) { answers.Add(DNS_rr_TXT.Parse(name, reply, ref offset, rdLength, ttl)); } else if ((DNS_QType)type == DNS_QType.AAAA) { answers.Add(DNS_rr_AAAA.Parse(name, reply, ref offset, rdLength, ttl)); } else if ((DNS_QType)type == DNS_QType.SRV) { answers.Add(DNS_rr_SRV.Parse(name, reply, ref offset, rdLength, ttl)); } else if ((DNS_QType)type == DNS_QType.NAPTR) { answers.Add(DNS_rr_NAPTR.Parse(name, reply, ref offset, rdLength, ttl)); } else if ((DNS_QType)type == DNS_QType.SPF) { answers.Add(DNS_rr_SPF.Parse(name, reply, ref offset, rdLength, ttl)); } else { // Unknown record, skip it. offset += rdLength; } } return(answers); }
public bool Filter(string from, IMailServerManagementApi api, SMTP_Session session, out string errorText) { errorText = null; bool result = true; if (session.IsAuthenticated || this.IsPrivateIP(session.RemoteEndPoint.Address)) { return(true); } try { DataSet dataSet = new DataSet(); dataSet.Tables.Add("General"); dataSet.Tables["General"].Columns.Add("CheckHelo"); dataSet.Tables["General"].Columns.Add("LogRejections"); dataSet.Tables.Add("BlackListSettings"); dataSet.Tables["BlackListSettings"].Columns.Add("ErrorText"); dataSet.Tables.Add("BlackList"); dataSet.Tables["BlackList"].Columns.Add("IP"); dataSet.Tables.Add("Servers"); dataSet.Tables["Servers"].Columns.Add("Cost"); dataSet.Tables["Servers"].Columns.Add("Server"); dataSet.Tables["Servers"].Columns.Add("DefaultRejectionText"); dataSet.ReadXml(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\DnsBlackList.xml"); bool flag = false; if (dataSet.Tables["General"].Rows.Count == 1) { if (Convert.ToBoolean(dataSet.Tables["General"].Rows[0]["CheckHelo"])) { DnsServerResponse dnsServerResponse = Dns_Client.Static.Query(session.EhloHost, DNS_QType.A); if (dnsServerResponse.ConnectionOk && dnsServerResponse.ResponseCode != DNS_RCode.SERVER_FAILURE) { bool flag2 = false; DNS_rr_A[] aRecords = dnsServerResponse.GetARecords(); for (int i = 0; i < aRecords.Length; i++) { DNS_rr_A dNS_rr_A = aRecords[i]; if (session.RemoteEndPoint.Address.Equals(dNS_rr_A.IP)) { flag2 = true; break; } } if (!flag2) { errorText = "Not valid DNS EHLO/HELO name for your IP '" + session.EhloHost + "' !"; bool result2 = false; return(result2); } } } flag = ConvertEx.ToBoolean(dataSet.Tables["General"].Rows[0]["LogRejections"]); } foreach (DataRow dataRow in dataSet.Tables["BlackList"].Rows) { if (this.IsAstericMatch(dataRow["IP"].ToString(), session.RemoteEndPoint.Address.ToString())) { errorText = dataSet.Tables["BlackListSettings"].Rows[0]["ErrorText"].ToString(); bool result2 = false; return(result2); } } foreach (DataRow dataRow2 in dataSet.Tables["Servers"].Rows) { DnsServerResponse dnsServerResponse2 = Dns_Client.Static.Query(this.ReverseIP(session.RemoteEndPoint.Address) + "." + dataRow2["Server"].ToString(), DNS_QType.ANY); DNS_rr_A[] aRecords2 = dnsServerResponse2.GetARecords(); if (aRecords2.Length > 0) { if (flag) { this.WriteFilterLog(string.Concat(new string[] { "Sender:", from, " IP:", session.RemoteEndPoint.Address.ToString(), " blocked\r\n" })); } errorText = dataRow2["DefaultRejectionText"].ToString(); if (dnsServerResponse2.GetTXTRecords().Length > 0) { errorText = dnsServerResponse2.GetTXTRecords()[0].Text; } if (errorText == "") { errorText = "You are in '" + dataRow2["Server"].ToString() + "' rejection list !"; } bool result2 = false; return(result2); } } } catch { } return(result); }