diff --git a/onionshare/__init__.py b/onionshare/__init__.py index 5b95e3a1..dede3d8a 100644 --- a/onionshare/__init__.py +++ b/onionshare/__init__.py @@ -266,7 +266,7 @@ def main(cwd=None): web = Web(common, False, mode_settings, mode) # Start the Onion object - onion = Onion(common) + onion = Onion(common, use_tmp_dir=True) try: onion.connect( custom_settings=False, diff --git a/onionshare/common.py b/onionshare/common.py index e85403eb..7048c174 100644 --- a/onionshare/common.py +++ b/onionshare/common.py @@ -181,15 +181,30 @@ class Common: os.makedirs(onionshare_data_dir, 0o700, True) return onionshare_data_dir + def build_tmp_dir(self): + """ + Returns path to a folder that can hold temporary files + """ + tmp_dir = os.path.join(self.build_data_dir(), "tmp") + os.makedirs(tmp_dir, 0o700, True) + return tmp_dir + def build_persistent_dir(self): """ Returns the path to the folder that holds persistent files """ - onionshare_data_dir = self.build_data_dir() - persistent_dir = os.path.join(onionshare_data_dir, "persistent") + persistent_dir = os.path.join(self.build_data_dir(), "persistent") os.makedirs(persistent_dir, 0o700, True) return persistent_dir + def build_tor_dir(self): + """ + Returns path to the tor data directory + """ + tor_dir = os.path.join(self.build_data_dir(), "tor_data") + os.makedirs(tor_dir, 0o700, True) + return tor_dir + def build_password(self, word_count=2): """ Returns a random string made of words from the wordlist, such as "deter-trig". diff --git a/onionshare/onion.py b/onionshare/onion.py index cce9ebfe..b04ab6b4 100644 --- a/onionshare/onion.py +++ b/onionshare/onion.py @@ -150,10 +150,12 @@ class Onion(object): is necessary for status updates to reach the GUI. """ - def __init__(self, common): + def __init__(self, common, use_tmp_dir=False): self.common = common self.common.log("Onion", "__init__") + self.use_tmp_dir = use_tmp_dir + # Is bundled tor supported? if ( self.common.platform == "Windows" or self.common.platform == "Darwin" @@ -217,24 +219,28 @@ class Onion(object): ) # Create a torrc for this session - self.tor_data_directory = tempfile.TemporaryDirectory( - dir=self.common.build_data_dir() - ) + if self.use_tmp_dir: + self.tor_data_directory = tempfile.TemporaryDirectory( + dir=self.common.build_tmp_dir() + ) + self.tor_data_directory_name = self.tor_data_directory.name + else: + self.tor_data_directory_name = self.common.build_tor_dir() self.common.log( - "Onion", "connect", f"tor_data_directory={self.tor_data_directory.name}" + "Onion", "connect", f"tor_data_directory_name={self.tor_data_directory_name}" ) # Create the torrc with open(self.common.get_resource_path("torrc_template")) as f: torrc_template = f.read() self.tor_cookie_auth_file = os.path.join( - self.tor_data_directory.name, "cookie" + self.tor_data_directory_name, "cookie" ) try: self.tor_socks_port = self.common.get_available_port(1000, 65535) except: raise OSError(strings._("no_available_port")) - self.tor_torrc = os.path.join(self.tor_data_directory.name, "torrc") + self.tor_torrc = os.path.join(self.tor_data_directory_name, "torrc") if self.common.platform == "Windows" or self.common.platform == "Darwin": # Windows doesn't support unix sockets, so it must use a network port. @@ -252,11 +258,11 @@ class Onion(object): torrc_template += "ControlSocket {{control_socket}}\n" self.tor_control_port = None self.tor_control_socket = os.path.join( - self.tor_data_directory.name, "control_socket" + self.tor_data_directory_name, "control_socket" ) torrc_template = torrc_template.replace( - "{{data_directory}}", self.tor_data_directory.name + "{{data_directory}}", self.tor_data_directory_name ) torrc_template = torrc_template.replace( "{{control_port}}", str(self.tor_control_port)