network: remove resolver monkey-patch as no local hostname lookups are performed when
enabling SOCKS5 proxy.
This commit is contained in:
@@ -20,30 +20,20 @@ _logger = get_logger(__name__)
|
||||
_dns_threads_executor = None # type: Optional[concurrent.futures.Executor]
|
||||
|
||||
|
||||
def configure_dns_depending_on_proxy(is_proxy: bool) -> None:
|
||||
def configure_dns_resolver() -> None:
|
||||
# Store this somewhere so we can un-monkey-patch:
|
||||
if not hasattr(socket, "_getaddrinfo"):
|
||||
socket._getaddrinfo = socket.getaddrinfo
|
||||
if is_proxy:
|
||||
# prevent dns leaks, see http://stackoverflow.com/questions/13184205/dns-over-proxy
|
||||
def getaddrinfo(host, port, *args, **kwargs):
|
||||
if _is_force_system_dns_for_host(host):
|
||||
return socket._getaddrinfo(host, port, *args, **kwargs)
|
||||
return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (host, port))]
|
||||
socket.getaddrinfo = getaddrinfo
|
||||
else:
|
||||
if sys.platform == 'win32':
|
||||
# On Windows, socket.getaddrinfo takes a mutex, and might hold it for up to 10 seconds
|
||||
# when dns-resolving. To speed it up drastically, we resolve dns ourselves, outside that lock.
|
||||
# See https://github.com/spesmilo/electrum/issues/4421
|
||||
try:
|
||||
_prepare_windows_dns_hack()
|
||||
except Exception as e:
|
||||
_logger.exception('failed to apply windows dns hack.')
|
||||
else:
|
||||
socket.getaddrinfo = _fast_getaddrinfo
|
||||
if sys.platform == 'win32':
|
||||
# On Windows, socket.getaddrinfo takes a mutex, and might hold it for up to 10 seconds
|
||||
# when dns-resolving. To speed it up drastically, we resolve dns ourselves, outside that lock.
|
||||
# See https://github.com/spesmilo/electrum/issues/4421
|
||||
try:
|
||||
_prepare_windows_dns_hack()
|
||||
except Exception as e:
|
||||
_logger.exception('failed to apply windows dns hack.')
|
||||
else:
|
||||
socket.getaddrinfo = socket._getaddrinfo
|
||||
socket.getaddrinfo = _fast_getaddrinfo
|
||||
|
||||
|
||||
def _prepare_windows_dns_hack():
|
||||
|
||||
@@ -627,7 +627,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]):
|
||||
|
||||
def _set_proxy(self, proxy: Optional[dict]):
|
||||
self.proxy = proxy
|
||||
dns_hacks.configure_dns_depending_on_proxy(bool(proxy))
|
||||
dns_hacks.configure_dns_resolver()
|
||||
self.logger.info(f'setting proxy {proxy}')
|
||||
|
||||
self.tor_proxy = False
|
||||
|
||||
@@ -1268,7 +1268,7 @@ def make_aiohttp_session(proxy: Optional[dict], headers=None, timeout=None):
|
||||
port=int(proxy['port']),
|
||||
username=proxy.get('user', None),
|
||||
password=proxy.get('password', None),
|
||||
rdns=True,
|
||||
rdns=True, # needed to prevent DNS leaks over proxy
|
||||
ssl=ssl_context,
|
||||
)
|
||||
else:
|
||||
@@ -1885,6 +1885,8 @@ class NetworkRetryManager(Generic[_NetAddrType]):
|
||||
|
||||
|
||||
class MySocksProxy(aiorpcx.SOCKSProxy):
|
||||
# note: proxy will not leak DNS as create_connection()
|
||||
# sets (local DNS) resolve=False by default
|
||||
|
||||
async def open_connection(self, host=None, port=None, **kwargs):
|
||||
loop = asyncio.get_running_loop()
|
||||
|
||||
Reference in New Issue
Block a user