Загрузить файлы в «venv/Lib/site-packages/dns»
This commit is contained in:
76
venv/Lib/site-packages/dns/_immutable_ctx.py
Normal file
76
venv/Lib/site-packages/dns/_immutable_ctx.py
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
|
||||||
|
|
||||||
|
# This implementation of the immutable decorator requires python >=
|
||||||
|
# 3.7, and is significantly more storage efficient when making classes
|
||||||
|
# with slots immutable. It's also faster.
|
||||||
|
|
||||||
|
import contextvars
|
||||||
|
import inspect
|
||||||
|
|
||||||
|
_in__init__ = contextvars.ContextVar("_immutable_in__init__", default=False)
|
||||||
|
|
||||||
|
|
||||||
|
class _Immutable:
|
||||||
|
"""Immutable mixin class"""
|
||||||
|
|
||||||
|
# We set slots to the empty list to say "we don't have any attributes".
|
||||||
|
# We do this so that if we're mixed in with a class with __slots__, we
|
||||||
|
# don't cause a __dict__ to be added which would waste space.
|
||||||
|
|
||||||
|
__slots__ = ()
|
||||||
|
|
||||||
|
def __setattr__(self, name, value):
|
||||||
|
if _in__init__.get() is not self:
|
||||||
|
raise TypeError("object doesn't support attribute assignment")
|
||||||
|
else:
|
||||||
|
super().__setattr__(name, value)
|
||||||
|
|
||||||
|
def __delattr__(self, name):
|
||||||
|
if _in__init__.get() is not self:
|
||||||
|
raise TypeError("object doesn't support attribute assignment")
|
||||||
|
else:
|
||||||
|
super().__delattr__(name)
|
||||||
|
|
||||||
|
|
||||||
|
def _immutable_init(f):
|
||||||
|
def nf(*args, **kwargs):
|
||||||
|
previous = _in__init__.set(args[0])
|
||||||
|
try:
|
||||||
|
# call the actual __init__
|
||||||
|
f(*args, **kwargs)
|
||||||
|
finally:
|
||||||
|
_in__init__.reset(previous)
|
||||||
|
|
||||||
|
nf.__signature__ = inspect.signature(f) # pyright: ignore
|
||||||
|
return nf
|
||||||
|
|
||||||
|
|
||||||
|
def immutable(cls):
|
||||||
|
if _Immutable in cls.__mro__:
|
||||||
|
# Some ancestor already has the mixin, so just make sure we keep
|
||||||
|
# following the __init__ protocol.
|
||||||
|
cls.__init__ = _immutable_init(cls.__init__)
|
||||||
|
if hasattr(cls, "__setstate__"):
|
||||||
|
cls.__setstate__ = _immutable_init(cls.__setstate__)
|
||||||
|
ncls = cls
|
||||||
|
else:
|
||||||
|
# Mixin the Immutable class and follow the __init__ protocol.
|
||||||
|
class ncls(_Immutable, cls):
|
||||||
|
# We have to do the __slots__ declaration here too!
|
||||||
|
__slots__ = ()
|
||||||
|
|
||||||
|
@_immutable_init
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
if hasattr(cls, "__setstate__"):
|
||||||
|
|
||||||
|
@_immutable_init
|
||||||
|
def __setstate__(self, *args, **kwargs):
|
||||||
|
super().__setstate__(*args, **kwargs)
|
||||||
|
|
||||||
|
# make ncls have the same name and module as cls
|
||||||
|
ncls.__name__ = cls.__name__
|
||||||
|
ncls.__qualname__ = cls.__qualname__
|
||||||
|
ncls.__module__ = cls.__module__
|
||||||
|
return ncls
|
||||||
61
venv/Lib/site-packages/dns/_no_ssl.py
Normal file
61
venv/Lib/site-packages/dns/_no_ssl.py
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
import enum
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
CERT_NONE = 0
|
||||||
|
|
||||||
|
|
||||||
|
class TLSVersion(enum.IntEnum):
|
||||||
|
TLSv1_2 = 12
|
||||||
|
|
||||||
|
|
||||||
|
class WantReadException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class WantWriteException(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class SSLWantReadError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class SSLWantWriteError(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class SSLContext:
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.minimum_version: Any = TLSVersion.TLSv1_2
|
||||||
|
self.check_hostname: bool = False
|
||||||
|
self.verify_mode: int = CERT_NONE
|
||||||
|
|
||||||
|
def wrap_socket(self, *args, **kwargs) -> "SSLSocket": # type: ignore
|
||||||
|
raise Exception("no ssl support") # pylint: disable=broad-exception-raised
|
||||||
|
|
||||||
|
def set_alpn_protocols(self, *args, **kwargs): # type: ignore
|
||||||
|
raise Exception("no ssl support") # pylint: disable=broad-exception-raised
|
||||||
|
|
||||||
|
|
||||||
|
class SSLSocket:
|
||||||
|
def pending(self) -> bool:
|
||||||
|
raise Exception("no ssl support") # pylint: disable=broad-exception-raised
|
||||||
|
|
||||||
|
def do_handshake(self) -> None:
|
||||||
|
raise Exception("no ssl support") # pylint: disable=broad-exception-raised
|
||||||
|
|
||||||
|
def settimeout(self, value: Any) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def getpeercert(self) -> Any:
|
||||||
|
raise Exception("no ssl support") # pylint: disable=broad-exception-raised
|
||||||
|
|
||||||
|
def __enter__(self):
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def create_default_context(*args, **kwargs) -> SSLContext: # type: ignore
|
||||||
|
raise Exception("no ssl support") # pylint: disable=broad-exception-raised
|
||||||
19
venv/Lib/site-packages/dns/_tls_util.py
Normal file
19
venv/Lib/site-packages/dns/_tls_util.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
|
||||||
|
|
||||||
|
import os
|
||||||
|
from typing import Tuple
|
||||||
|
|
||||||
|
|
||||||
|
def convert_verify_to_cafile_and_capath(
|
||||||
|
verify: bool | str,
|
||||||
|
) -> Tuple[str | None, str | None]:
|
||||||
|
cafile: str | None = None
|
||||||
|
capath: str | None = None
|
||||||
|
if isinstance(verify, str):
|
||||||
|
if os.path.isfile(verify):
|
||||||
|
cafile = verify
|
||||||
|
elif os.path.isdir(verify):
|
||||||
|
capath = verify
|
||||||
|
else:
|
||||||
|
raise ValueError("invalid verify string")
|
||||||
|
return cafile, capath
|
||||||
255
venv/Lib/site-packages/dns/_trio_backend.py
Normal file
255
venv/Lib/site-packages/dns/_trio_backend.py
Normal file
@@ -0,0 +1,255 @@
|
|||||||
|
# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
|
||||||
|
|
||||||
|
"""trio async I/O library query support"""
|
||||||
|
|
||||||
|
import socket
|
||||||
|
|
||||||
|
import trio
|
||||||
|
import trio.socket # type: ignore
|
||||||
|
|
||||||
|
import dns._asyncbackend
|
||||||
|
import dns._features
|
||||||
|
import dns.exception
|
||||||
|
import dns.inet
|
||||||
|
|
||||||
|
if not dns._features.have("trio"):
|
||||||
|
raise ImportError("trio not found or too old")
|
||||||
|
|
||||||
|
|
||||||
|
def _maybe_timeout(timeout):
|
||||||
|
if timeout is not None:
|
||||||
|
return trio.move_on_after(timeout)
|
||||||
|
else:
|
||||||
|
return dns._asyncbackend.NullContext()
|
||||||
|
|
||||||
|
|
||||||
|
# for brevity
|
||||||
|
_lltuple = dns.inet.low_level_address_tuple
|
||||||
|
|
||||||
|
# pylint: disable=redefined-outer-name
|
||||||
|
|
||||||
|
|
||||||
|
class DatagramSocket(dns._asyncbackend.DatagramSocket):
|
||||||
|
def __init__(self, sock):
|
||||||
|
super().__init__(sock.family, socket.SOCK_DGRAM)
|
||||||
|
self.socket = sock
|
||||||
|
|
||||||
|
async def sendto(self, what, destination, timeout):
|
||||||
|
with _maybe_timeout(timeout):
|
||||||
|
if destination is None:
|
||||||
|
return await self.socket.send(what)
|
||||||
|
else:
|
||||||
|
return await self.socket.sendto(what, destination)
|
||||||
|
raise dns.exception.Timeout(
|
||||||
|
timeout=timeout
|
||||||
|
) # pragma: no cover lgtm[py/unreachable-statement]
|
||||||
|
|
||||||
|
async def recvfrom(self, size, timeout):
|
||||||
|
with _maybe_timeout(timeout):
|
||||||
|
return await self.socket.recvfrom(size)
|
||||||
|
raise dns.exception.Timeout(timeout=timeout) # lgtm[py/unreachable-statement]
|
||||||
|
|
||||||
|
async def close(self):
|
||||||
|
self.socket.close()
|
||||||
|
|
||||||
|
async def getpeername(self):
|
||||||
|
return self.socket.getpeername()
|
||||||
|
|
||||||
|
async def getsockname(self):
|
||||||
|
return self.socket.getsockname()
|
||||||
|
|
||||||
|
async def getpeercert(self, timeout):
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
|
class StreamSocket(dns._asyncbackend.StreamSocket):
|
||||||
|
def __init__(self, family, stream, tls=False):
|
||||||
|
super().__init__(family, socket.SOCK_STREAM)
|
||||||
|
self.stream = stream
|
||||||
|
self.tls = tls
|
||||||
|
|
||||||
|
async def sendall(self, what, timeout):
|
||||||
|
with _maybe_timeout(timeout):
|
||||||
|
return await self.stream.send_all(what)
|
||||||
|
raise dns.exception.Timeout(timeout=timeout) # lgtm[py/unreachable-statement]
|
||||||
|
|
||||||
|
async def recv(self, size, timeout):
|
||||||
|
with _maybe_timeout(timeout):
|
||||||
|
return await self.stream.receive_some(size)
|
||||||
|
raise dns.exception.Timeout(timeout=timeout) # lgtm[py/unreachable-statement]
|
||||||
|
|
||||||
|
async def close(self):
|
||||||
|
await self.stream.aclose()
|
||||||
|
|
||||||
|
async def getpeername(self):
|
||||||
|
if self.tls:
|
||||||
|
return self.stream.transport_stream.socket.getpeername()
|
||||||
|
else:
|
||||||
|
return self.stream.socket.getpeername()
|
||||||
|
|
||||||
|
async def getsockname(self):
|
||||||
|
if self.tls:
|
||||||
|
return self.stream.transport_stream.socket.getsockname()
|
||||||
|
else:
|
||||||
|
return self.stream.socket.getsockname()
|
||||||
|
|
||||||
|
async def getpeercert(self, timeout):
|
||||||
|
if self.tls:
|
||||||
|
with _maybe_timeout(timeout):
|
||||||
|
await self.stream.do_handshake()
|
||||||
|
return self.stream.getpeercert()
|
||||||
|
else:
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
|
if dns._features.have("doh"):
|
||||||
|
import httpcore
|
||||||
|
import httpcore._backends.trio
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
_CoreAsyncNetworkBackend = httpcore.AsyncNetworkBackend
|
||||||
|
_CoreTrioStream = httpcore._backends.trio.TrioStream
|
||||||
|
|
||||||
|
from dns.query import _compute_times, _expiration_for_this_attempt, _remaining
|
||||||
|
|
||||||
|
class _NetworkBackend(_CoreAsyncNetworkBackend):
|
||||||
|
def __init__(self, resolver, local_port, bootstrap_address, family):
|
||||||
|
super().__init__()
|
||||||
|
self._local_port = local_port
|
||||||
|
self._resolver = resolver
|
||||||
|
self._bootstrap_address = bootstrap_address
|
||||||
|
self._family = family
|
||||||
|
|
||||||
|
async def connect_tcp(
|
||||||
|
self, host, port, timeout=None, local_address=None, socket_options=None
|
||||||
|
): # pylint: disable=signature-differs
|
||||||
|
addresses = []
|
||||||
|
_, expiration = _compute_times(timeout)
|
||||||
|
if dns.inet.is_address(host):
|
||||||
|
addresses.append(host)
|
||||||
|
elif self._bootstrap_address is not None:
|
||||||
|
addresses.append(self._bootstrap_address)
|
||||||
|
else:
|
||||||
|
timeout = _remaining(expiration)
|
||||||
|
family = self._family
|
||||||
|
if local_address:
|
||||||
|
family = dns.inet.af_for_address(local_address)
|
||||||
|
answers = await self._resolver.resolve_name(
|
||||||
|
host, family=family, lifetime=timeout
|
||||||
|
)
|
||||||
|
addresses = answers.addresses()
|
||||||
|
for address in addresses:
|
||||||
|
try:
|
||||||
|
af = dns.inet.af_for_address(address)
|
||||||
|
if local_address is not None or self._local_port != 0:
|
||||||
|
source = (local_address, self._local_port)
|
||||||
|
else:
|
||||||
|
source = None
|
||||||
|
destination = (address, port)
|
||||||
|
attempt_expiration = _expiration_for_this_attempt(2.0, expiration)
|
||||||
|
timeout = _remaining(attempt_expiration)
|
||||||
|
sock = await Backend().make_socket(
|
||||||
|
af, socket.SOCK_STREAM, 0, source, destination, timeout
|
||||||
|
)
|
||||||
|
assert isinstance(sock, StreamSocket)
|
||||||
|
return _CoreTrioStream(sock.stream)
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
raise httpcore.ConnectError
|
||||||
|
|
||||||
|
async def connect_unix_socket(
|
||||||
|
self, path, timeout=None, socket_options=None
|
||||||
|
): # pylint: disable=signature-differs
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
async def sleep(self, seconds): # pylint: disable=signature-differs
|
||||||
|
await trio.sleep(seconds)
|
||||||
|
|
||||||
|
class _HTTPTransport(httpx.AsyncHTTPTransport):
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
*args,
|
||||||
|
local_port=0,
|
||||||
|
bootstrap_address=None,
|
||||||
|
resolver=None,
|
||||||
|
family=socket.AF_UNSPEC,
|
||||||
|
**kwargs,
|
||||||
|
):
|
||||||
|
if resolver is None and bootstrap_address is None:
|
||||||
|
# pylint: disable=import-outside-toplevel,redefined-outer-name
|
||||||
|
import dns.asyncresolver
|
||||||
|
|
||||||
|
resolver = dns.asyncresolver.Resolver()
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self._pool._network_backend = _NetworkBackend(
|
||||||
|
resolver, local_port, bootstrap_address, family
|
||||||
|
)
|
||||||
|
|
||||||
|
else:
|
||||||
|
_HTTPTransport = dns._asyncbackend.NullTransport # type: ignore
|
||||||
|
|
||||||
|
|
||||||
|
class Backend(dns._asyncbackend.Backend):
|
||||||
|
def name(self):
|
||||||
|
return "trio"
|
||||||
|
|
||||||
|
async def make_socket(
|
||||||
|
self,
|
||||||
|
af,
|
||||||
|
socktype,
|
||||||
|
proto=0,
|
||||||
|
source=None,
|
||||||
|
destination=None,
|
||||||
|
timeout=None,
|
||||||
|
ssl_context=None,
|
||||||
|
server_hostname=None,
|
||||||
|
):
|
||||||
|
s = trio.socket.socket(af, socktype, proto)
|
||||||
|
stream = None
|
||||||
|
try:
|
||||||
|
if source:
|
||||||
|
await s.bind(_lltuple(source, af))
|
||||||
|
if socktype == socket.SOCK_STREAM or destination is not None:
|
||||||
|
connected = False
|
||||||
|
with _maybe_timeout(timeout):
|
||||||
|
assert destination is not None
|
||||||
|
await s.connect(_lltuple(destination, af))
|
||||||
|
connected = True
|
||||||
|
if not connected:
|
||||||
|
raise dns.exception.Timeout(
|
||||||
|
timeout=timeout
|
||||||
|
) # lgtm[py/unreachable-statement]
|
||||||
|
except Exception: # pragma: no cover
|
||||||
|
s.close()
|
||||||
|
raise
|
||||||
|
if socktype == socket.SOCK_DGRAM:
|
||||||
|
return DatagramSocket(s)
|
||||||
|
elif socktype == socket.SOCK_STREAM:
|
||||||
|
stream = trio.SocketStream(s)
|
||||||
|
tls = False
|
||||||
|
if ssl_context:
|
||||||
|
tls = True
|
||||||
|
try:
|
||||||
|
stream = trio.SSLStream(
|
||||||
|
stream, ssl_context, server_hostname=server_hostname
|
||||||
|
)
|
||||||
|
except Exception: # pragma: no cover
|
||||||
|
await stream.aclose()
|
||||||
|
raise
|
||||||
|
return StreamSocket(af, stream, tls)
|
||||||
|
raise NotImplementedError(
|
||||||
|
"unsupported socket " + f"type {socktype}"
|
||||||
|
) # pragma: no cover
|
||||||
|
|
||||||
|
async def sleep(self, interval):
|
||||||
|
await trio.sleep(interval)
|
||||||
|
|
||||||
|
def get_transport_class(self):
|
||||||
|
return _HTTPTransport
|
||||||
|
|
||||||
|
async def wait_for(self, awaitable, timeout):
|
||||||
|
with _maybe_timeout(timeout):
|
||||||
|
return await awaitable
|
||||||
|
raise dns.exception.Timeout(
|
||||||
|
timeout=timeout
|
||||||
|
) # pragma: no cover lgtm[py/unreachable-statement]
|
||||||
101
venv/Lib/site-packages/dns/asyncbackend.py
Normal file
101
venv/Lib/site-packages/dns/asyncbackend.py
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
# Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license
|
||||||
|
|
||||||
|
from typing import Dict
|
||||||
|
|
||||||
|
import dns.exception
|
||||||
|
|
||||||
|
# pylint: disable=unused-import
|
||||||
|
from dns._asyncbackend import ( # noqa: F401 lgtm[py/unused-import]
|
||||||
|
Backend,
|
||||||
|
DatagramSocket,
|
||||||
|
Socket,
|
||||||
|
StreamSocket,
|
||||||
|
)
|
||||||
|
|
||||||
|
# pylint: enable=unused-import
|
||||||
|
|
||||||
|
_default_backend = None
|
||||||
|
|
||||||
|
_backends: Dict[str, Backend] = {}
|
||||||
|
|
||||||
|
# Allow sniffio import to be disabled for testing purposes
|
||||||
|
_no_sniffio = False
|
||||||
|
|
||||||
|
|
||||||
|
class AsyncLibraryNotFoundError(dns.exception.DNSException):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def get_backend(name: str) -> Backend:
|
||||||
|
"""Get the specified asynchronous backend.
|
||||||
|
|
||||||
|
*name*, a ``str``, the name of the backend. Currently the "trio"
|
||||||
|
and "asyncio" backends are available.
|
||||||
|
|
||||||
|
Raises NotImplementedError if an unknown backend name is specified.
|
||||||
|
"""
|
||||||
|
# pylint: disable=import-outside-toplevel,redefined-outer-name
|
||||||
|
backend = _backends.get(name)
|
||||||
|
if backend:
|
||||||
|
return backend
|
||||||
|
if name == "trio":
|
||||||
|
import dns._trio_backend
|
||||||
|
|
||||||
|
backend = dns._trio_backend.Backend()
|
||||||
|
elif name == "asyncio":
|
||||||
|
import dns._asyncio_backend
|
||||||
|
|
||||||
|
backend = dns._asyncio_backend.Backend()
|
||||||
|
else:
|
||||||
|
raise NotImplementedError(f"unimplemented async backend {name}")
|
||||||
|
_backends[name] = backend
|
||||||
|
return backend
|
||||||
|
|
||||||
|
|
||||||
|
def sniff() -> str:
|
||||||
|
"""Attempt to determine the in-use asynchronous I/O library by using
|
||||||
|
the ``sniffio`` module if it is available.
|
||||||
|
|
||||||
|
Returns the name of the library, or raises AsyncLibraryNotFoundError
|
||||||
|
if the library cannot be determined.
|
||||||
|
"""
|
||||||
|
# pylint: disable=import-outside-toplevel
|
||||||
|
try:
|
||||||
|
if _no_sniffio:
|
||||||
|
raise ImportError
|
||||||
|
import sniffio
|
||||||
|
|
||||||
|
try:
|
||||||
|
return sniffio.current_async_library()
|
||||||
|
except sniffio.AsyncLibraryNotFoundError:
|
||||||
|
raise AsyncLibraryNotFoundError("sniffio cannot determine async library")
|
||||||
|
except ImportError:
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
try:
|
||||||
|
asyncio.get_running_loop()
|
||||||
|
return "asyncio"
|
||||||
|
except RuntimeError:
|
||||||
|
raise AsyncLibraryNotFoundError("no async library detected")
|
||||||
|
|
||||||
|
|
||||||
|
def get_default_backend() -> Backend:
|
||||||
|
"""Get the default backend, initializing it if necessary."""
|
||||||
|
if _default_backend:
|
||||||
|
return _default_backend
|
||||||
|
|
||||||
|
return set_default_backend(sniff())
|
||||||
|
|
||||||
|
|
||||||
|
def set_default_backend(name: str) -> Backend:
|
||||||
|
"""Set the default backend.
|
||||||
|
|
||||||
|
It's not normally necessary to call this method, as
|
||||||
|
``get_default_backend()`` will initialize the backend
|
||||||
|
appropriately in many cases. If ``sniffio`` is not installed, or
|
||||||
|
in testing situations, this function allows the backend to be set
|
||||||
|
explicitly.
|
||||||
|
"""
|
||||||
|
global _default_backend
|
||||||
|
_default_backend = get_backend(name)
|
||||||
|
return _default_backend
|
||||||
Reference in New Issue
Block a user