Browse Source

network: remove resolver monkey-patch as no local hostname lookups are performed when

enabling SOCKS5 proxy.
master
Sander van Grieken 2 years ago
parent
commit
297568a148
No known key found for this signature in database
GPG Key ID: 9BCF8209EA402EBA
  1. 30
      electrum/dns_hacks.py
  2. 2
      electrum/network.py
  3. 4
      electrum/util.py

30
electrum/dns_hacks.py

@ -20,30 +20,20 @@ _logger = get_logger(__name__)
_dns_threads_executor = None # type: Optional[concurrent.futures.Executor] _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: # Store this somewhere so we can un-monkey-patch:
if not hasattr(socket, "_getaddrinfo"): if not hasattr(socket, "_getaddrinfo"):
socket._getaddrinfo = socket.getaddrinfo socket._getaddrinfo = socket.getaddrinfo
if is_proxy: if sys.platform == 'win32':
# prevent dns leaks, see http://stackoverflow.com/questions/13184205/dns-over-proxy # On Windows, socket.getaddrinfo takes a mutex, and might hold it for up to 10 seconds
def getaddrinfo(host, port, *args, **kwargs): # when dns-resolving. To speed it up drastically, we resolve dns ourselves, outside that lock.
if _is_force_system_dns_for_host(host): # See https://github.com/spesmilo/electrum/issues/4421
return socket._getaddrinfo(host, port, *args, **kwargs) try:
return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (host, port))] _prepare_windows_dns_hack()
socket.getaddrinfo = getaddrinfo except Exception as e:
else: _logger.exception('failed to apply windows dns hack.')
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
else: else:
socket.getaddrinfo = socket._getaddrinfo socket.getaddrinfo = _fast_getaddrinfo
def _prepare_windows_dns_hack(): def _prepare_windows_dns_hack():

2
electrum/network.py

@ -627,7 +627,7 @@ class Network(Logger, NetworkRetryManager[ServerAddr]):
def _set_proxy(self, proxy: Optional[dict]): def _set_proxy(self, proxy: Optional[dict]):
self.proxy = proxy 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.logger.info(f'setting proxy {proxy}')
self.tor_proxy = False self.tor_proxy = False

4
electrum/util.py

@ -1268,7 +1268,7 @@ def make_aiohttp_session(proxy: Optional[dict], headers=None, timeout=None):
port=int(proxy['port']), port=int(proxy['port']),
username=proxy.get('user', None), username=proxy.get('user', None),
password=proxy.get('password', None), password=proxy.get('password', None),
rdns=True, rdns=True, # needed to prevent DNS leaks over proxy
ssl=ssl_context, ssl=ssl_context,
) )
else: else:
@ -1885,6 +1885,8 @@ class NetworkRetryManager(Generic[_NetAddrType]):
class MySocksProxy(aiorpcx.SOCKSProxy): 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): async def open_connection(self, host=None, port=None, **kwargs):
loop = asyncio.get_running_loop() loop = asyncio.get_running_loop()

Loading…
Cancel
Save