Ë
    ojŽ$  ã                   ó  — 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=   € ØˆÔÜ ×&Ñ&Ó(ò 	4‰DˆAˆqÜ#*¨4°Ó#3ˆD×Ñ˜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Ø×&Ñ& u§z¡zÑ2ˆFô ×&Ñ& v¨u¯z©z¯©ÀÓHÐHøô ò 	Ø�I‰I�O‰OØLØð ô ô ×&Ñ&Ø—‘˜eŸj™jŸo™o¬s¯v©v°u·z±zÀ7óò ð	ú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   € Ü�z‰zÔ-Ð.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Ó2´C·F±F¼C¿E¹EÀ7ÓKÐKr   c                 óˆ   — | j                  t        j                  |«      t        j                  t        j                  |«      S r   )r+   r   r4   r,   ÚAAAAr6   s      r   ÚlookupIPV6AddresszResolverBase.lookupIPV6AddressY   ó*   € Ø�|‰|œC×,Ñ,¨TÓ2´C·F±F¼C¿H¹HÀgÓNÐNr   c                 óˆ   — | j                  t        j                  |«      t        j                  t        j                  |«      S r   )r+   r   r4   r,   ÚA6r6   s      r   ÚlookupAddress6zResolverBase.lookupAddress6\   ó*   € Ø�|‰|œC×,Ñ,¨TÓ2´C·F±F¼C¿F¹FÀGÓ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Ó2´C·F±F¼C¿I¹IÀwÓ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Ó2´C·F±F¼C¿G¹GÀWÓ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Ó2´C·F±F¼C¿O¹OÈWÓ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ˆØ	�‰�d—o‘o t¨VÔ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   € Ø"Ñˆˆd�CÜ˜t¤S§X¡X¨d£^°S¸4±ZÀ#Ñ5EÀvÓ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ø   „ ññ ‹8€Dà�‰�^Ø�‰�^Ø�	‰	�<Ø�‰Ð+Ø�‰Ð*ð€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�$˜Ü  ¨T°3¸±:ÀÑ3CÀUÈQÁYÓ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Ø�v‰v˜‹~ !§&¡&¬C¯F©FÓ"2Ü×'Ñ'¬¯©¸¿¹×9JÑ9JÓKÒKð	Lð ò 	LˆAØ�v‰v˜‹~ !§&¡&¬C¯H©HÓ"4Ü×'Ñ'¬¯©¸¿¹×9JÑ9JÓKÒKð	Lð ò GˆØ�6‰6�T‹>˜aŸf™f¬¯©›oÜ×#Ñ#¤F§N¡N°A·I±I×4EÑ4EÓFÒFðGð ò ˆØ�6‰6�T‹>˜aŸf™f¬¯	©	Ó1Ü" 8¨Q¯Y©Y¯^©^¸WÀeÈaÁiÓPˆFÙØ×-Ñ-¨a¯i©i¯n©n×.AÑ.AÈ%ÐRSÉ)Ð-ÓTÒTØŠMðð ò KˆØ�6‰6”S—V‘VÒØÝ(à—_‘_à—‘—‘×$Ñ$×+Ñ+¨GÓ4´c·h±hÐ?ðð %ó 
ˆ
ö	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Ñ €€eˆTà€ñ ˆZ×!Ñ!Ó"÷Hð Hó #ðHóV?KðDØ‡E�Eˆ?ðà‡H�HÐ!ðð ‡F�FÐðð ‡F�FÐð	ð
 ‡I�IÐ$ðð ‡G�GÐðð ‡F�FˆOðð ‡F�FÐðð ‡F�FÐðð ‡H�Hˆlðð ‡G�GÐ&ðð ‡G�Gˆ_ðð ‡I�IÐðð ‡I�IÐ"ðð ‡F�FÐ ðð  ‡G�Gˆ\ð!ð" ‡G�GÐ!ð#ð$ ‡F�FÐ"Ø‡I�IÐ"Ø‡G�Gˆ_Ø‡I�IÐ-Ø‡H�HˆlØ‡O�OÐ'ñ/�r   