diff --git a/electrum/dns_hacks.py b/electrum/dns_hacks.py index c26a010ff..707847a0b 100644 --- a/electrum/dns_hacks.py +++ b/electrum/dns_hacks.py @@ -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(): diff --git a/electrum/network.py b/electrum/network.py index f8c76063e..2d2f255cc 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -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 diff --git a/electrum/util.py b/electrum/util.py index dac3a84c3..ab0626646 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -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()