Move owernship of the TorConnetionDialog objection from __init__.py into the OnionShareGUI class, and make it so when the Tor connection gets canceled, OnionShare quits

This commit is contained in:
Micah Lee 2017-05-14 18:30:45 -07:00
parent d112b35414
commit 2ca92c52db
No known key found for this signature in database
GPG Key ID: 403C2657CD994F73
4 changed files with 57 additions and 38 deletions

View File

@ -216,7 +216,10 @@ class Onion(object):
print("{}: {}% - {}{}".format(strings._('connecting_to_tor'), progress, summary, "\033[K"), end="\r")
if callable(tor_status_update_func):
tor_status_update_func(progress, summary)
if not tor_status_update_func(progress, summary):
# If the dialog was canceled, stop connecting to Tor
print()
return False
if summary == 'Done':
print("")

View File

@ -27,7 +27,6 @@ from onionshare.onionshare import OnionShare
from onionshare.settings import Settings
from .onionshare_gui import OnionShareGui
from .tor_connection_dialog import TorConnectionDialog
class Application(QtWidgets.QApplication):
"""
@ -87,35 +86,22 @@ def main():
if not valid:
sys.exit()
# Load settings
settings = Settings()
settings.load()
# Start the Onion
onion = Onion()
def exit_early():
# Wait for tor to exit
onion.cleanup()
sys.exit()
tor_con = TorConnectionDialog(settings, onion)
tor_con.canceled.connect(exit_early)
tor_con.start()
# Start the OnionShare app
web.set_stay_open(stay_open)
app = OnionShare(onion, debug, local_only, stay_open)
# Launch the gui
gui = OnionShareGui(onion, qtapp, app, filenames)
# Clean up when app quits
def shutdown():
onion.cleanup()
app.cleanup()
qtapp.aboutToQuit.connect(shutdown)
# Launch the gui
gui = OnionShareGui(qtapp, app, filenames)
# All done
sys.exit(qtapp.exec_())

View File

@ -24,6 +24,7 @@ from onionshare import strings, helpers, web
from onionshare.settings import Settings
from onionshare.onion import *
from .tor_connection_dialog import TorConnectionDialog
from .menu import Menu
from .file_selection import FileSelection
from .server_status import ServerStatus
@ -42,23 +43,31 @@ class OnionShareGui(QtWidgets.QMainWindow):
starting_server_step3 = QtCore.pyqtSignal()
starting_server_error = QtCore.pyqtSignal(str)
def __init__(self, qtapp, app, filenames):
def __init__(self, onion, qtapp, app, filenames):
super(OnionShareGui, self).__init__()
self.onion = onion
self.qtapp = qtapp
self.app = app
self.setWindowTitle('OnionShare')
self.setWindowIcon(QtGui.QIcon(helpers.get_resource_path('images/logo.png')))
# Load settings
self.settings = Settings()
self.settings.load()
# Start the "Connecting to Tor" dialog, which calls onion.connect()
tor_con = TorConnectionDialog(self.settings, self.onion)
tor_con.canceled.connect(self._tor_connection_canceled)
tor_con.start()
# Menu bar
self.setMenuBar(Menu(self.qtapp))
# Check for updates in a new thread, if enabled
system = platform.system()
if system == 'Windows' or system == 'Darwin':
settings = Settings()
settings.load()
if settings.get('use_autoupdate'):
if self.settings.get('use_autoupdate'):
def update_available(update_url, installed_version, latest_version):
Alert(strings._("update_available", True).format(update_url, installed_version, latest_version))
@ -130,6 +139,16 @@ class OnionShareGui(QtWidgets.QMainWindow):
self.timer.timeout.connect(self.check_for_requests)
self.timer.start(500)
def _tor_connection_canceled(self):
"""
If the user cancels before Tor finishes connecting, quit.
"""
def quit():
self.qtapp.quit()
# Wait 1ms for the event loop to finish closing the TorConnectionDialog before quitting
QtCore.QTimer.singleShot(1, quit)
def start_server(self):
"""
Start the onionshare server. This uses multiple threads to start the Tor onion
@ -310,22 +329,26 @@ class OnionShareGui(QtWidgets.QMainWindow):
self.status_bar.clearMessage()
def closeEvent(self, e):
if self.server_status.status != self.server_status.STATUS_STOPPED:
dialog = QtWidgets.QMessageBox()
dialog.setWindowTitle("OnionShare")
dialog.setText(strings._('gui_quit_warning', True))
quit_button = dialog.addButton(strings._('gui_quit_warning_quit', True), QtWidgets.QMessageBox.YesRole)
dont_quit_button = dialog.addButton(strings._('gui_quit_warning_dont_quit', True), QtWidgets.QMessageBox.NoRole)
dialog.setDefaultButton(dont_quit_button)
reply = dialog.exec_()
try:
if self.server_status.status != self.server_status.STATUS_STOPPED:
dialog = QtWidgets.QMessageBox()
dialog.setWindowTitle("OnionShare")
dialog.setText(strings._('gui_quit_warning', True))
quit_button = dialog.addButton(strings._('gui_quit_warning_quit', True), QtWidgets.QMessageBox.YesRole)
dont_quit_button = dialog.addButton(strings._('gui_quit_warning_dont_quit', True), QtWidgets.QMessageBox.NoRole)
dialog.setDefaultButton(dont_quit_button)
reply = dialog.exec_()
# Quit
if reply == 0:
self.stop_server()
e.accept()
# Don't Quit
else:
e.ignore()
# Quit
if reply == 0:
self.stop_server()
e.accept()
# Don't Quit
else:
e.ignore()
except:
e.accept()
class ZipProgressBar(QtWidgets.QProgressBar):

View File

@ -56,8 +56,12 @@ class TorConnectionDialog(QtWidgets.QProgressDialog):
self.setValue(0)
try:
self.onion.connect(self.settings, tor_status_update)
# Close the dialog after connecting
self.setValue(self.maximum())
except BundledTorCanceled as e:
self.close()
self.cancel()
except Exception as e:
print(e.args[0])
# TODO: Open settings to connect to Tor properly
@ -66,3 +70,6 @@ class TorConnectionDialog(QtWidgets.QProgressDialog):
def tor_status_update(self, progress, summary):
self.setValue(int(progress))
self.setLabelText("<strong>{}</strong><br>{}".format(strings._('connecting_to_tor', True), summary))
# Return False if the dialog was canceled
return not self.wasCanceled()