o
    .jU                     @  s  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
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 dd
lmZmZ ddlmZ ddlmZmZmZ ddl m!Z!m"Z" ddl#m$Z$ ddl%m&Z&m'Z'm(Z(m)Z) ej*rddl%m+Z+ G dd de,eZ-G dd de	dZ.G dd de.Z/G dd de0eZ1G dd dZ2dddd d!d"d#Z3d$e4d%< G d&d' d'e5Z6G d(d) d)Z7dS )*    )annotationsN)ABCMetaabstractmethod)deepcopy)datetime	timedeltatimezone)Enum)randint   )UDP_LINUX_GROUDP_LINUX_SEGMENT)_TYPE_SOCKET_OPTIONS_TYPE_TIMEOUT_INTERNAL)LocationParseError)_set_socket_options_with_attr_sockallowed_gai_family)CertificateErrormatch_hostname)_DEFAULT_TIMEOUT   )
inet4_ntoa
inet6_ntoaparse_https_rdata	read_name)HttpsRecordc                   @  s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )ProtocolResolverzx
    At urllib3.future we aim to propose a wide range of DNS-protocols.
    The most used techniques are available.
    systemdohdoqdotdouz	in-memorynullcustomN)__name__
__module____qualname____doc__SYSTEMDOHDOQDOTDOUMANUALNULLCUSTOM r1   r1   W/home/thesage/.local/lib/python3.10/site-packages/urllib3/contrib/resolver/protocols.pyr      s    r   c                   @  s   e Zd ZU ded< dZded< ded< 	dGdHddZdIddZedJddZedKddZ	dLddZ
dMd d!ZedNd"d#ZedLd$d%Ze	&	&dOd'd(dPd5d6Zeddejfd'dejd7dQdEdFZdS )RBaseResolverz!typing.ClassVar[ProtocolResolver]protocolNztyping.ClassVar[str | None]	specifierztyping.ClassVar[str]implementationserver
str | Noneport
int | Nonepatternsstrkwargs
typing.AnyreturnNonec                 O  sJ   || _ || _|| _t | _|| _| jsd|v r|d | _d| _d | _d S )Nr;   F)	_server_port_host_patterns	threadingLock_lock_kwargs_unsafe_expose_sock_cursor)selfr7   r9   r;   r=   r1   r1   r2   __init__=   s   


zBaseResolver.__init__c                 C  s   |   rtdt| jjjj}|d t| j	}| j
r"| j
|d< | jr*| j|d< d|v r;d|v r;| j| ji |S d|v rG| jdi |S |  S )Nz4Attempting to recycle a Resolver that was not closedrJ   r7   r9   r;   r=   r1   )is_availableRuntimeErrorlist	__class__rK   __code__co_varnamesremover   rG   rA   rB   rC   )rJ   args
kwargs_cpyr1   r1   r2   recycleR   s   



zBaseResolver.recyclec                 C     | j S N)rA   rJ   r1   r1   r2   r7   g      zBaseResolver.serverc                 C  rV   rW   )rB   rX   r1   r1   r2   r9   k   rY   zBaseResolver.portboolc                 C  
   t | jS rW   )rZ   rC   rX   r1   r1   r2   have_constraintso   s   
zBaseResolver.have_constraintshostnamestr | bytes | Nonebool | Nonec                 C  sd   | j sdS |du rd}t|tr|d}ztdtdd | j D i| W dS  ty1   Y dS w )	z
        Determine if given hostname is especially resolvable by given resolver.
        If this resolver does not have any constrained list of host, it returns None. Meaning
        it support any hostname for resolution.
        N	localhostasciisubjectAltNamec                 s  s    | ]}d |fV  qdS )DNSNr1   ).0er1   r1   r2   	<genexpr>   s    z'BaseResolver.support.<locals>.<genexpr>FT)rC   
isinstancebytesdecoder   tupler   )rJ   r]   r1   r1   r2   supportr   s   

zBaseResolver.supportc                 C     t )zsTerminate the given resolver instance. This should render it unusable. Further inquiries should raise an exception.NotImplementedErrorrX   r1   r1   r2   close      zBaseResolver.closec                 C  rl   )z,Determine if Resolver can receive inquiries.rm   rX   r1   r1   r2   rL      rp   zBaseResolver.is_availabler   Fquic_upgrade_via_dns_rrhostbytes | str | Nonestr | int | Nonefamilysocket.AddressFamilytypesocket.SocketKindprotointflagsrr   slist[tuple[socket.AddressFamily, socket.SocketKind, int, str | bytes, tuple[str, int] | tuple[str, int, int, int]]]c                C  rl   )zuThis method align itself on the standard library socket.getaddrinfo(). It must be implemented as-is on your Resolver.rm   )rJ   rs   r9   rv   rx   rz   r|   rr   r1   r1   r2   getaddrinfo   s   zBaseResolver.getaddrinfo)rr   timing_hookdefault_socket_familyaddresstuple[str, int]timeoutr   source_addresstuple[str, int] | Nonesocket_options_TYPE_SOCKET_OPTIONS | Nonesocket_kindr   Etyping.Callable[[tuple[timedelta, timedelta, datetime]], None] | Noner   socket.socketc                C  s(  |\}	}
|	 dr|	d}	d}t }|tjkr|}|dur0tt|d tjr-tj	}ntj
}z|	d W n tyG   td|	 ddw tjtjd}| j|	|
|||d	}tjtjd| }tjtjd}|D ]}|\}}}}}d}zt|||}|durz|tjtjd
 W n" ttfy   z|tjtjd
 W n ttfy   Y nw Y nw z|tjtjtdd
d W n ttfy   Y nw || |tjkrtj dkrz
|tj!t"d
 W n	 ty   Y nw z
|tj!t#d W n
 ty   Y nw t$|| |t%ur|&| | j'r|| _(|)| | j'r(d| _(d}tjtjd| }|durD|||tjtjdf t|t*rS|rSt+|d| |W   S  tt,fy } z|}|durm|-  t|t,rzW Y d}~ nW Y d}~qkd}~ww |durz|d}w td)a  Connect to *address* and return the socket object.

        Convenience function.  Connect to *address* (a 2-tuple ``(host,
        port)``) and return the socket object.  Passing the optional
        *timeout* parameter will set the timeout on the socket instance
        before attempting to connect.  If no *timeout* is supplied, the
        global default timeout setting returned by :func:`socket.getdefaulttimeout`
        is used.  If *source_address* is set it must be a tuple of (host, port)
        for the socket to bind as a source address before making the connection.
        An host of '' or port 0 tells the OS to use the default.
        [z[]Nr   idna'z', label empty or too long)tzrq   r   iilinuxi   _ech_configz!getaddrinfo returns an empty list).
startswithstripr   socket	AF_UNSPECrg   	ipaddress
ip_addressIPv4AddressAF_INETAF_INET6encodeUnicodeErrorr   r   nowr   utcr~   r   
setsockopt
SOL_SOCKETSO_REUSEPORTOSErrorAttributeErrorSO_REUSEADDR	SO_LINGERstructpackbind
SOCK_DGRAMsysplatformSOL_UDPr   r   r   r   
settimeoutrH   rI   connectrh   setattrOverflowErrorro   )rJ   r   r   r   r   r   rr   r   r   rs   r9   errrv   dt_pre_resolverecordsdelta_post_resolvedt_pre_establishedresafsocktyperz   	canonnamesasockdelta_post_established_r1   r1   r2   create_connection   s   














zBaseResolver.create_connectionrW   )
r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   r?   r3   )r?   r8   )r?   r:   r?   rZ   )r]   r^   r?   r_   r?   r@   r   r   rs   rt   r9   ru   rv   rw   rx   ry   rz   r{   r|   r{   rr   rZ   r?   r}   )r   r   r   r   r   r   r   r   r   ry   rr   rZ   r   r   r   rw   r?   r   )r%   r&   r'   __annotations__r5   rK   rU   propertyr7   r9   r\   rk   r   ro   rL   r~   r   r   SOCK_STREAMr   r   r1   r1   r1   r2   r3   7   s@   
 


	r3   )	metaclassc                      sd   e Zd ZdZd% fddZd&dd	Zd'd
dZd(ddZ	d)d*ddZ		d+ddd,d#d$Z	  Z
S )-ManyResolverzx
    Special resolver that use many child resolver. Priorities
    are based on given order (list of BaseResolver).
    	resolversr3   r?   r@   c                   sH   t  d d  t|| _dd |D | _dd |D | _d| _d| _d S )Nc                 S  s   g | ]}|  s|qS r1   r\   rd   r   r1   r1   r2   
<listcomp>S  
    z)ManyResolver.__init__.<locals>.<listcomp>c                 S  s   g | ]}|  r|qS r1   r   r   r1   r1   r2   r   V  r   r   F)superrK   len_size_unconstrained_constrained_concurrent_terminated)rJ   r   rO   r1   r2   rK   N  s   

zManyResolver.__init__c                 C  s,   g }| j | j D ]	}||  qt| S rW   )r   r   appendrU   r   )rJ   r   resolverr1   r1   r2   rU   ]  s   zManyResolver.recyclec                 C  s$   | j | j D ]}|  qd| _d S )NT)r   r   ro   r   )rJ   r   r1   r1   r2   ro   e  s   

zManyResolver.closerZ   c                 C  s   | j  S rW   )r   rX   r1   r1   r2   rL   k  s   zManyResolver.is_availableFconstrained*typing.Generator[BaseResolver, None, None]c                 c  s   |s| j n| j}|sd S | j |  jd7  _W d    n1 s"w   Y  zt|}| jd | }t||D ](}||  s[| j ||  ||< W d    n1 sVw   Y  || V  q8|dkrtd|D ](}||  s| j ||  ||< W d    n1 sw   Y  || V  qjW | j |  jd8  _W d    d S 1 sw   Y  d S | j |  jd8  _W d    w 1 sw   Y  w )Nr   r   )r   r   rF   r   r   rangerL   rU   )rJ   r   r   resolver_count	start_idxidxr1   r1   r2   __resolversn  s:   *zManyResolver.__resolversr   rq   rs   rt   r9   ru   rv   rw   rx   ry   rz   r{   r|   rr   r}   c                C  s  t |tr
|d}|d u rd}g }d}	| dD ]V}
|
|}|du rfd}	z|
j|||||||d}|r:|W   S W q tjye } zt |jd t	r[d|jd v sZd|jd v r[ W Y d }~qd }~ww |du ro|
|
 q|	rtd	| d
| jt| j  d|  D ]A}
z|
j|||||||d}|r|W   S W q tjy } zt |jd t	rd|jd v sd|jd v r W Y d }~qd }~ww td	| d
| jt| j  d)Nra   r`   FTrq   r   DNSSECDNSKEYzName or service not known: z using z resolver(s))rg   rh   ri   _ManyResolver__resolversrk   r~   r   gaierrorrS   r<   r   r   r   r   r   )rJ   rs   r9   rv   rx   rz   r|   rr   tested_resolversany_constrained_triedr   can_resolveresultsexcr1   r1   r2   r~     sz   







zManyResolver.getaddrinfo)r   r3   r?   r@   r   r   r   )F)r   rZ   r?   r   r   r   )r%   r&   r'   r(   rK   rU   ro   rL   r   r~   __classcell__r1   r1   r   r2   r   H  s    


%	r   c                   @  s   e Zd ZdZdZdZdZdS )SupportedQueryTypez
    urllib3.future does not need anything else so far. let's be pragmatic.
    Each type is associated with its hex value as per the RFC.
    r      A   N)r%   r&   r'   r(   AAAAAHTTPSr1   r1   r1   r2   r     s
    r   c                   @  s\   e Zd ZdZ	ddddZedddZedddZdddZdddZ	e
d ddZdS )!DomainNameServerQueryz
    Minimalist DNS query/message to ask for A, AAAA and HTTPS records.
    Only meant for urllib3.future use. Does not cover all of possible extent of use.
    Nrs   r<   
query_typer   override_idr:   r?   r@   c                 C  sR   t d|d u rtddn|| _|| _|| _t dd| _t dd| _d | _d S )N!Hr   i     r   )	r   r   r
   _id_host_query_flags	_qd_count_cached)rJ   rs   r   r   r1   r1   r2   rK     s   
zDomainNameServerQuery.__init__r{   c                 C  s   t d| jd S )Nr   r   )r   unpackr   rX   r1   r1   r2   id  s   zDomainNameServerQuery.idrh   c                 C  rV   rW   r   rX   r1   r1   r2   raw_id  rY   zDomainNameServerQuery.raw_idc                 C  s   d| j  d| jj dS )Nz<Query 'z' IN >)r   r   namerX   r1   r1   r2   __repr__
  s   zDomainNameServerQuery.__repr__c                 C  s   | j r| j S d}|| j7 }|| j7 }|| j7 }|d7 }|d7 }|d7 }| jdD ]}|tdt|7 }||	d7 }q)|d7 }|td| j
j7 }|tdd7 }|| _ |S )	N    s     .z!Bra       r   r   )r   r   r   r   r   splitr   r   r   r   r   value)rJ   payloadextr1   r1   r2   	__bytes__  s"   


zDomainNameServerQuery.__bytes__typeslist[DomainNameServerQuery]c                 G  s$   g }|D ]}| t| |d q|S )N)r   )r   r   )rs   r	  queriesr   r1   r1   r2   bulk&  s   zDomainNameServerQuery.bulkrW   )rs   r<   r   r   r   r:   r?   r@   r?   r{   )r?   rh   r?   r<   )rs   r<   r	  r   r?   r
  )r%   r&   r'   r(   rK   r   r   r   r   r  staticmethodr  r1   r1   r1   r2   r     s    

r   zNo ErrorzFormat ErrorzServer FailurezNon-Existent DomainzQuery RefusedzNot Authorized)r   r      r      	   zdict[int, str]COMMON_RCODE_LABELc                   @  s   e Zd ZdS )DomainNameServerParseExceptionN)r%   r&   r'   r1   r1   r1   r2   r  ;  s    r  c                   @  sx   e Zd ZdZdddZedd	d
ZedddZedddZedddZ	edddZ
edddZdddZdS ) DomainNameServerReturnz
    Minimalist DNS response parser. Allow to quickly extract key-data out of it.
    Meant for A, AAAA and HTTPS records. Basically only what we need.
    r  rh   r?   r@   c                 C  s  zt d|d d }|d | _|d | _|d | _|d | _|d d@ | _t|d\| _}g | _	| jr|d7 }|t
|k rt||\}}t d	|||d
  \}}}t d||d
 |d  d }||d |d |  }	|d| 7 }zt|}
W n	 ty   Y q8w |
tjkrt|	}n|
tjkrt|	}n|
tjkr|	sq8t|	}nq8| j	|
||f |t
|k s>W d S W d S W d S  t jtttfy } z
tdt| |d }~ww )Nz!HHHHHH   r   r   r  r         z!HHI   r   
   zBA protocol error occurred while parsing the DNS response payload: )r   r   r   r   r   	_an_count_rcoder   	_hostname_recordsr   r   
ValueErrorr   r   r   r   r   r   r   error
IndexErrorUnicodeDecodeErrorr  r<   )rJ   r  upr   r   rr_typerr_classrr_ttl
entry_sizedatar   decoded_datare   r1   r1   r2   rK   D  s^   




 





"zDomainNameServerReturn.__init__r{   c                 C  rV   rW   r   rX   r1   r1   r2   r     rY   zDomainNameServerReturn.idr<   c                 C  rV   rW   )r  rX   r1   r1   r2   r]     rY   zDomainNameServerReturn.hostname7list[tuple[SupportedQueryType, int, str | HttpsRecord]]c                 C  rV   rW   )r  rX   r1   r1   r2   r     rY   zDomainNameServerReturn.recordsrZ   c                 C  r[   rW   )rZ   r  rX   r1   r1   r2   is_found     
zDomainNameServerReturn.is_foundc                 C  rV   rW   r  rX   r1   r1   r2   rcode  rY   zDomainNameServerReturn.rcodec                 C  s
   | j dkS )Nr   r-  rX   r1   r1   r2   is_ok  r,  zDomainNameServerReturn.is_okc                 C  sR   | j rd| j d| j dS d| j d| j d| jtv r$t| j  dS d dS )	Nz
<Records 'z' r   z<DNS Error 'z' with Status z (Unknownz)>)r/  r]   r  r.  r  rX   r1   r1   r2   r     s   6zDomainNameServerReturn.__repr__N)r  rh   r?   r@   r  r  )r?   r*  r   )r%   r&   r'   r(   rK   r   r   r]   r   r+  r.  r/  r   r1   r1   r1   r2   r  >  s     
<r  )8
__future__r   r   r   r   r   rD   typingabcr   r   copyr   r   r   r   enumr	   randomr
   	_constantr   r   _typingr   r   
exceptionsr   util.connectionr   r   r   util.ssl_match_hostnamer   r   util.timeoutr   utilsr   r   r   r   TYPE_CHECKINGr   r<   r   r3   r   r{   r   r   r  r   	Exceptionr  r  r1   r1   r1   r2   <module>   sL       C
