
    Ϫf$                        d Z ddlZddlmZ ddlmZmZmZ ddlm	Z	 ddl
mZ ddlmZmZmZmZmZmZ  ed      \  ZZZd	Z eej0                         G d
 d             Zd$dZi ej6                  dej8                  dej:                  dej<                  dej>                  dej@                  dejB                  dejD                  dejF                  dejH                  dejJ                  dejL                  dejN                  dejP                  dejR                  dejT                  dejV                  dejX                  dejZ                  dej\                  d ej^                  d!ej`                  d"ejb                  d#iZ2y)%z>
Base functionality useful to various parts of Twisted Names.
    N)implementer)defererror
interfaces)Logger)dns)DNSFormatErrorDNSNameErrorDNSNotImplementedErrorDNSQueryRefusedErrorDNSServerErrorDNSUnknownError   ) r   r   c            
       ~   e Zd ZdZ e       Zej                  eej                  e
ej                  eej                  eej                  eiZdZd Zd Zd dZd Zd dZd dZd d	Zd d
Zd dZd dZd dZd dZd dZd dZ d dZ!d dZ"d dZ#d dZ$d dZ%d dZ&d dZ'd dZ(d dZ)d dZ*d dZ+d dZ,d dZ-d!dZ.d Z/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 | _         t         j                         D ]  \  }}t        | |      | j                   |<     y N)typeToMethoditemsgetattr)selfkvs      6/usr/lib/python3/dist-packages/twisted/names/common.py__init__zResolverBase.__init__7   s=     &&( 	4DAq#*4#3Da 	4    c                 B    | j                   j                  |t              S )z
        Convert a response code (one of the possible values of
        L{dns.Message.rCode} to an exception instance representing it.

        @since: 10.0
        )	_errormapgetr   )r   responseCodes     r   exceptionForCodezResolverBase.exceptionForCode<   s     ~~!!,@@r   c                    	 | j                   |j                     }t        j                  ||j                  j                  |      S # t
        $ ro | j                  j                  d|       t        j                  | j                  |j                  j                  t        j                  |j                  |      cY S w xY w)Nz:Query of unknown type {query.type} for {query.name.name!r})query)r   typer   maybeDeferrednameKeyError_logdebug_lookupr   IN)r   r$   timeoutmethods       r   r$   zResolverBase.queryE   s    	I&&uzz2F &&vuzzHH  	IIOOL   &&ejjoosvvuzz7 	s   A A5B>=B>c                 >    t        j                  t        d            S )NzResolverBase._lookup)r   failNotImplementedError)r   r'   clsr%   r-   s        r   r+   zResolverBase._lookupS   s    zz-.DEFFr   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   domainStringr,   Ar   r'   r-   s      r   lookupAddresszResolverBase.lookupAddressV   s*    ||C,,T2CFFCEE7KKr   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   AAAAr6   s      r   lookupIPV6AddresszResolverBase.lookupIPV6AddressY   *    ||C,,T2CFFCHHgNNr   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   A6r6   s      r   lookupAddress6zResolverBase.lookupAddress6\   *    ||C,,T2CFFCFFGLLr   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   MXr6   s      r   lookupMailExchangezResolverBase.lookupMailExchange_   r?   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   NSr6   s      r   lookupNameserverszResolverBase.lookupNameserversb   r?   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   CNAMEr6   s      r   lookupCanonicalNamez ResolverBase.lookupCanonicalNamee   *    ||C,,T2CFFCIIwOOr   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   MBr6   s      r   lookupMailBoxzResolverBase.lookupMailBoxh   r?   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   MGr6   s      r   lookupMailGroupzResolverBase.lookupMailGroupk   r?   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   MRr6   s      r   lookupMailRenamezResolverBase.lookupMailRenamen   r?   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   PTRr6   s      r   lookupPointerzResolverBase.lookupPointerq   *    ||C,,T2CFFCGGWMMr   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   SOAr6   s      r   lookupAuthorityzResolverBase.lookupAuthorityt   rV   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   NULLr6   s      r   
lookupNullzResolverBase.lookupNullw   r;   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   WKSr6   s      r   lookupWellKnownServicesz$ResolverBase.lookupWellKnownServicesz   rV   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   SRVr6   s      r   lookupServicezResolverBase.lookupService}   rV   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   HINFOr6   s      r   lookupHostInfozResolverBase.lookupHostInfo   rI   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   MINFOr6   s      r   lookupMailboxInfozResolverBase.lookupMailboxInfo   rI   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   TXTr6   s      r   
lookupTextzResolverBase.lookupText   rV   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   SPFr6   s      r   lookupSenderPolicyzResolverBase.lookupSenderPolicy   rV   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   RPr6   s      r   lookupResponsibilityz!ResolverBase.lookupResponsibility   r?   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   AFSDBr6   s      r   lookupAFSDatabasezResolverBase.lookupAFSDatabase   rI   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   AXFRr6   s      r   
lookupZonezResolverBase.lookupZone   r;   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   NAPTRr6   s      r   lookupNamingAuthorityPointerz)ResolverBase.lookupNamingAuthorityPointer   rI   r   c                     | j                  t        j                  |      t        j                  t        j                  |      S r   )r+   r   r4   r,   ALL_RECORDSr6   s      r   lookupAllRecordszResolverBase.lookupAllRecords   s*    ||C,,T2CFFCOOWUUr   c                     t        j                  |      }| j                  ||      }|j                  | j                  ||       |S r   )r   r4   r}   addCallback
_cbRecords)r   r'   r-   effortds        r   getHostByNamezResolverBase.getHostByName   s?    % !!$0	dootV4r   c                     |\  }}}t        | t        j                  |      ||z   |z   |      }|st        j                  |      |S r   )extractRecordr   Namer   DNSLookupError)r   recordsr'   r   ansauthaddresults           r   r   zResolverBase._cbRecords   sH    "dCtSXXd^S4Z#5EvN&&t,,r   r   )N
   )0__name__
__module____qualname____doc__r   r)   r   EFORMATr	   ESERVERr   ENAMEr
   ENOTIMPr   EREFUSEDr   r   r   r   r"   r$   r+   r7   r:   r>   rB   rE   rH   rL   rO   rR   rU   rY   r\   r_   rb   re   rh   rk   rn   rq   rt   rw   rz   r}   r   r   r   r   r   r   r   !   s     8D^^		<+*I L4
AIGLOMMMPMMMNNONNPPNNMPOPVr   r   c                 H   syt        t        d      r|D ]i  }|j                  k(  s|j                  t        j
                  k(  s1t        j                  t        j                  |j                  j                        c S  |D ]i  }|j                  k(  s|j                  t        j                  k(  s1t        j                  t        j                  |j                  j                        c S  |D ]i  }|j                  k(  s|j                  t        j                  k(  s1t        j                  t        j                  |j                  j                        c S  |D ]  }|j                  k(  s|j                  t        j                  k(  s1t        | |j                  j                  |dz
        }|s6| j                  |j                  j                  j                  dz
        c S |c S  |D ]  }|j                  t        j                   k7  r!ddlm} |j'                  |j                  j                  j                  j)                  d      t        j*                  fg      fd	}j-                  j                        j/                  |      c S  y)
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   )r   r   )clientascii)serversc                 >    | \  }}}t        ||z   |z   dz
        S )Nr   )r   )r   r   r   r   levelr'   
nsResolvers       r   
queryAgainz!extractRecord.<locals>.queryAgain   s-    &S$ T3:3CUQYOOr   )hasattrsocketr'   r%   r   r=   r   AF_INET6payloadaddressr9   r5   AF_INETrG   r   r   rD   twisted.namesr   ResolverdecodePORTr7   r   )	resolverr'   answersr   rr   r   r   r   s	    ` `    @r   r   r      s   4  v{# 	LAvv~!&&CFF"2''9J9JKK	L  	LAvv~!&&CHH"4''9J9JKK	L  G66T>affo##FNNAII4E4EFFG  66T>aff		1"8QYY^^WeaiPF--aiinn.A.A%RS)-TTM  K66SVV(__$$++G4chh? % 

	P ''		2>>zJJKr   r7   r:   r>   rE   rH   rY   rL   rO   rR   r\   r_   rU   re   rh   rB   rk   rn   rq   rt   rb   rz   rw   r}   )r   )3r   r   zope.interfacer   twisted.internetr   r   r   twisted.loggerr   r   r   twisted.names.errorr	   r
   r   r   r   r   range_ANS_AUTH_ADDEMPTY_RESULT	IResolverr   r   r5   r9   r=   rD   rG   rX   rK   rN   rQ   r[   r^   rT   rd   rg   rA   rj   rm   rp   rs   ra   ry   rv   r|   r   r   r   r   <module>r      s  

  & 5 5 !   !H eT Z!!"H H #HV?KDEE?HH! FF FF	
 II$ GG FFO FF FF HHl GG& GG_ II II" FF   GG\!" GG!#$ FF"II"GG_II-HHlOO'/r   