o
    .jW                     @  sB  d dl mZ d dlZd dlZddlmZ d dlmZ d dl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 d
dlmZmZ d
dlmZ ddlmZmZmZmZmZm Z  ddl!m"Z" ddl#m$Z$m%Z%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ ej0Z0ere1dG dd de"Z2G dd de2Z3G dd de2Z4dS )    )annotationsN   )ssl)deque)time)QuicConfiguration)QuicConnection)ConnectionTerminatedHandshakeCompleted	QuicEventStopSendingReceivedStreamDataReceivedStreamReset   )IS_FIPSresolve_cert_reqs)
SubTimeout) GenericSegmentOffloadUnsupported_sock_has_gro_sock_has_gsosync_recv_grosync_send_dgramsync_sendmsg_gso   )PlainResolver)COMMON_RCODE_LABELDomainNameServerQueryDomainNameServerReturnProtocolResolverSupportedQueryType)is_ipv4is_ipv6rfc1035_packrfc1035_should_readrfc1035_unpackvalidate_length_ofzJDNS-over-QUIC disabled when Python is built with FIPS-compliant ssl modulec                      sj   e Zd ZejZdZ	d/d0 fd
dZd1ddZd2ddZ			d3ddd4d"d#Z
ddd$d%d5d-d.Z  ZS )6QUICResolverqh3Nserverstrport
int | Nonepatternskwargs
typing.Anyc              
     sD  t  j||pdg|R i | d|vrcd|vrcg |d< ttj}z1|  |jddD ]}t|ts6J |d 	t
| q-|d rOd|d |d< n|d= W n tttfyb   |d= Y nw d|vr}d|vr}d|vsxt|d tjkr}tdtdd	gd
|vr| jn|d
 d|v rt|d ntjd|v r|d  nd d|v r|d nd dd}d|v r||d d|v r|d nd d|v r|d nd  nd|v r||d d|v r|d nd d|v r|d nd  t|d| _t| j| _t| j| _| j| j| jft  | j t!dd d| _"d| _#d| _$t% | _&t% | _'d S )NiU  ca_cert_dataca_certsT)binary_form 	cert_reqszDoQ requires at least one CA loaded in order to verify the remote peer certificate. Add ?cert_reqs=0 to disable certificate checks.doqserver_hostnameg     r@)	is_clientalpn_protocolsserver_nameverify_modecadatacafileidle_timeout	cert_filekey_filekey_password	cert_datakey_data)configurationF)receive_first)(super__init__r   
SSLContextPROTOCOL_TLS_CLIENTload_default_certsget_ca_certs
isinstancebytesappendDER_cert_to_PEM_certjoinAttributeError
ValueErrorOSErrorr   CERT_REQUIREDSSLErrorr   _serverencodeload_cert_chainr   _quicr   _socket_dgram_gro_enabledr   _dgram_gso_enabledconnect_port	monotonic_QUICResolver__exchange_untilr
   _terminated_should_disconnect_rfc1035_prefix_mandatedr   _unconsumed_pending)selfr(   r*   r,   r-   ctxderrB   	__class__ V/home/thesage/.local/lib/python3.10/site-packages/urllib3/contrib/resolver/doq/_qh3.pyrE   =   sv    
zQUICResolver.__init__returnNonec              	   C  s   | j so| j_ | j  	 | jt }|sn>| jrGt|dkrGzt| j	dd |D  W n& t
yF   d| _|D ]
}t| j	|d  q9Y nw |D ]
}t| j	|d  qIq| j	  d| _ W d    d S 1 shw   Y  d S d S )NT   c                 S     g | ]}|d  qS r   ri   .0dri   ri   rj   
<listcomp>       z&QUICResolver.close.<locals>.<listcomp>Fr   )r_   _lockrW   closedatagrams_to_sendr]   rZ   lenr   rX   r   r   )rd   	datagramsdatagramri   ri   rj   rv      s.   

"zQUICResolver.closeboolc                 C  s4   | j t  t| j dr| j jd urd| _| j S )N_close_eventT)rW   handle_timerr]   hasattrr|   r_   )rd   ri   ri   rj   is_available   s   zQUICResolver.is_availabler   F)quic_upgrade_via_dns_rrhostbytes | str | Nonestr | int | Nonefamilysocket.AddressFamilytypesocket.SocketKindprotointflagsr   slist[tuple[socket.AddressFamily, socket.SocketKind, int, str | bytes, tuple[str, int] | tuple[str, int, int, int]]]c          "        s  |d u r	t d|d u rd}t|trt|}|dk r!t dt|tr+|d}t|rD|t jkr9t dt j	|dd||ffgS t
|r_|t j	krRt dt j|dd||ddffgS t| d	}d |rp|t jkrpd	}g }	|t jt j	fv r|	tj |t jt jfv r|	tj |	tj tj|g|	R  }
g }| jz |
D ]o}t|}| j| | jd
u rt|}| j }| j||d
 || | jt }| jrt|dkrzt | j!dd |D  W q t"y   d	| _|D ]
}t#| j!|d  qY qw |D ]}t#| j!|d  qqW d    n	1 s w   Y  g }t|t|	k r/| j | j$rtd  |
D ]}| j$D ]}|j%|j%krS| |   nqA rZ nq< rt| j$&  | j&| 	 W d    q'z7| j't(d
t(fd	d}d)dd |D }t*|r|+| j't(d
t(fd	d d)dd |D }t*|sW n t,t-t j.t/fy } zt d|d }~ww |s	 W d    q't0|}|D ]?}t1| t2 fdd|
D r|  d }| jD ]}|j% j%kr|} nq|d ur| j&| q| j$  qW d    n	1 s!w   Y  t|t|	k s0| j3rQ| j | 4  d	| _3d
| _5W d    n	1 sLw   Y  g }|D ]}|j6s|j7dkrmt d| d| dt d|j7t8v r~t8|j7  d|j7  |j9D ]p}|d tjkrt|d t:sJ |d d r|d d d|d d v r|rd
}qt|d t:rJ |d tjkrt j	nt j}|t j	kr|d |fn|d |ddf}||||t j;krdndd|f qqUg }|r)d	} |D ]}!|!d t j;kr!||!d t jdd|!d f qd
}  | r)g }d ur@fd d|D }fd!d|D }|sO|sOt d"| d#t<|| d$d% d
d&S )'Nz3Tried to resolve 'localhost' using the QUICResolverr   z&Servname not supported for ai_socktypeasciiz)Address family for hostname not supported   r2      FTrm   c                 S  rn   ro   ri   rp   ri   ri   rj   rs     rt   z,QUICResolver.getaddrinfo.<locals>.<listcomp>rC   event_type_collectablerespect_end_stream_signal    c                 S     g | ]}|j qS ri   datarq   eri   ri   rj   rs   C      c                 S  r   ri   r   r   ri   ri   rj   rs   N  r   z?Got unexpectedly disconnected while waiting for name resolutionc                 3  s    | ]	} j |j kV  qd S N)id)rq   _)dns_respri   rj   	<genexpr>]  s    z+QUICResolver.getaddrinfo.<locals>.<genexpr>r   z5DNSSEC validation failure. Check http://dnsviz.net/d/z5/dnssec/ and http://dnssec-debugger.verisignlabs.com/z for errorszDNS returned an error: zcode 	echconfigh3alpnr   c                   *   g | ]}|d  |d |d  |d fqS r   rm   r   r   ri   rq   rech_config_listri   rj   rs     s   * c                   r   r   ri   r   r   ri   rj   rs     s    zName or service not known: ''c                 S  s   | d | d  S )Nr   rm   ri   )r   ri   ri   rj   <lambda>  s    z*QUICResolver.getaddrinfo.<locals>.<lambda>)keyreverse)=socketgaierrorrJ   r)   r   rK   decoder    AF_INET6AF_INETr!   r%   
SOCK_DGRAM	AF_UNSPECrL   r   AAAAAHTTPSr   bulkru   rc   ra   r"   rW   get_next_available_stream_idsend_stream_datarw   r]   rZ   rx   r   rX   r   r   rb   r   remover^   r   rN   r#   extendTimeoutErrorrQ   timeoutConnectionErrorr$   r   anyr`   rv   r_   is_okrcoder   recordsdictSOCK_STREAMsorted)"rd   r   r*   r   r   r   r   r   remote_preemptive_quic_rrtbqqueriesopen_streamsqpayload	stream_idry   dg	responsesquery
unconsumedeventsr   	fragmentsfragment	query_tbr	pending_qresultsresponserecord	inet_typedst_addrquic_resultsany_specifiedresultri   )r   r   rj   getaddrinfo   s  












-


A


0


zQUICResolver.getaddrinfoTr   
event_type-type[QuicEvent] | tuple[type[QuicEvent], ...]rC   r   4type[QuicEvent] | tuple[type[QuicEvent], ...] | Noner   list[QuicEvent]c                  s  j jj j}d fdd}	 |du rct }	 |}|s'n< rVt|dkrVztdd	 |D  W n& tyU   d _ |D ]	}	t	|	d
  qIY nw |D ]	}	t	|	d
  qXqg }
	 j
st |}| |r}td}nd}W d    n1 sw   Y  |jrqe|s	 |
S t }t|tr|D ]}|jjf| qn|jjf| 	 t }|}|sn< rt|dkrztdd	 |D  W n& ty   d _ |D ]	}	t	|	d
  qY nw |D ]	}	t	|	d
  qqtjd D ]u}t|tr,|jdkrtdtd|j d|j dt|tr:d_tdt|trEd_ q|rTt||rS|
!| n|
!| t||r|sf|
  S t"|drt|j#rt|
  S t"|ddu r|
  S qqf)Nrk   rl   c                    s   t  } |  	 | }|sd S  rAt|dkrAztdd |D  W n& ty@   d _ |D ]	}t|d  q4Y nw |D ]	}t|d  qCq	)NTrm   c                 S  rn   ro   ri   rp   ri   ri   rj   rs     rt   zGQUICResolver.__exchange_until.<locals>.send_pending.<locals>.<listcomp>Fr   )r]   r}   rw   rx   r   r   rZ   r   )nowry   rz   gso_enabledquicrd   sockri   rj   send_pending  s$   


z3QUICResolver.__exchange_until.<locals>.send_pendingTFrm   c                 S  rn   ro   ri   rp   ri   ri   rj   rs     rt   z1QUICResolver.__exchange_until.<locals>.<listcomp>r   i  i  c                 S  rn   ro   ri   rp   ri   ri   rj   rs   .  rt   i*  zQDNS over QUIC did not succeed (Error 298). Chain certificate verification failed.z9DNS over QUIC encountered a unrecoverable failure (error  )zEDNS over QUIC server submitted a StreamReset. A request was rejected.stream_endedrk   rl   )$rW   rX   rZ   rY   r]   rw   rx   r   r   r   _eventsr   	get_timerr   recvtimer_firedrJ   listreceive_datagramrT   r\   iter
next_eventr	   
error_coderS   r   r   reason_phraser   r_   r   r`   rL   r~   r   )rd   r   rC   r   r   gro_enabledr   r   ry   rz   r   subdata_ingro_segmentevri   r   rj   __exchange_until  s   



>




zQUICResolver.__exchange_untilr   )r(   r)   r*   r+   r,   r)   r-   r.   r   )rk   r{   )r   r   )r   r   r*   r   r   r   r   r   r   r   r   r   r   r{   rk   r   )
r   r   rC   r{   r   r   r   r{   rk   r   )__name__
__module____qualname__r   DOQprotocolimplementationrE   rv   r   r   r^   __classcell__ri   ri   rg   rj   r&   9   s$    
U
	  &r&   c                      "   e Zd ZdZd fddZ  ZS )	AdGuardResolveradguardr,   r)   r-   r.   c                   R   d|v r	| d d|v r|d }| d nd }t jd|g|R i | d S )Nr(   r*   zunfiltered.adguard-dns.compoprD   rE   rd   r,   r-   r*   rg   ri   rj   rE   _     
 zAdGuardResolver.__init__r,   r)   r-   r.   r   r   r   	specifierrE   r  ri   ri   rg   rj   r  Z      r  c                      r  )	NextDNSResolvernextdnsr,   r)   r-   r.   c                   r  )Nr(   r*   zdns.nextdns.ior  r	  rg   ri   rj   rE   o  r
  zNextDNSResolver.__init__r  r  ri   ri   rg   rj   r  j  r  r  )5
__future__r   r   typinganytlsr   collectionsr   r   r]   qh3.quic.configurationr   qh3.quic.connectionr   qh3.quic.eventsr	   r
   r   r   r   r   	util.ssl_r   r   util.sub_timeoutr   ssa._gror   r   r   r   r   r   dour   	protocolsr   r   r   r   r   utilsr    r!   r"   r#   r$   r%   rS   ImportErrorr&   r  r  ri   ri   ri   rj   <module>   s>     	  	    
%
