def test_valid_trusted(self): """ Chain of trust: 1. Zone created by this device 2. Another device joins (no central server) through an invitation """ own_device = Device.get_own_device() zone = Zone(name="test_zone") zone.save() new_device = Device(name="new_device") # make a new device new_device.set_key(Key()) new_device.save() # get an ID new_device.get_metadata().save() # Now create an invitation, and claim that invitation for the new device. invitation = ZoneInvitation.generate(zone=zone, invited_by=own_device) invitation.claim(used_by=new_device) self.assertEqual(invitation.used_by, new_device, "Invitation should now be used by device %s" % new_device) self.assertEqual(DeviceZone.objects.filter(device=new_device).count(), 1, "There should be a DeviceZone for device %s" % new_device) self.assertEqual(DeviceZone.objects.get(device=new_device).zone, zone, "DeviceZone for device %s should be zone %s" % (new_device, zone)) # Now get a chain of trust establishing the new device on the zone chain = ChainOfTrust(zone=zone, device=new_device) self.assertTrue(chain.verify(), "Chain of trust should verify.")
def test_invalid_invitation(self): """ Chain of trust: 1. Zone created by this device 2. Another device joins (no central server) without an invitation--assert! """ own_device = Device.get_own_device() call_command("generate_zone") # put own_device on a zone zone = Zone.objects.all()[0] new_device = Device(name="new_device") # make a new device new_device.set_key(Key()) new_device.save() # get an ID new_device.get_metadata().save() # Now create an illegal invitation--one that's not signed by the zone creator with self.assertRaises(ValidationError): ZoneInvitation.generate(zone=zone, invited_by=new_device) # invitation = ZoneInvitation(zone=zone, invited_by=new_device) with self.assertRaises(ValidationError): invitation.set_key(Key())
def __init__(self, *args, **kwargs): self.distributed_dir = (pathlib.Path(settings.PROJECT_PATH).parent / 'ka-lite-submodule' / 'kalite') self.manage_py_path = self.distributed_dir / 'manage.py' uniq_name = 'settings_' + ''.join( choice(string.ascii_lowercase) for _ in range(10)) self.db_path = ((self.distributed_dir / 'database' / uniq_name).with_suffix('.sqlite')) self.key = kwargs.pop("key", None) or Key() # setup for custom settings for this distributed server self.settings_name = uniq_name self.settings_contents = self._generate_settings(**kwargs) self.settings_path = ((self.distributed_dir / self.settings_name).with_suffix('.py')) self.running_process = None