mirror of
https://github.com/onionshare/onionshare.git
synced 2025-05-04 23:45:04 -04:00
Add a Startup Timer feature (scheduled start / dead man's switch)
This commit is contained in:
parent
3af05dcc20
commit
31c360b44d
16 changed files with 326 additions and 34 deletions
|
@ -28,6 +28,7 @@ class OnionThread(QtCore.QThread):
|
|||
Starts the onion service, and waits for it to finish
|
||||
"""
|
||||
success = QtCore.pyqtSignal()
|
||||
success_early = QtCore.pyqtSignal()
|
||||
error = QtCore.pyqtSignal(str)
|
||||
|
||||
def __init__(self, mode):
|
||||
|
@ -41,18 +42,30 @@ class OnionThread(QtCore.QThread):
|
|||
def run(self):
|
||||
self.mode.common.log('OnionThread', 'run')
|
||||
|
||||
# Choose port and slug early, because we need them to exist in advance for scheduled shares
|
||||
self.mode.app.stay_open = not self.mode.common.settings.get('close_after_first_download')
|
||||
|
||||
# start onionshare http service in new thread
|
||||
self.mode.web_thread = WebThread(self.mode)
|
||||
self.mode.web_thread.start()
|
||||
|
||||
# wait for modules in thread to load, preventing a thread-related cx_Freeze crash
|
||||
time.sleep(0.2)
|
||||
if not self.mode.app.port:
|
||||
self.mode.app.choose_port()
|
||||
if not self.mode.common.settings.get('public_mode'):
|
||||
if not self.mode.web.slug:
|
||||
self.mode.web.generate_slug(self.mode.common.settings.get('slug'))
|
||||
|
||||
try:
|
||||
self.mode.app.start_onion_service()
|
||||
self.success.emit()
|
||||
if self.mode.obtain_onion_early:
|
||||
self.mode.app.start_onion_service(await_publication=False, save_scheduled_key=True)
|
||||
# wait for modules in thread to load, preventing a thread-related cx_Freeze crash
|
||||
time.sleep(0.2)
|
||||
self.success_early.emit()
|
||||
# Unregister the onion so we can use it in the next OnionThread
|
||||
self.mode.app.onion.cleanup()
|
||||
else:
|
||||
self.mode.app.start_onion_service(await_publication=True)
|
||||
# wait for modules in thread to load, preventing a thread-related cx_Freeze crash
|
||||
time.sleep(0.2)
|
||||
# start onionshare http service in new thread
|
||||
self.mode.web_thread = WebThread(self.mode)
|
||||
self.mode.web_thread.start()
|
||||
self.success.emit()
|
||||
|
||||
except (TorTooOld, TorErrorInvalidSetting, TorErrorAutomatic, TorErrorSocketPort, TorErrorSocketFile, TorErrorMissingPassword, TorErrorUnreadableCookieFile, TorErrorAuthError, TorErrorProtocolError, BundledTorTimeout, OSError) as e:
|
||||
self.error.emit(e.args[0])
|
||||
|
@ -73,5 +86,39 @@ class WebThread(QtCore.QThread):
|
|||
|
||||
def run(self):
|
||||
self.mode.common.log('WebThread', 'run')
|
||||
self.mode.app.choose_port()
|
||||
self.mode.web.start(self.mode.app.port, self.mode.app.stay_open, self.mode.common.settings.get('public_mode'), self.mode.common.settings.get('slug'))
|
||||
self.mode.web.start(self.mode.app.port, self.mode.app.stay_open, self.mode.common.settings.get('public_mode'), self.mode.web.slug)
|
||||
self.success.emit()
|
||||
|
||||
|
||||
class StartupTimer(QtCore.QThread):
|
||||
"""
|
||||
Waits for a prescribed time before allowing a share to start
|
||||
"""
|
||||
success = QtCore.pyqtSignal()
|
||||
error = QtCore.pyqtSignal(str)
|
||||
def __init__(self, mode, canceled=False):
|
||||
super(StartupTimer, self).__init__()
|
||||
self.mode = mode
|
||||
self.canceled = canceled
|
||||
self.mode.common.log('StartupTimer', '__init__')
|
||||
|
||||
# allow this thread to be terminated
|
||||
self.setTerminationEnabled()
|
||||
|
||||
def run(self):
|
||||
now = QtCore.QDateTime.currentDateTime()
|
||||
scheduled_start = now.secsTo(self.mode.server_status.scheduled_start)
|
||||
try:
|
||||
# Sleep until scheduled time
|
||||
while scheduled_start > 0 and self.canceled == False:
|
||||
time.sleep(0.1)
|
||||
now = QtCore.QDateTime.currentDateTime()
|
||||
scheduled_start = now.secsTo(self.mode.server_status.scheduled_start)
|
||||
# Timer has now finished
|
||||
self.mode.server_status.server_button.setText(strings._('gui_please_wait'))
|
||||
self.mode.server_status_label.setText(strings._('gui_status_indicator_share_working'))
|
||||
if self.canceled == False:
|
||||
self.success.emit()
|
||||
except ValueError as e:
|
||||
self.error.emit(e.args[0])
|
||||
return
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue