o
    h                  #   @   s  d 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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mZmZmZ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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 Z#dd Z$ej%&dZ'e'rddl(Z)ddl*Z*e)j+Z,e)j-j.j/Z0G d	d
 d
e,Z1G dd de*j2Z3nG dd dZ3e'Z4zddl5Z5W n e6y   G dd dZ5Y nw e	j	Z7G dd dej8j9Z:G dd dej8j;Z<G dd dej8j9Z=G dd dej8j9Z>ej?j@Z@dd ZAdd ZBdd ZCdd ZDd d! ZEd"d# ZF	$dd%d&ZGdd'd(ZHd)ed* d+d*fd,d-ZIG d.d/ d/ejJZKdd0ddd1d1dd2d$dd$de	jLeKjMfd3ejNjOd4ePd5eeQ d6eRd7eeP d8eRd9eSd:eSd;ee d<ePd=eSd>eeP d?eeSePf d)ed* d@eRdAeKd+ejNjOf"dBdCZTdDejUjVdEeWd+eWfdFdGZXdDejUjVdHePdIeWd+dfdJdKZY		L			1	1	$		$dd3ejNjOd4ePdMePd5eeQ d6eRd7eeP d8eRd9eSd:eSd?eeSePf dNeeP d=eSd+ejNjOfdOdPZZdQdR Z[dSdT Z\	ddUedVeejNjOeWf dWedXeeQ d+eeReQf f
dYdZZ]			1	1		[	1	1	1	ddUedWee dXeeQ d\eSd9eSd]eeej^j_ej`jaf  d^eeW d:eSd_eSd`eSdaeejNjO d+efdbdcZb		d			1	1	1	1		1dd3ejNjOd4ePd5eeQ d6eRd7eeP d8eRd\eSd9eSd:eSd_eSdUee d`eSd+ejNjOfdedfZc		d			1	1	1			1dd3ejNjOd4ePd5eeQ d6eRd7eeP d8eRd\eSd9eSd:eSdgee dhee d`eSd+eejNjOeSf fdidjZddkdl Zedmdn Zf	ddUedVeejNjOeWf dXeeQ d+eeReQf fdodpZg		1		[	1ddUedXeeQ d9eSd]eeej^j_ej`jaf  d^eeW d:eSd+eejNjOeQf fdqdrZhdsdt Zi		d			1	1	dd3ejNjOd4ePd5eeQ d6eRd7eeP d8eRd9eSd:eSdUee d+ejNjOfdudvZjdwdx ZkdyeeP d?eeSePf d+e5jlfdzd{Zm		L			1	1				$dd3ejNjOd4ePd5eeQ d6eRd7eeP d8eRd9eSd:eSdUee5jn d|ee5jl dyeeP d?eeSePf d+ejNjOfd}d~Zo		L			1	1		$		dd3ejNjOd4ePd5eeQ d6eRd7eeP d8eRd9eSd:eSdeejUjp d?eeSePf dNeeP dyeeP d+ejNjOfddZUG dd dejJZqdejrjsde	j	daejNjOdeeR d5eeQ dXeQd+efddZtejujvejwjxdddddd$ddddd1ej`jyfd4ePdeej^j_ePf deejujzePf deejwj{ePf d5eeQ d6eRd]eeej^j_ej`jaf  deeej^j_ePf  deSdeeQ d7eeP d8eRdeRdeSdeej^j_ePf d+ef ddZ?dddddddeqj|fd4ePdejrjsdaeejNjO d6eRd5eeQ deeQ d7eeP d8eRdeqd+dfddZ}dS )zTalk to a DNS server.    N)AnyDictOptionalTupleUnioncastc                 C   s,   | d u rd S | t    }|dkrtjj|S )N        )timedns	exceptionTimeout)
expirationtimeout r   </var/www/html/venv/lib/python3.10/site-packages/dns/query.py
_remaining1   s   r   c                 C   s   |d u rd S t t |  |S N)minr	   )r   r   r   r   r   _expiration_for_this_attempt:   s   r   Zdohc                       s4   e Zd Z fddZ	dddZ	dddZ  ZS )	_NetworkBackendc                    s&   t    || _|| _|| _|| _d S r   )super__init___local_port	_resolver_bootstrap_address_family)selfresolver
local_portbootstrap_addressfamily	__class__r   r   r   I   s
   

z_NetworkBackend.__init__Nc              	   C   s  g }t |\}}tj|r|| n(| jd ur || j nt|}| j}	|r/tj|}	| j	j
||	|d}
|
 }|D ]G}tj|}|d usO| jdkrZtj|| jf|}nd }t|tj|}td|}zt|tj||f|| t|W   S  ty   Y q>w tj)N)r    lifetimer   g       @)_compute_timesr
   inet
is_addressappendr   r   r   af_for_addressr   resolve_name	addressesr   low_level_address_tuple_make_socketsocketSOCK_STREAMr   _connect_CoreSyncStream	ExceptionhttpcoreZConnectError)r   hostportr   local_addresssocket_optionsr*   _r   r    answersaddressafsourcesockZattempt_expirationr   r   r   connect_tcpP   sD   


z_NetworkBackend.connect_tcpc                 C      t r   NotImplementedError)r   pathr   r6   r   r   r   connect_unix_socketw   s   z#_NetworkBackend.connect_unix_socketr   )__name__
__module____qualname__r   r=   rB   __classcell__r   r   r!   r   r   H   s    
(r   c                       s*   e Zd Zdddejd fdd
Z  ZS )_HTTPTransportr   N)r   r   r   r    c                   sJ   |d u r|d u rdd l }|j }t j|i | t||||| j_d S Nr   )dns.resolverr   Resolverr   r   r   _poolZ_network_backend)r   r   r   r   r    argskwargsr
   r!   r   r   r   }   s   	
z_HTTPTransport.__init__)rC   rD   rE   r-   	AF_UNSPECr   rF   r   r   r!   r   rG   |   s    rG   c                   @   s   e Zd Zdd ZdS )rG   c                 C   r>   r   r?   )r   r3   r4   r   r5   r   r   r   r=         z_HTTPTransport.connect_tcpN)rC   rD   rE   r=   r   r   r   r   rG      s    c                   @   sX   e Zd ZdZG dd deZG dd deZG dd dZG dd	 d	Ze	d
d Z
dS )sslr   c                   @      e Zd ZdS )zssl.WantReadExceptionNrC   rD   rE   r   r   r   r   WantReadException       rS   c                   @   rQ   )zssl.WantWriteExceptionNrR   r   r   r   r   WantWriteException   rT   rU   c                   @   rQ   )zssl.SSLContextNrR   r   r   r   r   
SSLContext   rT   rV   c                   @   rQ   )zssl.SSLSocketNrR   r   r   r   r   	SSLSocket   rT   rW   c                 O   s   t d)Nzno ssl support)r1   )clsrL   rM   r   r   r   create_default_context   s   zssl.create_default_contextN)rC   rD   rE   	CERT_NONEr1   rS   rU   rV   rW   classmethodrY   r   r   r   r   rP      s    rP   c                   @      e Zd ZdZdS )UnexpectedSourcez=A DNS query response came from an unexpected address or port.NrC   rD   rE   __doc__r   r   r   r   r]          r]   c                   @   r\   )BadResponsez<A DNS query response does not respond to the question asked.Nr^   r   r   r   r   ra      r`   ra   c                   @   r\   )NoDOHzMDNS over HTTPS (DOH) was requested but the httpx module is not
    available.Nr^   r   r   r   r   rb      r`   rb   c                   @   r\   )NoDOQzNDNS over QUIC (DOQ) was requested but the aioquic module is not
    available.Nr^   r   r   r   r   rc      r`   rc   c                 C   s$   t   }| d u r|d fS |||  fS r   )r	   )r   nowr   r   r   r$      s   r$   c                 C   s   |rt | tjr|  dkrdS t }d}|r|tjO }|r$|tjO }|r,|| | |d u r3d }n|t		  }|dkrAt
jj||sJt
jjd S )Nr   Tr   )
isinstancerP   rW   pending	selectorsDefaultSelector
EVENT_READEVENT_WRITEregisterr	   r
   r   r   select)fdreadablewritabler7   r   seleventsr   r   r   r   	_wait_for   s$   


rr   c                 C   s   t | ddd| d S )NTFrr   sr   r   r   r   _wait_for_readable      rv   c                 C   s   t | ddd| d S )NFTrs   rt   r   r   r   _wait_for_writable   rw   rx   c                 C   sb   zt j| |d }t j| |d }W n t jjy    Y dS w ||ko0|dd  |dd  kS )Nr   F   )r
   r%   	inet_ptonr   SyntaxError)r:   Za1Za2Zn1Zn2r   r   r   _addresses_equal   s    r|   c                 C   s\   |sdS t | ||stj|d r |dd  |dd  kr dS |r$dS td| d| )NTr   ry   Fzgot a response from z instead of )r|   r
   r%   is_multicastr]   )r:   from_addressdestinationignore_unexpectedr   r   r   _matches_destination  s   r   Tc                 C   s   d }d }z
t j| }| }W n ty   |r Y nw |r0t j|}|r.||kr-tdn|}|rH|sHzt j|}W n tyG   tdw |rSt j||f|}|r^t j||f|}|||fS )Nz5different address families for source and destinationz3source_port specified but address family is unknown)r
   r%   r(   r1   
ValueErrorZ
any_for_afr+   )wherer4   r;   source_portZwhere_must_be_addressr:   r   Zsafr   r   r   _destination_and_source  s<   
r   c                 C   s\   t | |}z|d |d ur|| |r|j|d|dW S |W S  ty-   |   w )NF)do_handshake_on_connectserver_hostname)socket_factorysetblockingbindwrap_socketr1   close)r:   typer;   ssl_contextr   ru   r   r   r   r,   @  s    


r,   r   zdns.resolver.Resolverreturnc                 C   s   | d u rdd l }|j } | S rH   )rI   r   rJ   )r   r
   r   r   r   _maybe_get_resolverT  s   
r   c                   @   s,   e Zd ZdZdZdZdZdZdZdZ	dZ
dS )HTTPVersionzWhich version of HTTP should be used?

    DEFAULT will select the first version from the list [2, 1.1, 3] that
    is available.
    r   ry         N)rC   rD   rE   r_   DEFAULTZHTTP_1H1ZHTTP_2H2ZHTTP_3H3r   r   r   r   r   b  s    r   i  Fz
/dns-queryqr   r   r4   r;   r   one_rr_per_rrsetignore_trailingsessionrA   postr   verifyr    http_versionc           "      C   s  t ||||d\}}}|dur5tj|r5|tjkr%d| d| |	 }n|tjkr4d| d| |	 }n|}i }|du rctj	|}|j
du rLtdtj|j
r[|j
}|j
|d< |jdurc|j}|tjkso|tjkrts|du rt|}|j
dus~J ||j
|}tt| }t| ||||||||||
d	S tst|rt|tjstd
|  }ddi}|tjtjfv }|tjtjfv }|du rd}d}n|d }|d }|rt |}nt!||||||||d}tj||||d}|:}|
r|"dt#t$|d |j%|||||d}nt&'|(d}|) } |j*|||d| i|d}W d   n	1 s3w   Y  |j+dk sD|j+dkrRt| d|j+ d|j, tj-j.|j,| j/| j0||d}!|j12 |!_3| 4|!snt5|!S )a	  Return the response obtained after sending a query via DNS-over-HTTPS.

    *q*, a ``dns.message.Message``, the query to send.

    *where*, a ``str``, the nameserver IP address or the full URL. If an IP address is
    given, the URL will be constructed using the following schema:
    https://<IP-address>:<port>/<path>.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the query
    times out. If ``None``, the default, wait forever.

    *port*, a ``int``, the port to send the query to. The default is 443.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying the source
    address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message. The default is
    0.

    *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own RRset.

    *ignore_trailing*, a ``bool``. If ``True``, ignore trailing junk at end of the
    received message.

    *session*, an ``httpx.Client``.  If provided, the client session to use to send the
    queries.

    *path*, a ``str``. If *where* is an IP address, then *path* will be used to
    construct the URL to send the DNS query to.

    *post*, a ``bool``. If ``True``, the default, POST method will be used.

    *bootstrap_address*, a ``str``, the IP address to use to bypass resolution.

    *verify*, a ``bool`` or ``str``.  If a ``True``, then TLS certificate verification
    of the server is done using the default CA bundle; if ``False``, then no
    verification is done; if a `str` then it specifies the path to a certificate file or
    directory which will be used for verification.

    *resolver*, a ``dns.resolver.Resolver`` or ``None``, the resolver to use for
    resolution of hostnames in URLs.  If not specified, a new resolver with a default
    configuration will be used; note this is *not* the default resolver as that resolver
    might have been configured to use DoH causing a chicken-and-egg problem.  This
    parameter only has an effect if the HTTP library is httpx.

    *family*, an ``int``, the address family.  If socket.AF_UNSPEC (the default), both A
    and AAAA records will be retrieved.

    *http_version*, a ``dns.query.HTTPVersion``, indicating which HTTP version to use.

    Returns a ``dns.message.Message``.
    FNzhttps://:z	https://[z]:zno hostname in URLZsni_hostname)r   r   z)session parameter must be an httpx.Clientacceptzapplication/dns-messager   ry   )r5   http1http2r   r   r   r   r    )r   r   r   	transport)zcontent-typezcontent-length)headerscontentr   
extensions   =r
   )r   r   paramsr      +   responded with status code z
Response body: keyringrequest_macr   r   )6r   r
   r%   r&   r-   AF_INETAF_INET6urllibparseurlparsehostnamer   r4   r   r   r   have_dohr   r)   randomchoicelistr*   _http3rb   re   httpxZClientto_wirer   r   
contextlibnullcontextrG   updatestrlenr   base64urlsafe_b64encoderstripdecodegetstatus_coder   message	from_wirer   r   elapsedtotal_secondsr	   is_responsera   )"r   r   r   r4   r;   r   r   r   r   rA   r   r   r   r   r    r   r:   r7   Z
the_sourceurlr   parsedr8   wirer   Zh1Zh2r5   r   cmr   responseZtwirerr   r   r   httpsr  s   G








r   r   namec                 C   s.   | d u rt | D ]\}}||kr|  S qt r   )KeyError)r   r   headervaluer   r   r   _find_header9  s   r   peerr   c                 C   s   t | d}|d u rtdt|}|dk rtd|dk s!|dkrFd}t|dkr;zd|  }W n	 ty:   Y nw t| d	| | d S )
Ns   :statuszno :status header in responser   zstatus is negativer   r    z: r   )r   r{   intr   r   r1   r   )r   r   r   r   statuserrorr   r   r   _check_statusB  s    
r   U  r   r   c              	   C   s,  t jjstdtj|}|j}
|jd ur|j}d| _	| 
 }t jj|	|
dd}|E |||||}t|\}}||}|||| |t|}t| || W d    n1 s`w   Y  t }W d    n1 ssw   Y  t jj|| j| j||d}t|| d|_| |st|S )Nz DNS-over-HTTP3 is not available.r   T)verify_modeserver_nameZh3r   r   )r
   quic	have_quicrb   r   r   r   r   r4   idr   SyncQuicManagerconnectr$   make_streamZsend_h3receiver   r   r   r	   r   r   r   r   maxr   ra   )r   r   r   r   r4   r;   r   r   r   r   r   r   Z	url_partsr   manager
connectionstartr   streamfinishr   r   r   r   r   S  s@   


r   c                 C   s.   	 z|  |W S  ty   t| | Y nw q)zReads a datagram from the socket.
    A Timeout exception will be raised if the operation is not completed
    by the expiration time.
    )recvfromBlockingIOErrorrv   )r<   max_sizer   r   r   r   	_udp_recv  s   r   c                 C   s@   	 z|r|  ||W S | |W S  ty   t| | Y nw q)zSends the specified datagram to destination over the socket.
    A Timeout exception will be raised if the operation is not completed
    by the expiration time.
    )sendtosendr   rx   )r<   datar   r   r   r   r   	_udp_send  s   r   r<   whatr   r   c                 C   s4   t |tjjr| }t }t| |||}||fS )a  Send a DNS message to the specified UDP socket.

    *sock*, a ``socket``.

    *what*, a ``bytes`` or ``dns.message.Message``, the message to send.

    *destination*, a destination tuple appropriate for the address family
    of the socket, specifying where to send the query.

    *expiration*, a ``float`` or ``None``, the absolute time at which
    a timeout exception should be raised.  If ``None``, no timeout will
    occur.

    Returns an ``(int, float)`` tuple of bytes sent and the sent time.
    )re   r
   r   Messager   r	   r   )r<   r   r   r   	sent_timenr   r   r   send_udp  s
   r       r   r   r   raise_on_truncationignore_errorsqueryc              
   C   s   d}	 t | d|\}}t| j|||sqt }ztjj||||||d}W n- tjjyH } z|	rC|
durC|
| sCW Y d}~q d}~w t	yS   |	rRY q w |	r`|
dur`|
|s`q|rf||fS |||fS )a  Read a DNS message from a UDP socket.

    *sock*, a ``socket``.

    *destination*, a destination tuple appropriate for the address family
    of the socket, specifying where the message is expected to arrive from.
    When receiving a response, this would be where the associated query was
    sent.

    *expiration*, a ``float`` or ``None``, the absolute time at which
    a timeout exception should be raised.  If ``None``, no timeout will
    occur.

    *ignore_unexpected*, a ``bool``.  If ``True``, ignore responses from
    unexpected sources.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own
    RRset.

    *keyring*, a ``dict``, the keyring to use for TSIG.

    *request_mac*, a ``bytes`` or ``None``, the MAC of the request (for TSIG).

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing
    junk at end of the received message.

    *raise_on_truncation*, a ``bool``.  If ``True``, raise an exception if
    the TC bit is set.

    Raises if the message is malformed, if network errors occur, of if
    there is a timeout.

    If *destination* is not ``None``, returns a ``(dns.message.Message, float)``
    tuple of the received message and the received time.

    If *destination* is ``None``, returns a
    ``(dns.message.Message, float, tuple)``
    tuple of the received message, the received time, and the address where
    the message arrived from.

    *ignore_errors*, a ``bool``.  If various format errors or response
    mismatches occur, ignore them and keep listening for a valid response.
    The default is ``False``.

    *query*, a ``dns.message.Message`` or ``None``.  If not ``None`` and
    *ignore_errors* is ``True``, check that the received message is a response
    to this query, and if not keep listening for a valid response.
    r   T  )r   r   r   r   r   N)
r   r   r    r	   r
   r   r   	Truncatedr   r1   )r<   r   r   r   r   r   r   r   r   r   r   r   r~   received_timer   er   r   r   receive_udp  sH   >


r  5   c                 C   s   |   }t||||\}}}t|\}}|
rt|
}nt|tj|}|1}t|||| t	|||||| j
| j||	|| \}}|| |_|sM| |sMt|W  d   S 1 sYw   Y  	J )a  Return the response obtained after sending a query via UDP.

    *q*, a ``dns.message.Message``, the query to send

    *where*, a ``str`` containing an IPv4 or IPv6 address,  where
    to send the message.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the
    query times out.  If ``None``, the default, wait forever.

    *port*, an ``int``, the port send the message to.  The default is 53.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying
    the source address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message.
    The default is 0.

    *ignore_unexpected*, a ``bool``.  If ``True``, ignore responses from
    unexpected sources.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own
    RRset.

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing
    junk at end of the received message.

    *raise_on_truncation*, a ``bool``.  If ``True``, raise an exception if
    the TC bit is set.

    *sock*, a ``socket.socket``, or ``None``, the socket to use for the
    query.  If ``None``, the default, a socket is created.  Note that
    if a socket is provided, it must be a nonblocking datagram socket,
    and the *source* and *source_port* are ignored.

    *ignore_errors*, a ``bool``.  If various format errors or response
    mismatches occur, ignore them and keep listening for a valid response.
    The default is ``False``.

    Returns a ``dns.message.Message``.
    N)r   r   r$   r   r   r,   r-   
SOCK_DGRAMr   r  r   macr	   r   ra   )r   r   r   r4   r;   r   r   r   r   r   r<   r   r   r:   r   
begin_timer   r   ru   r   r  r   r   r   udp&  s<   8

 r  udp_socktcp_sockc                 C   s`   zt | ||||||||d|	|}|dfW S  tjjy/   t| ||||||||
	}|df Y S w )a|  Return the response to the query, trying UDP first and falling back
    to TCP if UDP results in a truncated response.

    *q*, a ``dns.message.Message``, the query to send

    *where*, a ``str`` containing an IPv4 or IPv6 address,  where to send the message.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the query
    times out.  If ``None``, the default, wait forever.

    *port*, an ``int``, the port send the message to.  The default is 53.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying the source
    address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message. The default is
    0.

    *ignore_unexpected*, a ``bool``.  If ``True``, ignore responses from unexpected
    sources.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own RRset.

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing junk at end of the
    received message.

    *udp_sock*, a ``socket.socket``, or ``None``, the socket to use for the UDP query.
    If ``None``, the default, a socket is created.  Note that if a socket is provided,
    it must be a nonblocking datagram socket, and the *source* and *source_port* are
    ignored for the UDP query.

    *tcp_sock*, a ``socket.socket``, or ``None``, the connected socket to use for the
    TCP query.  If ``None``, the default, a socket is created.  Note that if a socket is
    provided, it must be a nonblocking connected stream socket, and *where*, *source*
    and *source_port* are ignored for the TCP query.

    *ignore_errors*, a ``bool``.  If various format errors or response mismatches occur
    while listening for UDP, ignore them and keep listening for a valid response. The
    default is ``False``.

    Returns a (``dns.message.Message``, tcp) tuple where tcp is ``True`` if and only if
    TCP was used.
    TF)r  r
   r   r   tcp)r   r   r   r4   r;   r   r   r   r   r	  r
  r   r   r   r   r   udp_with_fallback  s<   9
r  c              	   C   s   d}|dkrCz|  |}|dkrtd|t|8 }||7 }W n ttjfy0   t| | Y n tjy>   t| | Y nw |dks|S )zRead the specified number of bytes from sock.  Keep trying until we
    either get the desired amount, or we hit EOF.
    A Timeout exception will be raised if the operation is not completed
    by the expiration time.
    r   r   ZEOF)	recvEOFErrorr   r   rP   SSLWantReadErrorrv   SSLWantWriteErrorrx   )r<   countr   ru   r   r   r   r   	_net_read  s   
r  c              	   C   s~   d}t |}||k r=z|| ||d 7 }W n ttjfy(   t| | Y n tjy6   t| | Y nw ||k s
dS dS )zWrite the specified data to the socket.
    A Timeout exception will be raised if the operation is not completed
    by the expiration time.
    r   N)r   r   r   rP   r  rx   r  rv   )r<   r   r   currentlr   r   r   
_net_write  s   r  c                 C   sP   t |tjjr|jdd}n
t|dd| }t }t| || t||fS )a{  Send a DNS message to the specified TCP socket.

    *sock*, a ``socket``.

    *what*, a ``bytes`` or ``dns.message.Message``, the message to send.

    *expiration*, a ``float`` or ``None``, the absolute time at which
    a timeout exception should be raised.  If ``None``, no timeout will
    occur.

    Returns an ``(int, float)`` tuple of bytes sent and the sent time.
    T)Zprepend_lengthr   big)	re   r
   r   r   r   r   to_bytesr	   r  )r<   r   r   tcpmsgr   r   r   r   send_tcp  s   r  c                 C   sL   t | d|}td|\}t | ||}t }	tjj|||||d}
|
|	fS )a  Read a DNS message from a TCP socket.

    *sock*, a ``socket``.

    *expiration*, a ``float`` or ``None``, the absolute time at which
    a timeout exception should be raised.  If ``None``, no timeout will
    occur.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own
    RRset.

    *keyring*, a ``dict``, the keyring to use for TSIG.

    *request_mac*, a ``bytes`` or ``None``, the MAC of the request (for TSIG).

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing
    junk at end of the received message.

    Raises if the message is malformed, if network errors occur, of if
    there is a timeout.

    Returns a ``(dns.message.Message, float)`` tuple of the received message
    and the received time.
    r   !Hr   )r  structunpackr	   r
   r   r   )r<   r   r   r   r   r   ldatar  r   r  r   r   r   r   receive_tcp  s   !r  c                 C   s`   |  |}|dkrd S |tjtjtjfv r"t| | | tjtj	}|dkr.t
|t|d S rH   )
connect_exerrnoZEINPROGRESSEWOULDBLOCKZEALREADYrx   
getsockoptr-   
SOL_SOCKETSO_ERROROSErrorosstrerror)ru   r9   r   errr   r   r   r/   K  s   

r/   c	                 C   s   |   }	t|\}
}|rt|}nt||||\}}}t|tj|}|1}|s.t||| t	||	| t
|||| j| j|\}}||
 |_| |sMt|W  d   S 1 sYw   Y  	J )a  Return the response obtained after sending a query via TCP.

    *q*, a ``dns.message.Message``, the query to send

    *where*, a ``str`` containing an IPv4 or IPv6 address, where
    to send the message.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the
    query times out.  If ``None``, the default, wait forever.

    *port*, an ``int``, the port send the message to.  The default is 53.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying
    the source address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message.
    The default is 0.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own
    RRset.

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing
    junk at end of the received message.

    *sock*, a ``socket.socket``, or ``None``, the connected socket to use for the
    query.  If ``None``, the default, a socket is created.  Note that
    if a socket is provided, it must be a nonblocking connected stream
    socket, and *where*, *port*, *source* and *source_port* are ignored.

    Returns a ``dns.message.Message``.
    N)r   r$   r   r   r   r,   r-   r.   r/   r  r  r   r  r	   r   ra   )r   r   r   r4   r;   r   r   r   r<   r   r  r   r   r:   r   ru   r   r  r   r   r   r  V  s,   +


 r  c                 C   sN   	 z|    W d S  tjy   t| | Y n tjy%   t| | Y nw qr   )do_handshakerP   r  rv   r  rx   rt   r   r   r   _tls_handshake  s   r*  r   c                 C   s   d }d }t |trtj|r|}ntj|r|}ntdtj||d}tj	j
|_| d u r2d|_|dg |du r@tj|_|S )Nzinvalid verify string)cafilecapathFdot)re   r   r&  rA   isfileisdirr   rP   rY   
TLSVersionTLSv1_2minimum_versioncheck_hostnameset_alpn_protocolsrZ   r   )r   r   r+  r,  r   r   r   r   _make_dot_ssl_context  s    

r5  r   c              
   C   s   |rt | ||||||||	S |  }t|\}}t||||\}}}|	du r-|s-t|
|}	t|tj||	|
d4}t||| t	|| t
||| t|||| j| j|\}}|| |_| |sbt|W  d   S 1 snw   Y  	J )ak  Return the response obtained after sending a query via TLS.

    *q*, a ``dns.message.Message``, the query to send

    *where*, a ``str`` containing an IPv4 or IPv6 address,  where
    to send the message.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the
    query times out.  If ``None``, the default, wait forever.

    *port*, an ``int``, the port send the message to.  The default is 853.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying
    the source address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message.
    The default is 0.

    *one_rr_per_rrset*, a ``bool``.  If ``True``, put each RR into its own
    RRset.

    *ignore_trailing*, a ``bool``.  If ``True``, ignore trailing
    junk at end of the received message.

    *sock*, an ``ssl.SSLSocket``, or ``None``, the socket to use for
    the query.  If ``None``, the default, a socket is created.  Note
    that if a socket is provided, it must be a nonblocking connected
    SSL stream socket, and *where*, *port*, *source*, *source_port*,
    and *ssl_context* are ignored.

    *ssl_context*, an ``ssl.SSLContext``, the context to use when establishing
    a TLS connection. If ``None``, the default, creates one with the default
    configuration.

    *server_hostname*, a ``str`` containing the server's hostname.  The
    default is ``None``, which means that no hostname is known, and if an
    SSL context is created, hostname checking will be disabled.

    *verify*, a ``bool`` or ``str``.  If a ``True``, then TLS certificate verification
    of the server is done using the default CA bundle; if ``False``, then no
    verification is done; if a `str` then it specifies the path to a certificate file or
    directory which will be used for verification.

    Returns a ``dns.message.Message``.

    N)r   r   )r  r   r$   r   r5  r,   r-   r.   r/   r*  r  r  r   r  r	   r   ra   )r   r   r   r4   r;   r   r   r   r<   r   r   r   r   r  r   r:   r   ru   r   r  r   r   r   tls  sP   =




 r6  r   c              	   C   s&  t jjstd|dur|
du r|}
d| _|  }|r#td}|}n
t jj|	|
d}|}|> |s:|	||||}t
|\}}||}||d |t|}W d   n1 s]w   Y  t }W d   n1 spw   Y  t jj|| j| j||d}t|| d|_| |st|S )a  Return the response obtained after sending a query via DNS-over-QUIC.

    *q*, a ``dns.message.Message``, the query to send.

    *where*, a ``str``, the nameserver IP address.

    *timeout*, a ``float`` or ``None``, the number of seconds to wait before the query
    times out. If ``None``, the default, wait forever.

    *port*, a ``int``, the port to send the query to. The default is 853.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying the source
    address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message. The default is
    0.

    *one_rr_per_rrset*, a ``bool``. If ``True``, put each RR into its own RRset.

    *ignore_trailing*, a ``bool``. If ``True``, ignore trailing junk at end of the
    received message.

    *connection*, a ``dns.quic.SyncQuicConnection``.  If provided, the connection to use
    to send the query.

    *verify*, a ``bool`` or ``str``.  If a ``True``, then TLS certificate verification
    of the server is done using the default CA bundle; if ``False``, then no
    verification is done; if a `str` then it specifies the path to a certificate file or
    directory which will be used for verification.

    *hostname*, a ``str`` containing the server's hostname or ``None``.  The default is
    ``None``, which means that no hostname is known, and if an SSL context is created,
    hostname checking will be disabled.  This value is ignored if *url* is not
    ``None``.

    *server_hostname*, a ``str`` or ``None``.  This item is for backwards compatibility
    only, and has the same meaning as *hostname*.

    Returns a ``dns.message.Message``.
    zDNS-over-QUIC is not available.Nr   )r   r   Tr   r   )r
   r   r   rc   r   r   r   r   r   r   r$   r   r   r   r   r	   r   r   r   r   r   r   ra   )r   r   r   r4   r;   r   r   r   r   r   r   r   r   r   Zthe_connectionZthe_managerr   r   r   r   r   r   r   r   r   '  s@   7


r   c                   @   s   e Zd ZdZdZdZdZdS )UDPModea  How should UDP be used in an IXFR from :py:func:`inbound_xfr()`?

    NEVER means "never use UDP; always use TCP"
    TRY_FIRST means "try to use UDP but fall back to TCP if needed"
    ONLY means "raise ``dns.xfr.UseTCP`` if trying UDP does not succeed"
    r   ry   r   N)rC   rD   rE   r_   NEVERZ	TRY_FIRSTONLYr   r   r   r   r7    s
    r7  txn_managerru   serialc                 c   sv   |j d j}|tjjk}|  }| }	|jtj	k}
|
r%t
||	d| ntdt|	|	 }t||| tj| |||
s}d}d}|st|\}}|du sW|durY||krY|}|
rdt|d|\}}nt|d|}td|\}t|||}tjj||j|jd|||
 |d}||}|V  |j}|rE|jr|jstjd	W d   dS W d   dS 1 sw   Y  dS )
z'Given a socket, does the zone transfer.r   Nr  Fr   r   T)r   r   xfrorigintsig_ctxmultir   zmissing TSIG)questionrdtyper
   	rdatatypeIXFRZfrom_wire_originr   r   r-   r  r   r  packr   r  r<  ZInboundr$   r   r  r  r   r   r   r  Zprocess_messager>  Zhad_tsigr   	FormError)r:  ru   r   r;  r   r   rA  Zis_ixfrr=  r   Zis_udpr  Zinbounddoner>  r7   ZmexpirationZrwirer  r  r   r   r   r   _inbound_xfr  sV   	

"rG  zonerA  rdclasskeyname
relativizer#   use_udpkeyalgorithmc                 c   sT   G dd dt jj}t|trt j|}t jj	|}t j
|||}|t jjkrJ|j|j|t jjt jjdd}t jddd| }||d |d	urV|j|||d
 t| ||
|\}}}
t|	\}}|||}|rw|t jjkrwtd|r|tjntj}t|||
}t||| t||||||E d	H  W d	   d	S 1 sw   Y  d	S )a  Return a generator for the responses to a zone transfer.

    *where*, a ``str`` containing an IPv4 or IPv6 address,  where
    to send the message.

    *zone*, a ``dns.name.Name`` or ``str``, the name of the zone to transfer.

    *rdtype*, an ``int`` or ``str``, the type of zone transfer.  The
    default is ``dns.rdatatype.AXFR``.  ``dns.rdatatype.IXFR`` can be
    used to do an incremental transfer instead.

    *rdclass*, an ``int`` or ``str``, the class of the zone transfer.
    The default is ``dns.rdataclass.IN``.

    *timeout*, a ``float``, the number of seconds to wait for each
    response message.  If None, the default, wait forever.

    *port*, an ``int``, the port send the message to.  The default is 53.

    *keyring*, a ``dict``, the keyring to use for TSIG.

    *keyname*, a ``dns.name.Name`` or ``str``, the name of the TSIG
    key to use.

    *relativize*, a ``bool``.  If ``True``, all names in the zone will be
    relativized to the zone origin.  It is essential that the
    relativize setting matches the one specified to
    ``dns.zone.from_xfr()`` if using this generator to make a zone.

    *lifetime*, a ``float``, the total number of seconds to spend
    doing the transfer.  If ``None``, the default, then there is no
    limit on the time the transfer may take.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying
    the source address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message.
    The default is 0.

    *serial*, an ``int``, the SOA serial number to use as the base for
    an IXFR diff sequence (only meaningful if *rdtype* is
    ``dns.rdatatype.IXFR``).

    *use_udp*, a ``bool``.  If ``True``, use UDP (only meaningful for IXFR).

    *keyalgorithm*, a ``dns.name.Name`` or ``str``, the TSIG algorithm to use.

    Raises on errors, and so does the generator.

    Returns a generator of ``dns.message.Message`` objects.
    c                   @   sN   e Zd Zdd Zdd ZdejjfddZdd	 Z	dde
dejjfddZdS )z$xfr.<locals>.DummyTransactionManagerc                 S   s   |||rt jjn|f| _d S r   )r
   r   emptyinfo)r   r=  rK  r   r   r   r   
  s   z-xfr.<locals>.DummyTransactionManager.__init__c                 S      | j S r   )rO  r   r   r   r   origin_information     z7xfr.<locals>.DummyTransactionManager.origin_informationr   c                 S   r>   r   r?   rQ  r   r   r   	get_class  rO   z.xfr.<locals>.DummyTransactionManager.get_classc                 S   r>   r   r?   rQ  r   r   r   reader  rO   z+xfr.<locals>.DummyTransactionManager.readerFreplacementc                 S   s   G dd d}t tjj| S )Nc                   @   s   e Zd Zdd Zdd ZdS )zExfr.<locals>.DummyTransactionManager.writer.<locals>.DummyTransactionc                 _   s   d S r   r   )r   rL   kwr   r   r   nop  rO   zIxfr.<locals>.DummyTransactionManager.writer.<locals>.DummyTransaction.nopc                 S   rP  r   )rX  )r   r7   r   r   r   __getattr__  rS  zQxfr.<locals>.DummyTransactionManager.writer.<locals>.DummyTransaction.__getattr__N)rC   rD   rE   rX  rY  r   r   r   r   DummyTransaction  s    rZ  )r   r
   transactionTransaction)r   rV  rZ  r   r   r   writer  s   z+xfr.<locals>.DummyTransactionManager.writerN)F)rC   rD   rE   r   rR  r
   
rdataclass
RdataClassrT  rU  boolr[  r\  r]  r   r   r   r   DummyTransactionManager	  s    ra  T)createINSOAz. . %u 0 0 0 0r   N)	algorithmzcannot do a UDP AXFR)r
   r[  TransactionManagerre   r   r   Z	from_textrB  	RdataTypemaker   
make_queryrC  Z
find_rrset	authorityr^  rc  rd  ZrdataaddZuse_tsigr   r$   r   r-   r  r.   r,   r/   rG  )r   rH  rA  rI  r   r4   r   rJ  rK  r#   r;   r   r;  rL  rM  ra  r   ZrrsetZsoar:   r   r7   r   tmZ	sock_typeru   r   r   r   r<    s4   E


"r<  udp_modec	              	   C   sD  |du rt j|\}}	nt j|}	t| |||\}
}}t|\}}|jd jt jj	krv|t
jkrvt|
tj|5}t||| zt||||	||D ]}qJW W d   dS  t jjyf   |t
jkrd Y nw W d   n1 sqw   Y  t|
tj|}t||| t||||	||D ]}qW d   dS 1 sw   Y  dS )a  Conduct an inbound transfer and apply it via a transaction from the
    txn_manager.

    *where*, a ``str`` containing an IPv4 or IPv6 address,  where
    to send the message.

    *txn_manager*, a ``dns.transaction.TransactionManager``, the txn_manager
    for this transfer (typically a ``dns.zone.Zone``).

    *query*, the query to send.  If not supplied, a default query is
    constructed using information from the *txn_manager*.

    *port*, an ``int``, the port send the message to.  The default is 53.

    *timeout*, a ``float``, the number of seconds to wait for each
    response message.  If None, the default, wait forever.

    *lifetime*, a ``float``, the total number of seconds to spend
    doing the transfer.  If ``None``, the default, then there is no
    limit on the time the transfer may take.

    *source*, a ``str`` containing an IPv4 or IPv6 address, specifying
    the source address.  The default is the wildcard address.

    *source_port*, an ``int``, the port from which to send the message.
    The default is 0.

    *udp_mode*, a ``dns.query.UDPMode``, determines how UDP is used
    for IXFRs.  The default is ``dns.UDPMode.NEVER``, i.e. only use
    TCP.  Other possibilities are ``dns.UDPMode.TRY_FIRST``, which
    means "try UDP but fallback to TCP if needed", and
    ``dns.UDPMode.ONLY``, which means "try UDP and raise
    ``dns.xfr.UseTCP`` if it does not succeed.

    Raises on errors.
    Nr   )r
   r<  ri  Zextract_serial_from_queryr   r$   r@  rA  rB  rC  r7  r8  r,   r-   r  r/   rG  ZUseTCPr9  r.   )r   r:  r   r4   r   r#   r;   r   rm  r;  r:   r   r7   r   ru   r   r   r   inbound_xfr9  s<   /

"rn  )T)NN)	Nr   Nr   FFTNTr   )
NNFFNr   FFFN)
Nr  Nr   FFFFNF)
Nr  Nr   FFFNNF)NFNr   F)Nr  Nr   FFN)
Nr   Nr   FFNNNT)
Nr   Nr   FFNTNN)~r_   r   r   enumr   r&  Zos.pathr   rg   r-   r  r	   urllib.parser   typingr   r   r   r   r   r   Zdns._featuresr
   Zdns.exceptionZdns.inetZdns.messageZdns.nameZdns.quicZ	dns.rcodeZdns.rdataclassZdns.rdatatypeZ
dns.serialZdns.transactionZdns.tsigZdns.xfrr   r   Z	_featuresZhaveZ_have_httpxZhttpcore._backends.syncr2   r   ZNetworkBackendZ_CoreNetworkBackendZ	_backendssyncZ
SyncStreamr0   r   ZHTTPTransportrG   r   rP   ImportErrorr   r   ZDNSExceptionr]   rE  ra   rb   rc   r<  ZTransferErrorr$   rr   rv   rx   r|   r   r   r,   r   IntEnumr   rN   r   r   r   r   floatr   r`  r   r   ZHeadersbytesr   r   r   r   r   r   r   NameZtsigKeyr  r  r  r  r  r  r  r/   r  r*  rV   r5  rW   r6  ZSyncQuicConnectionr7  r[  rf  rG  rB  ZAXFRr^  rc  Zdefault_algorithmrg  r_  r8  rn  r   r   r   r   <module>   s   	
4

,
	


 H		


1

	


m	

^	

X

 
/	

E

	


n
	


]
6	

x
	
