Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions electrum/gui/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,12 @@ def to_rtf(msg):


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

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

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

MSG_CONNECTMODE_ONESERVER_HELP = _(
"Electrum will stay with the server you selected, and it will not connect to additional nodes. "
"Electrum will use the servers you selected inorder to request your history, and it will not connect to additional nodes. "
"This will disable fork detection. "
"This mode is only intended for connecting to your own fully trusted server. "
"Using this option on a public server is a security risk and is discouraged."
"This mode is only intended for connecting to a set of fully trusted server. "
"Using this option on a single public server is a security risk and is discouraged."
)
5 changes: 3 additions & 2 deletions electrum/gui/qml/components/ServerConfigDialog.qml
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,10 @@ ElDialog {
icon.source: '../../icons/confirmed.png'
onClicked: {
let auto_connect = serverconfig.serverConnectMode == ServerConnectModeComboBox.Mode.Autoconnect
let server = serverconfig.address
let one_server = serverconfig.serverConnectMode == ServerConnectModeComboBox.Mode.Single
Network.setServerParameters(server, auto_connect, one_server)
Network.setParameters(auto_connect, one_server)
let server = serverconfig.address
Network.setBookmark(server, true)
rootItem.close()
}
}
Expand Down
30 changes: 16 additions & 14 deletions electrum/gui/qml/qenetwork.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ def on_event_tor_probed(self, *args):
self.proxyTorChanged.emit()

def _update_status(self):
server = str(self.network.get_parameters().server)
server = str(self.network.default_server)
if self._server != server:
self._server = server
self.statusChanged.emit()
Expand Down Expand Up @@ -198,27 +198,29 @@ def autoConnectDefined(self):
def server(self):
return self._server

@pyqtSlot(str, bool, bool)
def setServerParameters(self, server: str, auto_connect: bool, one_server: bool):
@pyqtSlot(bool, bool)
def setParameters(self, auto_connect: bool, one_server: bool):
net_params = self.network.get_parameters()
if server == net_params.server and auto_connect == net_params.auto_connect and one_server == net_params.oneserver:
if auto_connect == net_params.auto_connect and one_server == net_params.oneserver:
return
if server != str(net_params.server):
try:
server = ServerAddr.from_str_with_inference(server)
if not server:
raise Exception('failed to parse')
except Exception:
if not auto_connect:
return
server = net_params.server
self.statusChanged.emit()
if auto_connect != net_params.auto_connect:
self.network.config.NETWORK_AUTO_CONNECT = auto_connect
self.autoConnectChanged.emit()
net_params = net_params._replace(server=server, auto_connect=auto_connect, oneserver=one_server)
self.network.run_from_another_thread(self.network.set_parameters(net_params))

@pyqtSlot(str, bool)
def setBookmark(self, server: str, add: bool):
try:
server = ServerAddr.from_str_with_inference(server)
if not server:
raise Exception('failed to parse')
except Exception:
print('failed to parse')
return
self.network.set_server_bookmark(server, add=add)
self.statusChanged.emit()

@pyqtProperty(str, notify=statusChanged)
def serverWithStatus(self):
server = self._server
Expand Down
61 changes: 35 additions & 26 deletions electrum/gui/qt/network_dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ class ItemType(IntEnum):

followServer = pyqtSignal([ServerAddr], arguments=['server'])
followChain = pyqtSignal([str], arguments=['chain_id'])
setServer = pyqtSignal([str], arguments=['server'])
setBookmark = pyqtSignal([ServerAddr, bool], arguments=['server', 'add'])

def __init__(self, *, network: Network):
QTreeWidget.__init__(self)
Expand All @@ -106,19 +106,12 @@ def create_menu(self, position):
menu = QMenu()
if item_type in [self.ItemType.CONNECTED_SERVER, self.ItemType.DISCONNECTED_SERVER]:
server = item.data(0, self.SERVER_ADDR_ROLE) # type: ServerAddr
if item_type == self.ItemType.CONNECTED_SERVER:
if self.network.auto_connect or self.network.is_server_bookmarked(server):
def do_follow_server():
self.followServer.emit(server)
menu.addAction(read_QIcon("chevron-right.png"), _("Use as server"), do_follow_server)
elif item_type == self.ItemType.DISCONNECTED_SERVER:
def do_set_server():
self.setServer.emit(str(server))
menu.addAction(read_QIcon("chevron-right.png"), _("Use as server"), do_set_server)

def set_bookmark(*, add: bool):
self.network.set_server_bookmark(server, add=add)
self.update()

self.setBookmark.emit(server, add)
if self.network.is_server_bookmarked(server):
menu.addAction(read_QIcon("bookmark_remove.png"), _("Remove from bookmarks"), lambda: set_bookmark(add=False))
else:
Expand Down Expand Up @@ -404,7 +397,7 @@ def __init__(self, network: Network, parent=None):
grid.addWidget(self.connect_combo, 0, 1, 1, 3)

self.server_e = QLineEdit()
self.server_e.editingFinished.connect(self.on_server_settings_changed)
self.server_e.editingFinished.connect(self.on_server_edited)
grid.addWidget(QLabel(_('Server') + ':'), 1, 0)
grid.addWidget(self.server_e, 1, 1, 1, 3)
grid.addWidget(HelpButton(messages.MSG_CONNECTMODE_SERVER_HELP), 1, 4)
Expand Down Expand Up @@ -432,11 +425,7 @@ def __init__(self, network: Network, parent=None):
self.nodes_list_widget = NodesListWidget(network=self.network)
self.nodes_list_widget.followServer.connect(self.follow_server)
self.nodes_list_widget.followChain.connect(self.follow_branch)

def do_set_server(server):
self.server_e.setText(server)
self.set_server()
self.nodes_list_widget.setServer.connect(do_set_server)
self.nodes_list_widget.setBookmark.connect(self.set_bookmark)

self.layout().addWidget(self.nodes_list_widget)
self.nodes_list_widget.update()
Expand All @@ -462,10 +451,9 @@ def on_server_settings_changed(self):
if not self.network._was_started:
self.update()
return
server = self.server_e.text().strip()
net_params = self.network.get_parameters()
if server != net_params.server or self.is_auto_connect() != net_params.auto_connect or self.is_one_server() != net_params.oneserver:
self.set_server()
if self.is_auto_connect() != net_params.auto_connect or self.is_one_server() != net_params.oneserver:
self.set_params()

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

def update_server_edit(self):
self.server_e.setText(str(self.network.default_server) if self.network.default_server else '')

@qt_event_listener
def on_event_default_server_changed(self):
self.update_server_edit()

def update_from_config(self):
auto_connect = self.config.NETWORK_AUTO_CONNECT
one_server = self.config.NETWORK_ONESERVER
v = ConnectMode.AUTOCONNECT if auto_connect else ConnectMode.ONESERVER if one_server else ConnectMode.MANUAL
self.connect_combo.setCurrentIndex(v)

server = self.config.NETWORK_SERVER
self.server_e.setText(server)

self.update_server_edit()
self.server_e.setEnabled(self.config.cv.NETWORK_SERVER.is_modifiable() and not auto_connect)
self.nodes_list_widget.setEnabled(self.config.cv.NETWORK_SERVER.is_modifiable())

Expand All @@ -514,16 +506,33 @@ def follow_server(self, server: ServerAddr):
self.network.run_from_another_thread(self.network.follow_chain_given_server(server))
self.update()

def set_server(self):
net_params = self.network.get_parameters()
def on_server_edited(self):
try:
server = ServerAddr.from_str_with_inference(str(self.server_e.text()))
if not server:
raise Exception("failed to parse server")
except Exception:
self.server_e.setText('')
return
self.set_bookmark(server, add=True)
self.follow_server(server)

def set_bookmark(self, server: ServerAddr, add: bool):
self.network.set_server_bookmark(server, add=add)
if not add and server == self.network.default_server:
self.set_params()
else:
self.nodes_list_widget.update()
self.update()

def follow_server(self, server: ServerAddr):
self.server_e.setText(str(server))
self.network.run_from_another_thread(self.network.switch_to_interface(server))
self.update()

def set_params(self):
net_params = self.network.get_parameters()
net_params = net_params._replace(
server=server,
auto_connect=self.is_auto_connect(),
oneserver=self.is_one_server(),
)
Expand Down
Loading