]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
handle uri_extension with a non-bencode serialization scheme
authorBrian Warner <warner@lothar.com>
Fri, 8 Jun 2007 23:17:54 +0000 (16:17 -0700)
committerBrian Warner <warner@lothar.com>
Fri, 8 Jun 2007 23:17:54 +0000 (16:17 -0700)
src/allmydata/download.py
src/allmydata/encode.py
src/allmydata/interfaces.py

index 86c79689ebb3b7747a6c30bf744a3ff654cf7fe6..498c171f4f1ac545dd0eb0ef24ce625cccf2f111 100644 (file)
@@ -5,7 +5,7 @@ from twisted.python import log
 from twisted.internet import defer
 from twisted.application import service
 
-from allmydata.util import idlib, mathutil, bencode, hashutil
+from allmydata.util import idlib, mathutil, hashutil
 from allmydata.util.assertutil import _assert
 from allmydata import codec, hashtree
 from allmydata.Crypto.Cipher import AES
@@ -341,6 +341,31 @@ class FileDownloader:
         #        assert isinstance(vb, ValidatedBucket), \
         #               "vb is %s but should be a ValidatedBucket" % (vb,)
 
+    def _unpack_uri_extension_data(self, data):
+        d = {}
+        while data:
+            colon = data.index(":")
+            key = data[:colon]
+            data = data[colon+1:]
+
+            colon = data.index(":")
+            number = data[:colon]
+            length = int(number)
+            data = data[colon+1:]
+
+            value = data[:length]
+            assert data[length] == ","
+            data = data[length+1:]
+
+            d[key] = value
+
+        # convert certain things to numbers
+        for intkey in ("size", "segment_size", "num_segments",
+                       "needed_shares", "total_shares"):
+            if intkey in d:
+                d[intkey] = int(d[intkey])
+        return d
+
     def _obtain_uri_extension(self, ignored):
         # all shareholders are supposed to have a copy of uri_extension, and
         # all are supposed to be identical. We compute the hash of the data
@@ -353,7 +378,7 @@ class FileDownloader:
                 msg = ("The copy of uri_extension we received from "
                        "%s was bad" % bucket)
                 raise BadURIExtensionHashValue(msg)
-            return bencode.bdecode(proposal)
+            return self._unpack_uri_extension_data(proposal)
         return self._obtain_validated_thing(None,
                                             self._uri_extension_sources,
                                             "uri_extension",
index 997b59930e494f394ef52cc245743a0d26cafa62..f062d14b254a51789c03021ea85dcfc9abe297e5 100644 (file)
@@ -1,11 +1,12 @@
 # -*- test-case-name: allmydata.test.test_encode -*-
 
+import re
 from zope.interface import implements
 from twisted.internet import defer
 from twisted.python import log
 from allmydata.hashtree import HashTree
 from allmydata.Crypto.Cipher import AES
-from allmydata.util import mathutil, bencode, hashutil
+from allmydata.util import mathutil, hashutil
 from allmydata.util.assertutil import _assert
 from allmydata.codec import CRSEncoder
 from allmydata.interfaces import IEncoder
@@ -432,7 +433,15 @@ class Encoder(object):
 
     def send_uri_extension_to_all_shareholders(self):
         log.msg("%s: sending uri_extension" % self)
-        uri_extension = bencode.bencode(self.uri_extension_data)
+        pieces = []
+        for k in sorted(self.uri_extension_data.keys()):
+            value = self.uri_extension_data[k]
+            if isinstance(value, (int, long)):
+                value = "%d" % value
+            assert isinstance(value, str), k
+            assert re.match(r'^[a-zA-Z_\-]+$', k)
+            pieces.append(k + ":" + hashutil.netstring(value))
+        uri_extension = "".join(pieces)
         self.uri_extension_hash = hashutil.uri_extension_hash(uri_extension)
         dl = []
         for shareid in self.landlords.keys():
index 3fc3bb3b37bb6c2b5817e2d9128ccbfcbae2991d..4f40fd21bbb9b2c20ee60d372b391798aa14df6a 100644 (file)
@@ -69,6 +69,11 @@ class RIBucketWriter(RemoteInterface):
         mapping strings to other strings. The hash of this data is kept in
         the URI and verified before any of the data is used. All buckets for
         a given file contain identical copies of this data.
+
+        The serialization format is specified with the following pseudocode:
+        for k in sorted(dict.keys()):
+            assert re.match(r'^[a-zA-Z_\-]+$', k)
+            write(k + ':' + netstring(dict[k]))
         """
         return None