o
    b$                     @   sP  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 dZd&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j0d$ej1d%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                
   @   sV  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d Zdd Zd>ddZd	d
 Zd>ddZd>ddZd>ddZd>ddZd>ddZd>ddZd>ddZd>ddZd>ddZd>ddZ d>dd Z!d>d!d"Z"d>d#d$Z#d>d%d&Z$d>d'd(Z%d>d)d*Z&d>d+d,Z'd>d-d.Z(d>d/d0Z)d>d1d2Z*d>d3d4Z+d>d5d6Z,d>d7d8Z-d?d:d;Z.d<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                 C   s,   i | _ t  D ]\}}t| || j |< qd S N)typeToMethoditemsgetattr)selfkvr   r   6/usr/lib/python3/dist-packages/twisted/names/common.py__init__7   s   zResolverBase.__init__c                 C   s   | 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   responseCoder   r   r   exceptionForCode<   s   zResolverBase.exceptionForCodec              
   C   sb   z| j |j }W n ty'   | jjd|d t| j|jjt	j
|j| Y S w t||jj|S )Nz:Query of unknown type {query.type} for {query.name.name!r})query)r   typeKeyError_logdebugr   maybeDeferred_lookupnamer   IN)r   r   timeoutmethodr   r   r   r   E   s   	zResolverBase.queryc                 C   s   t tdS )NResolverBase._lookup)r   failNotImplementedError)r   r%   clsr   r'   r   r   r   r$   S   s   r)   c                 C      |  t|tjtj|S r   )r$   r   domainStringr&   Ar   r%   r'   r   r   r   lookupAddressV      zResolverBase.lookupAddressc                 C   r-   r   )r$   r   r.   r&   AAAAr0   r   r   r   lookupIPV6AddressY   r2   zResolverBase.lookupIPV6Addressc                 C   r-   r   )r$   r   r.   r&   A6r0   r   r   r   lookupAddress6\   r2   zResolverBase.lookupAddress6c                 C   r-   r   )r$   r   r.   r&   MXr0   r   r   r   lookupMailExchange_   r2   zResolverBase.lookupMailExchangec                 C   r-   r   )r$   r   r.   r&   NSr0   r   r   r   lookupNameserversb   r2   zResolverBase.lookupNameserversc                 C   r-   r   )r$   r   r.   r&   CNAMEr0   r   r   r   lookupCanonicalNamee   r2   z ResolverBase.lookupCanonicalNamec                 C   r-   r   )r$   r   r.   r&   MBr0   r   r   r   lookupMailBoxh   r2   zResolverBase.lookupMailBoxc                 C   r-   r   )r$   r   r.   r&   MGr0   r   r   r   lookupMailGroupk   r2   zResolverBase.lookupMailGroupc                 C   r-   r   )r$   r   r.   r&   MRr0   r   r   r   lookupMailRenamen   r2   zResolverBase.lookupMailRenamec                 C   r-   r   )r$   r   r.   r&   PTRr0   r   r   r   lookupPointerq   r2   zResolverBase.lookupPointerc                 C   r-   r   )r$   r   r.   r&   SOAr0   r   r   r   lookupAuthorityt   r2   zResolverBase.lookupAuthorityc                 C   r-   r   )r$   r   r.   r&   NULLr0   r   r   r   
lookupNullw   r2   zResolverBase.lookupNullc                 C   r-   r   )r$   r   r.   r&   WKSr0   r   r   r   lookupWellKnownServicesz   r2   z$ResolverBase.lookupWellKnownServicesc                 C   r-   r   )r$   r   r.   r&   SRVr0   r   r   r   lookupService}   r2   zResolverBase.lookupServicec                 C   r-   r   )r$   r   r.   r&   HINFOr0   r   r   r   lookupHostInfo   r2   zResolverBase.lookupHostInfoc                 C   r-   r   )r$   r   r.   r&   MINFOr0   r   r   r   lookupMailboxInfo   r2   zResolverBase.lookupMailboxInfoc                 C   r-   r   )r$   r   r.   r&   TXTr0   r   r   r   
lookupText   r2   zResolverBase.lookupTextc                 C   r-   r   )r$   r   r.   r&   SPFr0   r   r   r   lookupSenderPolicy   r2   zResolverBase.lookupSenderPolicyc                 C   r-   r   )r$   r   r.   r&   RPr0   r   r   r   lookupResponsibility   r2   z!ResolverBase.lookupResponsibilityc                 C   r-   r   )r$   r   r.   r&   AFSDBr0   r   r   r   lookupAFSDatabase   r2   zResolverBase.lookupAFSDatabasec                 C   r-   r   )r$   r   r.   r&   AXFRr0   r   r   r   
lookupZone   r2   zResolverBase.lookupZonec                 C   r-   r   )r$   r   r.   r&   NAPTRr0   r   r   r   lookupNamingAuthorityPointer   r2   z)ResolverBase.lookupNamingAuthorityPointerc                 C   r-   r   )r$   r   r.   r&   ALL_RECORDSr0   r   r   r   lookupAllRecords   r2   zResolverBase.lookupAllRecords
   c                 C   s*   t |}| ||}|| j|| |S r   )r   r.   r^   addCallback
_cbRecords)r   r%   r'   effortdr   r   r   getHostByName   s   
zResolverBase.getHostByNamec                 C   s8   |\}}}t | t||| | |}|st||S r   )extractRecordr   Namer   DNSLookupError)r   recordsr%   rb   ansauthaddresultr   r   r   ra      s
   

zResolverBase._cbRecordsr   )Nr_   )0__name__
__module____qualname____doc__r   r!   r   EFORMATr   ESERVERr   ENAMEr	   ENOTIMPr
   EREFUSEDr   r   r   r   r   r   r$   r1   r4   r6   r8   r:   r<   r>   r@   rB   rD   rF   rH   rJ   rL   rN   rP   rR   rT   rV   rX   rZ   r\   r^   rd   ra   r   r   r   r   r   !   sN    	
	























	r   r_   c                    s~   sdS t tdr?|D ]}|jkr#|jtjkr#ttj|jj	  S q|D ]}|jkr>|jtj
kr>ttj|jj	  S q&|D ]}|jkrY|jtjkrYttj|jj	  S qA|D ],}|jkr|jtjkrt| |jj| d }|s| j|jjj d d  S |  S q\|D ]1}|jtjkrqddlm} |j|jjjdtjfgd fd	d
}j|  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   )rb   r   )clientascii)serversc                    s$   | \}}}t || |  d S )Nrw   )re   )rh   ri   rj   rk   levelr%   
nsResolverr   r   
queryAgain   s   
z!extractRecord.<locals>.queryAgain)hasattrsocketr%   r   r   r5   rv   AF_INET6payloadaddressr3   r/   AF_INETr;   re   rd   r9   twisted.namesrx   ResolverdecodePORTr1   r`   )resolverr%   answersr|   rrl   rx   r~   r   r{   r   re      sB   
re   r1   r4   r6   r:   r<   rF   r>   r@   rB   rH   rJ   rD   rN   rP   r8   rR   rT   rV   rX   rL   r\   rZ   r^   )r_   )3rp   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   re   r/   r3   r5   r9   r;   rE   r=   r?   rA   rG   rI   rC   rM   rO   r7   rQ   rS   rU   rW   rK   r[   rY   r]   r   r   r   r   r   <module>   sn     
B	

