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))
Exemple #2
0
 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>")
Exemple #3
0
    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
Exemple #4
0
    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
            ]
Exemple #5
0
    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, [], []
Exemple #6
0
    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
Exemple #7
0
 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)])
Exemple #8
0
 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,
     )
Exemple #11
0
 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,
     )
Exemple #12
0
 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], [], [])
Exemple #13
0
 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,
Exemple #17
0
    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)