Skip to content

Commit 75f8d5f

Browse files
committed
network: extend existing connection modes to use a list of servers
The internal names of connection modes are unchanged: - auto-connect: behaviour unchanged - manual: choose history server within bookmarks. header nodes are not restricted - oneserver: choose history server and header nodes within bookmarks
1 parent 27599ac commit 75f8d5f

File tree

4 files changed

+130
-73
lines changed

4 files changed

+130
-73
lines changed

electrum/gui/messages.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,12 @@ def to_rtf(msg):
112112

113113

114114
MSG_CONNECTMODE_AUTOCONNECT = _('Auto-connect')
115-
MSG_CONNECTMODE_MANUAL = _('Manual server selection')
116-
MSG_CONNECTMODE_ONESERVER = _('Connect only to a single server')
115+
MSG_CONNECTMODE_MANUAL = _('Bookmarked servers')
116+
MSG_CONNECTMODE_ONESERVER = _('Bookmarked servers (strict)')
117117

118118
MSG_CONNECTMODE_SERVER_HELP = _(
119-
"Electrum connects to a unique server in order to receive your transaction history. "
119+
"This is the list of servers from wich Electrum may request your transaction history"
120+
"Electrum will pick one server from this list, with the longest blockchain. "
120121
"This server will learn your wallet adddresses."
121122
)
122123
MSG_CONNECTMODE_NODES_HELP = _(
@@ -132,12 +133,13 @@ def to_rtf(msg):
132133
)
133134

134135
MSG_CONNECTMODE_MANUAL_HELP = _(
135-
"Electrum will stay with the server you selected. It will warn you if your server is lagging."
136+
"Electrum will use the servers you selected in order to request your wallet history. "
137+
"It will connect to other nodes for block headers and warn you if your server is lagging."
136138
)
137139

138140
MSG_CONNECTMODE_ONESERVER_HELP = _(
139-
"Electrum will stay with the server you selected, and it will not connect to additional nodes. "
141+
"Electrum will use the servers you selected inorder to request your history, and it will not connect to additional nodes. "
140142
"This will disable fork detection. "
141-
"This mode is only intended for connecting to your own fully trusted server. "
142-
"Using this option on a public server is a security risk and is discouraged."
143+
"This mode is only intended for connecting to a set of fully trusted server. "
144+
"Using this option on a single public server is a security risk and is discouraged."
143145
)

electrum/gui/qt/network_dialog.py

Lines changed: 49 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ class ItemType(IntEnum):
8787
DISCONNECTED_SERVER = 2
8888
TOPLEVEL = 3
8989

90-
followServer = pyqtSignal([ServerAddr], arguments=['server'])
9190
followChain = pyqtSignal([str], arguments=['chain_id'])
9291
setServer = pyqtSignal([str], arguments=['server'])
92+
setBookmark = pyqtSignal([ServerAddr, bool])
9393

9494
def __init__(self, *, network: Network):
9595
QTreeWidget.__init__(self)
@@ -106,23 +106,18 @@ def create_menu(self, position):
106106
menu = QMenu()
107107
if item_type in [self.ItemType.CONNECTED_SERVER, self.ItemType.DISCONNECTED_SERVER]:
108108
server = item.data(0, self.SERVER_ADDR_ROLE) # type: ServerAddr
109-
if item_type == self.ItemType.CONNECTED_SERVER:
110-
def do_follow_server():
111-
self.followServer.emit(server)
112-
menu.addAction(read_QIcon("chevron-right.png"), _("Use as server"), do_follow_server)
113-
elif item_type == self.ItemType.DISCONNECTED_SERVER:
109+
110+
if self.network.auto_connect or self.network.is_server_bookmarked(server):
114111
def do_set_server():
115112
self.setServer.emit(str(server))
116113
menu.addAction(read_QIcon("chevron-right.png"), _("Use as server"), do_set_server)
117114

118-
def set_bookmark(*, add: bool):
119-
self.network.set_server_bookmark(server, add=add)
120-
self.update()
121-
115+
def do_set_bookmark(*, add: bool):
116+
self.setBookmark.emit(server, add)
122117
if self.network.is_server_bookmarked(server):
123-
menu.addAction(read_QIcon("bookmark_remove.png"), _("Remove from bookmarks"), lambda: set_bookmark(add=False))
118+
menu.addAction(read_QIcon("bookmark_remove.png"), _("Remove from bookmarks"), lambda: do_set_bookmark(add=False))
124119
else:
125-
menu.addAction(read_QIcon("bookmark_add.png"), _("Bookmark this server"), lambda: set_bookmark(add=True))
120+
menu.addAction(read_QIcon("bookmark_add.png"), _("Bookmark this server"), lambda: do_set_bookmark(add=True))
126121
elif item_type == self.ItemType.CHAIN:
127122
chain_id = item.data(0, self.CHAIN_ID_ROLE)
128123

@@ -404,7 +399,7 @@ def __init__(self, network: Network, parent=None):
404399
grid.addWidget(self.connect_combo, 0, 1, 1, 3)
405400

406401
self.server_e = QLineEdit()
407-
self.server_e.editingFinished.connect(self.on_server_settings_changed)
402+
self.server_e.editingFinished.connect(self.on_server_edited)
408403
grid.addWidget(QLabel(_('Server') + ':'), 1, 0)
409404
grid.addWidget(self.server_e, 1, 1, 1, 3)
410405
grid.addWidget(HelpButton(messages.MSG_CONNECTMODE_SERVER_HELP), 1, 4)
@@ -430,13 +425,10 @@ def __init__(self, network: Network, parent=None):
430425
self.layout().addLayout(grid)
431426

432427
self.nodes_list_widget = NodesListWidget(network=self.network)
433-
self.nodes_list_widget.followServer.connect(self.follow_server)
434428
self.nodes_list_widget.followChain.connect(self.follow_branch)
429+
self.nodes_list_widget.setBookmark.connect(self.set_bookmark)
435430

436-
def do_set_server(server):
437-
self.server_e.setText(server)
438-
self.set_server()
439-
self.nodes_list_widget.setServer.connect(do_set_server)
431+
self.nodes_list_widget.setServer.connect(self.set_server)
440432

441433
self.layout().addWidget(self.nodes_list_widget)
442434
self.nodes_list_widget.update()
@@ -462,10 +454,9 @@ def on_server_settings_changed(self):
462454
if not self.network._was_started:
463455
self.update()
464456
return
465-
server = self.server_e.text().strip()
466457
net_params = self.network.get_parameters()
467-
if server != net_params.server or self.is_auto_connect() != net_params.auto_connect or self.is_one_server() != net_params.oneserver:
468-
self.set_server()
458+
if self.is_auto_connect() != net_params.auto_connect or self.is_one_server() != net_params.oneserver:
459+
self.set_params()
469460

470461
def update(self):
471462
self.server_e.setEnabled(self.config.cv.NETWORK_SERVER.is_modifiable() and not self.is_auto_connect())
@@ -493,15 +484,19 @@ def update(self):
493484
msg += _('Your server is on branch {0} ({1} blocks)').format(name, chain.get_branch_size())
494485
self.split_label.setText(msg)
495486

487+
def update_server_edit(self):
488+
self.server_e.setText(str(self.network.default_server) if self.network.default_server else '')
489+
490+
@qt_event_listener
491+
def on_event_default_server_changed(self):
492+
self.update_server_edit()
493+
496494
def update_from_config(self):
497495
auto_connect = self.config.NETWORK_AUTO_CONNECT
498496
one_server = self.config.NETWORK_ONESERVER
499497
v = ConnectMode.AUTOCONNECT if auto_connect else ConnectMode.ONESERVER if one_server else ConnectMode.MANUAL
500498
self.connect_combo.setCurrentIndex(v)
501-
502-
server = self.config.NETWORK_SERVER
503-
self.server_e.setText(server)
504-
499+
self.update_server_edit()
505500
self.server_e.setEnabled(self.config.cv.NETWORK_SERVER.is_modifiable() and not auto_connect)
506501
self.nodes_list_widget.setEnabled(self.config.cv.NETWORK_SERVER.is_modifiable())
507502

@@ -514,16 +509,41 @@ def follow_server(self, server: ServerAddr):
514509
self.network.run_from_another_thread(self.network.follow_chain_given_server(server))
515510
self.update()
516511

517-
def set_server(self):
518-
net_params = self.network.get_parameters()
512+
def on_server_edited(self):
513+
try:
514+
server = ServerAddr.from_str_with_inference(self.server_e.text())
515+
if not server:
516+
raise Exception("failed to parse server")
517+
except Exception as e:
518+
print(f'exception {e}')
519+
self.server_e.setText('')
520+
return
521+
#if self.parent.question('add bookmark?'):
522+
# ask whether we want to bookmark it
523+
print('adding bookmark')
524+
self.set_bookmark(server, add=True)
525+
self.set_server(str(server))
526+
527+
def set_bookmark(self, server, add: bool):
528+
self.network.set_server_bookmark(server, add=add)
529+
self.nodes_list_widget.update()
530+
self.update()
531+
532+
def set_server(self, server_str: str):
533+
# if autoconnect, simply follow that server
534+
# in other modes too; the server must be bookmarked
519535
try:
520-
server = ServerAddr.from_str_with_inference(str(self.server_e.text()))
536+
server = ServerAddr.from_str_with_inference(server_str)
521537
if not server:
522538
raise Exception("failed to parse server")
523539
except Exception:
524540
return
541+
self.network.run_from_another_thread(self.network.switch_to_interface(server))
542+
self.update()
543+
544+
def set_params(self):
545+
net_params = self.network.get_parameters()
525546
net_params = net_params._replace(
526-
server=server,
527547
auto_connect=self.is_auto_connect(),
528548
oneserver=self.is_one_server(),
529549
)

0 commit comments

Comments
 (0)