[tor-commits] [stem/master] Load new fallback attributes when persisted

atagar at torproject.org atagar at torproject.org
Fri Jan 12 18:16:53 UTC 2018


commit c2c5c58519f1fc695b0c2111cb47f522510a6a53
Author: Damian Johnson <atagar at torproject.org>
Date:   Fri Jan 12 10:02:10 2018 -0800

    Load new fallback attributes when persisted
---
 cache_fallback_directories.py  |  2 +-
 stem/descriptor/remote.py      | 16 ++++++++++++++--
 test/unit/descriptor/remote.py | 15 ++++++++++++---
 3 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/cache_fallback_directories.py b/cache_fallback_directories.py
index 50139f56..990301f4 100755
--- a/cache_fallback_directories.py
+++ b/cache_fallback_directories.py
@@ -48,7 +48,7 @@ if __name__ == '__main__':
 
   # all fallbacks have the same header metadata, so just picking one
 
-  headers = latest_fallback_directories.values()[0].header if latest_fallback_directories else {}
+  headers = latest_fallback_directories.values()[0].header if latest_fallback_directories else None
 
   print('Differences detected...\n')
   print(stem.descriptor.remote._fallback_directory_differences(cached_fallback_directories, latest_fallback_directories))
diff --git a/stem/descriptor/remote.py b/stem/descriptor/remote.py
index f4845922..b2fd612c 100644
--- a/stem/descriptor/remote.py
+++ b/stem/descriptor/remote.py
@@ -92,6 +92,12 @@ import time
 import zlib
 
 try:
+  # added in python 2.7
+  from collections import OrderedDict
+except ImportError:
+  from stem.util.ordereddict import OrderedDict
+
+try:
   # account for urllib's change between python 2.x and 3.x
   import urllib.request as urllib
 except ImportError:
@@ -966,7 +972,7 @@ class FallbackDirectory(Directory):
     self.nickname = nickname
     self.has_extrainfo = has_extrainfo
     self.orport_v6 = orport_v6
-    self.header = header if header else {}
+    self.header = header if header else OrderedDict()
 
   @staticmethod
   def from_cache(path = CACHE_PATH):
@@ -988,6 +994,7 @@ class FallbackDirectory(Directory):
 
     conf = stem.util.conf.Config()
     conf.load(path)
+    headers = OrderedDict([(k.split('.', 1)[1], conf.get(k)) for k in conf.keys() if k.startswith('header.')])
 
     results = {}
 
@@ -1010,7 +1017,7 @@ class FallbackDirectory(Directory):
         raise IOError("'%s.or_port' was an invalid port (%s)" % (fingerprint, attr['or_port']))
       elif not connection.is_valid_port(attr['dir_port']):
         raise IOError("'%s.dir_port' was an invalid port (%s)" % (fingerprint, attr['dir_port']))
-      elif attr['nickname'] and not connection.is_valid_nickname(attr['nickname']):
+      elif attr['nickname'] and not tor_tools.is_valid_nickname(attr['nickname']):
         raise IOError("'%s.nickname' was an invalid nickname (%s)" % (fingerprint, attr['nickname']))
       elif attr['orport6_address'] and not connection.is_valid_ipv6_address(attr['orport6_address']):
         raise IOError("'%s.orport6_address' was an invalid IPv6 address (%s)" % (fingerprint, attr['orport6_address']))
@@ -1027,7 +1034,10 @@ class FallbackDirectory(Directory):
         or_port = int(attr['or_port']),
         dir_port = int(attr['dir_port']),
         fingerprint = fingerprint,
+        nickname = attr['nickname'],
+        has_extrainfo = attr['has_extrainfo'] == 'true',
         orport_v6 = orport_v6,
+        header = headers,
       )
 
     return results
@@ -1209,6 +1219,8 @@ class FallbackDirectory(Directory):
       conf.set('%s.address' % fingerprint, directory.address)
       conf.set('%s.or_port' % fingerprint, str(directory.or_port))
       conf.set('%s.dir_port' % fingerprint, str(directory.dir_port))
+      conf.set('%s.nickname' % fingerprint, directory.nickname)
+      conf.set('%s.has_extrainfo' % fingerprint, 'true' if directory.has_extrainfo else 'false')
 
       if directory.orport_v6:
         conf.set('%s.orport6_address' % fingerprint, str(directory.orport_v6[0]))
diff --git a/test/unit/descriptor/remote.py b/test/unit/descriptor/remote.py
index c17a1342..9409544c 100644
--- a/test/unit/descriptor/remote.py
+++ b/test/unit/descriptor/remote.py
@@ -12,6 +12,12 @@ import stem.prereq
 import stem.util.conf
 
 try:
+  # added in python 2.7
+  from collections import OrderedDict
+except ImportError:
+  from stem.util.ordereddict import OrderedDict
+
+try:
   # added in python 3.3
   from unittest.mock import patch
 except ImportError:
@@ -211,7 +217,7 @@ class TestDescriptorDownloader(unittest.TestCase):
   def test_fallback_directories_from_remote(self, urlopen_mock):
     urlopen_mock.return_value = io.BytesIO(FALLBACK_DIR_CONTENT)
     fallback_directories = stem.descriptor.remote.FallbackDirectory.from_remote()
-    header = {'type': 'fallback', 'version': '2.0.0', 'timestamp': '20170526090242'}
+    header = OrderedDict((('type', 'fallback'), ('version', '2.0.0'), ('timestamp', '20170526090242')))
 
     expected = {
       '0756B7CD4DFC8182BE23143FAC0642F515182CEB': stem.descriptor.remote.FallbackDirectory(
@@ -239,7 +245,7 @@ class TestDescriptorDownloader(unittest.TestCase):
     self.assertEqual(expected, fallback_directories)
 
   def test_fallback_persistence(self):
-    header = {'type': 'fallback', 'version': '2.0.0', 'timestamp': '20170526090242'}
+    header = OrderedDict((('type', 'fallback'), ('version', '2.0.0'), ('timestamp', '20170526090242')))
 
     expected = {
       '0756B7CD4DFC8182BE23143FAC0642F515182CEB': stem.descriptor.remote.FallbackDirectory(
@@ -273,9 +279,12 @@ class TestDescriptorDownloader(unittest.TestCase):
       '01A9258A46E97FF8B2CAC7910577862C14F2C524.address': ['193.171.202.146'],
       '01A9258A46E97FF8B2CAC7910577862C14F2C524.or_port': ['9001'],
       '01A9258A46E97FF8B2CAC7910577862C14F2C524.dir_port': ['9030'],
+      '01A9258A46E97FF8B2CAC7910577862C14F2C524.has_extrainfo': ['false'],
       '0756B7CD4DFC8182BE23143FAC0642F515182CEB.address': ['5.9.110.236'],
       '0756B7CD4DFC8182BE23143FAC0642F515182CEB.or_port': ['9001'],
       '0756B7CD4DFC8182BE23143FAC0642F515182CEB.dir_port': ['9030'],
+      '0756B7CD4DFC8182BE23143FAC0642F515182CEB.nickname': ['rueckgrat'],
+      '0756B7CD4DFC8182BE23143FAC0642F515182CEB.has_extrainfo': ['true'],
       '0756B7CD4DFC8182BE23143FAC0642F515182CEB.orport6_address': ['2a01:4f8:162:51e2::2'],
       '0756B7CD4DFC8182BE23143FAC0642F515182CEB.orport6_port': ['9001'],
     }
@@ -287,7 +296,7 @@ class TestDescriptorDownloader(unittest.TestCase):
       conf.load(tmp.name)
       self.assertEqual(excepted_config, dict(conf))
 
-      #self.assertEqual(expected, stem.descriptor.remote.FallbackDirectory.from_cache(tmp.name))
+      self.assertEqual(expected, stem.descriptor.remote.FallbackDirectory.from_cache(tmp.name))
 
   @patch(URL_OPEN)
   def test_fallback_directories_from_remote_empty(self, urlopen_mock):





More information about the tor-commits mailing list