o
    Þý°j  ã                   @   s‚   d dl Z d dlZ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ej d¡ZG dd„ dƒZdd„ Zdd	„ Zd
d„ ZdS )é    N)Úurlparsez_dns.resolver.arpac                   @   s6   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zdd
d„Zd	S )Ú	_SVCBInfoc                 C   s   || _ || _|| _|| _d S ©N)Úbootstrap_addressÚportÚhostnameÚnameservers)Úselfr   r   r   r   © r
   ú{/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/dns/_ddr.pyÚ__init__   s   
z_SVCBInfo.__init__c                 C   s.   |d D ]\}}|dkr|| j kr dS qdS )zIVerify that the _SVCBInfo's address is in the cert's subjectAltName (SAN)ÚsubjectAltNamez
IP AddressTF)r   )r	   ÚcertÚnameÚvaluer
   r
   r   Úddr_check_certificate!   s
   €z_SVCBInfo.ddr_check_certificatec                 C   s   t jj}| ¡ }|jj|_|S r   )ÚdnsÚqueryÚsslÚcreate_default_contextÚ
TLSVersionÚTLSv1_2Úminimum_version)r	   r   Úctxr
   r
   r   Úmake_tls_context(   s   
z_SVCBInfo.make_tls_contextc              	   C   s¸   |   ¡ }t ¡ | }t | j| jf|¡�>}|j|| jd��%}| t	j
 |¡¡ | ¡  | ¡ }|  |¡W  d   ƒ W  d   ƒ S 1 sEw   Y  W d   ƒ d S 1 sUw   Y  d S )N)Úserver_hostname)r   ÚtimeÚsocketÚcreate_connectionr   r   Úwrap_socketr   Ú
settimeoutr   r   Ú
_remainingÚdo_handshakeÚgetpeercertr   )r	   Úlifetimer   Ú
expirationÚsÚtsr   r
   r
   r   Úddr_tls_check_sync.   s   ÿüý"ýz_SVCBInfo.ddr_tls_check_syncNc              
   Ã   s¶   �|d u r
t j ¡ }|  ¡ }t ¡ | }| t j | j¡t	j
dd | j| jf||| j¡I d H 4 I d H š}| t j |¡¡I d H }|  |¡W  d   ƒI d H  S 1 I d H sTw   Y  d S )Nr   )r   ÚasyncbackendÚget_default_backendr   r   Úmake_socketÚinetÚaf_for_addressr   r   ÚSOCK_STREAMr   r   r#   r   r!   r   )r	   r$   Úbackendr   r%   r'   r   r
   r
   r   Úddr_tls_check_async:   s&   €

ø	0õz_SVCBInfo.ddr_tls_check_asyncr   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r(   r0   r
   r
   r
   r   r      s    r   c              	   C   s®  | j }tj |¡sg S g }| j ¡ D ]Â}g }|j tjj	j
j¡}|d u r%qt|jƒ}|jjdd�}d }|j tjj	j
j¡}|d urD|j}d|v r™|j tjj	j
j¡}|d u s\|j d¡s]q|jd d…  ¡ }	|	 d¡sod|	 }	|d u rud}d|› d	|› |	› �}
zt|
ƒ | tj  |
|¡¡ W n	 ty˜   Y nw d
|v r®|d u r£d}| tj  |||¡¡ d|v rÄ|d u r¸d}| tj  ||d|¡¡ t|ƒdkrÔ| t||||ƒ¡ q|S )NT)Úomit_final_dots   h2s   {?dns}iúÿÿÿú/i»  zhttps://ú:s   dotiU  s   doqr   )Ú
nameserverr   r,   Ú
is_addressÚrrsetÚprocessing_orderÚparamsÚgetÚrdtypesÚsvcbbaseÚParamKeyÚALPNÚsetÚidsÚtargetÚto_textÚPORTr   ÚDOHPATHr   ÚendswithÚdecodeÚ
startswithr   ÚappendÚDoHNameserverÚ	ExceptionÚDoTNameserverÚDoQNameserverÚlenr   )Úanswerr   ÚinfosÚrrr   ÚparamÚalpnsÚhostr   ÚpathÚurlr
   r
   r   Ú_extract_nameservers_from_svcbM   s^   

þÿÿ€rX   c              	   C   sF   g }t | ƒ}|D ]}z| |¡r| |j¡ W q ty    Y qw |S )úVReturn a list of TLS-validated resolver nameservers extracted from an SVCB
    answer.)rX   r(   Úextendr   rL   ©rP   r$   r   rQ   Úinfor
   r
   r   Ú_get_nameservers_sync�   s   
€ÿr]   c              	   Ã   sN   �g }t | ƒ}|D ]}z| |¡I dH r| |j¡ W q	 ty$   Y q	w |S )rY   N)rX   r0   rZ   r   rL   r[   r
   r
   r   Ú_get_nameservers_async�   s   €€ÿr^   )r   r   Úurllib.parser   Údns.asyncbackendr   Údns.inetÚdns.nameÚdns.nameserverÚ	dns.queryÚdns.rdtypes.svcbbaser   Ú	from_textÚ_local_resolver_namer   rX   r]   r^   r
   r
   r
   r   Ú<module>   s   	34