public DnsEntry FindDnsEntryWithWildcard(IUnitOfWork uow, DnsRequest dnsRequest) { return Mapper.Map<Core.Models.DnsEntry>(uow.Db.FirstOrDefault<SQL.Models.DnsEntry>( new Sql() .Append("SELECT * FROM dns_entries dnsEntry") .Append("WHERE @name LIKE dnsEntry.Name", new { name = dnsRequest.Name }) .Append("AND dnsEntry.Type = @type", new { type = dnsRequest.Type }) )); }
public void Should_Not_Resolve_Dns_Query_Because_No_Entry_Matches() { var dnsEntriesRepository = Mock.Of<IDnsEntriesRepository>(); var unitOfWorkProvider = Mock.Of<IUnitOfWorkProvider>(); IDnsResolver resolver = new DnsResolver(dnsEntriesRepository, unitOfWorkProvider); DnsRequest dnsRequest = new DnsRequest() { Name = "test", Type="TXT" }; DnsResolutionResult result = resolver.Resolve(dnsRequest); result.DnsEntry.Should().BeNull(); }
public void Should_Resolve_Dns_Query_Because_Entry_Matches_Exactly() { var dnsEntriesRepository = Mock.Of<IDnsEntriesRepository>(mock => mock.FindDnsEntry(It.IsAny<IUnitOfWork>(), It.IsAny<DnsRequest>()) == new DnsEntry()); var unitOfWorkProvider = Mock.Of<IUnitOfWorkProvider>(); IDnsResolver resolver = new DnsResolver(dnsEntriesRepository, unitOfWorkProvider); DnsRequest dnsRequest = new DnsRequest() { Name = "test", Type = "TXT" }; DnsResolutionResult result = resolver.Resolve(dnsRequest); result.DnsEntry.Should().NotBeNull(); }
private void ProcessQuestion(DnsMessage message, DnsQuestion dnsQuestion) { var dnsRequest = new DnsRequest() { Name = dnsQuestion.Name, Type = dnsQuestion.RecordType.ToString() }; var result = dnsResolver.Resolve(dnsRequest); if (result.DnsEntry == null) { message.ReturnCode = ReturnCode.NxDomain; return; } message.AnswerRecords.Add(new ARecord(dnsRequest.Name, 3600, IPAddress.Parse(result.DnsEntry.IpV4))); }
public DnsResolutionResult Resolve(DnsRequest dnsRequest) { var result = new DnsResolutionResult(); using (var uow = unitOfWorkProvider.GetUnitOfWork()) { result.DnsEntry = (dnsEntriesRepository.FindDnsEntry(uow, dnsRequest) ?? dnsEntriesRepository.FindDnsEntryWithWildcard(uow, dnsRequest)) ?? CheckCache(dnsRequest) ?? ForwardRequest(dnsRequest); } return result; }
private DnsEntry ForwardRequestToServer(DnsRequest dnsRequest, ForwardingServer forwardingServer, RecordType recordType) { var client = new DnsClient(IPAddress.Parse(forwardingServer.IpV4), 2000); var answer = client.Resolve(dnsRequest.Name, recordType); if (answer != null && answer.AnswerRecords.Any()) { var record = answer.AnswerRecords.FirstOrDefault(r => r.RecordType == recordType); //if (record.RecordType != RecordType.A) // return null; if (record == null) return null; if (record.RecordType != RecordType.A) return null; var dnsEntry = new DnsEntry() { Name = record.Name, IpV4 = ((ARecord)record).Address.ToString() }; return dnsEntry; } return null; }
private DnsEntry ForwardRequest(DnsRequest dnsRequest) { using (var uow = unitOfWorkProvider.GetUnitOfWork()) { var recordType = ParseRecordType(dnsRequest.Type); var forwardingServers = forwardingServersRepository.GetAllForwardingServers(uow); foreach (var forwardingServer in forwardingServers) { var dnsEntry = ForwardRequestToServer(dnsRequest, forwardingServer, recordType); if (dnsEntry != null) { if (!Cache.ContainsKey(dnsEntry.Name)) Cache.Add(dnsEntry.Name, dnsEntry); else Cache[dnsEntry.Name] = dnsEntry; return dnsEntry; } } return null; } }
private DnsEntry CheckCache(DnsRequest dnsRequest) { DnsEntry dnsEntry; return Cache.TryGetValue(dnsRequest.Name, out dnsEntry) ? dnsEntry : null; }