[tor-commits] [stem/master] Optionally wait for publication when creating HS

atagar at torproject.org atagar at torproject.org
Mon May 11 02:39:53 UTC 2015


commit 53058f868667e4c885ec21f69fb187f4993d6637
Author: Damian Johnson <atagar at torproject.org>
Date:   Sun May 10 17:45:09 2015 -0700

    Optionally wait for publication when creating HS
    
    Option for ephemeral hidden service creation to wait for the UPLOADED event.
    This has a few warts to it, but should work reasonably well in practice until
    we have something better. Based on a change by Yawning to do the same...
    
      https://github.com/Yawning/onionwrap/commit/8edda8c76b2a39d22c8fa197c0d4df7879f632a3
---
 stem/control.py |   34 +++++++++++++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/stem/control.py b/stem/control.py
index 3e426ea..39fc3c9 100644
--- a/stem/control.py
+++ b/stem/control.py
@@ -2582,7 +2582,7 @@ class Controller(BaseController):
 
     return result
 
-  def create_ephemeral_hidden_service(self, ports, key_type = 'NEW', key_content = 'BEST', discard_key = False, detached = False):
+  def create_ephemeral_hidden_service(self, ports, key_type = 'NEW', key_content = 'BEST', discard_key = False, detached = False, await_publication = False):
     """
     Creates a new hidden service. Unlike
     :func:`~stem.control.Controller.create_hidden_service` this style of
@@ -2619,6 +2619,8 @@ class Controller(BaseController):
     :param bool discard_key: avoid providing the key back in our response
     :param bool detached: continue this hidden service even after this control
       connection is closed if **True**
+    :param bool await_publication: blocks until our descriptor is successfully
+      published if **True**
 
     :returns: :class:`~stem.response.AddOnionResponse` with the response
 
@@ -2629,6 +2631,15 @@ class Controller(BaseController):
     # if self.get_version() < stem.version.Requirement.ADD_ONION:
     #   raise stem.UnsatisfiableRequest(message = 'Ephemeral hidden services were added in tor version %s' % stem.version.Requirement.ADD_ONION)
 
+    hs_desc_queue, hs_desc_listener = queue.Queue(), None
+
+    if await_publication:
+      def hs_desc_listener(event):
+        print event
+        hs_desc_queue.put(event)
+
+      self.add_event_listener(hs_desc_listener, EventType.HS_DESC)
+
     request = 'ADD_ONION %s:%s' % (key_type, key_content)
 
     flags = []
@@ -2655,6 +2666,27 @@ class Controller(BaseController):
 
     response = self.msg(request)
     stem.response.convert('ADD_ONION', response)
+
+    if await_publication:
+      # We should receive five UPLOAD events, followed by up to another five
+      # UPLOADED to indicate they've finished. Presently tor seems to have an
+      # issue where the address is provided for UPLOAD but not UPLOADED so need
+      # to just guess that if it's for the same hidden service authority then
+      # it's what we're looking for.
+
+      authorities_uploaded_to = []
+
+      try:
+        while True:
+          event = hs_desc_queue.get()
+
+          if event.action == stem.HSDescAction.UPLOAD and event.address == response.service_id:
+            authorities_uploaded_to.append(event.directory_fingerprint)
+          elif event.action == stem.HSDescAction.UPLOADED and event.directory_fingerprint in authorities_uploaded_to:
+            break  # successfully uploaded to a HS authority... maybe
+      finally:
+        self.remove_event_listener(hs_desc_listener)
+
     return response
 
   def remove_ephemeral_hidden_service(self, service_id):



More information about the tor-commits mailing list