diff --git a/electrum/gui/qml/components/NetworkOverview.qml b/electrum/gui/qml/components/NetworkOverview.qml index 01372122c..fbf9e4b71 100644 --- a/electrum/gui/qml/components/NetworkOverview.qml +++ b/electrum/gui/qml/components/NetworkOverview.qml @@ -300,23 +300,24 @@ Pane { FlatButton { Layout.fillWidth: true Layout.preferredWidth: 1 - text: qsTr('Reset SSL certificates'); + text: qsTr('Reset known servers'); icon.source: '../../icons/network.png' onClicked: { var dialog = app.messageDialog.createObject(app, { title: qsTr('Are you sure?'), - text: qsTr('This will remove cached SSL certificates for servers and reconnect to fetch them again.'), + text: qsTr('This will remove cached recently connected servers.'), yesno: true }) dialog.accepted.connect(function() { - var removed = Network.clearPinnedServerCertificates() + var removed = Network.clearKnownServers() + Network.serverListModel.initModel() var msg = removed < 0 - ? qsTr('Failed to reset SSL certificates.') + ? qsTr('Failed to reset known servers.') : removed > 0 - ? qsTr('%1 certificate files were removed.').arg(removed) - : qsTr('No cached certificate files were found.') + ? qsTr('%1 known servers were removed.').arg(removed) + : qsTr('No cached known servers were found.') var infoDialog = app.messageDialog.createObject(app, { - title: qsTr('Reset SSL certificates'), + title: qsTr('Reset known servers'), text: msg }) infoDialog.open() @@ -324,6 +325,7 @@ Pane { dialog.open() } } + } } diff --git a/electrum/gui/qml/components/ServerConfigDialog.qml b/electrum/gui/qml/components/ServerConfigDialog.qml index 80cc54a31..c8aa98908 100644 --- a/electrum/gui/qml/components/ServerConfigDialog.qml +++ b/electrum/gui/qml/components/ServerConfigDialog.qml @@ -36,6 +36,33 @@ ElDialog { } } + FlatButton { + Layout.fillWidth: true + text: qsTr('Reset SSL certificates') + icon.source: '../../icons/network.png' + onClicked: { + var dialog = app.messageDialog.createObject(app, { + title: qsTr('Are you sure?'), + text: qsTr('This will remove cached SSL certificates for servers and reconnect to fetch them again.'), + yesno: true + }) + dialog.accepted.connect(function() { + var removed = Network.clearPinnedServerCertificates() + var msg = removed < 0 + ? qsTr('Failed to reset SSL certificates.') + : removed > 0 + ? qsTr('%1 certificate files were removed.').arg(removed) + : qsTr('No cached certificate files were found.') + var infoDialog = app.messageDialog.createObject(app, { + title: qsTr('Reset SSL certificates'), + text: msg + }) + infoDialog.open() + }) + dialog.open() + } + } + FlatButton { Layout.fillWidth: true text: qsTr('Ok') diff --git a/electrum/gui/qml/qenetwork.py b/electrum/gui/qml/qenetwork.py index 84707b8c6..fa9ad3e3e 100644 --- a/electrum/gui/qml/qenetwork.py +++ b/electrum/gui/qml/qenetwork.py @@ -314,3 +314,11 @@ class QENetwork(QObject, QtEventListener): except Exception: self._logger.exception("failed to clear pinned server certificates") return -1 + + @pyqtSlot(result=int) + def clearKnownServers(self): + try: + return self.network.run_from_another_thread(self.network.clear_recent_servers()) + except Exception: + self._logger.exception("failed to clear known servers") + return -1 diff --git a/electrum/gui/qt/network_dialog.py b/electrum/gui/qt/network_dialog.py index eebdb4763..b5c64bc71 100644 --- a/electrum/gui/qt/network_dialog.py +++ b/electrum/gui/qt/network_dialog.py @@ -446,8 +446,11 @@ class ServerWidget(QWidget, QtEventListener): self.clear_certs_button = QPushButton(_('Reset SSL certificates')) self.clear_certs_button.clicked.connect(self.clear_pinned_server_certs) + self.clear_known_servers_button = QPushButton(_('Reset known servers')) + self.clear_known_servers_button.clicked.connect(self.clear_known_servers) buttons = QHBoxLayout() buttons.addStretch(1) + buttons.addWidget(self.clear_known_servers_button) buttons.addWidget(self.clear_certs_button) self.layout().addLayout(buttons) @@ -615,6 +618,31 @@ class ServerWidget(QWidget, QtEventListener): msg = _('No cached certificate files were found.') QMessageBox.information(self, _('Reset SSL certificates'), msg) + def clear_known_servers(self): + result = QMessageBox.question( + self, + _('Reset known servers'), + _('This will remove cached recently connected servers.') + + '\n\n' + + _('Do you want to continue?'), + QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No, + QMessageBox.StandardButton.No, + ) + if result != QMessageBox.StandardButton.Yes: + return + try: + removed = self.network.run_from_another_thread(self.network.clear_recent_servers()) + except Exception as e: + _logger.exception("failed to clear known servers") + QMessageBox.critical(self, _('Reset known servers'), str(e)) + return + if removed > 0: + msg = _('{} known servers were removed.').format(removed) + else: + msg = _('No cached known servers were found.') + self.nodes_list_widget.update() + QMessageBox.information(self, _('Reset known servers'), msg) + class NostrWidget(QWidget, QtEventListener): diff --git a/electrum/network.py b/electrum/network.py index 3a11514da..f016b5fd6 100644 --- a/electrum/network.py +++ b/electrum/network.py @@ -429,6 +429,16 @@ class Network(Logger, NetworkRetryManager[ServerAddr]): await self._close_interface(iface) return removed + async def clear_recent_servers(self) -> int: + """Delete cached list of recently connected servers.""" + with self.recent_servers_lock: + removed = len(self._recent_servers) + self._recent_servers = [] + self._save_recent_servers() + self.logger.info(f"removed {removed} cached recent server(s)") + util.trigger_callback('network_updated') + return removed + def has_channel_db(self): return self.channel_db is not None