U
    <æ{f  ã                   @   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
   úG/var/www/html/Darija-Ai-API/env/lib/python3.8/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|¡b}|j|| jdF}| t	j
 |¡¡ | ¡  | ¡ }|  |¡W  5 Q R £ W  5 Q R £ S Q R X W 5 Q R X 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 krt j ¡ }|  ¡ }t ¡ | }| t j | j¡t	j
dd | j| jf||| j¡I d H 4 I d H š6}| t j |¡¡I d H }|  |¡W  5 Q I d H R £ S Q I d H R X d S )Nr   )r   ZasyncbackendZget_default_backendr   r   Zmake_socketÚinetZ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"    

ø	z_SVCBInfo.ddr_tls_check_async)N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r(   r,   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 krLq$t|jƒ}|jjdd}d }|j tjj	j
j¡}|d k	rŠ|j}d|kr:|j tjj	j
j¡}|d ks$|j d¡s¾q$|jd d…  ¡ }	|	 d¡sâd|	 }	|d krîd}d|› d	|› |	› }
z t|
ƒ | tj  |
|¡¡ W n tk
r8   Y nX d
|krh|d krRd}| tj  |||¡¡ d|kr˜|d kr€d}| tj  ||d|¡¡ t|ƒdkr$| t||||ƒ¡ q$|S )NT)Zomit_final_dots   h2s   {?dns}iúÿÿÿú/i»  zhttps://ú:s   dotiU  s   doqr   )Z
nameserverr   r)   Z
is_addressZrrsetZprocessing_orderÚparamsÚgetZrdtypesZsvcbbaseZParamKeyZALPNÚsetZidsÚtargetZto_textZPORTr   ZDOHPATHr   ÚendswithÚdecodeÚ
startswithr   ÚappendZDoHNameserverÚ	ExceptionZDoTNameserverZDoQNameserverÚlenr   )Úanswerr   ÚinfosÚrrr   ÚparamZalpnsÚhostr   ÚpathÚurlr
   r
   r   Ú_extract_nameservers_from_svcbM   sZ    




ÿ

ÿrC   c              	   C   sJ   g }t | ƒ}|D ]4}z| |¡r,| |j¡ W q tk
rB   Y qX q|S )úVReturn a list of TLS-validated resolver nameservers extracted from an SVCB
    answer.)rC   r(   Úextendr   r:   ©r<   r$   r   r=   Úinfor
   r
   r   Ú_get_nameservers_sync   s    
rH   c              	   Ã   sP   g }t | ƒ}|D ]:}z | |¡I dH r2| |j¡ W q tk
rH   Y qX q|S )rD   N)rC   r,   rE   r   r:   rF   r
   r
   r   Ú_get_nameservers_async   s    rI   )r   r   Úurllib.parser   Zdns.asyncbackendr   Zdns.inetZdns.nameZdns.nameserverZ	dns.queryZdns.rdtypes.svcbbaser   Z	from_textZ_local_resolver_namer   rC   rH   rI   r
   r
   r
   r   Ú<module>   s   	34