Example #1
0
        private static Task DnsServer_QueryReceived(object sender, QueryReceivedEventArgs eventArgs)
        {
            eventArgs.Query.IsQuery = false;
            DnsMessage query = eventArgs.Query as DnsMessage;

            if (query == null || query.Questions.Count <= 0)
            {
                query.ReturnCode = ReturnCode.ServerFailure;
            }
            else
            {
                if (query.Questions[0].RecordType == RecordType.A)
                {
                    foreach (DnsQuestion dnsQuestion in query.Questions)
                    {
                        //string resolvedIp = Resolve(clientAddress.ToString(), dnsQuestion.Name);
                        ARecord aRecord = new ARecord(dnsQuestion.Name, 36000, ipAddress);
                        query.AnswerRecords.Add(aRecord);
                    }
                }
                else
                {
                    return(null);
                }
            }
            eventArgs.Response = eventArgs.Query;
            return(Task.CompletedTask);
        }
Example #2
0
        /// <summary>
        /// Gets the IP address for the domain name
        /// </summary>
        /// <param name="domainName"></param>
        /// <returns>IPAddress</returns>
        public IPAddress GetIPAddress(string domainName)
        {
            try
            {
                //try the domain
                ARecord aRecord = GetARecord(domainName);

                //if null try the www subdomain
                if (Object.Equals(aRecord, null))
                {
                    aRecord = GetARecord("www." + domainName);
                }

                if (!Object.Equals(aRecord, null))
                {
                    //compare address to known malicious list before returning
                    if (!_maliciousList.Contains(aRecord.IpAddress.ToString()))
                    {
                        return(aRecord.IpAddress);
                    }
                    else
                    {
                        Utility.WriteToLogFile(String.Format("SmallBiz_MaliciousIPs_{0:M_d_yyyy}", DateTime.Today) + ".log"
                                               , String.Format("{0} is a known malicious ip associated with {1}", aRecord.IpAddress.ToString(), domainName));
                    }
                }
            }
            catch (Exception e)
            {
                ExceptionExtensions.LogError(e, "Dig.GetIPAddress", "Domain: " + domainName);
            }

            return(null);
        }
Example #3
0
        /// <summary>
        /// Acts as a Factory which reads QType from Immutable IResource param to return concrete type which implements IResource.
        /// </summary>
        /// <param name="data"></param>
        /// <param name="position"></param>
        /// <param name="resource"></param>
        /// <returns></returns>
        private static IResource ReadAnswer(ref byte[] data, int position, IResource resource)
        {
            switch (resource.Type)
            {
            case QType.TXT:
                return(TxtRecord.Parse(data, position, resource));

            case QType.MX:
                return(MxRecord.Parse(data, position, resource));

            case QType.A:
                return(ARecord.Parse(data, position, resource));

            case QType.SOA:
                return(SoaRecord.Parse(data, position, resource));

            case QType.NS:
                return(NsRecord.Parse(data, position, resource));

            case QType.CNAME:
                return(CNameRecord.Parse(data, position, resource));
            }

            return(null); //TODO: Thrown Exception Here
        }
Example #4
0
        public FrontendStack(Construct scope, string name, string url, StackProps props = null) : base(scope, $"frontend-{name}", props)
        {
            // pricing - hosted zone
            // 0,50 USD por zona hospedada/mês para as primeiras 25 zonas hospedadas
            // 0,10 USD por zona hospedada/mês para zonas hospedadas adicionais
            // Consultas padrão
            // 0,40 USD por milhão de consultas – primeiro 1 bilhão de consultas/mês
            // 0,20 USD por milhão de consultas – mais de 1 bilhão de consultas/mês
            // Consultas de roteamento baseado em latência
            // 0,60 USD por milhão de consultas – primeiro 1 bilhão de consultas/mês
            // 0,30 USD por milhão de consultas – mais de 1 bilhão de consultas/mês
            // Consultas de Geo DNS e geoproximidade
            // 0,70 USD por milhão de consultas -- primeiro 1 bilhão de consultas/mês
            // 0,35 USD por milhão de consultas -- mais de 1 bilhão de consultas/mês

            _bucket = new Bucket(this, $"frontend-{name}-bucket", new BucketProps()
            {
                BucketName           = name + "72b302bf297a228a75730123efef7c41",
                WebsiteIndexDocument = "index.html",
                PublicReadAccess     = true,
                RemovalPolicy        = RemovalPolicy.DESTROY
            });

            _bucketDeployment = new BucketDeployment(this, $"frontend-{name}-deployment", new BucketDeploymentProps()
            {
                Sources           = new[] { Source.Asset("../tools/frontend/") },
                DestinationBucket = _bucket,
                RetainOnDelete    = false
            });

            _hostedZone = new HostedZone(this, $"frontend-{name}-hostedzone", new HostedZoneProps
            {
                ZoneName = url
            });

            _certificate = new Certificate(this, $"frontend-{name}-certificate", new CertificateProps
            {
                DomainName = url,
                Validation = CertificateValidation.FromDns(_hostedZone)
            });

            _distribution = new Distribution(this, $"frontend-{name}-distribution", new DistributionProps
            {
                DefaultBehavior = new BehaviorOptions
                {
                    Origin = new S3Origin(_bucket),
                    ViewerProtocolPolicy = ViewerProtocolPolicy.REDIRECT_TO_HTTPS
                },
                DomainNames       = new[] { url },
                Certificate       = _certificate,
                DefaultRootObject = "index.html"
            });

            _aRecord = new ARecord(this, $"frontend-{name}-arecord", new ARecordProps
            {
                Zone       = _hostedZone,
                RecordName = url,
                Target     = RecordTarget.FromAlias(new CloudFrontTarget(_distribution))
            });
        }
Example #5
0
 /// <summary>
 /// 消息队列处理
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="eventArgs"></param>
 /// <returns></returns>
 private Task DnsServer_QueryReceived(object sender, QueryReceivedEventArgs eventArgs)
 {
     return(Task.Run(() =>
     {
         var message = eventArgs.Query;
         var clientAddress = eventArgs.RemoteEndpoint;
         message.IsQuery = false;
         DnsMessage query = message as DnsMessage;
         if (query == null || query.Questions.Count <= 0)
         {
             message.ReturnCode = ReturnCode.ServerFailure;
         }
         else
         {
             if (query.Questions[0].RecordType == RecordType.A)
             {
                 foreach (DnsQuestion dnsQuestion in query.Questions)
                 {
                     string resolvedIp = Resolve(clientAddress.ToString(), dnsQuestion.Name.ToString());
                     ARecord aRecord = new ARecord(query.Questions[0].Name, 36000, IPAddress.Parse(resolvedIp));
                     query.AnswerRecords.Add(aRecord);
                 }
             }
         }
         eventArgs.Response = message;
     }));
 }
Example #6
0
        public void DnsRecordFactory_ResolveARecord()
        {
            var header          = new DnsResponseHeader(42, 256, 0, 1, 0, 0);
            var responseMessage = new DnsResponseMessage(header, 0);

            var info   = new ResourceRecordInfo("query", ResourceRecordType.A, QueryClass.IN, 100, 4);
            var ip     = IPAddress.Parse("123.45.67.9");
            var answer = new ARecord(info, ip);

            responseMessage.AddAnswer(answer);
            var response = responseMessage.AsQueryResponse(new NameServer(ip));

            var answerBytes = ip.GetAddressBytes();

            var raw = GetResponseBytes(response, answerBytes);

            var handle = new DnsUdpMessageHandler(true);
            var result = handle.GetResponseMessage(new System.ArraySegment <byte>(raw)).AsQueryResponse(new NameServer(ip));

            Assert.Equal(result.Answers.Count, 1);
            var resultAnswer = result.Answers.OfType <ARecord>().First();

            Assert.Equal(resultAnswer.Address.ToString(), ip.ToString());
            Assert.Equal(resultAnswer.DomainName.Value, "query.");
            Assert.Equal(resultAnswer.RawDataLength, 4);
            Assert.Equal(resultAnswer.RecordClass, QueryClass.IN);
            Assert.Equal(resultAnswer.RecordType, ResourceRecordType.A);
            Assert.True(resultAnswer.TimeToLive == 100);
            Assert.True(result.Header.Id == 42);
            Assert.True(result.Header.AnswerCount == 1);
        }
Example #7
0
        //委托实现方法,可自定义解析规则
        static DnsMessageBase ProcessQuery(DnsMessageBase message, IPAddress clientAddress, ProtocolType protocol)
        {
            message.IsQuery = false;
            DnsMessage query = message as DnsMessage;

            if (query == null || query.Questions.Count <= 0)
            {
                message.ReturnCode = ReturnCode.ServerFailure;
            }
            else
            {
                if (query.Questions[0].RecordType == RecordType.A)
                {
                    //自定义解析规则,clientAddress即客户端的IP,dnsQuestion.Name即客户端请求的域名,Resolve为自定义的方法(代码不再贴出),返回解析后的ip,将其加入AnswerRecords中
                    foreach (DnsQuestion dnsQuestion in query.Questions)
                    {
                        //string resolvedIp = Resolve(clientAddress.ToString(), dnsQuestion.Name);
                        ARecord aRecord = new ARecord(dnsQuestion.Name, 36000, ipAddress);
                        query.AnswerRecords.Add(aRecord);
                    }
                }
                else
                {
                    return(null);
                }
                //如果为IPV6请求,则交给上级DNS服务器处理,代码不再贴出
            }
            return(message);
        }
        public void ResolveMapOnlyArrayTest()
        {
            var q = new DnsQuestion("maponlyarray.bit", RecordType.Any, RecordClass.Any);

            string expectedA1 = "1.2.3.4";
            string expectedA2 = "4.3.2.1";

            string expectedAAAA = "2400:cb00:2049:1::adf5:3b6b";

            var answer = resolver.GetAnswer(q);

            var Aanswers    = answer.AnswerRecords.Where(m => m.RecordType == RecordType.A);
            var AAAAanswers = answer.AnswerRecords.Where(m => m.RecordType == RecordType.Aaaa);

            Assert.IsInstanceOfType(Aanswers.First(), typeof(ARecord));

            ARecord a1 = Aanswers.First() as ARecord;
            ARecord a2 = Aanswers.Last() as ARecord;

            AaaaRecord aaaa = AAAAanswers.First() as AaaaRecord;

            Assert.AreEqual(expectedA1, a1.Address.ToString());
            Assert.AreEqual(expectedA2, a2.Address.ToString());

            Assert.AreEqual(expectedAAAA, aaaa.Address.ToString());
        }
Example #9
0
        public void TestARecord()
        {
            var record = new ARecord("F00.tESt", "001.02.3.40");

            Assert.AreEqual("1.2.3.40", record.IPv4);
            Assert.AreEqual("F00.tESt", record.Name);
        }
Example #10
0
        public async Task MockLookup()
        {
            // arrange
            var lookupMock = new Mock <IDnsQuery>();

            var aRecord = new ARecord(new ResourceRecordInfo("query", ResourceRecordType.A, QueryClass.IN, 0, 0), IPAddress.Any);

            var responseMsg = new DnsResponseMessage(new DnsResponseHeader(123, 256, 1, 1, 0, 1), 123);

            responseMsg.Answers.Add(aRecord);
            IDnsQueryResponse dnsResponse = responseMsg.AsQueryResponse(new NameServer(NameServer.GooglePublicDns));

            //// or mock response
            //var dnsResponseMock = new Mock<IDnsQueryResponse>();
            //dnsResponseMock
            //    .Setup(p => p.Answers)
            //        .Returns(new DnsResourceRecord[] { aRecord });

            Task <IDnsQueryResponse> response = Task.FromResult(dnsResponse);

            lookupMock.Setup(f => f.QueryAsync(It.IsAny <string>(), QueryType.A)).Returns(response);
            var lookup = lookupMock.Object;

            // act
            var result = await lookup.QueryAsync("query", QueryType.A);

            // assert
            Assert.Equal(1, result.Header.AnswerCount);
            Assert.Equal("query.", result.Answers.First().DomainName.Value);
            Assert.Equal(IPAddress.Any, result.Answers.ARecords().First().Address);
        }
Example #11
0
        public void Dig()
        {
            try
            {
                //初始化DnsClient,第一个参数为DNS服务器的IP,第二个参数为超时时间
                DnsClient dnsClient = new DnsClient(IPAddress.Parse(DnsServer), TimeOut);

                //解析域名。将域名请求发送至DNS服务器解析,参数为需要解析的域名
                DnsMessage dnsMessage = dnsClient.Resolve(DomainName.Parse(Domain));
                //TimeSpan = s.Elapsed;
                //若返回结果为空,或者存在错误,则该请求失败。
                if (dnsMessage == null || (dnsMessage.ReturnCode != ReturnCode.NoError && dnsMessage.ReturnCode != ReturnCode.NxDomain))
                {
                    IsSuccess = false;
                    return;
                }
                //循环遍历返回结果,将返回的IPV4记录添加到结果集List中。
                if (dnsMessage != null)
                {
                    foreach (DnsRecordBase dnsRecord in dnsMessage.AnswerRecords)
                    {
                        ARecord AR = dnsRecord as ARecord;
                        if (AR != null)
                        {
                            IsSuccess = true;
                            Record.Add(AR.Address.ToString());
                        }
                    }
                }
            }
            catch (Exception)
            {
            }
        }
Example #12
0
        private Uri ConstructUrl(IRequest originalRequest, IPEndPoint remote)
        {
            if (!state_.IsLocal(remote.Address))
            {
                return(originalRequest.Uri);
            }

            DnsMessage message = state_.Dns.Resolve(originalRequest.Uri.DnsSafeHost);

            if (null == message)
            {
                throw new ApplicationException(string.Format("Could not resolve '{0}' with DNS '{1}'", originalRequest.Uri.DnsSafeHost, state_.Config.Dns.Server));
            }

            foreach (DnsRecordBase recordBase in message.AnswerRecords)
            {
                ARecord record = recordBase as ARecord;
                if (record == null)
                {
                    continue;
                }

                string host = originalRequest.Uri.Host;
                string url  = originalRequest.Uri.AbsoluteUri.Replace(host, record.Address.ToString());

                return(new Uri(url));
            }

            return(originalRequest.Uri);
        }
        public DnsResourceRecord GetRecord(BaseResourceRecordInfo info, ArraySegment <byte> data)
        {
            if (info == null)
            {
                throw new ArgumentNullException(nameof(info));
            }

            int oldIndex = _reader.Index;
            DnsResourceRecord result;

            switch (info.RecordType)
            {
            case ResourceRecordType.A:
                IPAddress ipaddress = _reader.ReadIPAddress(data);
                result = new ARecord(info, ipaddress);
                break;

            default:
                // update reader index because we don't read full data for the empty record
                _reader.Advance(info.RawDataLength);
                result = new EmptyRecord(info);
                break;
            }

            // sanity check
            if (_reader.Index != oldIndex + info.RawDataLength)
            {
                throw new InvalidOperationException("Record reader index out of sync.");
            }

            return(result);
        }
        private void SetupReponse([NotNull] DnsMessage query, [NotNull] DnsQuestion question)
        {
            var record = new ARecord(question.Name, 100, _serverIP);

            query.AnswerRecords.Add(record);
            query.ReturnCode = ReturnCode.NoError;
        }
Example #15
0
        private void ProcessARecord(ARecord record)
        {
            string hostname = record.Name;
            string ip       = record.Address;

            if (!_discoveredIPs.ContainsKey(hostname))
            {
                _discoveredIPs.Add(hostname, new List <string>());
            }
            if (!_discoveredIPs[hostname].Contains(ip))
            {
                _discoveredIPs[hostname].Insert(0, ip);
            }

            // Update existing services
            var services = _discoveredServices.Values.Where(s => s.Hostname == hostname);

            foreach (var service in services)
            {
                if (!service.IPAddresses.Contains(ip))
                {
                    service.IPAddresses.Insert(0, ip);
                }
            }
        }
Example #16
0
        public async Task <bool> ZoneIsUpToDate(string Hostname, RecordType recordType, string zoneAddress)
        {
            RecordSet recordSet = await RecordSet(Hostname, recordType);

            if (recordType == RecordType.A)
            {
                ARecord aRecord = new ARecord(zoneAddress);
                foreach (ARecord rec in recordSet.ARecords)
                {
                    string CurrentAddress = rec.Ipv4Address;
                    if (CurrentAddress.Equals(zoneAddress))
                    {
                        return(true);
                    }
                }
                return(false);
            }
            if (recordType == RecordType.AAAA)
            {
                AaaaRecord aaaaRecord = new AaaaRecord(zoneAddress);
                foreach (AaaaRecord rec in recordSet.AaaaRecords)
                {
                    string CurrentAddress = rec.Ipv6Address;
                    if (CurrentAddress.Equals(zoneAddress))
                    {
                        return(true);
                    }
                }
                return(false);
            }
            return(false);
        }
        public void Resolve_should_successfully_resolve_in_ARecord_domainName_using_IPEndpoint_and_DnsMessageRequest_overload()
        {
            // Arrange.
            const string       domainNameToResolve     = "www.A-Dummy-Domain.com";
            const string       domainNameToResolveRoot = domainNameToResolve + ".";
            const ushort       headerId        = 12345;
            const string       ipAddress       = "10.50.75.40";
            DnsRequestMessage  requestMessage  = GetDnsRequestMessage(headerId);
            IPEndPoint         dnsServerIP     = new IPEndPoint(IPAddress.Parse(ipAddress), dnsPort53);
            DnsResponseMessage responseMessage = GetDnsResponseMessage(headerId, ipAddress, domainNameToResolveRoot);

            mockMessageProcessor.Setup(m => m.ProcessResponse(It.IsAny <ArraySegment <byte> >())).Returns(responseMessage);
            mockDnsString.Setup(m => m.Value).Returns(domainNameToResolveRoot);
            mockUdpSocket.Setup(m => m.Receive(It.IsAny <byte[]>(), It.Is <int>(i => i == 0), It.Is <int>(i => i == ReadSize), It.Is <SocketFlags>(s => s == SocketFlags.None)))
            .Returns(1000);


            IDnsResolver resolver = new DnsResolver(mockCommunicator.Object, mockMessageProcessor.Object);

            // Act.
            DnsResponseMessage response = resolver.Resolve(dnsServerIP, requestMessage);

            // Assert.

            Assert.IsInstanceOf(typeof(ARecord), response.Answers[0]);
            ARecord arecord = response.Answers[0] as ARecord;

            Assert.AreEqual(domainNameToResolveRoot, response.Answers[0].DomainName.Value);
            Assert.AreEqual(ipAddress, arecord.Address.ToString());
        }
Example #18
0
        public void ProcessResponse_should_return_DnsResponseMessage_object_with_1_answer_1_question_only_successfully()
        {
            // Arrange.
            const string domainNameToResolve     = "www.microsoft.com";
            const string domainNameToResolveRoot = domainNameToResolve + ".";
            const string ipAddress = "10.1.1.100";
            const ushort headerId  = 1001;
            IDnsString   dnsString = new DnsString(domainNameToResolve, domainNameToResolveRoot);

            ArraySegment <byte> responseData = GetSampleData(ResponseDataSampleFile.QuestionAndAnswerQuery);

            mockReader.SetupSequence(m => m.ReadUInt16NetworkOrder(responseData))
            .Returns(headerId)                                                         // id
            .Returns(33152)                                                            // flags
            .Returns(1)                                                                // questionCount
            .Returns(1)                                                                // answerCount
            .Returns(0)                                                                // nameServerCount - setting it to zero for this unit test
            .Returns(0)                                                                // additionCount
            .Returns(1)                                                                // QueryType
            .Returns(1)                                                                // QueryClass
            // BaseResourceRecordInfo
            .Returns(1)                                                                // record type
            .Returns(1)                                                                //query class
            .Returns(4);                                                               //// RDLength
            mockReader.Setup(m => m.ReadUInt32NetworkOrder(responseData)).Returns(12); // ttl - 32bit!!

            // question
            mockReader.SetupSequence(m => m.ReadQuestionQueryString(responseData))
            .Returns(dnsString)         // question
            .Returns(dnsString);        // ReadRecordInfo
            mockReader.Setup(m => m.ReadIPAddress(responseData)).Returns(IPAddress.Parse(ipAddress));

            mockReader.SetupSequence(m => m.Index).Returns(8).Returns(12);

            INetworkMessageProcessor messageProcessor = new DnsQueryMessageProcessor(mockReader.Object, mockDnsString.Object);

            // Act.
            DnsResponseMessage response = messageProcessor.ProcessResponse(responseData);

            // Assert.

            Assert.AreEqual(1, response.Answers.Count);
            Assert.AreEqual(1, response.Questions.Count);

            Assert.AreEqual(0, response.Additionals.Count);
            Assert.AreEqual(0, response.Authorities.Count);

            Assert.AreEqual(headerId, response.Header.Identifier);
            Assert.IsInstanceOf <ARecord>(response.Answers[0]);
            ARecord arecord = response.Answers[0] as ARecord;

            Assert.AreEqual(domainNameToResolveRoot, response.Answers[0].DomainName.Value);
            Assert.AreEqual(ipAddress, arecord.Address.ToString());

            // question check
            Assert.AreEqual(QueryClass.IN, response.Questions[0].QuestionClass);
            Assert.AreEqual(QueryType.A, response.Questions[0].QuestionType);
            Assert.AreEqual(domainNameToResolveRoot, response.Questions[0].QueryName.Value);
        }
        private void SetupReponse(DnsMessage query, DnsQuestion question)
        {
            var     ip     = IPAddress.Parse(_serverIp);
            ARecord record = new ARecord(question.Name, 100, ip);

            query.AnswerRecords.Add(record);
            query.ReturnCode = ReturnCode.NoError;
        }
Example #20
0
 private static void PrintResult(DnsResponseMessage response)
 {
     Console.WriteLine("\nDomain Name\t\tRecord Type\tRecord Class\tTime to live\tIP Address");
     Console.WriteLine("--------------------------------------------------------------------------------------------|");
     foreach (DnsResourceRecord nextRec in response.Answers)
     {
         ARecord rec = nextRec as ARecord;
         Console.WriteLine($"{nextRec.DomainName.Value.TrimEnd('.')}\t\t{nextRec.RecordType}\t\t{nextRec.RecordClass}\t\t{nextRec.TimeToLive}\t\t{rec?.Address}");
     }
 }
Example #21
0
        private static IRecord ReadRecord(ByteReader byteReader)
        {
            var name   = DnsUtils.ReadName(byteReader);
            var rtype  = byteReader.GetUshort();
            var rclass = byteReader.GetUshort();
            var ttl    = byteReader.GetUint();

            if ((RecordType)rtype == RecordType.NS)
            {
                var record = new NSRecord()
                {
                    Name   = name,
                    RClass = rclass,
                    Ttl    = ttl,
                };
                var rdlength = byteReader.GetUshort();
                record.Host = ReadName(byteReader);
                return(record);
            }
            else if ((RecordType)rtype == RecordType.A)
            {
                var rdlength = byteReader.GetUshort();
                var ipv4     = ReadIpv4(byteReader);
                var record   = new ARecord(name, ipv4)
                {
                    RClass = rclass,
                    Ttl    = ttl,
                };
                return(record);
            }
            else if ((RecordType)rtype == RecordType.AAAA)
            {
                var rdlength = byteReader.GetUshort();
                var ipv6     = ReadIpv6(byteReader);
                var record   = new AaaaRecord(name, ipv6)
                {
                    RClass = rclass,
                    Ttl    = ttl,
                };
                return(record);
            }
            else
            {
                var record = new Record()
                {
                    Name   = name,
                    RType  = rtype,
                    RClass = (ushort)rclass,
                    Ttl    = ttl,
                };
                var rdlength = byteReader.GetUshort();
                record.RData = byteReader.GetBytes(rdlength);
                return(record);
            }
        }
 public void OnChange(ARecord entity, UpdateOperations operation)
 {
     switch (operation)
     {
     case UpdateOperations.Add:
     case UpdateOperations.Change:
         entity.ChangedDate = DateTime.Now;
         entity.Key         = Guid.NewGuid(); // setting next value for concurrency column, check is based on original value
         break;
     }
 }
Example #23
0
        static void Main(string[] args)
        {
            var ctx = new ConcurrencyTestDataContext();

            var entityA = new ARecord {
                Value = "[0] created payload"
            };

            ctx.ARecords.Add(entityA);
            ctx.SaveChanges();

            entityA.Value = string.Format("[1]  updated payload at {0}", DateTime.Now);
            ctx.SaveChanges();

            entityA.Value = string.Format("[2] updated payload at {0}", DateTime.Now);
            ctx.SaveChanges();


            var entityB = new BRecord {
                Value = "[0] created payload"
            };

            ctx.BRecords.Add(entityB);
            ctx.SaveChanges();

            entityB.Value = string.Format("[1]  updated payload at {0}", DateTime.Now);
            ctx.SaveChanges();

            entityB.Value = string.Format("[2] updated payload at {0}", DateTime.Now);
            ctx.SaveChanges();


            var entityC = new CRecord {
                Value = "[0] created payload"
            };

            ctx.CRecords.Add(entityC);
            ctx.SaveChanges();

            entityC.Value = string.Format("[1]  updated payload at {0}", DateTime.Now);
            ctx.SaveChanges();

            entityC.Value = string.Format("[2] updated payload at {0}", DateTime.Now);
            ctx.SaveChanges();


            var newContext = new ConcurrencyTestDataContext();

            entityC.Value = string.Format("[3] updated payload at {0} via new data context", DateTime.Now);
            newContext.Attach(entityC);

            newContext.SaveChanges();
        }
Example #24
0
        public void ResolveMapNestTest()
        {
            var    q         = new DnsQuestion("www.nest.bit", RecordType.Any, RecordClass.Any);
            string expectedA = "178.248.244.15";
            var    answer    = resolver.GetAnswer(q);

            Assert.IsInstanceOfType(answer.AnswerRecords.First(), typeof(ARecord));

            ARecord a = answer.AnswerRecords.First() as ARecord;

            Assert.AreEqual(expectedA, a.Address.ToString());
        }
Example #25
0
        private static void RunServer()
        {
            var service = "_appletv.local.appletv._local.appletv.local.appletv.local";
            var mdns    = new MulticastService();

            mdns.QueryReceived += (s, e) =>
            {
                var msg = e.Message;
                if (msg.Questions.Any(q => q.Name == service))
                {
                    var res       = msg.CreateResponse();
                    var addresses = MulticastService.GetIPAddresses()
                                    .Where(ip => ip.AddressFamily == AddressFamily.InterNetwork);
                    foreach (var address in addresses)
                    {
                        var ar = new ARecord
                        {
                            Name    = service,
                            Address = address
                        };
                        var writer = new PresentationWriter(new StringWriter());
                        writer.WriteString("123qweq");
                        ar.WriteData(writer);
                        ar.Name = "qweqeqweq";
                        res.Answers.Add(ar);
                    }
                    mdns.SendAnswer(res);
                }
            };
            advertiseThread = new Thread(new ThreadStart(() =>
            {
                sd     = new ServiceDiscovery(mdns);
                var sp = new ServiceProfile("_itxpt_multicast._tcp.", "_itxpt._tcp", 5353, new List <IPAddress> {
                    IPAddress.Parse("192.168.88.239")
                });
                //sp.AddProperty("host", "192.168.88.239");
                //sp.AddProperty("port", "14005");
                sp.Resources.Add(new ARecord {
                    Name = "_itxpt_multicast._tcp.", Address = IPAddress.Parse("192.168.88.239"), Class = DnsClass.ANY
                });
                sp.Resources.Add(new SRVRecord {
                    Name = "_itxpt_multicast._tcp.", Port = 5353, Priority = 0, Weight = 0, Class = DnsClass.ANY
                });
                sp.Resources.Add(new PTRRecord {
                    Name = "_itxpt_multicast._tcp.", DomainName = "192.168.88.239"
                });
                sd.Advertise(sp);
            }));
            advertiseThread.Start();

            mdns.Start();
        }
    private ARecord DiscoveryDnsRecord(Output <string> resourceGroupName, Zone privateDns, Output <string>[] ipAddresses)
    {
        var discoveryRecord = new ARecord($"a-{DiscoveryRecordName}", new ARecordArgs
        {
            ResourceGroupName = resourceGroupName,
            ZoneName          = privateDns.Name,
            Name    = DiscoveryRecordName,
            Records = ipAddresses,
            Ttl     = 300
        });

        return(discoveryRecord);
    }
Example #27
0
        private async Task DnsServer_QueryReceived(object sender, QueryReceivedEventArgs eventArgs)
        {
            DnsMessage message = eventArgs.Query as DnsMessage;

            if (message == null)
            {
                return;
            }

            DnsMessage response = message.CreateResponseInstance();

            if ((message.Questions.Count == 1))
            {
                DnsQuestion question = message.Questions[0];

                var fullAddress = string.Join(".", question.Name.Labels);

                if (this.blockedList.Contains(fullAddress))
                {
                    ARecord fakeRecord = new ARecord(question.Name, 10, this.loopbackIpAddress);
                    response.ReturnCode = ReturnCode.NoError;

                    Debug.WriteLine("Blocked: " + fullAddress);

                    eventArgs.Response = response;
                    return;
                }

                // send query to upstream server
                DnsMessage upstreamResponse = await this.dnsClient.ResolveAsync(question.Name, question.RecordType, question.RecordClass);

                var answer = upstreamResponse.AnswerRecords.FirstOrDefault();
                // if got an answer, copy it to the message sent to the client
                if (answer != null)
                {
                    foreach (DnsRecordBase record in (upstreamResponse.AnswerRecords))
                    {
                        response.AnswerRecords.Add(record);
                    }
                    foreach (DnsRecordBase record in (upstreamResponse.AdditionalRecords))
                    {
                        response.AdditionalRecords.Add(record);
                    }

                    response.ReturnCode = ReturnCode.NoError;

                    // set the response
                    eventArgs.Response = response;
                }
            }
        }
 private void DnsRecord(Output <string> resourceGroupName, Zone privateDns, Output <string> ipAddress, int vnetRangePrefix, Resource[] dependencies)
 {
     var nodeRecord = new ARecord($"a-{DeploymentName}{vnetRangePrefix / 2 + 1}", new ARecordArgs
     {
         ResourceGroupName = resourceGroupName,
         ZoneName          = privateDns.Name,
         Name    = $"{DeploymentName}{vnetRangePrefix / 2 + 1}",
         Records = { ipAddress },
         Ttl     = 300
     },
                                  new CustomResourceOptions
     {
         DependsOn = dependencies
     });
 }
Example #29
0
    /// <summary>
    /// Do DNS queries to get any A records associated with the custom hostname the user has entered.
    /// Puts the string output of the A record listing into the AppService argument so the list can be used later.
    /// </summary>
    /// <param name="appService">The object that holds all of the information the user has given, including the custom hostname.</param>
    public static void GetHostnameARecords(AppService appService, DNSCheckErrors dnsCheckErrors)
    {
        //IDnsResolver resolver = new DnsStubResolver();

        // This is moved into the AppService class itself to prevent making the string multiple times
        // string fullHostnameDNSStyle = appService.CustomHostname + ".";

        try
        {
            //List<ARecord> aRecords = DnsResolverExtensions.Resolve<ARecord>(resolver, appService.CustomHostname, RecordType.A, RecordClass.Any);

            List <string> aRecordsStrings = new List <string>();

            DnsMessage dnsMessage = DnsClient.Default.Resolve(DomainName.Parse(appService.CustomHostname), RecordType.A);
            if ((dnsMessage == null) || ((dnsMessage.ReturnCode != ReturnCode.NoError) && (dnsMessage.ReturnCode != ReturnCode.NxDomain)))
            {
                throw new Exception("DNS request failed");
            }
            else
            {
                foreach (DnsRecordBase dnsRecord in dnsMessage.AnswerRecords)
                {
                    if (dnsRecord.RecordType == RecordType.A && dnsRecord.Name.ToString() == appService.CustomHostnameDNSStyle)
                    {
                        ARecord aRecord = dnsRecord as ARecord;
                        if (aRecord != null)
                        {
                            aRecordsStrings.Add(aRecord.Address.ToString());
                        }
                    }
                }
            }

            /*
             * List<string> aRecordsStrings = new List<string>();
             * foreach (ARecord aRecord in aRecords)
             * {
             *  aRecordsStrings.Add(aRecord.Address.ToString());
             * } */

            appService.HostnameARecords = aRecordsStrings;
        }
        catch
        {
            dnsCheckErrors.hostnameARecordLookupFailed = true;
            dnsCheckErrors.currentDNSFailures++;
        }
    }
Example #30
0
        private static DnsMessage ReplaceARecords(DnsMessage response, DnsMessage dnsMessage)
        {
            var newRecords = new List <DnsRecordBase>();

            foreach (var answerRecord in response.AnswerRecords)
            {
                switch (answerRecord)
                {
                case ARecord _:
                    var newARecord = new ARecord(answerRecord.Name, answerRecord.TimeToLive, IPAddress.Loopback);
                    newRecords.Add(newARecord);
                    break;

                case AaaaRecord _:
                    var newAaaaRecord = new AaaaRecord(answerRecord.Name, answerRecord.TimeToLive, IPAddress.IPv6Loopback);
                    newRecords.Add(newAaaaRecord);
                    break;

                default:
                    newRecords.Add(answerRecord);
                    break;
                }
            }

            return(new DnsMessage
            {
                Questions = dnsMessage.Questions,
                IsQuery = false,
                AdditionalRecords = response.AdditionalRecords,
                AnswerRecords = newRecords,
                AuthorityRecords = response.AuthorityRecords,
                EDnsOptions = response.EDnsOptions,
                IsAuthenticData = response.IsAuthenticData,
                IsAuthoritiveAnswer = response.IsAuthoritiveAnswer,
                IsCheckingDisabled = response.IsCheckingDisabled,
                IsDnsSecOk = response.IsDnsSecOk,
                IsEDnsEnabled = response.IsAuthenticData,
                IsRecursionAllowed = response.IsRecursionAllowed,
                IsRecursionDesired = response.IsRecursionDesired,
                IsTruncated = response.IsTruncated,
                OperationCode = response.OperationCode,
                ReturnCode = response.ReturnCode,
                TSigOptions = response.TSigOptions,
                TransactionID = response.TransactionID
            });
        }
        public override void ExecuteCmdlet()
        {
            DnsRecordBase result = null;
            switch (this.ParameterSetName)
            {
                case ParameterSetA:
                    {
                        result = new ARecord { Ipv4Address = this.Ipv4Address };
                        break;
                    }

                case ParameterSetAaaa:
                    {
                        result = new AaaaRecord { Ipv6Address = this.Ipv6Address };
                        break;
                    }

                case ParameterSetMx:
                    {
                        result = new MxRecord { Preference = this.Preference, Exchange = this.Exchange };
                        break;
                    }

                case ParameterSetNs:
                    {
                        result = new NsRecord { Nsdname = this.Nsdname };
                        break;
                    }
                case ParameterSetSrv:
                    {
                        result = new SrvRecord { Priority = this.Priority, Port = this.Port, Target = this.Target, Weight = this.Weight };
                        break;
                    }
                case ParameterSetTxt:
                    {
                        result = new TxtRecord { Value = this.Value };
                        break;
                    }
                case ParameterSetCName:
                    {
                        result = new CnameRecord { Cname = this.Cname };
                        break;
                    }
                case ParameterSetPtr:
                    {
                        result = new PtrRecord {Ptrdname = this.Ptrdname};
                        break;
                    }
                default:
                    {
                        throw new PSArgumentException(string.Format(ProjectResources.Error_UnknownParameterSetName, this.ParameterSetName));
                    }
            }

            WriteObject(result);
        }