commit 53058f868667e4c885ec21f69fb187f4993d6637 Author: Damian Johnson atagar@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/8edda8c76b2a39d22c8fa197c0d4df78... --- 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):
tor-commits@lists.torproject.org