[tor-commits] [stem/master] Supporting reason attribute in HS_DESC events
atagar at torproject.org
atagar at torproject.org
Tue Nov 18 06:09:21 UTC 2014
commit 52150096b772e3e8c946c1eb1958bf0010d9ac99
Author: Damian Johnson <atagar at torproject.org>
Date: Mon Nov 17 11:47:22 2014 -0800
Supporting reason attribute in HS_DESC events
New attribute being added to HS_DESC events...
https://gitweb.torproject.org/torspec.git/commitdiff/7908c8d
---
docs/change_log.rst | 1 +
stem/__init__.py | 21 +++++++++++++++++++++
stem/response/events.py | 5 +++++
test/unit/response/events.py | 19 +++++++++++++++++++
4 files changed, 46 insertions(+)
diff --git a/docs/change_log.rst b/docs/change_log.rst
index 172b206..1724497 100644
--- a/docs/change_log.rst
+++ b/docs/change_log.rst
@@ -48,6 +48,7 @@ The following are only available within Stem's `git repository
* Added :func:`~stem.control.BaseController.connection_time` to the :class:`~stem.control.BaseController`
* Changed :func:`~stem.control.Controller.get_microdescriptor`, :func:`~stem.control.Controller.get_server_descriptor`, and :func:`~stem.control.Controller.get_network_status` to get our own descriptor if no fingerprint or nickname is provided.
* Added :class:`~stem.exit_policy.ExitPolicy` methods for more easily handling 'private' policies (the `default prefix <https://www.torproject.org/docs/tor-manual.html.en#ExitPolicyRejectPrivate>`_) and the defaultly appended suffix. This includes :func:`~stem.exit_policy.ExitPolicy.has_private`, :func:`~stem.exit_policy.ExitPolicy.strip_private`, :func:`~stem.exit_policy.ExitPolicy.has_default`, and :func:`~stem.exit_policy.ExitPolicy.strip_default` :class:`~stem.exit_policy.ExitPolicy` methods in addition to :func:`~stem.exit_policy.ExitPolicyRule.is_private` and :func:`~stem.exit_policy.ExitPolicyRule.is_default` for the :class:`~stem.exit_policy.ExitPolicyRule`. (:trac:`10107`)
+ * Added the reason attribute to the :class:`~stem.response.events.HSDescEvent` (:spec:`7908c8d`)
* :func:`~stem.process.launch_tor_with_config` could cause a "Too many open files" OSError if called too many times (:trac:`13141`)
* **Descriptors**
diff --git a/stem/__init__.py b/stem/__init__.py
index f020342..eb84be7 100644
--- a/stem/__init__.py
+++ b/stem/__init__.py
@@ -409,6 +409,19 @@ Library for working with the tor process.
**FAILED** we were unable to retrieve the descriptor
=============== ===========
+.. data:: HSDescReason (enum)
+
+ Reason for the hidden service descriptor to fail to be fetched.
+
+ =================== ===========
+ HSDescReason Description
+ =================== ===========
+ **BAD_DESC** descriptor was unparseable
+ **QUERY_REJECTED** hidden service directory refused to provide the descriptor
+ **NOT_FOUND** descriptor with the given identifier wasn't found
+ **UNEXPECTED** failure type is unknown
+ =================== ===========
+
.. data:: HSAuth (enum)
Type of authentication being used for a HS_DESC event.
@@ -460,6 +473,7 @@ __all__ = [
'HiddenServiceState',
'HSAuth',
'HSDescAction',
+ 'HSDescReason',
'RelayEndReason',
'StreamStatus',
'StreamClosureReason',
@@ -776,6 +790,13 @@ HSDescAction = stem.util.enum.UppercaseEnum(
'FAILED',
)
+HSDescReason = stem.util.enum.UppercaseEnum(
+ 'BAD_DESC',
+ 'QUERY_REJECTED',
+ 'NOT_FOUND',
+ 'UNEXPECTED',
+)
+
HSAuth = stem.util.enum.UppercaseEnum(
'NO_AUTH',
'BASIC_AUTH',
diff --git a/stem/response/events.py b/stem/response/events.py
index b640d2d..0df830b 100644
--- a/stem/response/events.py
+++ b/stem/response/events.py
@@ -615,6 +615,9 @@ class HSDescEvent(Event):
.. versionadded:: 1.2.0
+ .. versionchanged:: 1.3.0
+ Added the reason attribute.
+
:var stem.HSDescAction action: what is happening with the descriptor
:var str address: hidden service address
:var stem.HSAuth authentication: service's authentication method
@@ -622,10 +625,12 @@ class HSDescEvent(Event):
:var str directory_fingerprint: hidden service directory's finterprint
:var str directory_nickname: hidden service directory's nickname if it was provided
:var str descriptor_id: descriptor identifier
+ :var stem.HSDescReason reason: reason the descriptor failed to be fetched
"""
_VERSION_ADDED = stem.version.Requirement.EVENT_HS_DESC
_POSITIONAL_ARGS = ('action', 'address', 'authentication', 'directory', 'descriptor_id')
+ _KEYWORD_ARGS = {'REASON': 'reason'}
def _parse(self):
self.directory_fingerprint = None
diff --git a/test/unit/response/events.py b/test/unit/response/events.py
index a44d536..054a9ff 100644
--- a/test/unit/response/events.py
+++ b/test/unit/response/events.py
@@ -198,6 +198,10 @@ $67B2BDA4264D8A189D9270E28B1D30A262838243=europa1 b3oeducbhjmbqmgw2i3jtz4fekkrin
HS_DESC_NO_DESC_ID = '650 HS_DESC REQUESTED ajhb7kljbiru65qo NO_AUTH \
$67B2BDA4264D8A189D9270E28B1D30A262838243'
+HS_DESC_FAILED = '650 HS_DESC FAILED ajhb7kljbiru65qo NO_AUTH \
+$67B2BDA4264D8A189D9270E28B1D30A262838243 \
+b3oeducbhjmbqmgw2i3jtz4fekkrinwj REASON=NOT_FOUND'
+
# NEWCONSENSUS event from v0.2.1.30.
NEWCONSENSUS_EVENT = """650+NEWCONSENSUS
@@ -748,6 +752,7 @@ class TestEvents(unittest.TestCase):
self.assertEqual('67B2BDA4264D8A189D9270E28B1D30A262838243', event.directory_fingerprint)
self.assertEqual('europa1', event.directory_nickname)
self.assertEqual('b3oeducbhjmbqmgw2i3jtz4fekkrinwj', event.descriptor_id)
+ self.assertEqual(None, event.reason)
event = _get_event(HS_DESC_NO_DESC_ID)
@@ -755,6 +760,20 @@ class TestEvents(unittest.TestCase):
self.assertEqual('67B2BDA4264D8A189D9270E28B1D30A262838243', event.directory_fingerprint)
self.assertEqual(None, event.directory_nickname)
self.assertEqual(None, event.descriptor_id)
+ self.assertEqual(None, event.reason)
+
+ event = _get_event(HS_DESC_FAILED)
+
+ self.assertTrue(isinstance(event, stem.response.events.HSDescEvent))
+ self.assertEqual(HS_DESC_FAILED.lstrip('650 '), str(event))
+ self.assertEqual(HSDescAction.FAILED, event.action)
+ self.assertEqual('ajhb7kljbiru65qo', event.address)
+ self.assertEqual(HSAuth.NO_AUTH, event.authentication)
+ self.assertEqual('$67B2BDA4264D8A189D9270E28B1D30A262838243', event.directory)
+ self.assertEqual('67B2BDA4264D8A189D9270E28B1D30A262838243', event.directory_fingerprint)
+ self.assertEqual(None, event.directory_nickname)
+ self.assertEqual('b3oeducbhjmbqmgw2i3jtz4fekkrinwj', event.descriptor_id)
+ self.assertEqual(HSDescReason.NOT_FOUND, event.reason)
def test_newdesc_event(self):
event = _get_event(NEWDESC_SINGLE)
More information about the tor-commits
mailing list