Fix linux tor paths, make event handler properly quit thread

This commit is contained in:
Micah Lee 2020-04-06 19:49:49 -07:00
parent dea6de67d0
commit c07eda330d
No known key found for this signature in database
GPG Key ID: 403C2657CD994F73
5 changed files with 31 additions and 19 deletions

View File

@ -28,6 +28,7 @@ import sys
import tempfile import tempfile
import threading import threading
import time import time
import shutil
from .settings import Settings from .settings import Settings
@ -100,7 +101,9 @@ class Common:
# Look for resources relative to the binary, so if the binary is /usr/bin/onionshare-gui and # Look for resources relative to the binary, so if the binary is /usr/bin/onionshare-gui and
# the resource dir is /usr/share/onionshare, then the resource dir relative to the binary dir # the resource dir is /usr/share/onionshare, then the resource dir relative to the binary dir
# is ../share/onionshare # is ../share/onionshare
prefix = os.path.join(os.path.dirname(os.path.dirname(sys.argv[0])), "share/onionshare") prefix = os.path.join(
os.path.dirname(os.path.dirname(sys.argv[0])), "share/onionshare"
)
elif getattr(sys, "frozen", False): elif getattr(sys, "frozen", False):
# Check if app is "frozen" # Check if app is "frozen"
@ -114,11 +117,11 @@ class Common:
def get_tor_paths(self): def get_tor_paths(self):
if self.platform == "Linux": if self.platform == "Linux":
prefix = os.path.dirname(os.path.dirname(sys.argv[0])) tor_path = shutil.which("tor")
tor_path = os.path.join(prefix, "bin/tor") obfs4proxy_file_path = shutil.which("obfs4proxy")
prefix = os.path.dirname(os.path.dirname(tor_path))
tor_geo_ip_file_path = os.path.join(prefix, "share/tor/geoip") tor_geo_ip_file_path = os.path.join(prefix, "share/tor/geoip")
tor_geo_ipv6_file_path = os.path.join(prefix, "share/tor/geoip6") tor_geo_ipv6_file_path = os.path.join(prefix, "share/tor/geoip6")
obfs4proxy_file_path = os.path.join(prefix, "bin/obfs4proxy")
elif self.platform == "Windows": elif self.platform == "Windows":
base_path = os.path.join( base_path = os.path.join(
os.path.dirname(os.path.dirname(self.get_resource_path(""))), "tor" os.path.dirname(os.path.dirname(self.get_resource_path(""))), "tor"

View File

@ -142,7 +142,9 @@ class SettingsDialog(QtWidgets.QDialog):
self.tor_geo_ipv6_file_path, self.tor_geo_ipv6_file_path,
self.obfs4proxy_file_path, self.obfs4proxy_file_path,
) = self.common.get_tor_paths() ) = self.common.get_tor_paths()
if not os.path.isfile(self.obfs4proxy_file_path): if not self.obfs4proxy_file_path or not os.path.isfile(
self.obfs4proxy_file_path
):
self.tor_bridges_use_obfs4_radio = QtWidgets.QRadioButton( self.tor_bridges_use_obfs4_radio = QtWidgets.QRadioButton(
strings._("gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy") strings._("gui_settings_tor_bridges_obfs4_radio_option_no_obfs4proxy")
) )
@ -163,7 +165,9 @@ class SettingsDialog(QtWidgets.QDialog):
self.tor_geo_ipv6_file_path, self.tor_geo_ipv6_file_path,
self.obfs4proxy_file_path, self.obfs4proxy_file_path,
) = self.common.get_tor_paths() ) = self.common.get_tor_paths()
if not os.path.isfile(self.obfs4proxy_file_path): if not self.obfs4proxy_file_path or not os.path.isfile(
self.obfs4proxy_file_path
):
self.tor_bridges_use_meek_lite_azure_radio = QtWidgets.QRadioButton( self.tor_bridges_use_meek_lite_azure_radio = QtWidgets.QRadioButton(
strings._( strings._(
"gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy" "gui_settings_tor_bridges_meek_lite_azure_radio_option_no_obfs4proxy"
@ -662,8 +666,7 @@ class SettingsDialog(QtWidgets.QDialog):
onion = Onion(self.common, use_tmp_dir=True) onion = Onion(self.common, use_tmp_dir=True)
onion.connect( onion.connect(
custom_settings=settings, custom_settings=settings, tor_status_update_func=tor_status_update_func,
tor_status_update_func=tor_status_update_func,
) )
# If an exception hasn't been raised yet, the Tor settings work # If an exception hasn't been raised yet, the Tor settings work
@ -750,9 +753,7 @@ class SettingsDialog(QtWidgets.QDialog):
) )
close_forced_update_thread() close_forced_update_thread()
forced_update_thread = UpdateThread( forced_update_thread = UpdateThread(self.common, self.onion, force=True)
self.common, self.onion, force=True
)
forced_update_thread.update_available.connect(update_available) forced_update_thread.update_available.connect(update_available)
forced_update_thread.update_not_available.connect(update_not_available) forced_update_thread.update_not_available.connect(update_not_available)
forced_update_thread.update_error.connect(update_error) forced_update_thread.update_error.connect(update_error)
@ -850,7 +851,10 @@ class SettingsDialog(QtWidgets.QDialog):
f"Onion done rebooting, connected to Tor: {self.common.gui.onion.connected_to_tor}", f"Onion done rebooting, connected to Tor: {self.common.gui.onion.connected_to_tor}",
) )
if self.common.gui.onion.is_authenticated() and not tor_con.wasCanceled(): if (
self.common.gui.onion.is_authenticated()
and not tor_con.wasCanceled()
):
self.settings_saved.emit() self.settings_saved.emit()
self.close() self.close()
@ -866,7 +870,10 @@ class SettingsDialog(QtWidgets.QDialog):
Cancel button clicked. Cancel button clicked.
""" """
self.common.log("SettingsDialog", "cancel_clicked") self.common.log("SettingsDialog", "cancel_clicked")
if not self.common.gui.local_only and not self.common.gui.onion.is_authenticated(): if (
not self.common.gui.local_only
and not self.common.gui.onion.is_authenticated()
):
Alert( Alert(
self.common, self.common,
strings._("gui_tor_connection_canceled"), strings._("gui_tor_connection_canceled"),

View File

@ -78,8 +78,9 @@ class TabWidget(QtWidgets.QTabWidget):
def cleanup(self): def cleanup(self):
# Stop the event thread # Stop the event thread
self.event_handler_t.stop() self.event_handler_t.should_quit = True
self.event_handler_t.join() self.event_handler_t.quit()
self.event_handler_t.wait(50)
# Clean up each tab # Clean up each tab
for index in range(self.count()): for index in range(self.count()):

View File

@ -185,6 +185,7 @@ class EventHandlerThread(QtCore.QThread):
super(EventHandlerThread, self).__init__() super(EventHandlerThread, self).__init__()
self.common = common self.common = common
self.common.log("EventHandlerThread", "__init__") self.common.log("EventHandlerThread", "__init__")
self.should_quit = False
def run(self): def run(self):
self.common.log("EventHandlerThread", "run") self.common.log("EventHandlerThread", "run")
@ -246,4 +247,6 @@ class EventHandlerThread(QtCore.QThread):
except: except:
pass pass
if self.should_quit:
break
time.sleep(0.2) time.sleep(0.2)

View File

@ -157,10 +157,8 @@ class TorConnectionThread(QtCore.QThread):
self.canceled_connecting_to_tor.emit() self.canceled_connecting_to_tor.emit()
except Exception as e: except Exception as e:
self.common.log( self.common.log("TorConnectionThread", "run", f"caught exception: {e}")
"TorConnectionThread", "run", f"caught exception: {e.args[0]}" self.error_connecting_to_tor.emit(str(e))
)
self.error_connecting_to_tor.emit(str(e.args[0]))
def _tor_status_update(self, progress, summary): def _tor_status_update(self, progress, summary):
self.tor_status_update.emit(progress, summary) self.tor_status_update.emit(progress, summary)