mirror of https://github.com/nucypher/nucypher.git
First draft of Character classes, along with a test of the moment that Alice finds Ursula.
parent
c0d401c9ca
commit
346f0a3d01
|
@ -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]
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue