o
    h                  #   @   s	  U 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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zddl"Z"W n e#y   ddl$m%Z" Y nw dd Z&dd Z'ej()dZ*e*rddl+Z,ddl-Z-e,j.Z/e,j0j1j2Z3G d	d
 d
e/Z4G dd de-j5Z6nG dd dZ6e*Z7dej8e9B dej:de9dejfddZ;e;Z<eej8e9B ej:e9gejf e=d< G dd dej>j?Z@G dd dej>jAZBG dd dej>j?ZCG dd dej>j?ZDejEjFZFdd ZGdd  ZHd!d" ZId#d$ ZJd%d& ZKd'd( ZL	)dd*d+ZM	ddej8e9B d,ej:d-edB dejfd.d/ZN		ddej8e9B d,ej:d0e"jOd1ejPjQeRB dB d-edB de"jSfd2d3ZTd4d5 ZUd6ed7 dd7fd8d9ZVG d:d; d;ejWZXdd<ddd=d=dd>d)dd)dejYeXjZfd?ej[j\d@eRdAe]dB dBe9d-eRdB dCe9dDe^dEe^dFedB dGeRdHe^dIeRdB dJe^eRB e"jOB d6ed7 dKe9dLeXdej[j\f"dMdNZ_dOej`jadPebdebfdQdRZcdOej`jadSeRdTebddfdUdVZd		<			=	=	)	)	dd?ej[j\d@eRdWeRdAe]dB dBe9d-eRdB dCe9dDe^dEe^dJe^eRB e"jOB dHe^dXej`jedB dej[j\fdYdZZfd[d\ Zgd]d^ Zh	dd_ed`ej[j\ebB daedbe]dB dee9e]f f
dcddZi			=	=		e	=	=	=	dd_edaedB dbe]dB dfe^dDe^dgeejPjQejjjkf dB dhebdB dEe^die^dje^dkej[j\dB defdldmZl		n			=	=	=	=		=dd?ej[j\d@eRdAe]dB dBe9d-eRdB dCe9dfe^dDe^dEe^die^d_edB dje^dej[j\fdodpZm		n			=	=	=			=dd?ej[j\d@eRdAe]dB dBe9d-eRdB dCe9dfe^dDe^dEe^dqedB dredB dje^deej[j\e^f fdsdtZndudv Zodwdx Zp	dd_ed`ej[j\ebB dbe]dB dee9e]f fdydzZq		=		e	=dd_edbe]dB dDe^dgeejPjQejjjkf dB dhebdB dEe^deej[j\e]f fd{d|Zrd}d~ Zs		n			=	=	dd?ej[j\d@eRdAe]dB dBe9d-eRdB dCe9dDe^dEe^d_edB dej[j\fddZtdd Zu	)	)	ddJe^eRB de^deveR dB de"jOfddZwd1eRdB dJe^eRB de"jOfddZx					=	=				)dd?ej[j\d@eRdAe]dB dBe9d-eRdB dCe9dDe^dEe^d_e"jSdB d0e"jOdB d1eRdB dJe^eRB dej[j\fddZy					=	=		)		dd?ej[j\d@eRdAe]dB dBe9d-eRdB dCe9dDe^dEe^dXej`jedB dJe^eRB deRdB d1eRdB dej[j\fddZ`G dd dejWZzdej{j|deje"jSB dkej[j\de9dB dAe]dB dbe]dB defddZ}ej~jejjddnddd)ddddd=ejjjfd@eRdejPjQeRB dej~jeRB dejjeRB dAe]dB dBe9dgeejPjQejjjkf dB dejPjQeRB dB de^de]dB d-eRdB dCe9de9de^dejPjQeRB def ddZEddnddddezjfd@eRdej{j|dkej[j\dB dBe9dAe]dB de]dB d-eRdB dCe9dezddfddZdS )zTalk to a DNS server.    N)AnyCallableDictOptionalTuplecastc                 C   s,   | d u rd S | t    }|dkrtjj|S )N        )timedns	exceptionTimeout)
expirationtimeout r   K/var/www/html/pro-man-master/venv/lib/python3.10/site-packages/dns/query.py
_remaining5   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   M   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 ]M}tj|}|d usO| jdkr`|d u rUd}tj|| jf|}nd }z t|tj|}td|}t|tj||f|| t|W   S  ty   Y q>w tj)N)r!   lifetimer   z0.0.0.0g       @)_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_tcpT   sH   


z_NetworkBackend.connect_tcpc                 C      t r   NotImplementedError)r   pathr   r8   r   r   r   connect_unix_socket}   s   z#_NetworkBackend.connect_unix_socket)NNNNN)__name__
__module____qualname__r   r@   rE   __classcell__r   r   r"   r   r   L   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   	
_HTTPTransport.__init__)rG   rH   rI   r.   	AF_UNSPECr   rJ   r   r   r"   r   rK      s    rK   c                   @   s*   e Zd ZdddejdddZdd ZdS )rK   r   NrL   c                O      d S r   r   )r   r   r    r   r!   rR   rS   r   r   r   r      s   	rT   c                 C   rA   r   rB   )r   r5   r6   r   r7   r   r   r   r@         z_HTTPTransport.connect_tcp)rG   rH   rI   r.   rU   r   r@   r   r   r   r   rK      s    r<   kindprotoreturnc                 C   s   t  | ||S r   )r.   )r<   rX   rY   r   r   r   default_socket_factory   s   r[   socket_factoryc                   @      e Zd ZdZdS )UnexpectedSourcez=A DNS query response came from an unexpected address or port.NrG   rH   rI   __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   rb      ra   rb   c                   @   r]   )NoDOHzMDNS over HTTPS (DOH) was requested but the httpx module is not
    available.Nr_   r   r   r   r   rc      ra   rc   c                   @   r]   )NoDOQzNDNS over QUIC (DOQ) was requested but the aioquic module is not
    available.Nr_   r   r   r   r   rd      ra   rd   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 r4d }n|t		  }|dkrBt
jj||sKt
jjW d    d S 1 sVw   Y  d S )Nr   Tr   )
isinstancessl	SSLSocketpending	selectorsDefaultSelector
EVENT_READEVENT_WRITEregisterr	   r
   r   r   select)fdreadablewritabler9   r   seleventsr   r   r   r   	_wait_for   s&   



"ru   c                 C   s   t | ddd| d S )NTFru   sr   r   r   r   _wait_for_readable      ry   c                 C   s   t | ddd| d S )NFTrv   rw   r   r   r   _wait_for_writable   rz   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_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)   r2   
ValueError
any_for_afr,   )wherer6   r=   source_portwhere_must_be_addressr<   r   safr   r   r   _destination_and_source  s<   
r   typer=   c                 C   sH   t | |d}z|d |dur|| |W S  ty#   |   w )aQ  Make a socket.

    This function uses the module's ``socket_factory`` to make a socket of the
    specified address family and type.

    *af*, a ``socket.AddressFamily`` or ``int`` is the address family, either
    ``socket.AF_INET`` or ``socket.AF_INET6``.

    *type*, a ``socket.SocketKind`` is the type of socket, e.g. ``socket.SOCK_DGRAM``,
    a datagram socket, or ``socket.SOCK_STREAM``, a stream socket.  Note that the
    ``proto`` attribute of a socket is always zero with this API, so a datagram socket
    will always be a UDP socket, and a stream socket will always be a TCP socket.

    *source* is the source address and port to bind to, if any.  The default is
    ``None`` which will bind to the wildcard address and a randomly chosen port.
    If not ``None``, it should be a (low-level) address tuple appropriate for *af*.
    r   FN)r\   setblockingbindr2   close)r<   r   r=   rx   r   r   r   r-   D  s   

r-   ssl_contextserver_hostnamec                 C   s2   t | ||}t|tjjr| }|j|d|dS )a  Make a socket.

    This function uses the module's ``socket_factory`` to make a socket of the
    specified address family and type.

    *af*, a ``socket.AddressFamily`` or ``int`` is the address family, either
    ``socket.AF_INET`` or ``socket.AF_INET6``.

    *type*, a ``socket.SocketKind`` is the type of socket, e.g. ``socket.SOCK_DGRAM``,
    a datagram socket, or ``socket.SOCK_STREAM``, a stream socket.  Note that the
    ``proto`` attribute of a socket is always zero with this API, so a datagram socket
    will always be a UDP socket, and a stream socket will always be a TCP socket.

    If *ssl_context* is not ``None``, then it specifies the SSL context to use,
    typically created with ``make_ssl_context()``.

    If *server_hostname* is not ``None``, then it is the hostname to use for server
    certificate validation.  A valid hostname must be supplied if *ssl_context*
    requires hostname checking.

    *source* is the source address and port to bind to, if any.  The default is
    ``None`` which will bind to the wildcard address and a randomly chosen port.
    If not ``None``, it should be a (low-level) address tuple appropriate for *af*.
    F)do_handshake_on_connectr   )r-   rf   r
   nameNameto_textwrap_socket)r<   r   r   r   r=   r>   r   r   r   make_ssl_sockete  s   r   c                 C   s$   |d urt | ||||S t| ||S r   )r   r-   )r<   r   r=   r   r   r   r   r   _make_socket  s   r   r   zdns.resolver.Resolverc                 C   s   | d u rdd l }|j } | S rM   )rN   r   rO   )r   r
   r   r   r   _maybe_get_resolver  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)rG   rH   rI   r`   DEFAULTHTTP_1H1HTTP_2H2HTTP_3H3r   r   r   r   r     s    r     Fz
/dns-queryqr   r   r6   r   one_rr_per_rrsetignore_trailingsessionrD   postr    verifyr!   http_versionc           "      C   s  t ||||d\}}}|}|dur6tj|r6|tjkr'd| d| |	 }n|tjkr6d| d| |	 }i }|du rbtj	|}|j
du rKtdtj|j
rZ|j
}|j
|d< |jdurb|j}|tjksn|tjkrts|du rt|}|j
dus}J ||j
|}tt| }|rt|tjjstd	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}|A}|dus
J |
r$|$dt%t&|d |j'|||||d}nt()|*d}|+ } |j,|||d| i|d}W d   n	1 sGw   Y  |j-dk sX|j-dkrft| d|j- d|j. tj/j0|j.| j1| j2||d}!|j34 |!_5| 6|!st7|!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_hostnamez8session parameter must be a dns.quic.SyncQuicConnection.)r   r   
connectionz)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   )8r   r
   r&   r'   r.   AF_INETAF_INET6urllibparseurlparsehostnamer   r6   r   r   r   have_dohr   r*   randomchoicelistr+   rf   quicSyncQuicConnection_http3rc   httpxClientto_wirer   r   
contextlibnullcontextrK   updatestrlenr   base64urlsafe_b64encoderstripdecodegetstatus_coder   message	from_wirer   r   elapsedtotal_secondsr	   is_responserb   )"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   https  s   G








r   r   r   c                 C   s.   | d u rt | D ]\}}||kr|  S qt r   )KeyError)r   r   headervaluer   r   r   _find_header  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_status  s    
r   r   r   c              	   C   sV  t jjstdtj|}|j}|d usJ |jd ur|j}d| _	| 
 }|r.td }nt jj|	|dd}|}|J |rA|}n|||||}t|\}}||}||||
 |t|}t| || W d    n1 suw   Y  t }W d    n1 sw   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
   r   	have_quicrc   r   r   r   r   r6   idr   r   r   SyncQuicManagerconnectr%   make_streamsend_h3receiver   r   r   r	   r   r   r   r   maxr   rb   )r   r   r   r   r6   r=   r   r   r   r   r   r   	url_partsr   r   managerthe_managerthe_connectionstartr   streamfinishr   r   r   r   r     sP   


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BlockingIOErrorry   )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.
    )rf   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||||d\}}}t|\}}|
rt|
}n|dus#J t|tj|}|1}t|||| t	|||||| j
| j||	|| \}}|| |_|sT| |sTt|W  d   S 1 s`w   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``.
    TN)r   r   r%   r   r   r-   r.   
SOCK_DGRAMr  r  r   macr	   r   rb   )r   r   r   r6   r=   r   r   r   r   r  r>   r  r   r<   r   
begin_timer   r   rx   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
  rg   SSLWantReadErrorry   SSLWantWriteErrorr{   )r>   countr   rx   r  r   r   r   	_net_read7  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
  rg   r,  r{   r+  ry   )r>   r  r   currentlr   r   r   
_net_writeL  s   r1  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)	rf   r
   r   r  r   r   to_bytesr	   r1  )r>   r  r   tcpmsgr  r   r   r   send_tcp\  s   r6  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   ldatar0  r   r  r   r   r   r   receive_tcpz  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 rM   )
connect_exerrnoEINPROGRESSEWOULDBLOCKEALREADYr{   
getsockoptr.   
SOL_SOCKETSO_ERROROSErrorosstrerror)rx   r;   r   errr   r   r   r0     s   

r0   c	                 C   s   |   }	t|\}
}|rt|}nt||||d\}}}|dus#J t|tj|}|1}|s5t||| t	||	| t
|||| j| j|\}}||
 |_| |sTt|W  d   S 1 s`w   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``.
    TN)r   r%   r   r   r   r-   r.   r/   r0   r6  r;  r   r!  r	   r   rb   )r   r   r   r6   r=   r   r   r   r>   r   r"  r   r   r<   r   rx   r   r  r   r   r   r&    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_handshakerg   r+  ry   r,  r{   rw   r   r   r   _tls_handshake  s   rI  check_hostnamealpnsc                 C   sT   t j| \}}tj||d}tjj|_||_| du rtj	|_
|dur(|| |S )aQ  Make an SSL context

    If *verify* is ``True``, the default, then certificate verification will occur using
    the standard CA roots.  If *verify* is ``False``, then certificate verification will
    be disabled.  If *verify* is a string which is a valid pathname, then if the
    pathname is a regular file, the CA roots will be taken from the file, otherwise if
    the pathname is a directory roots will be taken from the directory.

    If *check_hostname* is ``True``, the default, then the hostname of the server must
    be specified when connecting and the server's certificate must authorize the
    hostname.  If ``False``, then hostname checking is disabled.

    *aplns* is ``None`` or a list of TLS ALPN (Application Layer Protocol Negotiation)
    strings to use in negotiation.  For DNS-over-TLS, the right value is `["dot"]`.
    )cafilecapathFN)r
   	_tls_util#convert_verify_to_cafile_and_capathrg   create_default_context
TLSVersionTLSv1_2minimum_versionrJ  	CERT_NONEr   set_alpn_protocols)r   rJ  rK  rL  rM  r   r   r   r   make_ssl_context  s   

rV  c                 C   s   t || d udgS )Ndot)rV  )r   r   r   r   r   _make_dot_ssl_context'  s   rX  U  c              
   C   s   |rt | ||||||||	S |  }t|\}}t||||d\}}}|dus)J |	du r6t||
dudg}	t|tj|	|
|d4}t||| t	|| t
||| t|||| j| j|\}}|| |_| |skt|W  d   S 1 sww   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``.

    TNrW  )r   r   r=   )r&  r   r%   r   rV  r   r.   r/   r0   rI  r6  r;  r   r!  r	   r   rb   )r   r   r   r6   r=   r   r   r   r>   r   r   r   r   r"  r   r<   r   rx   r   r  r   r   r   tls-  sR   =




 rZ  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   rd   r   r   r   r   r   r   r%   r   r  r   r   r	   r   r   r   r   r  r   rb   )r   r   r   r6   r=   r   r   r   r   r   r   r   r   r  r  r  r  r   r  r  r   r   r   r   r     sH   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)rG   rH   rI   r`   NEVER	TRY_FIRSTONLYr   r   r   r   r[    s
    r[  txn_managerrx   serialc                 c   s   |j d j}|tjjk}|  }| }	t|tjo |j	tj
k}
|
r+t||	d| ntdt|	|	 }t||| tj| |||
}d}d}d}|st|\}}|du s_|dura||kra|}|
rlt|d|\}}nt|d|}td|\}t|||}tjj||j|jd|||
 |d}||}|V  |j}|rM|jr|dur|jstjd	W d   dS W d   dS W d   dS 1 sw   Y  dS )
z'Given a socket, does the zone transfer.r   Nr7  Fr  r   T)r   r   xfrorigintsig_ctxmultir   zmissing TSIG)questionrdtyper
   	rdatatypeIXFRfrom_wire_originr   rf   r.   r   r   r  r8  packr   r1  ra  Inboundr%   r  r.  r9  r   r   r   r!  process_messagerc  had_tsigr   	FormError)r_  rx   r  r`  r   r   rf  is_ixfrrb  r   is_udpr5  inbounddonerc  r   r9   mexpirationrwirer:  r0  r   r   r   _inbound_xfr  s\   	

"ru  zonerf  rdclasskeyname
relativizer$   use_udpkeyalgorithmc                 c   sf   G dd dt jj}t|trt j|}t jj	|}t j
|||}|t jjkrL|j|j|t jjt jjdd}t jddd| d}||d	 |d
urX|j|||d t| ||
|d\}}}
|d
usiJ t|	\}}|||}|r|t jjkrtd|rt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   rb  ry  r   r   r   r     s   z-xfr.<locals>.DummyTransactionManager.__init__c                 S      | j S r   )r}  r   r   r   r   origin_information     z7xfr.<locals>.DummyTransactionManager.origin_informationrZ   c                 S   rA   r   rB   r  r   r   r   	get_class  rW   z.xfr.<locals>.DummyTransactionManager.get_classc                 S   rA   r   rB   r  r   r   r   reader  rW   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                 _   rV   r   r   )r   rR   kwr   r   r   nop  rW   zIxfr.<locals>.DummyTransactionManager.writer.<locals>.DummyTransaction.nopc                 S   r~  r   )r  )r   r9   r   r   r   __getattr__  r  zQxfr.<locals>.DummyTransactionManager.writer.<locals>.DummyTransaction.__getattr__N)rG   rH   rI   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)rG   rH   rI   r   r  r
   
rdataclass
RdataClassr  r  boolr  r  r  r   r   r   r   DummyTransactionManager  s    r  T)createINSOAz. . z 0 0 0 0r   N)	algorithmzcannot do a UDP AXFR)r
   r  TransactionManagerrf   r   r   	from_textrg  	RdataTypemaker   
make_queryrh  
find_rrset	authorityr  r  r  rdataadduse_tsigr   r%   r   r.   r   r/   r-   r0   ru  )r   rv  rf  rw  r   r6   r   rx  ry  r$   r=   r   r`  rz  r{  r  r   rrsetsoar<   r   r9   r   tm	sock_typerx   r   r   r   ra  ;  s6   E



"ra  udp_modec	              	   C   sR  |du rt j|\}}	nt j|}	t| |||d\}
}}|
dus$J t|\}}|jd jt jj	kr}|t
jkr}t|
tj|5}t||| zt||||	||D ]}qQW W d   dS  t jjym   |t
jkrk Y nw W d   n1 sxw   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.query.UDPMode.NEVER``, i.e. only use
    TCP.  Other possibilities are ``dns.query.UDPMode.TRY_FIRST``, which
    means "try UDP but fallback to TCP if needed", and
    ``dns.query.UDPMode.ONLY``, which means "try UDP and raise
    ``dns.xfr.UseTCP`` if it does not succeed.

    Raises on errors.
    NTr   )r
   ra  r  extract_serial_from_queryr   r%   re  rf  rg  rh  r[  r\  r-   r.   r   r0   ru  UseTCPr^  r/   )r   r_  r  r6   r   r$   r=   r   r  r`  r<   r   r9   r   rx   r   r   r   inbound_xfr  s>   /


"r  )Tr   rF   )	Nr   Nr   FFTTN)
NNFFNr  FFFN)
Nr  Nr   FFFFNF)
Nr  Nr   FFFNNF)NFNr  F)Nr  Nr   FFN)TTN)
NrY  Nr   FFNNNT)
NrY  Nr   FFNTNN)r`   r   r   enumr=  rE  r   rj   r.   r8  r	   urllib.parser   typingr   r   r   r   r   r   dns._featuresr
   dns._tls_utildns.exceptiondns.inetdns.messagedns.namedns.quic	dns.rdatadns.rdataclassdns.rdatatypedns.transactiondns.tsigdns.xfrrg   ImportErrordns._no_ssl_no_sslr   r   	_featureshave_have_httpxhttpcore._backends.syncr3   r   NetworkBackend_CoreNetworkBackend	_backendssync
SyncStreamr1   r   HTTPTransportrK   r   AddressFamilyr   
SocketKindr[   r\   __annotations__r   DNSExceptionr^   rn  rb   rc   rd   ra  TransferErrorr%   ru   ry   r{   r   r   r   r-   
SSLContextr   r   r   rh   r   r   r   IntEnumr   rU   r   r   r  floatr  r   r   Headersbytesr   r   r   r   r  r  r  tsigKeyr  r#  r'  r.  r1  r6  r;  r0   r&  rI  r   rV  rX  rZ  r[  r  r  ru  rg  AXFRr  r  default_algorithmr  r  r\  r  r   r   r   r   <module>   sZ   	
6

/
%
+
	

 P		


=


	


m	

_	

X


 
/	

F

"
		

o
	

a

7


	


y
	
