diff --git a/onionshare/web.py b/onionshare/web.py index 39bb6f34..8fe46bcc 100644 --- a/onionshare/web.py +++ b/onionshare/web.py @@ -45,13 +45,13 @@ class Web(object): The Web object is the OnionShare web server, powered by flask """ REQUEST_LOAD = 0 - REQUEST_DOWNLOAD = 1 + REQUEST_STARTED = 1 REQUEST_PROGRESS = 2 REQUEST_OTHER = 3 REQUEST_CANCELED = 4 REQUEST_RATE_LIMIT = 5 REQUEST_CLOSE_SERVER = 6 - + def __init__(self, common, gui_mode, receive_mode=False): self.common = common @@ -103,6 +103,7 @@ class Web(object): self.slug = None self.download_count = 0 + self.upload_count = 0 self.error404_count = 0 # If "Stop After First Download" is checked (stay_open == False), only allow @@ -173,17 +174,17 @@ class Web(object): r = make_response(render_template('denied.html')) return self.add_security_headers(r) - # each download has a unique id + # Each download has a unique id download_id = self.download_count self.download_count += 1 - # prepare some variables to use inside generate() function below + # Prepare some variables to use inside generate() function below # which is outside of the request context shutdown_func = request.environ.get('werkzeug.server.shutdown') path = request.path - # tell GUI the download started - self.add_request(self.REQUEST_DOWNLOAD, path, {'id': download_id}) + # Tell GUI the download started + self.add_request(self.REQUEST_STARTED, path, {'id': download_id}) dirname = os.path.dirname(self.zip_filename) basename = os.path.basename(self.zip_filename) @@ -266,9 +267,8 @@ class Web(object): def receive_routes(self): """ - The web app routes for sharing files + The web app routes for receiving files """ - def index_logic(): self.add_request(self.REQUEST_LOAD, request.path) @@ -277,12 +277,12 @@ class Web(object): slug=self.slug, receive_allow_receiver_shutdown=self.common.settings.get('receive_allow_receiver_shutdown'))) return self.add_security_headers(r) - + @self.app.route("/") def index(slug_candidate): self.check_slug_candidate(slug_candidate) return index_logic() - + @self.app.route("/") def index_public(): if not self.common.settings.get('receive_public_mode'): @@ -291,6 +291,9 @@ class Web(object): def upload_logic(slug_candidate=''): + """ + Upload files. + """ files = request.files.getlist('file[]') filenames = [] for f in files: @@ -345,7 +348,7 @@ class Web(object): def upload(slug_candidate): self.check_slug_candidate(slug_candidate) return upload_logic(slug_candidate) - + @self.app.route("/upload") def upload_public(): if not self.common.settings.get('receive_public_mode'): @@ -361,12 +364,12 @@ class Web(object): return self.add_security_headers(r) else: return redirect('/{}'.format(slug_candidate)) - + @self.app.route("//close", methods=['POST']) def close(slug_candidate): self.check_slug_candidate(slug_candidate) return close_logic(slug_candidate) - + @self.app.route("/upload") def close_public(): if not self.common.settings.get('receive_public_mode'): @@ -653,9 +656,24 @@ class ReceiveModeRequest(Request): This gets called for each file that gets uploaded, and returns an file-like writable stream. """ + # Each upload has a unique id. Now that the upload is starting, attach its + # upload_id to the request + self.upload_id = self.web.upload_count + self.web.upload_count += 1 + + # Tell GUI the upload started + self.web.add_request(self.web.REQUEST_STARTED, self.path, { + 'id': self.upload_id + }) + + self.onionshare_progress[filename] = { + 'total_bytes': total_content_length, + 'uploaded_bytes': 0 + } + if len(self.onionshare_progress) > 0: print('') - self.onionshare_progress[filename] = 0 + return ReceiveModeTemporaryFile(filename, self.onionshare_update_func) def close(self): @@ -670,5 +688,13 @@ class ReceiveModeRequest(Request): """ Keep track of the bytes uploaded so far for all files. """ - self.onionshare_progress[filename] += length - print('{} - {} '.format(self.web.common.human_readable_filesize(self.onionshare_progress[filename]), filename), end='\r') + self.onionshare_progress[filename]['uploaded_bytes'] += length + uploaded = self.web.common.human_readable_filesize(self.onionshare_progress[filename]['uploaded_bytes']) + total = self.web.common.human_readable_filesize(self.onionshare_progress[filename]['total_bytes']) + print('{}/{} - {} '.format(uploaded, total, filename), end='\r') + + # Update the GUI on the download progress + self.web.add_request(self.web.REQUEST_PROGRESS, self.path, { + 'id': self.upload_id, + 'bytes': self.onionshare_progress[filename]['uploaded_bytes'] + }) diff --git a/onionshare_gui/mode.py b/onionshare_gui/mode.py index d425341e..1e8bd23b 100644 --- a/onionshare_gui/mode.py +++ b/onionshare_gui/mode.py @@ -295,7 +295,7 @@ class Mode(QtWidgets.QWidget): def handle_request_download(self, event): """ - Handle REQUEST_DOWNLOAD event. + Handle REQUEST_STARTED event. """ pass diff --git a/onionshare_gui/onionshare_gui.py b/onionshare_gui/onionshare_gui.py index 81bea23e..295db45b 100644 --- a/onionshare_gui/onionshare_gui.py +++ b/onionshare_gui/onionshare_gui.py @@ -372,7 +372,7 @@ class OnionShareGui(QtWidgets.QMainWindow): if event["type"] == Web.REQUEST_LOAD: mode.handle_request_load(event) - elif event["type"] == Web.REQUEST_DOWNLOAD: + elif event["type"] == Web.REQUEST_STARTED: mode.handle_request_download(event) elif event["type"] == Web.REQUEST_RATE_LIMIT: diff --git a/onionshare_gui/receive_mode/__init__.py b/onionshare_gui/receive_mode/__init__.py index 9099dec9..6fd0031c 100644 --- a/onionshare_gui/receive_mode/__init__.py +++ b/onionshare_gui/receive_mode/__init__.py @@ -105,6 +105,7 @@ class ReceiveMode(Mode): Starting the server. """ # Reset web counters + self.web.upload_count = 0 self.web.error404_count = 0 # Hide and reset the uploads if we have previously shared @@ -118,6 +119,12 @@ class ReceiveMode(Mode): self.starting_server_step3.emit() self.start_server_finished.emit() + def handle_tor_broke_custom(self): + """ + Connection to Tor broke. + """ + self.info_widget.hide() + def handle_request_load(self, event): """ Handle REQUEST_LOAD event. diff --git a/onionshare_gui/share_mode/__init__.py b/onionshare_gui/share_mode/__init__.py index b87b515b..12a9265a 100644 --- a/onionshare_gui/share_mode/__init__.py +++ b/onionshare_gui/share_mode/__init__.py @@ -237,7 +237,7 @@ class ShareMode(Mode): def handle_request_download(self, event): """ - Handle REQUEST_DOWNLOAD event. + Handle REQUEST_STARTED event. """ self.downloads.add(event["data"]["id"], self.web.zip_filesize) self.downloads_in_progress += 1