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   E/var/www/html/olx_land/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   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httpcoreConnectError)r   hostportr   local_addresssocket_optionsr+   _r   r!   answersaddressafsourcesockattempt_expirationr   r   r   connect_tcpP   sD   


z_NetworkBackend.connect_tcpc                 C      t r   NotImplementedError)r   pathr   r8   r   r   r   connect_unix_socketw   s   z#_NetworkBackend.connect_unix_socketr   )__name__
__module____qualname__r   r@   rE   __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   _pool_network_backend)r   r   r    r   r!   argskwargsr
   r"   r   r   r   }   s   	
z_HTTPTransport.__init__)rF   rG   rH   r.   	AF_UNSPECr   rI   r   r   r"   r   rJ   |   s    rJ   c                   @   s   e Zd Zdd ZdS )rJ   c                 C   rA   r   rB   )r   r5   r6   r   r7   r   r   r   r@         z_HTTPTransport.connect_tcpN)rF   rG   rH   r@   r   r   r   r   rJ      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rF   rG   rH   r   r   r   r   WantReadException       rW   c                   @   rU   )zssl.WantWriteExceptionNrV   r   r   r   r   WantWriteException   rX   rY   c                   @   rU   )zssl.SSLContextNrV   r   r   r   r   
SSLContext   rX   rZ   c                   @   rU   )zssl.SSLSocketNrV   r   r   r   r   	SSLSocket   rX   r[   c                 O   s   t d)Nzno ssl support)r2   )clsrP   rQ   r   r   r   create_default_context   s   zssl.create_default_contextN)rF   rG   rH   	CERT_NONEr2   rW   rY   rZ   r[   classmethodr]   r   r   r   r   rT      s    rT   c                   @      e Zd ZdZdS )UnexpectedSourcez=A DNS query response came from an unexpected address or port.NrF   rG   rH   __doc__r   r   r   r   ra          ra   c                   @   r`   )BadResponsez<A DNS query response does not respond to the question asked.Nrb   r   r   r   r   re      rd   re   c                   @   r`   )NoDOHzMDNS over HTTPS (DOH) was requested but the httpx module is not
    available.Nrb   r   r   r   r   rf      rd   rf   c                   @   r`   )NoDOQzNDNS over QUIC (DOQ) was requested but the aioquic module is not
    available.Nrb   r   r   r   r   rg      rd   rg   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   )
isinstancerT   r[   pending	selectorsDefaultSelector
EVENT_READEVENT_WRITEregisterr	   r
   r   r   select)fdreadablewritabler9   r   seleventsr   r   r   r   	_wait_for   s$   


rv   c                 C   s   t | ddd| d S )NTFrv   sr   r   r   r   _wait_for_readable      rz   c                 C   s   t | ddd| d S )NFTrw   rx   r   r   r   _wait_for_writable   r{   r|   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<   a1a2n1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   r}   Fzgot a response from z instead of )r   r
   r&   is_multicastra   )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)   r2   
ValueError
any_for_afr,   )wherer6   r=   source_portwhere_must_be_addressr<   r   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_socketr2   close)r<   typer=   ssl_contextr   ry   r   r   r   r-   @  s    


r-   r   zdns.resolver.Resolverreturnc                 C   s   | d u rdd l }|j } | S rK   )rL   r   rM   )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   r}         N)rF   rG   rH   rc   DEFAULTHTTP_1H1HTTP_2H2HTTP_3H3r   r   r   r   r   b  s    r   i  Fz
/dns-queryqr   r   r6   r=   r   one_rr_per_rrsetignore_trailingsessionrD   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 URLsni_hostname)r   r   z)session parameter must be an httpx.Clientacceptzapplication/dns-messager   r}   )r7   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   r6   r   r   r   have_dohr   r*   randomchoicelistr+   _http3rf   ri   httpxClientto_wirer   r   
contextlibnullcontextrJ   updatestrlenr   base64urlsafe_b64encoderstripdecodegetstatus_coder   message	from_wirer   r   elapsedtotal_secondsr	   is_responsere   )"r   r   r   r6   r=   r   r   r   r   rD   r   r    r   r   r!   r   r<   r9   
the_sourceurlr   parsedr:   wirer   h1h2r7   r   cmr   response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   r2   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_nameh3r   r   )r
   quic	have_quicrf   r   r   r   r   r6   idr   SyncQuicManagerconnectr%   make_streamsend_h3receiver   r   r   r	   r   r   r   r   maxr   re   )r   r   r   r   r6   r=   r   r   r   r   r   r   	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BlockingIOErrorrz   )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  r|   )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.
    )ri   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   r2   )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   re   )r   r   r   r6   r=   r   r   r   r   r  r>   r  r   r<   r   
begin_timer   r   ry   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   r6   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   EOF)	recvEOFErrorr   r  rT   SSLWantReadErrorrz   SSLWantWriteErrorr|   )r>   countr   ry   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  rT   r(  r|   r'  rz   )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)prepend_lengthr   big)	ri   r
   r   r  r   r   to_bytesr	   r-  )r>   r  r   tcpmsgr  r   r   r   send_tcp  s   r2  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   !r7  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 rK   )
connect_exerrnoEINPROGRESSEWOULDBLOCKEALREADYr|   
getsockoptr.   
SOL_SOCKETSO_ERROROSErrorosstrerror)ry   r;   r   errr   r   r   r0   K  s   

r0   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/   r0   r2  r7  r   r  r	   r   re   )r   r   r   r6   r=   r   r   r   r>   r   r  r   r   r<   r   ry   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_handshakerT   r'  rz   r(  r|   rx   r   r   r   _tls_handshake  s   rE  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)ri   r   rA  rD   isfileisdirr   rT   r]   
TLSVersionTLSv1_2minimum_versioncheck_hostnameset_alpn_protocolsr^   r   )r   r   rF  rG  r   r   r   r   _make_dot_ssl_context  s    

rP  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   rP  r-   r.   r/   r0   rE  r2  r7  r   r  r	   r   re   )r   r   r   r6   r=   r   r   r   r>   r   r   r   r   r  r   r<   r   ry   r   r  r   r   r   tls  sP   =




 rQ  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   rg   r   r   r   r   r   r   r%   r   r
  r   r   r	   r   r   r   r   r   r   re   )r   r   r   r6   r=   r   r   r   r  r   r   r   r   r   the_connection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   r}   r   N)rF   rG   rH   rc   NEVER	TRY_FIRSTONLYr   r   r   r   rT    s
    rT  txn_managerry   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   Nr3  Fr  r   T)r   r   xfrorigintsig_ctxmultir   zmissing TSIG)questionrdtyper
   	rdatatypeIXFRfrom_wire_originr   r   r.   r  r  r4  packr   r-  rZ  Inboundr%   r  r*  r5  r   r   r   r  process_messager\  had_tsigr   	FormError)rX  ry   r  rY  r   r   r_  is_ixfrr[  r   is_udpr1  inbounddoner\  r9   mexpirationrwirer6  r,  r   r   r   r   _inbound_xfr  sV   	

"rn  zoner_  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[  rr  r   r   r   r   
  s   z-xfr.<locals>.DummyTransactionManager.__init__c                 S      | j S r   )rv  r   r   r   r   origin_information     z7xfr.<locals>.DummyTransactionManager.origin_informationr   c                 S   rA   r   rB   rx  r   r   r   	get_class  rS   z.xfr.<locals>.DummyTransactionManager.get_classc                 S   rA   r   rB   rx  r   r   r   reader  rS   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   rP   kwr   r   r   nop  rS   zIxfr.<locals>.DummyTransactionManager.writer.<locals>.DummyTransaction.nopc                 S   rw  r   )r  )r   r9   r   r   r   __getattr__  rz  zQxfr.<locals>.DummyTransactionManager.writer.<locals>.DummyTransaction.__getattr__N)rF   rG   rH   r  r  r   r   r   r   DummyTransaction  s    r  )r   r
   transactionTransaction)r   r}  r  r   r   r   writer  s   z+xfr.<locals>.DummyTransactionManager.writerN)F)rF   rG   rH   r   ry  r
   
rdataclass
RdataClassr{  r|  boolr  r  r  r   r   r   r   DummyTransactionManager	  s    r  T)createINSOAz. . %u 0 0 0 0r   N)	algorithmzcannot do a UDP AXFR)r
   r  TransactionManagerri   r   r   	from_textr`  	RdataTypemaker   
make_queryra  
find_rrset	authorityr  r  r  rdataadduse_tsigr   r%   r   r.   r  r/   r-   r0   rn  )r   ro  r_  rp  r   r6   r   rq  rr  r$   r=   r   rY  rs  rt  r  r   rrsetsoar<   r   r9   r   tm	sock_typery   r   r   r   rZ    s4   E


"rZ  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
   rZ  r  extract_serial_from_queryr   r%   r^  r_  r`  ra  rT  rU  r-   r.   r  r0   rn  UseTCPrW  r/   )r   rX  r  r6   r   r$   r=   r   r  rY  r<   r   r9   r   ry   r   r   r   inbound_xfr9  s<   /

"r  )T)NN)	Nr   Nr   FFTNTr   )
NNFFNr  FFFN)
Nr  Nr   FFFFNF)
Nr  Nr   FFFNNF)NFNr  F)Nr  Nr   FFN)
Nr   Nr   FFNNNT)
Nr   Nr   FFNTNN)~rc   r   r   enumr9  rA  os.pathr   rk   r.   r4  r	   urllib.parser   typingr   r   r   r   r   r   dns._featuresr
   dns.exceptiondns.inetdns.messagedns.namedns.quic	dns.rcodedns.rdataclassdns.rdatatype
dns.serialdns.transactiondns.tsigdns.xfrr   r   	_featureshave_have_httpxhttpcore._backends.syncr3   r   NetworkBackend_CoreNetworkBackend	_backendssync
SyncStreamr1   r   HTTPTransportrJ   r   rT   ImportErrorr   r   DNSExceptionra   rg  re   rf   rg   rZ  TransferErrorr%   rv   rz   r|   r   r   r   r-   r   IntEnumr   rR   r   r   r  r   floatr   r  r   r   Headersbytesr   r   r   r  r  r  r   NametsigKeyr  r  r#  r*  r-  r2  r7  r0   r"  rE  rZ   rP  r[   rQ  SyncQuicConnectionrT  r  r  rn  r`  AXFRr  r  default_algorithmr  r  rU  r  r   r   r   r   <module>   s   	
4

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

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

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

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