summaryrefslogtreecommitdiff
path: root/cli/onionshare_cli/onionshare.py
diff options
context:
space:
mode:
Diffstat (limited to 'cli/onionshare_cli/onionshare.py')
-rw-r--r--cli/onionshare_cli/onionshare.py111
1 files changed, 111 insertions, 0 deletions
diff --git a/cli/onionshare_cli/onionshare.py b/cli/onionshare_cli/onionshare.py
new file mode 100644
index 00000000..f74672ce
--- /dev/null
+++ b/cli/onionshare_cli/onionshare.py
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+"""
+OnionShare | https://onionshare.org/
+
+Copyright (C) 2014-2020 Micah Lee, et al. <micah@micahflee.com>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+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 <http://www.gnu.org/licenses/>.
+"""
+
+import os, shutil
+
+from . import common
+from .onion import TorTooOld, TorErrorProtocolError
+from .common import AutoStopTimer
+
+
+class OnionShare(object):
+ """
+ OnionShare is the main application class. Pass in options and run
+ start_onion_service and it will do the magic.
+ """
+
+ def __init__(self, common, onion, local_only=False, autostop_timer=0):
+ self.common = common
+
+ self.common.log("OnionShare", "__init__")
+
+ # The Onion object
+ self.onion = onion
+
+ self.hidserv_dir = None
+ self.onion_host = None
+ self.port = None
+
+ # files and dirs to delete on shutdown
+ self.cleanup_filenames = []
+
+ # do not use tor -- for development
+ self.local_only = local_only
+
+ # optionally shut down after N hours
+ self.autostop_timer = autostop_timer
+ # init auto-stop timer thread
+ self.autostop_timer_thread = None
+
+ def choose_port(self):
+ """
+ Choose a random port.
+ """
+ try:
+ self.port = self.common.get_available_port(17600, 17650)
+ except:
+ raise OSError("Cannot find an available OnionShare port")
+
+ def start_onion_service(self, mode_settings, await_publication=True):
+ """
+ Start the onionshare onion service.
+ """
+ self.common.log("OnionShare", "start_onion_service")
+
+ if not self.port:
+ self.choose_port()
+
+ if self.autostop_timer > 0:
+ self.autostop_timer_thread = AutoStopTimer(self.common, self.autostop_timer)
+
+ if self.local_only:
+ self.onion_host = f"127.0.0.1:{self.port}"
+ return
+
+ self.onion_host = self.onion.start_onion_service(
+ mode_settings, self.port, await_publication
+ )
+
+ if mode_settings.get("general", "client_auth"):
+ self.auth_string = self.onion.auth_string
+
+ def stop_onion_service(self, mode_settings):
+ """
+ Stop the onion service
+ """
+ self.onion.stop_onion_service(mode_settings)
+
+ def cleanup(self):
+ """
+ Shut everything down and clean up temporary files, etc.
+ """
+ self.common.log("OnionShare", "cleanup")
+
+ # Cleanup files
+ try:
+ for filename in self.cleanup_filenames:
+ if os.path.isfile(filename):
+ os.remove(filename)
+ elif os.path.isdir(filename):
+ shutil.rmtree(filename)
+ except:
+ # Don't crash if file is still in use
+ pass
+ self.cleanup_filenames = []