Ϫf$ dZddlZddlmZddlmZmZmZddlm Z ddl m Z ddl m Z mZmZmZmZmZed\ZZZd Zeej0Gd d Zd$d Zie j6d e j8de j:de j<de j>de j@de jBde jDde jFde jHde jJde jLde jNde jPde jRde jTde jVde jXde jZde j\d e j^d!e j`d"e jbd#iZ2y)%z> Base functionality useful to various parts of Twisted Names. N) implementer)defererror interfaces)Logger)dns)DNSFormatError DNSNameErrorDNSNotImplementedErrorDNSQueryRefusedErrorDNSServerErrorDNSUnknownError)rrc ~eZdZdZeZejeeje eje ejeejeiZdZdZdZd dZdZd dZd dZd d Zd d Zd d Zd d Zd d Zd dZd dZd dZ d dZ!d dZ"d dZ#d dZ$d dZ%d dZ&d dZ'd dZ(d dZ)d dZ*d dZ+d dZ,d dZ-d!dZ.dZ/y)" ResolverBaseaN L{ResolverBase} is a base class for implementations of L{interfaces.IResolver} which deals with a lot of the boilerplate of implementing all of the lookup methods. @cvar _errormap: A C{dict} mapping DNS protocol failure response codes to exception classes which will be used to represent those failures. Nc|i|_tjD]\}}t|||j|< yN) typeToMethoditemsgetattr)selfkvs 6/usr/lib/python3/dist-packages/twisted/names/common.py__init__zResolverBase.__init__7s= &&( 4DAq#*4#3D  a  4cB|jj|tS)z Convert a response code (one of the possible values of L{dns.Message.rCode} to an exception instance representing it. @since: 10.0 ) _errormapgetr)r responseCodes rexceptionForCodezResolverBase.exceptionForCode<s~~!!,@@rc |j|j}tj||jj|S#t $ro|j jd|tj|j|jjtj|j|cYSwxYw)Nz:Query of unknown type {query.type} for {query.name.name!r})query) rtyper maybeDeferrednameKeyError_logdebug_lookuprIN)rr$timeoutmethods rr$zResolverBase.queryEs I&&uzz2F&&vuzzH H  IIOOL  && ejjoosvvuzz7   sAA5B>=B>c>tjtdS)NzResolverBase._lookup)rfailNotImplementedError)rr'clsr%r-s rr+zResolverBase._lookupSszz-.DEFFrc|jtj|tjtj|Sr)r+r domainStringr,Arr'r-s r lookupAddresszResolverBase.lookupAddressVs*||C,,T2CFFCEE7KKrc|jtj|tjtj|Sr)r+rr4r,AAAAr6s rlookupIPV6AddresszResolverBase.lookupIPV6AddressY*||C,,T2CFFCHHgNNrc|jtj|tjtj|Sr)r+rr4r,A6r6s rlookupAddress6zResolverBase.lookupAddress6\*||C,,T2CFFCFFGLLrc|jtj|tjtj|Sr)r+rr4r,MXr6s rlookupMailExchangezResolverBase.lookupMailExchange_r?rc|jtj|tjtj|Sr)r+rr4r,NSr6s rlookupNameserverszResolverBase.lookupNameserversbr?rc|jtj|tjtj|Sr)r+rr4r,CNAMEr6s rlookupCanonicalNamez ResolverBase.lookupCanonicalNamee*||C,,T2CFFCIIwOOrc|jtj|tjtj|Sr)r+rr4r,MBr6s r lookupMailBoxzResolverBase.lookupMailBoxhr?rc|jtj|tjtj|Sr)r+rr4r,MGr6s rlookupMailGroupzResolverBase.lookupMailGroupkr?rc|jtj|tjtj|Sr)r+rr4r,MRr6s rlookupMailRenamezResolverBase.lookupMailRenamenr?rc|jtj|tjtj|Sr)r+rr4r,PTRr6s r lookupPointerzResolverBase.lookupPointerq*||C,,T2CFFCGGWMMrc|jtj|tjtj|Sr)r+rr4r,SOAr6s rlookupAuthorityzResolverBase.lookupAuthoritytrVrc|jtj|tjtj|Sr)r+rr4r,NULLr6s r lookupNullzResolverBase.lookupNullwr;rc|jtj|tjtj|Sr)r+rr4r,WKSr6s rlookupWellKnownServicesz$ResolverBase.lookupWellKnownServiceszrVrc|jtj|tjtj|Sr)r+rr4r,SRVr6s r lookupServicezResolverBase.lookupService}rVrc|jtj|tjtj|Sr)r+rr4r,HINFOr6s rlookupHostInfozResolverBase.lookupHostInforIrc|jtj|tjtj|Sr)r+rr4r,MINFOr6s rlookupMailboxInfozResolverBase.lookupMailboxInforIrc|jtj|tjtj|Sr)r+rr4r,TXTr6s r lookupTextzResolverBase.lookupTextrVrc|jtj|tjtj|Sr)r+rr4r,SPFr6s rlookupSenderPolicyzResolverBase.lookupSenderPolicyrVrc|jtj|tjtj|Sr)r+rr4r,RPr6s rlookupResponsibilityz!ResolverBase.lookupResponsibilityr?rc|jtj|tjtj|Sr)r+rr4r,AFSDBr6s rlookupAFSDatabasezResolverBase.lookupAFSDatabaserIrc|jtj|tjtj|Sr)r+rr4r,AXFRr6s r lookupZonezResolverBase.lookupZoner;rc|jtj|tjtj|Sr)r+rr4r,NAPTRr6s rlookupNamingAuthorityPointerz)ResolverBase.lookupNamingAuthorityPointerrIrc|jtj|tjtj|Sr)r+rr4r, ALL_RECORDSr6s rlookupAllRecordszResolverBase.lookupAllRecordss*||C,,T2CFFCOOWUUrctj|}|j||}|j|j|||Sr)rr4r} addCallback _cbRecords)rr'r-effortds r getHostByNamezResolverBase.getHostByNames?%  ! !$ 0 dootV4rc|\}}}t|tj|||z|z|}|stj||Sr) extractRecordrNamerDNSLookupError)rrecordsr'ransauthaddresults rrzResolverBase._cbRecordssH"dCtSXXd^S4Z#5EvN&&t, , rr)N )0__name__ __module__ __qualname____doc__rr)rEFORMATr ESERVERr ENAMEr ENOTIMPr EREFUSEDr rrrr"r$r+r7r:r>rBrErHrLrOrRrUrYr\r_rbrerhrkrnrqrtrwrzr}rrrrrrr!s 8D ^ ^ < + * IL4 A IGLOMMMPMMMNNONNPPNNMPOPVrrcHsyttdr|D]i}|jk(s|jtj k(s1tj tj|jjcS|D]i}|jk(s|jtjk(s1tj tj|jjcS|D]i}|jk(s|jtjk(s1tj tj|jjcS|D]}|jk(s|jtjk(s1t||jj|dz }|s6|j|jjjdz cS|cS|D]}|jtj k7r!ddlm}|j'|jjjj)dtj*fgfd }j-jj/|cSy) am Resolve a name to an IP address, following I{CNAME} records and I{NS} referrals recursively. This is an implementation detail of L{ResolverBase.getHostByName}. @param resolver: The resolver to use for the next query (unless handling an I{NS} referral). @type resolver: L{IResolver} @param name: The name being looked up. @type name: L{dns.Name} @param answers: All of the records returned by the previous query (answers, authority, and additional concatenated). @type answers: L{list} of L{dns.RRHeader} @param level: Remaining recursion budget. This is decremented at each recursion. The query returns L{None} when it reaches 0. @type level: L{int} @returns: The first IPv4 or IPv6 address (as a dotted quad or colon quibbles), or L{None} when no result is found. @rtype: native L{str} or L{None} N inet_ntop)rr)clientascii)serversc>|\}}}t||z|zdz S)Nr)r)rrrrlevelr' nsResolvers r queryAgainz!extractRecord..queryAgains-& S$ T3:3CUQYO Or)hasattrsocketr'r%rr=rAF_INET6payloadaddressr9r5AF_INETrGrrrD twisted.namesrResolverdecodePORTr7r) resolverr'answersrrrrrrs ` ` @rrrs4 v{# LAvv~!&&CFF"2''9J9JKK L LAvv~!&&CHH"4''9J9JKK LG 66T>affo##FNNAII4E4EF FG 66T>aff 1"8QYY^^WeaiPF--aiinn.A.A%RS)-TTM K 66SVV  (__$$++G4chh?%  P'' 2>>zJJKrr7r:r>rErHrYrLrOrRr\r_rUrerhrBrkrnrqrtrbrzrwr})r)3rrzope.interfacertwisted.internetrrrtwisted.loggerrrrtwisted.names.errorr r r r r rrange_ANS_AUTH_ADD EMPTY_RESULT IResolverrrr5r9r=rDrGrXrKrNrQr[r^rTrdrgrArjrmrprsraryrvr|rrrrrs  &55!!HeT  Z ! !"HH#HV?KDEE?HH!FF FF   II$  GG  FFOFF FF HHlGG &GG_IIII"FF  GG\!"GG !#$FF "II"GG_II-HHlOO'/ r