mirror of https://github.com/nucypher/nucypher.git
Beginning of verifying Ursula's interface.
parent
4dc146b2d6
commit
745e5a43b4
|
@ -254,7 +254,7 @@ class Ursula(Character):
|
|||
if not self.port and self.interface:
|
||||
raise RuntimeError("Must listen before publishing interface information.")
|
||||
ip_dht_key = self.ip_dht_key()
|
||||
setter = self.server.set(key=ip_dht_key, value=msgpack.dumps((self.port, self.interface)))
|
||||
setter = self.server.set(key=ip_dht_key, value=msgpack.dumps((self.port, self.interface, bytes(self.seal))))
|
||||
blockchain_client._ursulas_on_blockchain.append(ip_dht_key)
|
||||
loop = asyncio.get_event_loop()
|
||||
loop.run_until_complete(setter)
|
||||
|
|
|
@ -36,6 +36,15 @@ class NuCypherHashProtocol(KademliaProtocol):
|
|||
else:
|
||||
return NODE_HAS_NO_STORAGE, False
|
||||
|
||||
def rpc_store(self, sender, nodeid, key, value):
|
||||
source = NuCypherNode(nodeid, sender[0], sender[1])
|
||||
self.welcomeIfNewNode(source)
|
||||
self.log.debug("got a store request from %s" % str(sender))
|
||||
if value.startswith(b"uaddr"):
|
||||
assert False
|
||||
self.storage[key] = value
|
||||
return True
|
||||
|
||||
|
||||
class NuCypherSeedOnlyProtocol(NuCypherHashProtocol):
|
||||
def __init__(self, *args, **kwargs):
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
import asyncio
|
||||
import random
|
||||
import types
|
||||
|
||||
import msgpack
|
||||
|
||||
from kademlia.crawling import NodeSpiderCrawl
|
||||
from kademlia.network import Server
|
||||
|
@ -20,7 +17,8 @@ class NuCypherDHTServer(Server):
|
|||
|
||||
def __init__(self, ksize=20, alpha=3, id=None, storage=None, *args, **kwargs):
|
||||
super().__init__(ksize=20, alpha=3, id=None, storage=None, *args, **kwargs)
|
||||
self.node = NuCypherNode(id or digest(random.getrandbits(255))) # TODO: Assume that this can be attacked to get closer to desired kFrags.
|
||||
self.node = NuCypherNode(id or digest(
|
||||
random.getrandbits(255))) # TODO: Assume that this can be attacked to get closer to desired kFrags.
|
||||
|
||||
def serialize_capabilities(self):
|
||||
return [ServerCapability.stringify(capability) for capability in self.capabilities]
|
||||
|
@ -70,6 +68,14 @@ class NuCypherDHTServer(Server):
|
|||
loop = asyncio.get_event_loop()
|
||||
return loop.run_until_complete(self.get(key))
|
||||
|
||||
async def set(self, key, value):
|
||||
"""
|
||||
Set the given string key to the given value in the network.
|
||||
"""
|
||||
self.log.debug("setting '%s' = '%s' on network" % (key, value))
|
||||
key = digest(key)
|
||||
return await self.set_digest(key, value)
|
||||
|
||||
|
||||
class NuCypherSeedOnlyDHTServer(NuCypherDHTServer):
|
||||
protocol_class = NuCypherSeedOnlyProtocol
|
||||
|
|
|
@ -218,3 +218,6 @@ class TreasureMap(object):
|
|||
|
||||
def __eq__(self, other):
|
||||
return self.nodes == other.nodes
|
||||
|
||||
def __iter__(self):
|
||||
pass
|
||||
|
|
|
@ -56,7 +56,7 @@ def test_alice_finds_ursula():
|
|||
getter = ALICE.server.get(all_ursulas[ursula_index])
|
||||
loop = asyncio.get_event_loop()
|
||||
interface_bytes = loop.run_until_complete(getter)
|
||||
port, interface = msgpack.loads(interface_bytes)
|
||||
port, interface, ursula_pubkey_sig = msgpack.loads(interface_bytes)
|
||||
assert port == URSULA_PORT + ursula_index
|
||||
|
||||
|
||||
|
@ -126,6 +126,7 @@ def test_treasure_map_from_ursula_to_bob():
|
|||
def test_cannot_offer_policy_without_finding_ursula():
|
||||
networky_stuff = MockNetworkyStuff()
|
||||
policy = Policy(Alice())
|
||||
|
||||
with pytest.raises(Ursula.NotFound):
|
||||
policy_offer = policy.encrypt_payload_for_ursula()
|
||||
|
||||
|
@ -170,3 +171,17 @@ def test_trying_to_find_unknown_actor_raises_not_found():
|
|||
verification, NO_DECRYPTION_PERFORMED = tony_clifton.verify_from(ALICE, signature, message)
|
||||
|
||||
assert verification is True
|
||||
|
||||
|
||||
def test_bob_and_ursula_upgrade_to_tls():
|
||||
treasure_map, treasure_map_as_set_on_network, signature, policy_group = test_treasure_map_from_alice_to_ursula()
|
||||
networky_stuff = MockNetworkyStuff()
|
||||
|
||||
# Of course, in the real world, Bob has sufficient information to reconstitute a PolicyGroup, gleaned, we presume, through a side-channel with Alice.
|
||||
treasure_map_from_wire = BOB.get_treasure_map(policy_group, signature)
|
||||
|
||||
|
||||
# for ursula in treasure_map_from_wire:
|
||||
# pass
|
||||
#
|
||||
# BOB
|
|
@ -114,8 +114,8 @@ def test_seed_only_node_knows_it_can_store_on_full_node():
|
|||
event_loop.run_until_complete(seed_only_server.bootstrap([("127.0.0.1", 8468)]))
|
||||
|
||||
# The seed-only will try to store a value.
|
||||
key_to_store = "llamas"
|
||||
value_to_store = "tons_of_things_keyed_llamas"
|
||||
key_to_store = b"llamas"
|
||||
value_to_store = b"tons_of_things_keyed_llamas"
|
||||
setter = seed_only_server.set(key_to_store, value_to_store)
|
||||
|
||||
# But watch - unlike before, this node knows it can set values.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
|
||||
|
||||
def test_bob_and_ursula_upgrade_to_tls():
|
||||
assert False
|
||||
pass
|
||||
|
|
Loading…
Reference in New Issue