fixed Tails bug where if you stopped server in GUI, you could not start a new server again

This commit is contained in:
Micah Lee 2014-08-30 01:42:17 +00:00
parent cf52c2dcd0
commit c49cc75a55
3 changed files with 28 additions and 7 deletions

View File

@ -11,6 +11,8 @@ class TailsError(Exception): pass
class OnionShare(object): class OnionShare(object):
def __init__(self, debug=False, local_only=False, stay_open=False): def __init__(self, debug=False, local_only=False, stay_open=False):
self.port = None
# debug mode # debug mode
if debug: if debug:
web.debug_mode() web.debug_mode()
@ -24,10 +26,6 @@ class OnionShare(object):
# files and dirs to delete on shutdown # files and dirs to delete on shutdown
self.cleanup_filenames = [] self.cleanup_filenames = []
# choose a random port
self.choose_port()
self.local_host = "127.0.0.1:{0}".format(self.port)
def cleanup(self): def cleanup(self):
for filename in self.cleanup_filenames: for filename in self.cleanup_filenames:
if os.path.isfile(filename): if os.path.isfile(filename):
@ -44,6 +42,9 @@ class OnionShare(object):
tmpsock.close() tmpsock.close()
def start_hidden_service(self, gui=False, tails_root=False): def start_hidden_service(self, gui=False, tails_root=False):
if not self.port:
self.choose_port()
if helpers.get_platform() == 'Tails' and not tails_root: if helpers.get_platform() == 'Tails' and not tails_root:
# in Tails, start the hidden service in a root process # in Tails, start the hidden service in a root process
if gui: if gui:
@ -115,9 +116,15 @@ class OnionShare(object):
ready = True ready = True
sys.stdout.write('{0}\n'.format(strings._('wait_for_hs_yup'))) sys.stdout.write('{0}\n'.format(strings._('wait_for_hs_yup')))
except: except TypeError: # non-Tails error
sys.stdout.write('{0}\n'.format(strings._('wait_for_hs_nope'))) sys.stdout.write('{0}\n'.format(strings._('wait_for_hs_nope')))
sys.stdout.flush() sys.stdout.flush()
except urllib2.HTTPError: # Tails error
sys.stdout.write('{0}\n'.format(strings._('wait_for_hs_nope')))
sys.stdout.flush()
except KeyboardInterrupt:
return False
return True
def tails_root(): def tails_root():
# if running in Tails and as root, do only the things that require root # if running in Tails and as root, do only the things that require root
@ -137,6 +144,7 @@ def tails_root():
# start hidden service # start hidden service
app = OnionShare() app = OnionShare()
app.choose_port()
app.port = port app.port = port
app.start_hidden_service(False, True) app.start_hidden_service(False, True)
sys.stdout.write(app.onion_host) sys.stdout.write(app.onion_host)
@ -186,6 +194,7 @@ def main():
# start the onionshare app # start the onionshare app
try: try:
app = OnionShare(debug, local_only, stay_open) app = OnionShare(debug, local_only, stay_open)
app.choose_port()
print strings._("connecting_ctrlport").format(app.port) print strings._("connecting_ctrlport").format(app.port)
app.start_hidden_service() app.start_hidden_service()
except NoTor as e: except NoTor as e:
@ -204,7 +213,10 @@ def main():
t.start() t.start()
# wait for hs # wait for hs
app.wait_for_hs() ready = app.wait_for_hs()
if not ready:
sys.exit()
print strings._("give_this_url") print strings._("give_this_url")
print 'http://{0}/{1}'.format(app.onion_host, web.slug) print 'http://{0}/{1}'.format(app.onion_host, web.slug)
print '' print ''

View File

@ -179,6 +179,14 @@ def start(port, stay_open=False):
def stop(): def stop():
# to stop flask, load http://127.0.0.1:<port>/<shutdown_slug>/shutdown # to stop flask, load http://127.0.0.1:<port>/<shutdown_slug>/shutdown
try: try:
urllib2.urlopen('http://127.0.0.1:{0}/{1}/shutdown'.format(app.port, shutdown_slug)).read() if helpers.get_platform() == 'Tails':
# in Tails everything is proxies over Tor, so we need to get lower level
# to connect not over the proxy
import socket
s = socket.socket()
s.connect(('127.0.0.1', app.port))
s.sendall('GET /{0}/shutdown HTTP/1.1\r\n\r\n'.format(shutdown_slug))
else:
urllib2.urlopen('http://127.0.0.1:{0}/{1}/shutdown'.format(app.port, shutdown_slug)).read()
except: except:
pass pass

View File

@ -83,6 +83,7 @@ class OnionShareGui(QtGui.QWidget):
# start the hidden service # start the hidden service
self.status_bar.showMessage(strings._('gui_starting_server').format(self.app.port)) self.status_bar.showMessage(strings._('gui_starting_server').format(self.app.port))
try: try:
self.app.choose_port()
print strings._("connecting_ctrlport").format(self.app.port) print strings._("connecting_ctrlport").format(self.app.port)
self.app.start_hidden_service(gui=True) self.app.start_hidden_service(gui=True)
except onionshare.NoTor as e: except onionshare.NoTor as e: