diff --git a/electrum/interface.py b/electrum/interface.py index 50949a908..298ec0809 100644 --- a/electrum/interface.py +++ b/electrum/interface.py @@ -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. diff --git a/electrum/util.py b/electrum/util.py index eaf584792..4c30d681c 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -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