diff --git a/desktop/src/onionshare/connection_tab.py b/desktop/src/onionshare/connection_tab.py index fee4d428..4aaf52c8 100644 --- a/desktop/src/onionshare/connection_tab.py +++ b/desktop/src/onionshare/connection_tab.py @@ -24,7 +24,10 @@ import random import time from PySide2 import QtCore, QtWidgets, QtGui -from onionshare_cli.censorship import CensorshipCircumvention +from onionshare_cli.censorship import ( + CensorshipCircumvention, + CensorshipCircumventionError, +) from onionshare_cli.meek import ( MeekNotRunning, MeekNotFound, @@ -95,7 +98,9 @@ class AutoConnectTab(QtWidgets.QWidget): # Use bridge widget self.use_bridge_widget = AutoConnectUseBridgeWidget(self.common) self.use_bridge_widget.connect_clicked.connect(self.use_bridge_connect_clicked) - self.use_bridge_widget.try_again_clicked.connect(self.first_launch_widget_connect_clicked) + self.use_bridge_widget.try_again_clicked.connect( + self.first_launch_widget_connect_clicked + ) self.use_bridge_widget.open_tor_settings.connect(self.open_tor_settings) self.use_bridge_widget.hide() @@ -183,6 +188,16 @@ class AutoConnectTab(QtWidgets.QWidget): f"{strings._('gui_autoconnect_circumventing_censorship')}
{summary}" ) + def network_connection_error(self): + """ + Display an error if there simply seems no network connection. + """ + self.use_bridge_widget.progress.hide() + self.use_bridge_widget.progress_label.hide() + self.use_bridge_widget.error_label.show() + self.use_bridge_widget.show_buttons() + self.use_bridge_widget.show() + def use_bridge_connect_clicked(self): """ Connect button in use bridge widget clicked. @@ -235,6 +250,13 @@ class AutoConnectTab(QtWidgets.QWidget): MeekNotFound, ) as e: self._got_no_bridges() + except CensorshipCircumventionError as e: + self.common.log( + "AutoConnectTab", + "use_bridge_connect_clicked", + "Request to the Tor Censorship Circumvention API failed. No network connection?", + ) + self.network_connection_error() def check_for_updates(self): """ @@ -288,6 +310,10 @@ class AutoConnectTab(QtWidgets.QWidget): self.use_bridge_widget.show_buttons() def reload_settings(self): + """ + Reload the latest Tor settings, and reset to show the + first-launch widget if it had been hidden. + """ self.curr_settings.load() self.auto_connect_enabled = self.curr_settings.get("auto_connect") self.first_launch_widget.enable_autoconnect_checkbox.setChecked( @@ -394,7 +420,9 @@ class AutoConnectUseBridgeWidget(QtWidgets.QWidget): strings._("gui_autoconnect_failed_to_connect_to_tor") ) failed_to_connect_label.setTextFormat(QtCore.Qt.RichText) - failed_to_connect_label.setStyleSheet(common.gui.css["autoconnect_failed_to_connect_label"]) + failed_to_connect_label.setStyleSheet( + common.gui.css["autoconnect_failed_to_connect_label"] + ) # Description description_label = QtWidgets.QLabel( @@ -475,6 +503,12 @@ class AutoConnectUseBridgeWidget(QtWidgets.QWidget): common.gui.css["autoconnect_configure_button"] ) + # Error label + self.error_label = QtWidgets.QLabel(strings._("gui_tor_connection_canceled")) + self.error_label.setStyleSheet(self.common.gui.css["tor_settings_error"]) + self.error_label.setWordWrap(True) + self.error_label.hide() + self.progress = QtWidgets.QProgressBar() self.progress.setRange(0, 100) self.progress_label = QtWidgets.QLabel( @@ -503,6 +537,7 @@ class AutoConnectUseBridgeWidget(QtWidgets.QWidget): layout.addWidget(cta_widget) layout.addWidget(self.progress) layout.addWidget(self.progress_label) + layout.addWidget(self.error_label) self.setLayout(layout) self._country_changed() @@ -512,6 +547,7 @@ class AutoConnectUseBridgeWidget(QtWidgets.QWidget): self.connect_button.hide() self.try_again_button.hide() self.configure_button.hide() + self.error_label.hide() def show_buttons(self): self.connect_button.show()