home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2011 October / maximum-cd-2011-10.iso / DiscContents / digsby_setup.exe / lib / dns / message.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2011-06-22  |  19.2 KB  |  734 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.6)
  3.  
  4. import cStringIO
  5. import random
  6. import struct
  7. import sys
  8. import time
  9. import dns.exception as dns
  10. import dns.flags as dns
  11. import dns.name as dns
  12. import dns.opcode as dns
  13. import dns.entropy as dns
  14. import dns.rcode as dns
  15. import dns.rdata as dns
  16. import dns.rdataclass as dns
  17. import dns.rdatatype as dns
  18. import dns.rrset as dns
  19. import dns.renderer as dns
  20. import dns.tsig as dns
  21.  
  22. class ShortHeader(dns.exception.FormError):
  23.     pass
  24.  
  25.  
  26. class TrailingJunk(dns.exception.FormError):
  27.     pass
  28.  
  29.  
  30. class UnknownHeaderField(dns.exception.DNSException):
  31.     pass
  32.  
  33.  
  34. class BadEDNS(dns.exception.FormError):
  35.     pass
  36.  
  37.  
  38. class BadTSIG(dns.exception.FormError):
  39.     pass
  40.  
  41.  
  42. class UnknownTSIGKey(dns.exception.DNSException):
  43.     pass
  44.  
  45.  
  46. class Message(object):
  47.     
  48.     def __init__(self, id = None):
  49.         if id is None:
  50.             self.id = dns.entropy.random_16()
  51.         else:
  52.             self.id = id
  53.         self.flags = 0
  54.         self.question = []
  55.         self.answer = []
  56.         self.authority = []
  57.         self.additional = []
  58.         self.edns = -1
  59.         self.ednsflags = 0
  60.         self.payload = 0
  61.         self.options = []
  62.         self.request_payload = 0
  63.         self.keyring = None
  64.         self.keyname = None
  65.         self.keyalgorithm = dns.tsig.default_algorithm
  66.         self.request_mac = ''
  67.         self.other_data = ''
  68.         self.tsig_error = 0
  69.         self.fudge = 300
  70.         self.original_id = self.id
  71.         self.mac = ''
  72.         self.xfr = False
  73.         self.origin = None
  74.         self.tsig_ctx = None
  75.         self.had_tsig = False
  76.         self.multi = False
  77.         self.first = True
  78.         self.index = { }
  79.  
  80.     
  81.     def __repr__(self):
  82.         return '<DNS message, ID ' + `self.id` + '>'
  83.  
  84.     
  85.     def __str__(self):
  86.         return self.to_text()
  87.  
  88.     
  89.     def to_text(self, origin = None, relativize = True, **kw):
  90.         s = cStringIO.StringIO()
  91.         print >>s, 'id %d' % self.id
  92.         print >>s, 'opcode %s' % dns.opcode.to_text(dns.opcode.from_flags(self.flags))
  93.         rc = dns.rcode.from_flags(self.flags, self.ednsflags)
  94.         print >>s, 'rcode %s' % dns.rcode.to_text(rc)
  95.         print >>s, 'flags %s' % dns.flags.to_text(self.flags)
  96.         if self.edns >= 0:
  97.             print >>s, 'edns %s' % self.edns
  98.             if self.ednsflags != 0:
  99.                 print >>s, 'eflags %s' % dns.flags.edns_to_text(self.ednsflags)
  100.             
  101.             print >>s, 'payload', self.payload
  102.         
  103.         is_update = dns.opcode.is_update(self.flags)
  104.         if is_update:
  105.             print >>s, ';ZONE'
  106.         else:
  107.             print >>s, ';QUESTION'
  108.         for rrset in self.question:
  109.             print >>s, rrset.to_text(origin, relativize, **kw)
  110.         
  111.         if is_update:
  112.             print >>s, ';PREREQ'
  113.         else:
  114.             print >>s, ';ANSWER'
  115.         for rrset in self.answer:
  116.             print >>s, rrset.to_text(origin, relativize, **kw)
  117.         
  118.         if is_update:
  119.             print >>s, ';UPDATE'
  120.         else:
  121.             print >>s, ';AUTHORITY'
  122.         for rrset in self.authority:
  123.             print >>s, rrset.to_text(origin, relativize, **kw)
  124.         
  125.         print >>s, ';ADDITIONAL'
  126.         for rrset in self.additional:
  127.             print >>s, rrset.to_text(origin, relativize, **kw)
  128.         
  129.         return s.getvalue()[:-1]
  130.  
  131.     
  132.     def __eq__(self, other):
  133.         if not isinstance(other, Message):
  134.             return False
  135.         if self.id != other.id:
  136.             return False
  137.         if self.flags != other.flags:
  138.             return False
  139.         for n in self.question:
  140.             if n not in other.question:
  141.                 return False
  142.         
  143.         for n in other.question:
  144.             if n not in self.question:
  145.                 return False
  146.         
  147.         for n in self.answer:
  148.             if n not in other.answer:
  149.                 return False
  150.         
  151.         for n in other.answer:
  152.             if n not in self.answer:
  153.                 return False
  154.         
  155.         for n in self.authority:
  156.             if n not in other.authority:
  157.                 return False
  158.         
  159.         for n in other.authority:
  160.             if n not in self.authority:
  161.                 return False
  162.         
  163.         return True
  164.  
  165.     
  166.     def __ne__(self, other):
  167.         return not self.__eq__(other)
  168.  
  169.     
  170.     def is_response(self, other):
  171.         if other.flags & dns.flags.QR == 0 and self.id != other.id or dns.opcode.from_flags(self.flags) != dns.opcode.from_flags(other.flags):
  172.             return False
  173.         if dns.rcode.from_flags(other.flags, other.ednsflags) != dns.rcode.NOERROR:
  174.             return True
  175.         if dns.opcode.is_update(self.flags):
  176.             return True
  177.         for n in self.question:
  178.             if n not in other.question:
  179.                 return False
  180.         
  181.         for n in other.question:
  182.             if n not in self.question:
  183.                 return False
  184.         
  185.         return True
  186.  
  187.     
  188.     def section_number(self, section):
  189.         if section is self.question:
  190.             return 0
  191.         if section is self.answer:
  192.             return 1
  193.         if section is self.authority:
  194.             return 2
  195.         if section is self.additional:
  196.             return 3
  197.         raise ValueError('unknown section')
  198.  
  199.     
  200.     def find_rrset(self, section, name, rdclass, rdtype, covers = dns.rdatatype.NONE, deleting = None, create = False, force_unique = False):
  201.         key = (self.section_number(section), name, rdclass, rdtype, covers, deleting)
  202.         if not force_unique:
  203.             if self.index is not None:
  204.                 rrset = self.index.get(key)
  205.                 if rrset is not None:
  206.                     return rrset
  207.             else:
  208.                 for rrset in section:
  209.                     if rrset.match(name, rdclass, rdtype, covers, deleting):
  210.                         return rrset
  211.                 
  212.         
  213.         if not create:
  214.             raise KeyError
  215.         create
  216.         rrset = dns.rrset.RRset(name, rdclass, rdtype, covers, deleting)
  217.         section.append(rrset)
  218.         if self.index is not None:
  219.             self.index[key] = rrset
  220.         
  221.         return rrset
  222.  
  223.     
  224.     def get_rrset(self, section, name, rdclass, rdtype, covers = dns.rdatatype.NONE, deleting = None, create = False, force_unique = False):
  225.         
  226.         try:
  227.             rrset = self.find_rrset(section, name, rdclass, rdtype, covers, deleting, create, force_unique)
  228.         except KeyError:
  229.             rrset = None
  230.  
  231.         return rrset
  232.  
  233.     
  234.     def to_wire(self, origin = None, max_size = 0, **kw):
  235.         if max_size == 0:
  236.             if self.request_payload != 0:
  237.                 max_size = self.request_payload
  238.             else:
  239.                 max_size = 65535
  240.         
  241.         if max_size < 512:
  242.             max_size = 512
  243.         elif max_size > 65535:
  244.             max_size = 65535
  245.         
  246.         r = dns.renderer.Renderer(self.id, self.flags, max_size, origin)
  247.         for rrset in self.question:
  248.             r.add_question(rrset.name, rrset.rdtype, rrset.rdclass)
  249.         
  250.         for rrset in self.answer:
  251.             r.add_rrset(dns.renderer.ANSWER, rrset, **kw)
  252.         
  253.         for rrset in self.authority:
  254.             r.add_rrset(dns.renderer.AUTHORITY, rrset, **kw)
  255.         
  256.         if self.edns >= 0:
  257.             r.add_edns(self.edns, self.ednsflags, self.payload, self.options)
  258.         
  259.         for rrset in self.additional:
  260.             r.add_rrset(dns.renderer.ADDITIONAL, rrset, **kw)
  261.         
  262.         r.write_header()
  263.         if self.keyname is not None:
  264.             r.add_tsig(self.keyname, self.keyring[self.keyname], self.fudge, self.original_id, self.tsig_error, self.other_data, self.request_mac, self.keyalgorithm)
  265.             self.mac = r.mac
  266.         
  267.         return r.get_wire()
  268.  
  269.     
  270.     def use_tsig(self, keyring, keyname = None, fudge = 300, original_id = None, tsig_error = 0, other_data = '', algorithm = dns.tsig.default_algorithm):
  271.         self.keyring = keyring
  272.         if keyname is None:
  273.             self.keyname = self.keyring.keys()[0]
  274.         elif isinstance(keyname, (str, unicode)):
  275.             keyname = dns.name.from_text(keyname)
  276.         
  277.         self.keyname = keyname
  278.         self.keyalgorithm = algorithm
  279.         self.fudge = fudge
  280.         if original_id is None:
  281.             self.original_id = self.id
  282.         else:
  283.             self.original_id = original_id
  284.         self.tsig_error = tsig_error
  285.         self.other_data = other_data
  286.  
  287.     
  288.     def use_edns(self, edns = 0, ednsflags = 0, payload = 1280, request_payload = None, options = None):
  289.         if edns is None or edns is False:
  290.             edns = -1
  291.         
  292.         if edns is True:
  293.             edns = 0
  294.         
  295.         if request_payload is None:
  296.             request_payload = payload
  297.         
  298.         if edns < 0:
  299.             ednsflags = 0
  300.             payload = 0
  301.             request_payload = 0
  302.             options = []
  303.         else:
  304.             ednsflags &= 0xFF00FFFFL
  305.             ednsflags |= edns << 16
  306.             if options is None:
  307.                 options = []
  308.             
  309.         self.edns = edns
  310.         self.ednsflags = ednsflags
  311.         self.payload = payload
  312.         self.options = options
  313.         self.request_payload = request_payload
  314.  
  315.     
  316.     def want_dnssec(self, wanted = True):
  317.         if wanted:
  318.             if self.edns < 0:
  319.                 self.use_edns()
  320.             
  321.             self.ednsflags |= dns.flags.DO
  322.         elif self.edns >= 0:
  323.             self.ednsflags &= ~(dns.flags.DO)
  324.         
  325.  
  326.     
  327.     def rcode(self):
  328.         return dns.rcode.from_flags(self.flags, self.ednsflags)
  329.  
  330.     
  331.     def set_rcode(self, rcode):
  332.         (value, evalue) = dns.rcode.to_flags(rcode)
  333.         self.flags &= 65520
  334.         self.flags |= value
  335.         self.ednsflags &= 0xFFFFFFL
  336.         self.ednsflags |= evalue
  337.  
  338.     
  339.     def opcode(self):
  340.         return dns.opcode.from_flags(self.flags)
  341.  
  342.     
  343.     def set_opcode(self, opcode):
  344.         self.flags &= 34815
  345.         self.flags |= dns.opcode.to_flags(opcode)
  346.  
  347.  
  348.  
  349. class _WireReader(object):
  350.     
  351.     def __init__(self, wire, message, question_only = False, one_rr_per_rrset = False):
  352.         self.wire = wire
  353.         self.message = message
  354.         self.current = 0
  355.         self.updating = False
  356.         self.zone_rdclass = dns.rdataclass.IN
  357.         self.question_only = question_only
  358.         self.one_rr_per_rrset = one_rr_per_rrset
  359.  
  360.     
  361.     def _get_question(self, qcount):
  362.         if self.updating and qcount > 1:
  363.             raise dns.exception.FormError
  364.         qcount > 1
  365.         for i in xrange(0, qcount):
  366.             (qname, used) = dns.name.from_wire(self.wire, self.current)
  367.             if self.message.origin is not None:
  368.                 qname = qname.relativize(self.message.origin)
  369.             
  370.             self.current = self.current + used
  371.             (rdtype, rdclass) = struct.unpack('!HH', self.wire[self.current:self.current + 4])
  372.             self.current = self.current + 4
  373.             self.message.find_rrset(self.message.question, qname, rdclass, rdtype, create = True, force_unique = True)
  374.             if self.updating:
  375.                 self.zone_rdclass = rdclass
  376.                 continue
  377.         
  378.  
  379.     
  380.     def _get_section(self, section, count):
  381.         if self.updating or self.one_rr_per_rrset:
  382.             force_unique = True
  383.         else:
  384.             force_unique = False
  385.         seen_opt = False
  386.         for i in xrange(0, count):
  387.             rr_start = self.current
  388.             (name, used) = dns.name.from_wire(self.wire, self.current)
  389.             absolute_name = name
  390.             if self.message.origin is not None:
  391.                 name = name.relativize(self.message.origin)
  392.             
  393.             self.current = self.current + used
  394.             (rdtype, rdclass, ttl, rdlen) = struct.unpack('!HHIH', self.wire[self.current:self.current + 10])
  395.             self.current = self.current + 10
  396.             if rdtype == dns.rdatatype.OPT:
  397.                 if section is not self.message.additional or seen_opt:
  398.                     raise BadEDNS
  399.                 seen_opt
  400.                 self.message.payload = rdclass
  401.                 self.message.ednsflags = ttl
  402.                 self.message.edns = (ttl & 16711680) >> 16
  403.                 self.message.options = []
  404.                 current = self.current
  405.                 optslen = rdlen
  406.                 while optslen > 0:
  407.                     (otype, olen) = struct.unpack('!HH', self.wire[current:current + 4])
  408.                     current = current + 4
  409.                     opt = dns.edns.option_from_wire(otype, self.wire, current, olen)
  410.                     self.message.options.append(opt)
  411.                     current = current + olen
  412.                     optslen = optslen - 4 - olen
  413.                 seen_opt = True
  414.             elif rdtype == dns.rdatatype.TSIG:
  415.                 if not section is self.message.additional and i == count - 1:
  416.                     raise BadTSIG
  417.                 i == count - 1
  418.                 if self.message.keyring is None:
  419.                     raise UnknownTSIGKey('got signed message without keyring')
  420.                 self.message.keyring is None
  421.                 secret = self.message.keyring.get(absolute_name)
  422.                 if secret is None:
  423.                     raise UnknownTSIGKey("key '%s' unknown" % name)
  424.                 secret is None
  425.                 self.message.tsig_ctx = dns.tsig.validate(self.wire, absolute_name, secret, int(time.time()), self.message.request_mac, rr_start, self.current, rdlen, self.message.tsig_ctx, self.message.multi, self.message.first)
  426.                 self.message.had_tsig = True
  427.             elif ttl < 0:
  428.                 ttl = 0
  429.             
  430.             if self.updating:
  431.                 if rdclass == dns.rdataclass.ANY or rdclass == dns.rdataclass.NONE:
  432.                     deleting = rdclass
  433.                     rdclass = self.zone_rdclass
  434.                 else:
  435.                     deleting = None
  436.             if (deleting == dns.rdataclass.ANY or deleting == dns.rdataclass.NONE) and section == self.message.answer:
  437.                 covers = dns.rdatatype.NONE
  438.                 rd = None
  439.             else:
  440.                 rd = dns.rdata.from_wire(rdclass, rdtype, self.wire, self.current, rdlen, self.message.origin)
  441.                 covers = rd.covers()
  442.             if self.message.xfr and rdtype == dns.rdatatype.SOA:
  443.                 force_unique = True
  444.             
  445.             rrset = self.message.find_rrset(section, name, rdclass, rdtype, covers, deleting, True, force_unique)
  446.             if rd is not None:
  447.                 rrset.add(rd, ttl)
  448.             
  449.             self.current = self.current + rdlen
  450.         
  451.  
  452.     
  453.     def read(self):
  454.         l = len(self.wire)
  455.         if l < 12:
  456.             raise ShortHeader
  457.         l < 12
  458.         (self.message.id, self.message.flags, qcount, ancount, aucount, adcount) = struct.unpack('!HHHHHH', self.wire[:12])
  459.         self.current = 12
  460.         if dns.opcode.is_update(self.message.flags):
  461.             self.updating = True
  462.         
  463.         self._get_question(qcount)
  464.         if self.question_only:
  465.             return None
  466.         self._get_section(self.message.answer, ancount)
  467.         self._get_section(self.message.authority, aucount)
  468.         self._get_section(self.message.additional, adcount)
  469.         if self.current != l:
  470.             raise TrailingJunk
  471.         self.current != l
  472.         if self.message.multi and self.message.tsig_ctx and not (self.message.had_tsig):
  473.             self.message.tsig_ctx.update(self.wire)
  474.         
  475.  
  476.  
  477.  
  478. def from_wire(wire, keyring = None, request_mac = '', xfr = False, origin = None, tsig_ctx = None, multi = False, first = True, question_only = False, one_rr_per_rrset = False):
  479.     m = Message(id = 0)
  480.     m.keyring = keyring
  481.     m.request_mac = request_mac
  482.     m.xfr = xfr
  483.     m.origin = origin
  484.     m.tsig_ctx = tsig_ctx
  485.     m.multi = multi
  486.     m.first = first
  487.     reader = _WireReader(wire, m, question_only, one_rr_per_rrset)
  488.     reader.read()
  489.     return m
  490.  
  491.  
  492. class _TextReader(object):
  493.     
  494.     def __init__(self, text, message):
  495.         self.message = message
  496.         self.tok = dns.tokenizer.Tokenizer(text)
  497.         self.last_name = None
  498.         self.zone_rdclass = dns.rdataclass.IN
  499.         self.updating = False
  500.  
  501.     
  502.     def _header_line(self, section):
  503.         token = self.tok.get()
  504.         what = token.value
  505.         if what == 'id':
  506.             self.message.id = self.tok.get_int()
  507.         elif what == 'flags':
  508.             while True:
  509.                 token = self.tok.get()
  510.                 if not token.is_identifier():
  511.                     self.tok.unget(token)
  512.                     break
  513.                 
  514.                 self.message.flags = self.message.flags | dns.flags.from_text(token.value)
  515.             if dns.opcode.is_update(self.message.flags):
  516.                 self.updating = True
  517.             
  518.         elif what == 'edns':
  519.             self.message.edns = self.tok.get_int()
  520.             self.message.ednsflags = self.message.ednsflags | self.message.edns << 16
  521.         elif what == 'eflags':
  522.             if self.message.edns < 0:
  523.                 self.message.edns = 0
  524.             
  525.             while True:
  526.                 token = self.tok.get()
  527.                 if not token.is_identifier():
  528.                     self.tok.unget(token)
  529.                     break
  530.                 
  531.                 self.message.ednsflags = self.message.ednsflags | dns.flags.edns_from_text(token.value)
  532.         elif what == 'payload':
  533.             self.message.payload = self.tok.get_int()
  534.             if self.message.edns < 0:
  535.                 self.message.edns = 0
  536.             
  537.         elif what == 'opcode':
  538.             text = self.tok.get_string()
  539.             self.message.flags = self.message.flags | dns.opcode.to_flags(dns.opcode.from_text(text))
  540.         elif what == 'rcode':
  541.             text = self.tok.get_string()
  542.             self.message.set_rcode(dns.rcode.from_text(text))
  543.         else:
  544.             raise UnknownHeaderField
  545.         (what == 'id').tok.get_eol()
  546.  
  547.     
  548.     def _question_line(self, section):
  549.         token = self.tok.get(want_leading = True)
  550.         if not token.is_whitespace():
  551.             self.last_name = dns.name.from_text(token.value, None)
  552.         
  553.         name = self.last_name
  554.         token = self.tok.get()
  555.         if not token.is_identifier():
  556.             raise dns.exception.SyntaxError
  557.         token.is_identifier()
  558.         
  559.         try:
  560.             rdclass = dns.rdataclass.from_text(token.value)
  561.             token = self.tok.get()
  562.             if not token.is_identifier():
  563.                 raise dns.exception.SyntaxError
  564.             token.is_identifier()
  565.         except dns.exception.SyntaxError:
  566.             raise dns.exception.SyntaxError
  567.         except:
  568.             rdclass = dns.rdataclass.IN
  569.  
  570.         rdtype = dns.rdatatype.from_text(token.value)
  571.         self.message.find_rrset(self.message.question, name, rdclass, rdtype, create = True, force_unique = True)
  572.         if self.updating:
  573.             self.zone_rdclass = rdclass
  574.         
  575.         self.tok.get_eol()
  576.  
  577.     
  578.     def _rr_line(self, section):
  579.         deleting = None
  580.         token = self.tok.get(want_leading = True)
  581.         if not token.is_whitespace():
  582.             self.last_name = dns.name.from_text(token.value, None)
  583.         
  584.         name = self.last_name
  585.         token = self.tok.get()
  586.         if not token.is_identifier():
  587.             raise dns.exception.SyntaxError
  588.         token.is_identifier()
  589.         
  590.         try:
  591.             ttl = int(token.value, 0)
  592.             token = self.tok.get()
  593.             if not token.is_identifier():
  594.                 raise dns.exception.SyntaxError
  595.             token.is_identifier()
  596.         except dns.exception.SyntaxError:
  597.             raise dns.exception.SyntaxError
  598.         except:
  599.             ttl = 0
  600.  
  601.         
  602.         try:
  603.             rdclass = dns.rdataclass.from_text(token.value)
  604.             token = self.tok.get()
  605.             if not token.is_identifier():
  606.                 raise dns.exception.SyntaxError
  607.             token.is_identifier()
  608.             if rdclass == dns.rdataclass.ANY or rdclass == dns.rdataclass.NONE:
  609.                 deleting = rdclass
  610.                 rdclass = self.zone_rdclass
  611.         except dns.exception.SyntaxError:
  612.             raise dns.exception.SyntaxError
  613.         except:
  614.             rdclass = dns.rdataclass.IN
  615.  
  616.         rdtype = dns.rdatatype.from_text(token.value)
  617.         token = self.tok.get()
  618.         if not token.is_eol_or_eof():
  619.             self.tok.unget(token)
  620.             rd = dns.rdata.from_text(rdclass, rdtype, self.tok, None)
  621.             covers = rd.covers()
  622.         else:
  623.             rd = None
  624.             covers = dns.rdatatype.NONE
  625.         rrset = self.message.find_rrset(section, name, rdclass, rdtype, covers, deleting, True, self.updating)
  626.         if rd is not None:
  627.             rrset.add(rd, ttl)
  628.         
  629.  
  630.     
  631.     def read(self):
  632.         line_method = self._header_line
  633.         section = None
  634.         while None:
  635.             token = self.tok.get(True, True)
  636.             if token.is_eol_or_eof():
  637.                 break
  638.             
  639.             if token.is_comment():
  640.                 u = token.value.upper()
  641.                 if u == 'HEADER':
  642.                     line_method = self._header_line
  643.                 elif u == 'QUESTION' or u == 'ZONE':
  644.                     line_method = self._question_line
  645.                     section = self.message.question
  646.                 elif u == 'ANSWER' or u == 'PREREQ':
  647.                     line_method = self._rr_line
  648.                     section = self.message.answer
  649.                 elif u == 'AUTHORITY' or u == 'UPDATE':
  650.                     line_method = self._rr_line
  651.                     section = self.message.authority
  652.                 elif u == 'ADDITIONAL':
  653.                     line_method = self._rr_line
  654.                     section = self.message.additional
  655.                 
  656.                 self.tok.get_eol()
  657.                 continue
  658.             
  659.             line_method(section)
  660.             continue
  661.             return None
  662.  
  663.  
  664.  
  665. def from_text(text):
  666.     m = Message()
  667.     reader = _TextReader(text, m)
  668.     reader.read()
  669.     return m
  670.  
  671.  
  672. def from_file(f):
  673.     if sys.hexversion >= 33751040:
  674.         str_type = basestring
  675.         opts = 'rU'
  676.     else:
  677.         str_type = str
  678.         opts = 'r'
  679.     if isinstance(f, str_type):
  680.         f = file(f, opts)
  681.         want_close = True
  682.     else:
  683.         want_close = False
  684.     
  685.     try:
  686.         m = from_text(f)
  687.     finally:
  688.         if want_close:
  689.             f.close()
  690.         
  691.  
  692.     return m
  693.  
  694.  
  695. def make_query(qname, rdtype, rdclass = dns.rdataclass.IN, use_edns = None, want_dnssec = False):
  696.     if isinstance(qname, (str, unicode)):
  697.         qname = dns.name.from_text(qname)
  698.     
  699.     if isinstance(rdtype, str):
  700.         rdtype = dns.rdatatype.from_text(rdtype)
  701.     
  702.     if isinstance(rdclass, str):
  703.         rdclass = dns.rdataclass.from_text(rdclass)
  704.     
  705.     m = Message()
  706.     m.flags |= dns.flags.RD
  707.     m.find_rrset(m.question, qname, rdclass, rdtype, create = True, force_unique = True)
  708.     m.use_edns(use_edns)
  709.     m.want_dnssec(want_dnssec)
  710.     return m
  711.  
  712.  
  713. def make_response(query, recursion_available = False, our_payload = 8192):
  714.     if query.flags & dns.flags.QR:
  715.         raise dns.exception.FormError('specified query message is not a query')
  716.     query.flags & dns.flags.QR
  717.     response = dns.message.Message(query.id)
  718.     response.flags = dns.flags.QR | query.flags & dns.flags.RD
  719.     if recursion_available:
  720.         response.flags |= dns.flags.RA
  721.     
  722.     response.set_opcode(query.opcode())
  723.     response.question = list(query.question)
  724.     if query.edns >= 0:
  725.         response.use_edns(0, 0, our_payload, query.payload)
  726.     
  727.     if query.keyname is not None:
  728.         response.keyname = query.keyname
  729.         response.keyring = query.keyring
  730.         response.request_mac = query.mac
  731.     
  732.     return response
  733.  
  734.