fix unicode handling in server_id from YAML

YAML, like JSON, is all-unicode. StorageFarmBroker.set_static_servers()
is defined to take an all-unicode dictionary (the "storage:" key from
private/servers.yaml), so the server_id keys it gets will be unicode.
NativeStorageServer is defined to accept server_ids which are bytes (at
least it is now). The tests were only passing bytes into
set_static_servers(), whereas a real launch passed unicode in, causing a
problem when NativeStorageServer tried to base32.a2b() the pubkey and
choked on the unicode it received.

This fixes set_static_servers() to convert the server_id to bytes, and
changes NativeStorageServer to assert that it gets bytes. It also fixes
the test to match real usage more closely.
This commit is contained in:
Brian Warner 2016-08-27 19:41:20 -07:00
parent 3cc8daf5bd
commit c56a0a4ba9
2 changed files with 19 additions and 12 deletions

View File

@ -86,6 +86,8 @@ class StorageFarmBroker(service.MultiService):
def set_static_servers(self, servers): def set_static_servers(self, servers):
for (server_id, server) in servers.items(): for (server_id, server) in servers.items():
assert isinstance(server_id, unicode) # from YAML
server_id = server_id.encode("ascii")
self._static_server_ids.add(server_id) self._static_server_ids.add(server_id)
handler_overrides = server.get("connections", {}) handler_overrides = server.get("connections", {})
s = NativeStorageServer(server_id, server["ann"], s = NativeStorageServer(server_id, server["ann"],
@ -275,6 +277,7 @@ class NativeStorageServer(service.MultiService):
def __init__(self, server_id, ann, tub_maker, handler_overrides): def __init__(self, server_id, ann, tub_maker, handler_overrides):
service.MultiService.__init__(self) service.MultiService.__init__(self)
assert isinstance(server_id, str)
self._server_id = server_id self._server_id = server_id
self.announcement = ann self.announcement = ann
self._tub_maker = tub_maker self._tub_maker = tub_maker

View File

@ -1,6 +1,6 @@
import hashlib import hashlib
from mock import Mock from mock import Mock
from allmydata.util import base32 from allmydata.util import base32, yamlutil
from twisted.trial import unittest from twisted.trial import unittest
from twisted.internet.defer import succeed, inlineCallbacks from twisted.internet.defer import succeed, inlineCallbacks
@ -48,17 +48,21 @@ class TestStorageFarmBroker(unittest.TestCase):
def test_static_servers(self): def test_static_servers(self):
broker = StorageFarmBroker(True, lambda h: Mock()) broker = StorageFarmBroker(True, lambda h: Mock())
key_s = 'v0-1234-{}'.format(1) key_s = 'v0-1234-1'
ann = { servers_yaml = """\
"service-name": "storage", storage:
"anonymous-storage-FURL": "pb://{}@nowhere/fake".format(base32.b2a(str(1))), v0-1234-1:
"permutation-seed-base32": "aaaaaaaaaaaaaaaaaaaaaaaa", ann:
} anonymous-storage-FURL: pb://ge@nowhere/fake
permutation-seed-base32: aaaaaaaaaaaaaaaaaaaaaaaa
"""
servers = yamlutil.safe_load(servers_yaml)
permseed = base32.a2b("aaaaaaaaaaaaaaaaaaaaaaaa") permseed = base32.a2b("aaaaaaaaaaaaaaaaaaaaaaaa")
broker.set_static_servers({key_s: {"ann": ann}}) broker.set_static_servers(servers["storage"])
self.failUnlessEqual(len(broker._static_server_ids), 1) self.failUnlessEqual(len(broker._static_server_ids), 1)
s = broker.servers[key_s] s = broker.servers[key_s]
self.failUnlessEqual(s.announcement, ann) self.failUnlessEqual(s.announcement,
servers["storage"]["v0-1234-1"]["ann"])
self.failUnlessEqual(s.get_serverid(), key_s) self.failUnlessEqual(s.get_serverid(), key_s)
self.assertEqual(s.get_permutation_seed(), permseed) self.assertEqual(s.get_permutation_seed(), permseed)
@ -82,7 +86,7 @@ class TestStorageFarmBroker(unittest.TestCase):
ann = { ann = {
"anonymous-storage-FURL": "pb://abcde@nowhere/fake", "anonymous-storage-FURL": "pb://abcde@nowhere/fake",
} }
broker.set_static_servers({server_id: {"ann": ann}}) broker.set_static_servers({server_id.decode("ascii"): {"ann": ann}})
s = broker.servers[server_id] s = broker.servers[server_id]
self.assertEqual(s.get_permutation_seed(), base32.a2b(k)) self.assertEqual(s.get_permutation_seed(), base32.a2b(k))
@ -94,7 +98,7 @@ class TestStorageFarmBroker(unittest.TestCase):
"anonymous-storage-FURL": "pb://abcde@nowhere/fake", "anonymous-storage-FURL": "pb://abcde@nowhere/fake",
"permutation-seed-base32": k, "permutation-seed-base32": k,
} }
broker.set_static_servers({server_id: {"ann": ann}}) broker.set_static_servers({server_id.decode("ascii"): {"ann": ann}})
s = broker.servers[server_id] s = broker.servers[server_id]
self.assertEqual(s.get_permutation_seed(), base32.a2b(k)) self.assertEqual(s.get_permutation_seed(), base32.a2b(k))
@ -104,7 +108,7 @@ class TestStorageFarmBroker(unittest.TestCase):
ann = { ann = {
"anonymous-storage-FURL": "pb://abcde@nowhere/fake", "anonymous-storage-FURL": "pb://abcde@nowhere/fake",
} }
broker.set_static_servers({server_id: {"ann": ann}}) broker.set_static_servers({server_id.decode("ascii"): {"ann": ann}})
s = broker.servers[server_id] s = broker.servers[server_id]
self.assertEqual(s.get_permutation_seed(), self.assertEqual(s.get_permutation_seed(),
hashlib.sha256(server_id).digest()) hashlib.sha256(server_id).digest())