From 496adf01d2d097218e23c37a5b664ba587c96e91 Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Wed, 13 Oct 2021 20:14:38 -0700 Subject: [PATCH] When you click "Test Connecting to Tor" in Tor settings, it now uses the TorConnectionDialog --- .../src/onionshare/tor_connection_dialog.py | 53 +++++++---- desktop/src/onionshare/tor_settings_dialog.py | 93 +++---------------- desktop/src/onionshare/widgets.py | 3 +- 3 files changed, 50 insertions(+), 99 deletions(-) diff --git a/desktop/src/onionshare/tor_connection_dialog.py b/desktop/src/onionshare/tor_connection_dialog.py index b5c2f61c..dd2721bd 100644 --- a/desktop/src/onionshare/tor_connection_dialog.py +++ b/desktop/src/onionshare/tor_connection_dialog.py @@ -49,11 +49,15 @@ class TorConnectionDialog(QtWidgets.QProgressDialog): """ open_settings = QtCore.Signal() + success = QtCore.Signal() - def __init__(self, common, custom_settings=False): + def __init__( + self, common, custom_settings=False, testing_settings=False, onion=None + ): super(TorConnectionDialog, self).__init__(None) self.common = common + self.testing_settings = testing_settings if custom_settings: self.settings = custom_settings @@ -62,7 +66,15 @@ class TorConnectionDialog(QtWidgets.QProgressDialog): self.common.log("TorConnectionDialog", "__init__") - self.setWindowTitle("OnionShare") + if self.testing_settings: + self.title = strings._("gui_settings_connection_type_test_button") + self.onion = onion + else: + self.title = "OnionShare" + self.onion = self.common.gui.onion + + self.setWindowTitle(self.title) + self.setWindowIcon(QtGui.QIcon(GuiCommon.get_resource_path("images/logo.png"))) self.setModal(True) self.setFixedSize(400, 150) @@ -112,7 +124,7 @@ class TorConnectionDialog(QtWidgets.QProgressDialog): def _canceled_connecting_to_tor(self): self.common.log("TorConnectionDialog", "_canceled_connecting_to_tor") self.active = False - self.common.gui.onion.cleanup() + self.onion.cleanup() # Cancel connecting to Tor QtCore.QTimer.singleShot(1, self.cancel) @@ -121,18 +133,25 @@ class TorConnectionDialog(QtWidgets.QProgressDialog): self.common.log("TorConnectionDialog", "_error_connecting_to_tor") self.active = False - def alert_and_open_settings(): - # Display the exception in an alert box - Alert( - self.common, - f"{msg}\n\n{strings._('gui_tor_connection_error_settings')}", - QtWidgets.QMessageBox.Warning, - ) + if self.testing_settings: + # If testing, just display the error but don't open settings + def alert(): + Alert(self.common, msg, QtWidgets.QMessageBox.Warning, title=self.title) - # Open settings - self.open_settings.emit() + else: + # If not testing, open settings after displaying the error + def alert(): + Alert( + self.common, + f"{msg}\n\n{strings._('gui_tor_connection_error_settings')}", + QtWidgets.QMessageBox.Warning, + title=self.title, + ) - QtCore.QTimer.singleShot(1, alert_and_open_settings) + # Open settings + self.open_settings.emit() + + QtCore.QTimer.singleShot(1, alert) # Cancel connecting to Tor QtCore.QTimer.singleShot(1, self.cancel) @@ -146,13 +165,9 @@ class TorConnectionThread(QtCore.QThread): def __init__(self, common, settings, dialog): super(TorConnectionThread, self).__init__() - self.common = common - self.common.log("TorConnectionThread", "__init__") - self.settings = settings - self.dialog = dialog def run(self): @@ -160,8 +175,8 @@ class TorConnectionThread(QtCore.QThread): # Connect to the Onion try: - self.common.gui.onion.connect(self.settings, False, self._tor_status_update) - if self.common.gui.onion.connected_to_tor: + self.dialog.onion.connect(self.settings, False, self._tor_status_update) + if self.dialog.onion.connected_to_tor: self.connected_to_tor.emit() else: self.canceled_connecting_to_tor.emit() diff --git a/desktop/src/onionshare/tor_settings_dialog.py b/desktop/src/onionshare/tor_settings_dialog.py index 817fc599..60b006be 100644 --- a/desktop/src/onionshare/tor_settings_dialog.py +++ b/desktop/src/onionshare/tor_settings_dialog.py @@ -358,16 +358,10 @@ class TorSettingsDialog(QtWidgets.QDialog): buttons_layout.addWidget(self.save_button) buttons_layout.addWidget(self.cancel_button) - # Tor network connection status - self.tor_status = QtWidgets.QLabel() - self.tor_status.setStyleSheet(self.common.gui.css["settings_tor_status"]) - self.tor_status.hide() - # Layout layout = QtWidgets.QVBoxLayout() layout.addWidget(connection_type_radio_group) layout.addLayout(connection_type_layout) - layout.addWidget(self.tor_status) layout.addStretch() layout.addLayout(buttons_layout) @@ -547,30 +541,17 @@ class TorSettingsDialog(QtWidgets.QDialog): self.common.log("TorSettingsDialog", "test_tor_clicked") settings = self.settings_from_fields() - try: - # Show Tor connection status if connection type is bundled tor - if settings.get("connection_type") == "bundled": - self.tor_status.show() - self._disable_buttons() + onion = Onion( + self.common, + use_tmp_dir=True, + get_tor_paths=self.common.gui.get_tor_paths, + ) - def tor_status_update_func(progress, summary): - self._tor_status_update(progress, summary) - return True + tor_con = TorConnectionDialog(self.common, settings, True, onion) + tor_con.start() - else: - tor_status_update_func = None - - onion = Onion( - self.common, - use_tmp_dir=True, - get_tor_paths=self.common.gui.get_tor_paths, - ) - onion.connect( - custom_settings=settings, - tor_status_update_func=tor_status_update_func, - ) - - # If an exception hasn't been raised yet, the Tor settings work + # If Tor settings worked, show results + if onion.connected_to_tor: Alert( self.common, strings._("settings_test_success").format( @@ -579,35 +560,11 @@ class TorSettingsDialog(QtWidgets.QDialog): onion.supports_stealth, onion.supports_v3_onions, ), + title=strings._("gui_settings_connection_type_test_button"), ) - # Clean up - onion.cleanup() - - except ( - TorErrorInvalidSetting, - TorErrorAutomatic, - TorErrorSocketPort, - TorErrorSocketFile, - TorErrorMissingPassword, - TorErrorUnreadableCookieFile, - TorErrorAuthError, - TorErrorProtocolError, - BundledTorTimeout, - BundledTorBroken, - TorTooOldEphemeral, - TorTooOldStealth, - PortNotAvailable, - ) as e: - message = self.common.gui.get_translated_tor_error(e) - Alert( - self.common, - message, - QtWidgets.QMessageBox.Warning, - ) - if settings.get("connection_type") == "bundled": - self.tor_status.hide() - self._enable_buttons() + # Clean up + onion.cleanup() def save_clicked(self): """ @@ -748,9 +705,9 @@ class TorSettingsDialog(QtWidgets.QDialog): settings.set("socks_address", self.connection_type_socks_address.text()) settings.set("socks_port", self.connection_type_socks_port.text()) - if self.authenticate_no_auth_radio.isChecked(): + if self.authenticate_no_auth_checkbox.checkState() == QtCore.Qt.Checked: settings.set("auth_type", "no_auth") - if self.authenticate_password_radio.isChecked(): + else: settings.set("auth_type", "password") settings.set("auth_password", self.authenticate_password_extras_password.text()) @@ -826,25 +783,3 @@ class TorSettingsDialog(QtWidgets.QDialog): # Wait 1ms for the event loop to finish, then quit QtCore.QTimer.singleShot(1, self.common.gui.qtapp.quit) - - def _tor_status_update(self, progress, summary): - self.tor_status.setText( - f"{strings._('connecting_to_tor')}
{progress}% {summary}" - ) - self.common.gui.qtapp.processEvents() - if "Done" in summary: - self.tor_status.hide() - self._enable_buttons() - - def _disable_buttons(self): - self.common.log("TorSettingsDialog", "_disable_buttons") - - self.connection_type_test_button.setEnabled(False) - self.save_button.setEnabled(False) - self.cancel_button.setEnabled(False) - - def _enable_buttons(self): - self.common.log("TorSettingsDialog", "_enable_buttons") - self.connection_type_test_button.setEnabled(True) - self.save_button.setEnabled(True) - self.cancel_button.setEnabled(True) diff --git a/desktop/src/onionshare/widgets.py b/desktop/src/onionshare/widgets.py index b396c43f..761df212 100644 --- a/desktop/src/onionshare/widgets.py +++ b/desktop/src/onionshare/widgets.py @@ -37,6 +37,7 @@ class Alert(QtWidgets.QMessageBox): icon=QtWidgets.QMessageBox.NoIcon, buttons=QtWidgets.QMessageBox.Ok, autostart=True, + title="OnionShare", ): super(Alert, self).__init__(None) @@ -44,7 +45,7 @@ class Alert(QtWidgets.QMessageBox): self.common.log("Alert", "__init__") - self.setWindowTitle("OnionShare") + self.setWindowTitle(title) self.setWindowIcon(QtGui.QIcon(GuiCommon.get_resource_path("images/logo.png"))) self.setText(message) self.setIcon(icon)