def _lookup(self, name, cls, type, timeout): log.msg("Looking up type %s records for hostname: %s" % (type, name)) all_types = self.names.lookup(name, type) results = [] authority = [] additional = [] if len(all_types) > 0: log.msg("Got results.") else: log.msg("No results.") for type, records in all_types.items(): for data, metadata in records.items(): if type == A: payload = dns.Record_A(data) elif type == CNAME: # TODO: Add proper CNAME support that sends corresponding "A" records. payload = dns.Record_CNAME(data) elif type == MX: payload = dns.Record_MX(metadata["preference"], data) elif type == NS: payload = dns.Record_NS(data) header = dns.RRHeader(name, type=type, payload=payload, ttl=metadata["ttl"], auth=True) results.append(header) return defer.succeed((results, authority, additional))
def test_mx(self): """ The repr of a L{dns.Record_MX} instance includes the preference, name, and TTL fields of the record. """ self.assertEqual(repr(dns.Record_MX(13, 'mx.example.com', 2)), "<MX preference=13 name=mx.example.com ttl=2>")
def __parseLine(self, line): tokens = line.split(None, 2) # reject if incorrectly formatted. if len(tokens) != 3: raise RuntimeError( "line '%s': wrong # of tokens %d." %(line, len(tokens))) rname, rtype, rvalue = tokens # # if rvalue is a list, make sure to store it as one! if rvalue.startswith("["): rvalue = json.loads(rvalue) # create correct payload payload = None if rtype == "A": payload = dns.Record_A(address=rvalue) elif rtype == "CNAME": payload = dns.Record_CNAME(name=rvalue) elif rtype == "MX": payload = dns.Record_MX(name=rvalue[0], preference=int(rvalue[1])) elif rtype == "NS": payload = dns.Record_NS(name=rvalue) elif rtype == "SOA": payload = dns.Record_SOA(mname=rvalue[0], rname=rvalue[1]) elif rtype == "TXT": payload = dns.Record_TXT(data=[rvalue]) else: raise "cannot parse line!" return dns.RRHeader(name=rname, type=self.__query_types[rtype], payload=payload, ttl=0) # set TTL to 0 for now so that we can
def setUp(self): self.results = None self.d = defer.Deferred() self.d.addCallback(self._gotResults) self.controller = client.AXFRController('fooby.com', self.d) self.soa = dns.RRHeader(name='fooby.com', type=dns.SOA, cls=dns.IN, ttl=86400, auth=False, payload=dns.Record_SOA(mname='fooby.com', rname='hooj.fooby.com', serial=100, refresh=200, retry=300, expire=400, minimum=500, ttl=600)) self.records = [ self.soa, dns.RRHeader(name='fooby.com', type=dns.NS, cls=dns.IN, ttl=700, auth=False, payload=dns.Record_NS(name='ns.twistedmatrix.com', ttl=700)), dns.RRHeader(name='fooby.com', type=dns.MX, cls=dns.IN, ttl=700, auth=False, payload=dns.Record_MX(preference=10, exchange='mail.mv3d.com', ttl=700)), dns.RRHeader(name='fooby.com', type=dns.A, cls=dns.IN, ttl=700, auth=False, payload=dns.Record_A(address='64.123.27.105', ttl=700)), self.soa ]
def _Record_MX(self, query): answers = [dns.RRHeader( name=query.name.name, type=query.type, payload=dns.Record_MX(10, self.lookup_result['ip'], ttl=5), auth=True)] return answers, [], []
def generateAnswerRecordPayload(self, qtype_string, record_value): payload = None if qtype_string == 'A': payload = dns.Record_A(address=record_value) elif qtype_string == 'AAAA': payload = dns.Record_AAAA(address=record_value) elif qtype_string == 'MX': payload = dns.Record_MX(name=record_value) elif qtype_string == 'NS': payload = dns.Record_NS(name=record_value) elif qtype_string == 'MD': raise NotImplementedError() elif qtype_string == 'MF': raise NotImplementedError() elif qtype_string == 'CNAME': raise NotImplementedError() elif qtype_string == 'SOA': raise NotImplementedError() elif qtype_string == 'MB': raise NotImplementedError() elif qtype_string == 'MG': raise NotImplementedError() elif qtype_string == 'MR': raise NotImplementedError() elif qtype_string == 'NULL': raise NotImplementedError() elif qtype_string == 'WKS': raise NotImplementedError() elif qtype_string == 'PTR': raise NotImplementedError() elif qtype_string == 'HINFO': raise NotImplementedError() elif qtype_string == 'MINFO': raise NotImplementedError() elif qtype_string == 'TXT': raise NotImplementedError() elif qtype_string == 'RP': raise NotImplementedError() elif qtype_string == 'AFSDB': raise NotImplementedError() elif qtype_string == 'SRV': raise NotImplementedError() elif qtype_string == 'NAPTR': raise NotImplementedError() elif qtype_string == 'A6': raise NotImplementedError() elif qtype_string == 'DNAME': raise NotImplementedError() elif qtype_string == 'OPT': raise NotImplementedError() elif qtype_string == 'SPF': raise NotImplementedError() else: raise RuntimeError( "DNSReplyGenerator: received request to generate" " DNS query type {}.".format(qtype)) return payload
def test_mailExchangeRecord(self): """ The DNS client can issue an MX query and receive a response including an MX record as well as any A record hints. """ return self.namesTest( self.resolver.lookupMailExchange(b"test-domain.com"), [dns.Record_MX(10, b"host.test-domain.com", ttl=19283784), dns.Record_A(b"123.242.1.5", ttl=19283784), dns.Record_A(b"0.255.0.255", ttl=19283784)])
def test_mx(self): """ Two L{dns.Record_MX} instances compare equal if and only if they have the same preference, name, and ttl. """ # Vary the preference self._equalityTest(dns.Record_MX(10, 'example.org', 20), dns.Record_MX(10, 'example.org', 20), dns.Record_MX(100, 'example.org', 20)) # Vary the name self._equalityTest(dns.Record_MX(10, 'example.org', 20), dns.Record_MX(10, 'example.org', 20), dns.Record_MX(10, 'example.net', 20)) # Vary the ttl self._equalityTest(dns.Record_MX(10, 'example.org', 20), dns.Record_MX(10, 'example.org', 20), dns.Record_MX(10, 'example.org', 200))
def _ebMX(self, failure, domain): if self.fallbackToDomain: failure.trap(IOError) log.msg( "MX lookup failed; attempting to use hostname (%s) directly" % (domain, )) # Alright, I admit, this is a bit icky. from twisted.names import dns return self.resolver.getHostByName(domain).addCallback( lambda h: dns.Record_MX(name=h)) return failure
def test_mxRecords(self): """ MX records are loaded. """ [[rr], [], []] = self.successResultOf( self.auth.lookupMailExchange(b"not-fqdn.example.com")) self.assertEqual( dns.Record_MX( preference=10, name="mail.example.com", ), rr.payload, )
def test_mxRecords(self): """ MX records are loaded. """ rr = self.successResultOf( self.auth.lookupMailExchange(b"not-fqdn.example.com") )[0][0] self.assertEqual( dns.Record_MX( preference=10, name="mx.example.com", ttl=604800, ), rr.payload, )
def makeResult(value): print "dht: %s -> %s" % (dhtQueryString(name, type), value) response = dns.RRHeader(name=name, type=type, ttl=10) if type == dns.A: payload = dns.Record_A(address=value, ttl=10) elif type == dns.AAAA: payload = dns.Record_AAAA(address=value, ttl=10) elif type == dns.CNAME: payload = dns.Record_CNAME(name=value, ttl=10) elif type == dns.MX: payload = dns.Record_MX(name=value, ttl=10) elif type == dns.PTR: payload = dns.Record_PTR(name=value, ttl=10) response.payload = payload return ([response], [], [])
def cbResolved(addr): return dns.Record_MX(name=addr)
def testMailExchangeRecord(self): """Test DNS 'MX' record queries""" return self.namesTest( self.resolver.lookupMailExchange('test-domain.com'), [dns.Record_MX(10, 'host.test-domain.com', ttl=19283784)])
minimum=1, expire=999999, retry=100, ) test_domain_com = NoFileAuthority( soa=('test-domain.com', soa_record), records={ 'test-domain.com': [ soa_record, dns.Record_A('127.0.0.1'), dns.Record_NS('39.28.189.39'), dns.Record_SPF('v=spf1 mx/30 mx:example.org/30 -all'), dns.Record_SPF('v=spf1 +mx a:\0colo', '.example.com/28 -all not valid'), dns.Record_MX(10, 'host.test-domain.com'), dns.Record_HINFO(os='Linux', cpu='A Fast One, Dontcha know'), dns.Record_CNAME('canonical.name.com'), dns.Record_MB('mailbox.test-domain.com'), dns.Record_MG('mail.group.someplace'), dns.Record_TXT('A First piece of Text', 'a SecoNd piece'), dns.Record_A6(0, 'ABCD::4321', ''), dns.Record_A6(12, '0:0069::0', 'some.network.tld'), dns.Record_A6(8, '0:5634:1294:AFCB:56AC:48EF:34C3:01FF', 'tra.la.la.net'), dns.Record_TXT('Some more text, haha! Yes. \0 Still here?'), dns.Record_MR('mail.redirect.or.whatever'), dns.Record_MINFO(rmailbx='r mail box', emailbx='e mail box'), dns.Record_AFSDB(subtype=1, hostname='afsdb.test-domain.com'), dns.Record_RP(mbox='whatever.i.dunno', txt='some.more.text'), dns.Record_WKS('12.54.78.12', socket.IPPROTO_TCP,
minimum=1, expire=999999, retry=100, ) test_domain_com = NoFileAuthority( soa=(b"test-domain.com", soa_record), records={ b"test-domain.com": [ soa_record, dns.Record_A(b"127.0.0.1"), dns.Record_NS(b"39.28.189.39"), dns.Record_SPF(b"v=spf1 mx/30 mx:example.org/30 -all"), dns.Record_SPF(b"v=spf1 +mx a:\0colo", b".example.com/28 -all not valid"), dns.Record_MX(10, "host.test-domain.com"), dns.Record_HINFO(os=b"Linux", cpu=b"A Fast One, Dontcha know"), dns.Record_CNAME(b"canonical.name.com"), dns.Record_MB(b"mailbox.test-domain.com"), dns.Record_MG(b"mail.group.someplace"), dns.Record_TXT(b"A First piece of Text", b"a SecoNd piece"), dns.Record_A6(0, b"ABCD::4321", b""), dns.Record_A6(12, b"0:0069::0", b"some.network.tld"), dns.Record_A6(8, b"0:5634:1294:AFCB:56AC:48EF:34C3:01FF", b"tra.la.la.net"), dns.Record_TXT(b"Some more text, haha! Yes. \0 Still here?"), dns.Record_MR(b"mail.redirect.or.whatever"), dns.Record_MINFO(rmailbx=b"r mail box", emailbx=b"e mail box"), dns.Record_AFSDB(subtype=1, hostname=b"afsdb.test-domain.com"), dns.Record_RP(mbox=b"whatever.i.dunno", txt=b"some.more.text"), dns.Record_WKS(b"12.54.78.12", socket.IPPROTO_TCP,
def __build_answer(self, query, db_zone, db_record, is_conditional_response=False): record = None # Calculate the query type (in case it's a request for A but a CNAME is returned). query_type = REV_TYPES[db_record.type] if query_type == dns.A: record = dns.Record_A(address=db_record.property( 'address', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.AAAA: record = dns.Record_AAAA(address=db_record.property( 'address', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.AFSDB: record = dns.Record_AFSDB(subtype=int( db_record.property('subtype', conditional=is_conditional_response)), hostname=db_record.property( 'hostname', conditional=is_conditional_response)) elif query_type == dns.CNAME: record = dns.Record_CNAME(name=db_record.property( 'name', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.DNAME: record = dns.Record_DNAME(name=db_record.property( 'name', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.HINFO: record = dns.Record_HINFO( cpu=db_record.property( 'cpu', conditional=is_conditional_response).encode(), os=db_record.property( 'os', conditional=is_conditional_response).encode()) elif query_type == dns.MX: record = dns.Record_MX(preference=int( db_record.property('preference', conditional=is_conditional_response)), name=db_record.property( 'name', conditional=is_conditional_response)) elif query_type == dns.NAPTR: record = dns.Record_NAPTR( order=int( db_record.property('order', conditional=is_conditional_response)), preference=int( db_record.property('preference', conditional=is_conditional_response)), flags=db_record.property( 'flags', conditional=is_conditional_response).encode(), service=db_record.property( 'service', conditional=is_conditional_response).encode(), regexp=db_record.property( 'regexp', conditional=is_conditional_response).encode(), replacement=db_record.property( 'replacement', conditional=is_conditional_response)) elif query_type == dns.NS: record = dns.Record_NS(name=db_record.property( 'name', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.PTR: record = dns.Record_PTR(name=db_record.property( 'name', conditional=is_conditional_response), ttl=db_record.ttl) elif query_type == dns.RP: record = dns.Record_RP( mbox=db_record.property('mbox', conditional=is_conditional_response), txt=db_record.property('txt', conditional=is_conditional_response)) elif query_type == dns.SOA: record = dns.Record_SOA( mname=db_record.property('mname', conditional=is_conditional_response), rname=db_record.property('rname', conditional=is_conditional_response), serial=int( db_record.property('serial', conditional=is_conditional_response)), refresh=int( db_record.property('refresh', conditional=is_conditional_response)), retry=int( db_record.property('retry', conditional=is_conditional_response)), expire=int( db_record.property('expire', conditional=is_conditional_response)), minimum=int( db_record.property('minimum', conditional=is_conditional_response))) elif query_type == dns.SPF: record = dns.Record_SPF( db_record.property( 'data', conditional=is_conditional_response).encode()) elif query_type == dns.SRV: record = dns.Record_SRV( priority=int( db_record.property('priority', conditional=is_conditional_response)), port=int( db_record.property('port', conditional=is_conditional_response)), weight=int( db_record.property('weight', conditional=is_conditional_response)), target=db_record.property('target', conditional=is_conditional_response)) elif query_type == dns.SSHFP: record = dns.Record_SSHFP( algorithm=int( db_record.property('algorithm', conditional=is_conditional_response)), fingerprintType=int( db_record.property('fingerprint_type', conditional=is_conditional_response)), fingerprint=db_record.property( 'fingerprint', conditional=is_conditional_response).encode()) elif query_type == dns.TSIG: record = dns.Record_TSIG( algorithm=db_record.property( 'algorithm', conditional=is_conditional_response).encode(), timeSigned=int( db_record.property('timesigned', conditional=is_conditional_response)), fudge=int( db_record.property('fudge', conditional=is_conditional_response)), originalID=int( db_record.property('original_id', conditional=is_conditional_response)), MAC=db_record.property( 'mac', conditional=is_conditional_response).encode(), otherData=db_record.property( 'other_data', conditional=is_conditional_response).encode()) elif query_type == dns.TXT: record = dns.Record_TXT( db_record.property( 'data', conditional=is_conditional_response).encode()) else: pass if not record: return None answer = dns.RRHeader(name=query.name.name, type=query_type, cls=query.cls, ttl=db_record.ttl, payload=record) return answer
def test_MX_record_response(self): f = self._getDNSFactory() h = self._getRRHeader(dns.MX, dns.Record_MX(name=b'mail.foobar.com')) s = f.getDNSAnswerRecordLog(h) self.assertEqual('MX - foobar.com - mail.foobar.com', s)