[Pkg-anonymity-tools] [onionshare] 46/140: waits for hidden service before displaying URL. fixes #116

Ulrike Uhlig u-guest at moszumanska.debian.org
Mon Sep 29 20:33:46 UTC 2014


This is an automated email from the git hooks/post-receive script.

u-guest pushed a commit to branch master
in repository onionshare.

commit 846b10b75558b023fd198fd89e8a0c4d1e3e4a69
Author: Micah Lee <micah at micahflee.com>
Date:   Fri Aug 29 14:32:19 2014 -0700

    waits for hidden service before displaying URL. fixes #116
---
 onionshare/onionshare.py         | 41 +++++++++++++++++++++++++++++++++++-----
 onionshare/strings.json          |  4 ++++
 onionshare/web.py                |  8 +++++++-
 onionshare_gui/onionshare_gui.py |  8 ++------
 stdeb.cfg                        |  2 +-
 5 files changed, 50 insertions(+), 13 deletions(-)

diff --git a/onionshare/onionshare.py b/onionshare/onionshare.py
index f9367e4..da1aba0 100644
--- a/onionshare/onionshare.py
+++ b/onionshare/onionshare.py
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-import os, sys, subprocess, time, argparse, inspect, shutil, socket
+import os, sys, subprocess, time, argparse, inspect, shutil, socks, socket, threading
 
 from stem.control import Controller
 from stem import SocketError
@@ -94,6 +94,24 @@ class OnionShare(object):
                 hostname_file = '{0}/hostname'.format(hidserv_dir)
                 self.onion_host = open(hostname_file, 'r').read().strip()
 
+    def wait_for_hs(self):
+        print strings._('wait_for_hs')
+
+        ready = False
+        while not ready:
+            try:
+                sys.stdout.write('{0} '.format(strings._('wait_for_hs_trying')))
+                sys.stdout.flush()
+
+                s = socks.socksocket()
+                s.setproxy(socks.PROXY_TYPE_SOCKS5, '127.0.0.1', 9150)
+                s.connect((self.onion_host, 80))
+                ready = True
+                sys.stdout.write('{0}\n'.format(strings._('wait_for_hs_yup')))
+            except TypeError as e:
+                sys.stdout.write('{0}\n'.format(strings._('wait_for_hs_nope')))
+                sys.stdout.flush()
+
 def tails_root():
     # if running in Tails and as root, do only the things that require root
     if helpers.get_platform() == 'Tails' and helpers.is_root():
@@ -165,17 +183,30 @@ def main():
     except TailsError as e:
         sys.exit(e.args[0])
 
-    # startup
+    # prepare files to share
     web.set_file_info(filenames)
     app.cleanup_filenames.append(web.zip_filename)
+
+    # start onionshare service in new thread
+    t = threading.Thread(target=web.start, args=(app.port, app.stay_open))
+    t.daemon = True
+    t.start()
+
+    # wait for hs
+    app.wait_for_hs()
     print strings._("give_this_url")
     print 'http://{0}/{1}'.format(app.onion_host, web.slug)
     print ''
     print strings._("ctrlc_to_stop")
 
-    # start the web server
-    web.start(app.port, app.stay_open)
-    print '\n'
+    # wait for app to close
+    running = True
+    while running:
+        try:
+            time.sleep(0.5)
+        except KeyboardInterrupt:
+            running = False
+            web.stop()
 
     # shutdown
     app.cleanup()
diff --git a/onionshare/strings.json b/onionshare/strings.json
index eb5be01..f1c0287 100644
--- a/onionshare/strings.json
+++ b/onionshare/strings.json
@@ -2,6 +2,10 @@
     "calculating_sha1": "Calculating SHA1 checksum.",
     "connecting_ctrlport": "Connecting to Tor control port to set up hidden service on port {0}.",
     "cant_connect_ctrlport": "Cannot connect to Tor control port on port {0}. Is Tor running?",
+    "wait_for_hs": "Waiting for hidden service to be ready:",
+    "wait_for_hs_trying": "Trying...",
+    "wait_for_hs_nope": "Not ready yet.",
+    "wait_for_hs_yup": "Ready!",
     "give_this_url": "Give this URL to the person you're sending the file to:",
     "ctrlc_to_stop":  "Press Ctrl-C to stop server",
     "not_a_file": "{0} is not a file.",
diff --git a/onionshare/web.py b/onionshare/web.py
index f8449fd..4a2cef0 100644
--- a/onionshare/web.py
+++ b/onionshare/web.py
@@ -1,4 +1,4 @@
-import Queue, mimetypes, platform, os, sys, zipfile
+import Queue, mimetypes, platform, os, sys, zipfile, urllib2
 from flask import Flask, Response, request, render_template_string, abort
 
 import strings, helpers
@@ -187,3 +187,9 @@ def start(port, stay_open=False, gui_mode=False):
     set_gui_mode(gui_mode)
     app.run(port=port)
 
+def stop():
+    # to stop flask, load http://127.0.0.1:<port>/<shutdown_slug>/shutdown
+    try:
+        urllib2.urlopen('http://127.0.0.1:{0}/{1}/shutdown'.format(app.port, shutdown_slug)).read()
+    except:
+        pass
diff --git a/onionshare_gui/onionshare_gui.py b/onionshare_gui/onionshare_gui.py
index 578746f..f33d89d 100644
--- a/onionshare_gui/onionshare_gui.py
+++ b/onionshare_gui/onionshare_gui.py
@@ -1,5 +1,5 @@
 from __future__ import division
-import os, sys, subprocess, inspect, platform, argparse, threading, time, math, inspect, platform, urllib2
+import os, sys, subprocess, inspect, platform, argparse, threading, time, math, inspect, platform
 from PyQt4 import QtCore, QtGui
 
 import common
@@ -101,11 +101,7 @@ class OnionShareGui(QtGui.QWidget):
         t.start()
 
     def stop_server(self):
-        # to stop flask, load http://127.0.0.1:<port>/<shutdown_slug>/shutdown
-        try:
-            urllib2.urlopen('http://127.0.0.1:{0}/{1}/shutdown'.format(self.app.port, web.shutdown_slug)).read()
-        except:
-            pass
+        web.stop()
         self.app.cleanup()
         self.stop_server_finished.emit()
 
diff --git a/stdeb.cfg b/stdeb.cfg
index 0895703..3264722 100644
--- a/stdeb.cfg
+++ b/stdeb.cfg
@@ -1,4 +1,4 @@
 [DEFAULT]
 Package: onionshare
-Depends: python-flask, python-stem
+Depends: python-flask, python-stem, python-socksipy
 Suite: trusty

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/collab-maint/onionshare.git



More information about the Pkg-anonymity-tools mailing list