diff --git a/electrum/gui/qml/components/ServerConfigDialog.qml b/electrum/gui/qml/components/ServerConfigDialog.qml index 2d779b97b..b9679546e 100644 --- a/electrum/gui/qml/components/ServerConfigDialog.qml +++ b/electrum/gui/qml/components/ServerConfigDialog.qml @@ -42,11 +42,11 @@ ElDialog { text: qsTr('Ok') icon.source: '../../icons/confirmed.png' onClicked: { - Config.autoConnect = serverconfig.auto_connect - Network.server = serverconfig.address Network.oneServer = serverconfig.auto_connect ? false : serverconfig.one_server + Config.autoConnect = serverconfig.auto_connect + Network.server = serverconfig.address rootItem.close() } } diff --git a/electrum/gui/qml/components/controls/ServerConfig.qml b/electrum/gui/qml/components/controls/ServerConfig.qml index 12227d03b..c2704e89a 100644 --- a/electrum/gui/qml/components/controls/ServerConfig.qml +++ b/electrum/gui/qml/components/controls/ServerConfig.qml @@ -28,6 +28,7 @@ Item { visible: showAutoselectServer text: qsTr('Select server automatically') checked: !showAutoselectServer + enabled: !one_server_cb.checked } Label { @@ -58,7 +59,7 @@ Item { HelpButton { heading: qsTr('One server') - helptext: qsTr('Connect only to a single Electrum Server. This can help with privacy, but at the cost of detecting lagging and forks') + helptext: Config.longDescFor('NETWORK_ONESERVER') } } diff --git a/electrum/gui/qt/network_dialog.py b/electrum/gui/qt/network_dialog.py index e4d31f23f..fe99e3887 100644 --- a/electrum/gui/qt/network_dialog.py +++ b/electrum/gui/qt/network_dialog.py @@ -394,23 +394,29 @@ class ServerWidget(QWidget, QtEventListener): grid.addWidget(self.autoconnect_cb, 1, 0, 1, 3) grid.addWidget(HelpButton(msg), 1, 4) + self.one_server_cb = QCheckBox(_('One server')) + self.one_server_cb.setEnabled(self.config.cv.NETWORK_ONESERVER.is_modifiable()) + self.one_server_cb.stateChanged.connect(self.on_server_settings_changed) + grid.addWidget(self.one_server_cb, 2, 0, 1, 3) + grid.addWidget(HelpButton(self.config.cv.NETWORK_ONESERVER.get_long_desc()), 2, 4) + self.server_e = QLineEdit() self.server_e.editingFinished.connect(self.on_server_settings_changed) msg = _("Electrum sends your wallet addresses to a single server, in order to receive your transaction history.") - grid.addWidget(QLabel(_('Server') + ':'), 2, 0) - grid.addWidget(self.server_e, 2, 1, 1, 3) - grid.addWidget(HelpButton(msg), 2, 4) + grid.addWidget(QLabel(_('Server') + ':'), 3, 0) + grid.addWidget(self.server_e, 3, 1, 1, 3) + grid.addWidget(HelpButton(msg), 3, 4) msg = _('This is the height of your local copy of the blockchain.') self.height_label_header = QLabel(_('Blockchain') + ':') self.height_label = QLabel('') self.height_label_helpbutton = HelpButton(msg) - grid.addWidget(self.height_label_header, 3, 0) - grid.addWidget(self.height_label, 3, 1) - grid.addWidget(self.height_label_helpbutton, 3, 4) + grid.addWidget(self.height_label_header, 4, 0) + grid.addWidget(self.height_label, 4, 1) + grid.addWidget(self.height_label_helpbutton, 4, 4) self.split_label = QLabel('') - grid.addWidget(self.split_label, 4, 0, 1, 3) + grid.addWidget(self.split_label, 5, 0, 1, 3) self.layout().addLayout(grid) @@ -442,13 +448,19 @@ class ServerWidget(QWidget, QtEventListener): self.update() return auto_connect = self.autoconnect_cb.isChecked() + one_server = self.one_server_cb.isChecked() + self.autoconnect_cb.setEnabled(not one_server and self.config.cv.NETWORK_AUTO_CONNECT.is_modifiable()) + self.one_server_cb.setEnabled(not auto_connect and self.config.cv.NETWORK_ONESERVER.is_modifiable()) server = self.server_e.text().strip() net_params = self.network.get_parameters() - if server != net_params.server or auto_connect != net_params.auto_connect: + if server != net_params.server or auto_connect != net_params.auto_connect or one_server != net_params.oneserver: self.set_server() def update(self): auto_connect = self.autoconnect_cb.isChecked() + one_server = self.one_server_cb.isChecked() + self.autoconnect_cb.setEnabled(not one_server and self.config.cv.NETWORK_AUTO_CONNECT.is_modifiable()) + self.one_server_cb.setEnabled(not auto_connect and self.config.cv.NETWORK_ONESERVER.is_modifiable()) self.server_e.setEnabled(self.config.cv.NETWORK_SERVER.is_modifiable() and not auto_connect) for item in [ @@ -479,10 +491,13 @@ class ServerWidget(QWidget, QtEventListener): def update_from_config(self): auto_connect = self.config.NETWORK_AUTO_CONNECT self.autoconnect_cb.setChecked(auto_connect) + one_server = self.config.NETWORK_ONESERVER + self.one_server_cb.setChecked(one_server) server = self.config.NETWORK_SERVER self.server_e.setText(server) - self.autoconnect_cb.setEnabled(self.config.cv.NETWORK_AUTO_CONNECT.is_modifiable()) + self.autoconnect_cb.setEnabled(self.config.cv.NETWORK_AUTO_CONNECT.is_modifiable() and not one_server) + self.one_server_cb.setEnabled(self.config.cv.NETWORK_ONESERVER.is_modifiable() and not auto_connect) 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()) @@ -504,7 +519,8 @@ class ServerWidget(QWidget, QtEventListener): except Exception: return net_params = net_params._replace(server=server, - auto_connect=self.autoconnect_cb.isChecked()) + auto_connect=self.autoconnect_cb.isChecked(), + oneserver=self.one_server_cb.isChecked()) self.network.run_from_another_thread(self.network.set_parameters(net_params)) diff --git a/electrum/gui/qt/wizard/server_connect.py b/electrum/gui/qt/wizard/server_connect.py index 0c6b88b36..c7a5f3d2b 100644 --- a/electrum/gui/qt/wizard/server_connect.py +++ b/electrum/gui/qt/wizard/server_connect.py @@ -96,4 +96,4 @@ class WCServerConfig(WizardComponent): def apply(self): self.wizard_data['autoconnect'] = self.sw.server_e.text().strip() == '' self.wizard_data['server'] = self.sw.server_e.text() - self.wizard_data['one_server'] = False + self.wizard_data['one_server'] = self.wizard.config.NETWORK_ONESERVER diff --git a/electrum/simple_config.py b/electrum/simple_config.py index c02be88df..19f7f781d 100644 --- a/electrum/simple_config.py +++ b/electrum/simple_config.py @@ -614,7 +614,12 @@ class SimpleConfig(Logger): # config variables -----> NETWORK_AUTO_CONNECT = ConfigVar('auto_connect', default=True, type_=bool) - NETWORK_ONESERVER = ConfigVar('oneserver', default=False, type_=bool) + NETWORK_ONESERVER = ConfigVar( + 'oneserver', default=False, type_=bool, + short_desc=lambda: _('Connect only to a single Electrum Server'), + long_desc=lambda: _('This is only intended for connecting to your own node. ' + 'Using this option on a public server is a security risk and is discouraged.') + ) NETWORK_PROXY = ConfigVar('proxy', default=None, type_=str, convert_getter=lambda v: "none" if v is None else v) NETWORK_PROXY_USER = ConfigVar('proxy_user', default=None, type_=str) NETWORK_PROXY_PASSWORD = ConfigVar('proxy_password', default=None, type_=str) diff --git a/tests/test_wizard.py b/tests/test_wizard.py index c3f009faa..350162502 100644 --- a/tests/test_wizard.py +++ b/tests/test_wizard.py @@ -112,7 +112,7 @@ class ServerConnectWizardTestCase(WizardTestCase): serverobj = ServerAddr.from_str_with_inference('localhost:1:t') self.assertTrue(w._daemon.network.run_called) - self.assertEqual(NetworkParameters(server=serverobj, proxy=None, auto_connect=False, oneserver=None), w._daemon.network.parameters) + self.assertEqual(NetworkParameters(server=serverobj, proxy=None, auto_connect=False, oneserver=False), w._daemon.network.parameters) class WalletWizardTestCase(WizardTestCase):