First draft of Character classes, along with a test of the moment that Alice finds Ursula.

pull/62/head
jMyles 2017-09-27 17:07:36 -07:00
parent c0d401c9ca
commit 346f0a3d01
2 changed files with 64 additions and 11 deletions

37
nkms/characters.py Normal file
View File

@ -0,0 +1,37 @@
from kademlia.network import Server
from nkms.network.server import NuCypherDHTServer, NuCypherSeedOnlyDHTServer
class Character(object):
"""
A base-class for any character in our cryptography protocol narrative.
"""
_server = None
_server_class = Server
def __init__(self, attach_server=True):
if attach_server:
self.attach_server()
def attach_server(self, ksize=20, alpha=3, id=None, storage=None,
*args, **kwargs) -> None:
self._server = self._server_class(ksize, alpha, id, storage, *args, **kwargs)
@property
def server(self) -> Server:
if self._server:
return self._server
else:
raise RuntimeError("Server hasn't been attached.")
class Ursula(Character):
_server_class = NuCypherDHTServer
class Alice(Character):
_server_class = NuCypherSeedOnlyDHTServer
def find_best_ursula(self):
# TODO: Right now this just finds the nearest node and returns its ip and port. Make it do something useful.
return self.server.bootstrappableNeighbors()[0]

View File

@ -1,5 +1,8 @@
import asyncio
from nkms.characters import Ursula, Alice
from nkms.crypto.keyring import KeyRing
from nkms.policy.models import PolicyGroup, PolicyManagerForAlice
from nkms.policy.models import PolicyManagerForAlice
class MockUrsula(object):
@ -9,13 +12,11 @@ class MockUrsula(object):
return random.getrandbits(32)
class MockPolicyOfferResponse(object):
was_accepted = True
class MockNetworkyStuff(object):
def transmit_offer(self, ursula, policy_offer):
return MockPolicyOfferResponse()
@ -23,9 +24,6 @@ class MockNetworkyStuff(object):
return MockUrsula()
def test_alice_has_ursulas_public_key_and_uses_it_to_encode_policy_payload():
keychain_alice = KeyRing()
keychain_bob = KeyRing()
@ -37,10 +35,28 @@ def test_alice_has_ursulas_public_key_and_uses_it_to_encode_policy_payload():
# Alice runs this to get a policy object.
policy_manager = PolicyManagerForAlice(keychain_alice)
policy_group = policy_manager.create_policy_group(
keychain_bob.enc_keypair.pub_key,
resource_id,
m=20,
n=50
)
keychain_bob.enc_keypair.pub_key,
resource_id,
m=20,
n=50
)
networky_stuff = MockNetworkyStuff()
policy_group.transmit(networky_stuff)
def test_alice_finds_ursula():
event_loop = asyncio.new_event_loop()
asyncio.set_event_loop(event_loop)
ursula_port = 8468
ursula = Ursula()
ursula.server.listen(ursula_port)
event_loop.run_until_complete(ursula.server.bootstrap([("127.0.0.1", ursula_port)]))
alice = Alice()
alice.server.listen(8471)
event_loop.run_until_complete(ursula.server.bootstrap([("127.0.0.1", 8471)]))
_discovered_ursula_ip, discovered_ursula_port = alice.find_best_ursula()
assert ursula_port == ursula_port