mirror of
https://github.com/tahoe-lafs/tahoe-lafs.git
synced 2025-02-07 20:00:20 +00:00
change uri-packer-unpacker to deal with dictionaries, not fragile tuples
This commit is contained in:
parent
3d1adf6d30
commit
05163ec8e1
@ -214,17 +214,21 @@ class FileDownloader:
|
|||||||
def __init__(self, client, uri, downloadable):
|
def __init__(self, client, uri, downloadable):
|
||||||
self._client = client
|
self._client = client
|
||||||
self._downloadable = downloadable
|
self._downloadable = downloadable
|
||||||
(codec_name, codec_params, tail_codec_params, verifierid, fileid, key, roothash, needed_shares, total_shares, size, segment_size) = unpack_uri(uri)
|
|
||||||
|
d = unpack_uri(uri)
|
||||||
|
verifierid = d['verifierid']
|
||||||
|
size = d['size']
|
||||||
|
segment_size = d['segment_size']
|
||||||
assert isinstance(verifierid, str)
|
assert isinstance(verifierid, str)
|
||||||
assert len(verifierid) == 20
|
assert len(verifierid) == 20
|
||||||
self._verifierid = verifierid
|
self._verifierid = verifierid
|
||||||
self._fileid = fileid
|
self._fileid = d['fileid']
|
||||||
self._roothash = roothash
|
self._roothash = d['roothash']
|
||||||
|
|
||||||
self._codec = codec.get_decoder_by_name(codec_name)
|
self._codec = codec.get_decoder_by_name(d['codec_name'])
|
||||||
self._codec.set_serialized_params(codec_params)
|
self._codec.set_serialized_params(d['codec_params'])
|
||||||
self._tail_codec = codec.get_decoder_by_name(codec_name)
|
self._tail_codec = codec.get_decoder_by_name(d['codec_name'])
|
||||||
self._tail_codec.set_serialized_params(tail_codec_params)
|
self._tail_codec.set_serialized_params(d['tail_codec_params'])
|
||||||
|
|
||||||
|
|
||||||
self._total_segments = mathutil.div_ceil(size, segment_size)
|
self._total_segments = mathutil.div_ceil(size, segment_size)
|
||||||
@ -233,10 +237,10 @@ class FileDownloader:
|
|||||||
self._size = size
|
self._size = size
|
||||||
self._num_needed_shares = self._codec.get_needed_shares()
|
self._num_needed_shares = self._codec.get_needed_shares()
|
||||||
|
|
||||||
self._output = Output(downloadable, key)
|
self._output = Output(downloadable, d['key'])
|
||||||
|
|
||||||
self._share_hashtree = hashtree.IncompleteHashTree(total_shares)
|
self._share_hashtree = hashtree.IncompleteHashTree(d['total_shares'])
|
||||||
self._share_hashtree.set_hashes({0: roothash})
|
self._share_hashtree.set_hashes({0: self._roothash})
|
||||||
|
|
||||||
self.active_buckets = {} # k: shnum, v: bucket
|
self.active_buckets = {} # k: shnum, v: bucket
|
||||||
self._share_buckets = {} # k: shnum, v: set of buckets
|
self._share_buckets = {} # k: shnum, v: set of buckets
|
||||||
|
@ -212,11 +212,10 @@ class SystemTest(testutil.SignalMixin, unittest.TestCase):
|
|||||||
def mangle_uri(self, gooduri):
|
def mangle_uri(self, gooduri):
|
||||||
# change the verifierid, which means we'll be asking about the wrong
|
# change the verifierid, which means we'll be asking about the wrong
|
||||||
# file, so nobody will have any shares
|
# file, so nobody will have any shares
|
||||||
pieces = list(uri.unpack_uri(gooduri))
|
d = uri.unpack_uri(gooduri)
|
||||||
# [3] is the verifierid
|
assert len(d['verifierid']) == 20
|
||||||
assert len(pieces[3]) == 20
|
d['verifierid'] = self.flip_bit(d['verifierid'])
|
||||||
pieces[3] = self.flip_bit(pieces[3])
|
return uri.pack_uri(**d)
|
||||||
return uri.pack_uri(*pieces)
|
|
||||||
|
|
||||||
# TODO: add a test which mangles the fileid instead, and should fail in
|
# TODO: add a test which mangles the fileid instead, and should fail in
|
||||||
# the post-download phase when the file's integrity check fails. Do the
|
# the post-download phase when the file's integrity check fails. Do the
|
||||||
|
@ -24,14 +24,14 @@ class GoodServer(unittest.TestCase):
|
|||||||
def _check(self, uri):
|
def _check(self, uri):
|
||||||
self.failUnless(isinstance(uri, str))
|
self.failUnless(isinstance(uri, str))
|
||||||
self.failUnless(uri.startswith("URI:"))
|
self.failUnless(uri.startswith("URI:"))
|
||||||
codec_name, codec_params, tail_codec_params, verifierid, fileid, key, roothash, needed_shares, total_shares, size, segment_size = unpack_uri(uri)
|
d = unpack_uri(uri)
|
||||||
self.failUnless(isinstance(verifierid, str))
|
self.failUnless(isinstance(d['verifierid'], str))
|
||||||
self.failUnlessEqual(len(verifierid), 20)
|
self.failUnlessEqual(len(d['verifierid']), 20)
|
||||||
self.failUnless(isinstance(fileid, str))
|
self.failUnless(isinstance(d['fileid'], str))
|
||||||
self.failUnlessEqual(len(fileid), 20)
|
self.failUnlessEqual(len(d['fileid']), 20)
|
||||||
self.failUnless(isinstance(key, str))
|
self.failUnless(isinstance(d['key'], str))
|
||||||
self.failUnlessEqual(len(key), 16)
|
self.failUnlessEqual(len(d['key']), 16)
|
||||||
self.failUnless(isinstance(codec_params, str))
|
self.failUnless(isinstance(d['codec_params'], str))
|
||||||
|
|
||||||
def testData(self):
|
def testData(self):
|
||||||
data = "This is some data to upload"
|
data = "This is some data to upload"
|
||||||
|
@ -8,6 +8,7 @@ from allmydata.util import idlib
|
|||||||
def pack_uri(codec_name, codec_params, tail_codec_params,
|
def pack_uri(codec_name, codec_params, tail_codec_params,
|
||||||
verifierid, fileid, key,
|
verifierid, fileid, key,
|
||||||
roothash, needed_shares, total_shares, size, segment_size):
|
roothash, needed_shares, total_shares, size, segment_size):
|
||||||
|
# applications should pass keyword parameters into this
|
||||||
assert isinstance(codec_name, str)
|
assert isinstance(codec_name, str)
|
||||||
assert len(codec_name) < 10
|
assert len(codec_name) < 10
|
||||||
assert ":" not in codec_name
|
assert ":" not in codec_name
|
||||||
@ -26,15 +27,17 @@ def pack_uri(codec_name, codec_params, tail_codec_params,
|
|||||||
|
|
||||||
def unpack_uri(uri):
|
def unpack_uri(uri):
|
||||||
assert uri.startswith("URI:")
|
assert uri.startswith("URI:")
|
||||||
header, codec_name, codec_params, tail_codec_params, verifierid_s, fileid_s, key_s, roothash_s, needed_shares_s, total_shares_s, size_s, segment_size_s = uri.split(":")
|
d = {}
|
||||||
verifierid = idlib.a2b(verifierid_s)
|
header, d['codec_name'], d['codec_params'], d['tail_codec_params'], verifierid_s, fileid_s, key_s, roothash_s, needed_shares_s, total_shares_s, size_s, segment_size_s = uri.split(":")
|
||||||
fileid = idlib.a2b(fileid_s)
|
assert header == "URI"
|
||||||
key = idlib.a2b(key_s)
|
d['verifierid'] = idlib.a2b(verifierid_s)
|
||||||
roothash = idlib.a2b(roothash_s)
|
d['fileid'] = idlib.a2b(fileid_s)
|
||||||
needed_shares = int(needed_shares_s)
|
d['key'] = idlib.a2b(key_s)
|
||||||
total_shares = int(total_shares_s)
|
d['roothash'] = idlib.a2b(roothash_s)
|
||||||
size = int(size_s)
|
d['needed_shares'] = int(needed_shares_s)
|
||||||
segment_size = int(segment_size_s)
|
d['total_shares'] = int(total_shares_s)
|
||||||
return codec_name, codec_params, tail_codec_params, verifierid, fileid, key, roothash, needed_shares, total_shares, size, segment_size
|
d['size'] = int(size_s)
|
||||||
|
d['segment_size'] = int(segment_size_s)
|
||||||
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
@ -128,8 +128,7 @@ class Directory(rend.Page):
|
|||||||
ctx.fillSlots("uri", T.a(href=dl_uri_url)[html.escape(uri)])
|
ctx.fillSlots("uri", T.a(href=dl_uri_url)[html.escape(uri)])
|
||||||
|
|
||||||
#extract and display file size
|
#extract and display file size
|
||||||
unpacked = unpack_uri(uri)
|
ctx.fillSlots("size", unpack_uri(uri)['size'])
|
||||||
ctx.fillSlots("size", unpacked[9])
|
|
||||||
|
|
||||||
# this creates a button which will cause our child__delete method
|
# this creates a button which will cause our child__delete method
|
||||||
# to be invoked, which deletes the file and then redirects the
|
# to be invoked, which deletes the file and then redirects the
|
||||||
|
Loading…
x
Reference in New Issue
Block a user