1
0

interface: bypass proxy for servers on localhost

closes https://github.com/spesmilo/electrum/issues/3126
closes https://github.com/spesmilo/electrum/issues/7256

I am unsure if this would be safe to do for the more general "server running on private ip" case,
so this is restricted to localhost only atm.
This commit is contained in:
SomberNight
2022-05-16 22:24:07 +02:00
parent 3cc6c0dd2d
commit d7678e14b5
2 changed files with 23 additions and 2 deletions

View File

@@ -372,9 +372,17 @@ class Interface(Logger):
self.blockchain = None # type: Optional[Blockchain]
self._requested_chunks = set() # type: Set[int]
self.network = network
self.proxy = MySocksProxy.from_proxy_dict(proxy)
self.session = None # type: Optional[NotificationSession]
self._ipaddr_bucket = None
# Set up proxy.
# - for servers running on localhost, the proxy is not used. If user runs their own server
# on same machine, this lets them enable the proxy (which is used for e.g. FX rates).
# note: we could maybe relax this further and bypass the proxy for all private
# addresses...? e.g. 192.168.x.x
if util.is_localhost(server.host):
self.logger.info(f"looks like localhost: not using proxy for this server")
proxy = None
self.proxy = MySocksProxy.from_proxy_dict(proxy)
# Latest block header and corresponding height, as claimed by the server.
# Note that these values are updated before they are verified.

View File

@@ -1529,11 +1529,24 @@ def is_ip_address(x: Union[str, bytes]) -> bool:
return False
def is_private_netaddress(host: str) -> bool:
def is_localhost(host: str) -> bool:
if str(host) in ('localhost', 'localhost.',):
return True
if host[0] == '[' and host[-1] == ']': # IPv6
host = host[1:-1]
try:
ip_addr = ipaddress.ip_address(host) # type: Union[IPv4Address, IPv6Address]
return ip_addr.is_loopback
except ValueError:
pass # not an IP
return False
def is_private_netaddress(host: str) -> bool:
if is_localhost(host):
return True
if host[0] == '[' and host[-1] == ']': # IPv6
host = host[1:-1]
try:
ip_addr = ipaddress.ip_address(host) # type: Union[IPv4Address, IPv6Address]
return ip_addr.is_private