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]
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():

2
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

4
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()

Loading…
Cancel
Save