From c3d1b2046a5397b0430c1615e0f3aa82659b9dd6 Mon Sep 17 00:00:00 2001 From: f321x Date: Mon, 26 Jan 2026 12:07:04 +0100 Subject: [PATCH] qt: ServerWidget/wizard: validate server_e The `ServerWidget` didn't validate the input of server_e, which allowed the user to enter an invalid server connection string and exit the dialog without knowing they entered an invalid string. In the wizard this behavior is very misleading as the user explicitly wanted to use a custom server, can click next after entering an invalid server, and we will just silently fall back to automatic server selection. This change will disable the "Next" button in the wizard if an invalid address has been entered and show a red background in the server_e while the input is not valid, so the user clearly sees that this input is not going to be used. --- electrum/gui/qt/network_dialog.py | 13 +++++++++++++ electrum/gui/qt/wizard/server_connect.py | 5 ++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/electrum/gui/qt/network_dialog.py b/electrum/gui/qt/network_dialog.py index ad4ff4823..9545e45b7 100644 --- a/electrum/gui/qt/network_dialog.py +++ b/electrum/gui/qt/network_dialog.py @@ -361,6 +361,8 @@ class ServerWidget(QWidget, QtEventListener): ConnectMode.ONESERVER: messages.MSG_CONNECTMODE_ONESERVER, } + server_e_valid = pyqtSignal(bool) + def __init__(self, network: Network, parent=None): super().__init__(parent) self.network = network @@ -390,6 +392,7 @@ class ServerWidget(QWidget, QtEventListener): grid.addWidget(self.connect_combo, 0, 1, 1, 3) self.server_e = QLineEdit() + self.server_e.textChanged.connect(self.validate_server_e) self.server_e.editingFinished.connect(self.on_server_settings_changed) grid.addWidget(QLabel(_('Server') + ':'), 1, 0) grid.addWidget(self.server_e, 1, 1, 1, 3) @@ -502,6 +505,7 @@ class ServerWidget(QWidget, QtEventListener): self.status_label_header, self.status_label, self.status_label_helpbutton, self.height_label_header, self.height_label, self.height_label_helpbutton]: item.setVisible(self.network._was_started) + self.validate_server_e() msg = _('Fork detection disabled') if self.is_one_server() else '' if self.network._was_started: # Network was started, so we don't run in initial setup wizard. @@ -522,6 +526,15 @@ class ServerWidget(QWidget, QtEventListener): msg += _('Your server is on branch {0} ({1} blocks)').format(name, chain.get_branch_size()) self.split_label.setText(msg) + def validate_server_e(self): + if not self.server_e.isEnabled(): + self.server_e.setStyleSheet("") + self.server_e_valid.emit(True) + return + server = ServerAddr.from_str_with_inference(self.server_e.text()) + self.server_e.setStyleSheet("background-color: rgba(255, 0, 0, 0.2);" if not server else "") + self.server_e_valid.emit(server is not None) + def update_from_config(self): auto_connect = self.config.NETWORK_AUTO_CONNECT one_server = self.config.NETWORK_ONESERVER diff --git a/electrum/gui/qt/wizard/server_connect.py b/electrum/gui/qt/wizard/server_connect.py index c7a5f3d2b..19b403d13 100644 --- a/electrum/gui/qt/wizard/server_connect.py +++ b/electrum/gui/qt/wizard/server_connect.py @@ -91,7 +91,10 @@ class WCServerConfig(WizardComponent): WizardComponent.__init__(self, parent, wizard, title=_('Server')) self.sw = ServerWidget(wizard._daemon.network, self) self.layout().addWidget(self.sw) - self._valid = True + self.sw.server_e_valid.connect(self.on_server_e_valid) + + def on_server_e_valid(self, valid): + self.valid = valid def apply(self): self.wizard_data['autoconnect'] = self.sw.server_e.text().strip() == ''