network: disconnected servers: do not filter out bookmarked raw ":t"
In the GUI, when displaying the list of disconnected servers, we were filtering to only ":s" servers. Instead now we also show ":t" servers if they are bookmarked. Also, if bookmarked, we also show disconnected .onion servers, even when not using a Tor proxy. fixes https://github.com/spesmilo/electrum/issues/10374
This commit is contained in:
@@ -118,7 +118,7 @@ class QEServerListModel(QAbstractListModel, QtEventListener):
|
||||
'height': 0,
|
||||
'is_primary': False,
|
||||
'is_connected': False,
|
||||
'name': s.net_addr_str()
|
||||
'name': s.to_friendly_name()
|
||||
}
|
||||
server['address'] = server['name']
|
||||
|
||||
|
||||
@@ -183,7 +183,7 @@ class NodesListWidget(QTreeWidget):
|
||||
disconnected_servers_item = QTreeWidgetItem([_("Other known servers"), ""])
|
||||
disconnected_servers_item.setData(0, self.ITEMTYPE_ROLE, self.ItemType.TOPLEVEL)
|
||||
for server in network.get_disconnected_server_addrs():
|
||||
item = QTreeWidgetItem([server.net_addr_str(), ""])
|
||||
item = QTreeWidgetItem([server.to_friendly_name(), ""])
|
||||
item.setData(0, self.ITEMTYPE_ROLE, self.ItemType.DISCONNECTED_SERVER)
|
||||
item.setData(0, self.SERVER_ADDR_ROLE, server)
|
||||
if network.is_server_bookmarked(server):
|
||||
|
||||
@@ -75,9 +75,9 @@ ca_path = certifi.where()
|
||||
|
||||
BUCKET_NAME_OF_ONION_SERVERS = 'onion'
|
||||
|
||||
_KNOWN_NETWORK_PROTOCOLS = {'t', 's'}
|
||||
KNOWN_ELEC_PROTOCOL_TRANSPORTS = {'t', 's'}
|
||||
PREFERRED_NETWORK_PROTOCOL = 's'
|
||||
assert PREFERRED_NETWORK_PROTOCOL in _KNOWN_NETWORK_PROTOCOLS
|
||||
assert PREFERRED_NETWORK_PROTOCOL in KNOWN_ELEC_PROTOCOL_TRANSPORTS
|
||||
|
||||
MAX_NUM_HEADERS_PER_REQUEST = 2016
|
||||
assert MAX_NUM_HEADERS_PER_REQUEST >= CHUNK_SIZE
|
||||
@@ -462,7 +462,7 @@ class ServerAddr:
|
||||
net_addr = NetAddress(host, port) # this validates host and port
|
||||
except Exception as e:
|
||||
raise ValueError(f"cannot construct ServerAddr: invalid host or port (host={host}, port={port})") from e
|
||||
if protocol not in _KNOWN_NETWORK_PROTOCOLS:
|
||||
if protocol not in KNOWN_ELEC_PROTOCOL_TRANSPORTS:
|
||||
raise ValueError(f"invalid network protocol: {protocol}")
|
||||
self.host = str(net_addr.host) # canonical form (if e.g. IPv6 address)
|
||||
self.port = int(net_addr.port)
|
||||
|
||||
@@ -53,7 +53,7 @@ from .transaction import Transaction
|
||||
from .blockchain import Blockchain
|
||||
from .interface import (
|
||||
Interface, PREFERRED_NETWORK_PROTOCOL, RequestTimedOut, NetworkTimeout, BUCKET_NAME_OF_ONION_SERVERS,
|
||||
NetworkException, RequestCorrupted, ServerAddr, TxBroadcastError,
|
||||
NetworkException, RequestCorrupted, ServerAddr, TxBroadcastError, KNOWN_ELEC_PROTOCOL_TRANSPORTS,
|
||||
)
|
||||
from .version import PROTOCOL_VERSION_MIN
|
||||
from .i18n import _
|
||||
@@ -660,21 +660,27 @@ class Network(Logger, NetworkRetryManager[ServerAddr]):
|
||||
return out
|
||||
|
||||
def get_disconnected_server_addrs(self) -> Sequence[ServerAddr]:
|
||||
servers = self.get_servers()
|
||||
hostmap = self.get_servers()
|
||||
disconnected_server_addrs = [] # type: List[ServerAddr]
|
||||
chains = self.get_blockchains()
|
||||
connected_hosts = set([iface.host for ifaces in chains.values() for iface in ifaces])
|
||||
protocol = PREFERRED_NETWORK_PROTOCOL
|
||||
server_addrs = [
|
||||
ServerAddr(_host, port, protocol=protocol)
|
||||
for _host, d in servers.items()
|
||||
if (port := d.get(protocol))] # FIXME this filters out even bookmarked servers from other protocols
|
||||
# convert hostmap to list of ServerAddrs (one-to-many mapping)
|
||||
server_addrs = []
|
||||
for host, portmap in hostmap.items():
|
||||
for protocol in KNOWN_ELEC_PROTOCOL_TRANSPORTS:
|
||||
if port := portmap.get(protocol):
|
||||
server_addrs.append(ServerAddr(host, port, protocol=protocol))
|
||||
# sort bookmarked servers to appear first
|
||||
server_addrs.sort(key=lambda x: (-self.is_server_bookmarked(x), str(x)))
|
||||
# filter out stuff
|
||||
for server in server_addrs:
|
||||
if server.host in connected_hosts:
|
||||
continue
|
||||
if server.host.endswith('.onion') and not self.is_proxy_tor:
|
||||
continue
|
||||
if not self.is_server_bookmarked(server):
|
||||
if server.protocol != PREFERRED_NETWORK_PROTOCOL:
|
||||
continue
|
||||
if server.host.endswith('.onion') and not self.is_proxy_tor:
|
||||
continue
|
||||
disconnected_server_addrs.append(server)
|
||||
return disconnected_server_addrs
|
||||
|
||||
|
||||
Reference in New Issue
Block a user