o
    h                     @   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
   @/var/www/vip_panel/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&   

	0z_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 rd}|tj ||| d|v r|d u rd}|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