From 4a0c6e8dcdfb6468020313f38be1496cd6cabdac Mon Sep 17 00:00:00 2001 From: Micah Lee Date: Tue, 6 Mar 2018 00:56:40 -0800 Subject: [PATCH] Refactor OnionShareGui to use new Web class --- onionshare/web.py | 9 +++--- onionshare_gui/__init__.py | 10 ++++--- onionshare_gui/onionshare_gui.py | 51 +++++++++++++++++--------------- 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/onionshare/web.py b/onionshare/web.py index 3e75ba27..afe66d84 100644 --- a/onionshare/web.py +++ b/onionshare/web.py @@ -41,7 +41,7 @@ class Web(object): """ The Web object is the OnionShare web server, powered by flask """ - def __init__(self, debug, stay_open, gui_mode, receive_mode): + def __init__(self, debug, stay_open, gui_mode, receive_mode=False): # The flask app self.app = Flask(__name__) @@ -50,14 +50,13 @@ class Web(object): self.debug_mode() # Stay open after the first download? - self.stay_open = False + self.stay_open = stay_open # Are we running in GUI mode? - self.gui_mode = False + self.gui_mode = gui_mode # Are we using receive mode? - self.receive_mode = False - + self.receive_mode = receive_mode # Starting in Flask 0.11, render_template_string autoescapes template variables # by default. To prevent content injection through template variables in diff --git a/onionshare_gui/__init__.py b/onionshare_gui/__init__.py index a40c081f..205f1c82 100644 --- a/onionshare_gui/__init__.py +++ b/onionshare_gui/__init__.py @@ -23,7 +23,7 @@ from .alert import Alert from PyQt5 import QtCore, QtWidgets from onionshare import strings, common -from .web import Web +from onionshare.web import Web from onionshare.onion import Onion from onionshare.onionshare import OnionShare from onionshare.settings import Settings @@ -86,7 +86,6 @@ def main(): # Debug mode? if debug: common.set_debug(debug) - web.debug_mode() # Validation if filenames: @@ -101,15 +100,18 @@ def main(): if not valid: sys.exit() + # Create the Web object + web = Web(debug, stay_open, True) + # Start the Onion onion = Onion() # Start the OnionShare app - web.set_stay_open(stay_open) app = OnionShare(onion, local_only, stay_open, shutdown_timeout) # Launch the gui - gui = OnionShareGui(onion, qtapp, app, filenames, config) + web.stay_open = stay_open + gui = OnionShareGui(web, onion, qtapp, app, filenames, config) # Clean up when app quits def shutdown(): diff --git a/onionshare_gui/onionshare_gui.py b/onionshare_gui/onionshare_gui.py index f38dd727..947499ed 100644 --- a/onionshare_gui/onionshare_gui.py +++ b/onionshare_gui/onionshare_gui.py @@ -17,10 +17,13 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ -import os, threading, time +import os +import threading +import time +import queue from PyQt5 import QtCore, QtWidgets, QtGui -from onionshare import strings, common, web +from onionshare import strings, common from onionshare.settings import Settings from onionshare.onion import * @@ -43,13 +46,14 @@ class OnionShareGui(QtWidgets.QMainWindow): starting_server_step3 = QtCore.pyqtSignal() starting_server_error = QtCore.pyqtSignal(str) - def __init__(self, onion, qtapp, app, filenames, config=False): + def __init__(self, web, onion, qtapp, app, filenames, config=False): super(OnionShareGui, self).__init__() self._initSystemTray() common.log('OnionShareGui', '__init__') + self.web = web self.onion = onion self.qtapp = qtapp self.app = app @@ -70,7 +74,7 @@ class OnionShareGui(QtWidgets.QMainWindow): self.file_selection.file_list.add_file(filename) # Server status - self.server_status = ServerStatus(self.qtapp, self.app, web, self.file_selection, self.settings) + self.server_status = ServerStatus(self.qtapp, self.app, self.web, self.file_selection, self.settings) self.server_status.server_started.connect(self.file_selection.server_started) self.server_status.server_started.connect(self.start_server) self.server_status.server_started.connect(self.update_server_status_indicator) @@ -377,9 +381,8 @@ class OnionShareGui(QtWidgets.QMainWindow): self.server_share_status_label.setText('') # Reset web counters - web.download_count = 0 - web.error404_count = 0 - web.set_gui_mode() + self.web.download_count = 0 + self.web.error404_count = 0 # start the onion service in a new thread def start_onion_service(self): @@ -395,7 +398,7 @@ class OnionShareGui(QtWidgets.QMainWindow): self.app.stay_open = not self.settings.get('close_after_first_download') # start onionshare http service in new thread - t = threading.Thread(target=web.start, args=(self.app.port, self.app.stay_open, self.settings.get('slug'))) + t = threading.Thread(target=self.web.start, args=(self.app.port, self.app.stay_open, self.settings.get('slug'))) t.daemon = True t.start() # wait for modules in thread to load, preventing a thread-related cx_Freeze crash @@ -428,8 +431,8 @@ class OnionShareGui(QtWidgets.QMainWindow): if self._zip_progress_bar != None: self._zip_progress_bar.update_processed_size_signal.emit(x) try: - web.set_file_info(self.filenames, processed_size_callback=_set_processed_size) - self.app.cleanup_filenames.append(web.zip_filename) + self.web.set_file_info(self.filenames, processed_size_callback=_set_processed_size) + self.app.cleanup_filenames.append(self.web.zip_filename) self.starting_server_step3.emit() # done @@ -455,7 +458,7 @@ class OnionShareGui(QtWidgets.QMainWindow): self._zip_progress_bar = None # warn about sending large files over Tor - if web.zip_filesize >= 157286400: # 150mb + if self.web.zip_filesize >= 157286400: # 150mb self.filesize_warning.setText(strings._("large_filesize", True)) self.filesize_warning.show() @@ -503,7 +506,7 @@ class OnionShareGui(QtWidgets.QMainWindow): if self.server_status.status != self.server_status.STATUS_STOPPED: try: - web.stop(self.app.port) + self.web.stop(self.app.port) except: # Probably we had no port to begin with (Onion service didn't start) pass @@ -570,33 +573,33 @@ class OnionShareGui(QtWidgets.QMainWindow): done = False while not done: try: - r = web.q.get(False) + r = self.web.q.get(False) events.append(r) - except web.queue.Empty: + except queue.Empty: done = True for event in events: - if event["type"] == web.REQUEST_LOAD: + if event["type"] == self.web.REQUEST_LOAD: self.status_bar.showMessage(strings._('download_page_loaded', True)) - elif event["type"] == web.REQUEST_DOWNLOAD: + elif event["type"] == self.web.REQUEST_DOWNLOAD: self.downloads_container.show() # show the downloads layout - self.downloads.add_download(event["data"]["id"], web.zip_filesize) + self.downloads.add_download(event["data"]["id"], self.web.zip_filesize) self.new_download = True self.downloads_in_progress += 1 self.update_downloads_in_progress(self.downloads_in_progress) if self.systemTray.supportsMessages() and self.settings.get('systray_notifications'): self.systemTray.showMessage(strings._('systray_download_started_title', True), strings._('systray_download_started_message', True)) - elif event["type"] == web.REQUEST_RATE_LIMIT: + elif event["type"] == self.web.REQUEST_RATE_LIMIT: self.stop_server() Alert(strings._('error_rate_limit'), QtWidgets.QMessageBox.Critical) - elif event["type"] == web.REQUEST_PROGRESS: + elif event["type"] == self.web.REQUEST_PROGRESS: self.downloads.update_download(event["data"]["id"], event["data"]["bytes"]) # is the download complete? - if event["data"]["bytes"] == web.zip_filesize: + if event["data"]["bytes"] == self.web.zip_filesize: if self.systemTray.supportsMessages() and self.settings.get('systray_notifications'): self.systemTray.showMessage(strings._('systray_download_completed_title', True), strings._('systray_download_completed_message', True)) # Update the total 'completed downloads' info @@ -607,7 +610,7 @@ class OnionShareGui(QtWidgets.QMainWindow): self.update_downloads_in_progress(self.downloads_in_progress) # close on finish? - if not web.get_stay_open(): + if not self.web.stay_open: self.server_status.stop_server() self.status_bar.clearMessage() self.server_share_status_label.setText(strings._('closing_automatically', True)) @@ -618,7 +621,7 @@ class OnionShareGui(QtWidgets.QMainWindow): self.update_downloads_in_progress(self.downloads_in_progress) - elif event["type"] == web.REQUEST_CANCELED: + elif event["type"] == self.web.REQUEST_CANCELED: self.downloads.cancel_download(event["data"]["id"]) # Update the 'in progress downloads' info self.downloads_in_progress -= 1 @@ -627,7 +630,7 @@ class OnionShareGui(QtWidgets.QMainWindow): self.systemTray.showMessage(strings._('systray_download_canceled_title', True), strings._('systray_download_canceled_message', True)) elif event["path"] != '/favicon.ico': - self.status_bar.showMessage('[#{0:d}] {1:s}: {2:s}'.format(web.error404_count, strings._('other_page_loaded', True), event["path"])) + self.status_bar.showMessage('[#{0:d}] {1:s}: {2:s}'.format(self.web.error404_count, strings._('other_page_loaded', True), event["path"])) # If the auto-shutdown timer has stopped, stop the server if self.server_status.status == self.server_status.STATUS_STARTED: @@ -638,7 +641,7 @@ class OnionShareGui(QtWidgets.QMainWindow): self.server_status.server_button.setText(strings._('gui_stop_server_shutdown_timeout', True).format(seconds_remaining)) if not self.app.shutdown_timer.is_alive(): # If there were no attempts to download the share, or all downloads are done, we can stop - if web.download_count == 0 or web.done: + if self.web.download_count == 0 or self.web.done: self.server_status.stop_server() self.status_bar.clearMessage() self.server_share_status_label.setText(strings._('close_on_timeout', True))