
    \d$                     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j                   G d
 d                      Zd%dZi ej        dej        dej        dej        dej        dej         dej!        dej"        dej#        dej$        dej%        dej&        dej'        dej(        dej)        dej*        dej+        dej,        dej-        d ej.        d!ej/        d"ej0        d#ej1        d$iZ2dS )&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            
       T   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/dS )#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                                           D ]\  }}t          | |          | j         |<   d S N)typeToMethoditemsgetattr)selfkvs      4lib/python3.11/site-packages/twisted/names/common.py__init__zResolverBase.__init__7   sM    "((** 	4 	4FQ#*4#3#3Da  	4 	4    c                 B    | 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
          $ rU | 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&uz2F &vuzHHH  	 	 	IOOL     &ejosvuz7    	s   4 ABBc                 D    t          j        t          d                    S )NzResolverBase._lookup)r   failNotImplementedError)r   r'   clsr%   r-   s        r   r+   zResolverBase._lookupS   s    z-.DEEFFFr   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   domainStringr,   Ar   r'   r-   s      r   lookupAddresszResolverBase.lookupAddressV   s)    ||C,T22CFCE7KKKr   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   AAAAr6   s      r   lookupIPV6AddresszResolverBase.lookupIPV6AddressY   )    ||C,T22CFCHgNNNr   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   A6r6   s      r   lookupAddress6zResolverBase.lookupAddress6\   )    ||C,T22CFCFGLLLr   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   MXr6   s      r   lookupMailExchangezResolverBase.lookupMailExchange_   r?   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   NSr6   s      r   lookupNameserverszResolverBase.lookupNameserversb   r?   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   CNAMEr6   s      r   lookupCanonicalNamez ResolverBase.lookupCanonicalNamee   )    ||C,T22CFCIwOOOr   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   MBr6   s      r   lookupMailBoxzResolverBase.lookupMailBoxh   r?   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   MGr6   s      r   lookupMailGroupzResolverBase.lookupMailGroupk   r?   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   MRr6   s      r   lookupMailRenamezResolverBase.lookupMailRenamen   r?   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   PTRr6   s      r   lookupPointerzResolverBase.lookupPointerq   )    ||C,T22CFCGWMMMr   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   SOAr6   s      r   lookupAuthorityzResolverBase.lookupAuthorityt   rV   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   NULLr6   s      r   
lookupNullzResolverBase.lookupNullw   r;   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   WKSr6   s      r   lookupWellKnownServicesz$ResolverBase.lookupWellKnownServicesz   rV   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   SRVr6   s      r   lookupServicezResolverBase.lookupService}   rV   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   HINFOr6   s      r   lookupHostInfozResolverBase.lookupHostInfo   rI   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   MINFOr6   s      r   lookupMailboxInfozResolverBase.lookupMailboxInfo   rI   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   TXTr6   s      r   
lookupTextzResolverBase.lookupText   rV   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   SPFr6   s      r   lookupSenderPolicyzResolverBase.lookupSenderPolicy   rV   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   RPr6   s      r   lookupResponsibilityz!ResolverBase.lookupResponsibility   r?   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   AFSDBr6   s      r   lookupAFSDatabasezResolverBase.lookupAFSDatabase   rI   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   AXFRr6   s      r   
lookupZonezResolverBase.lookupZone   r;   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   NAPTRr6   s      r   lookupNamingAuthorityPointerz)ResolverBase.lookupNamingAuthorityPointer   rI   r   c                 ~    |                      t          j        |          t          j        t          j        |          S r   )r+   r   r4   r,   ALL_RECORDSr6   s      r   lookupAllRecordszResolverBase.lookupAllRecords   s)    ||C,T22CFCOWUUUr   
   c                     t          j        |          }|                     ||          }|                    | j        ||           |S r   )r   r4   r}   addCallback
_cbRecords)r   r'   r-   effortds        r   getHostByNamezResolverBase.getHostByName   sF    %% !!$00	dotV44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   sP    "dCtSXd^^S4Z#5EvNN 	-&t,,,r   r   )Nr~   )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         688D^^	<+*I L4 4 4
A A AI I I IG G GL L L LO O O OM M M MM M M MM M M MP P P PM M M MM M M MM M M MN N N NN N N NO O O ON N N NN N N NP P P PP P P PN N N NN N N NM M M MP P P PO O O OP P P PV V V V       r   r   r~   c                 >   sdS t          t          d          r|D ]M}|j        k    r@|j        t          j        k    r+t          j        t          j        |j        j	                  c S N|D ]M}|j        k    r@|j        t          j
        k    r+t          j        t          j        |j        j	                  c S N|D ]M}|j        k    r@|j        t          j        k    r+t          j        t          j        |j        j	                  c S N|D ]r}|j        k    re|j        t          j        k    rPt          | |j        j        |dz
            }|s+|                     |j        j        j        dz
            c S |c S s|D ]}|j        t          j        k    rddlm} |                    |j        j        j                            d          t          j        fg          fd	}                    j                                      |          c S dS )
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                 F    | \  }}}t          ||z   |z   dz
            S )Nr   )r   )r   r   r   r   levelr'   
nsResolvers       r   
queryAgainz!extractRecord.<locals>.queryAgain   s0    &S$ T3:3CUQYO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  t v{## L 	L 	LAv~~!&CF"2"2'9JKKKKK 	L 	LAv~~!&CH"4"4'9JKKKKK G G6T>>afoo#FNAI4EFFFFF  6T>>af	11"8QY^WeaiPPF U--ain.A%RS)-TTTTTMMM  K K6SV((((((__$++G44ch? % 
 

	P 	P 	P 	P 	P 	P 	P ''	22>>zJJJJJK 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      sx  
 
  & & & & & & 5 5 5 5 5 5 5 5 5 5 ! ! ! ! ! !                      E!HH eT Z!""H H H H H H H #"HV?K ?K ?K ?KDE?H! F F	
 I$ G FO F F Hl G& G_ I I" F   G\!" G!#$ F"I"G_I-HlO'/ r   