Ejemplo n.º 1
0
    def test_get_identities(self):
        """Test identity retrieval."""

        db = ContentDB(tempfile.NamedTemporaryFile().name)

        id1 = dandelion.identity.generate()
        id2 = dandelion.identity.generate().public_identity()
        id3 = dandelion.identity.generate()

        db.add_identities([id1, id2, id3])
        db.add_messages([Message("fu")])

        _, idlist = db.get_identities()
        self.assertTrue(id1 in idlist)
        self.assertTrue(id2 in idlist)
        self.assertTrue(id3 in idlist)
        for id in idlist:
            self.assertFalse(id.rsa_key.is_private)
            self.assertFalse(id.dsa_key.is_private)

        _, idlist = db.get_identities(fingerprints=[id1.fingerprint, id2.fingerprint])
        self.assertTrue(id1 in idlist)
        self.assertTrue(id2 in idlist)
        self.assertFalse(id3 in idlist)
        for id in idlist:
            self.assertFalse(id.rsa_key.is_private)
            self.assertFalse(id.dsa_key.is_private)
Ejemplo n.º 2
0
    def test_private_identities(self):
        """Test private id interface"""

        db = ContentDB(tempfile.NamedTemporaryFile().name)
        id_priv = dandelion.identity.generate()
        id_pub = dandelion.identity.generate().public_identity()

        # Add junk
        self.assertRaises(TypeError, db.add_private_identity, None)
        self.assertRaises(ValueError, db.add_private_identity, id_pub)

        # Add, get, remove
        db.add_private_identity(id_priv)
        id = db.get_private_identity(id_priv.fingerprint)

        self.assertEqual(id_priv.fingerprint, id.fingerprint)
        self.assertEqual(id_priv, id)
        self.assertTrue(IdentityInfo(db, id).is_private())

        db.remove_private_identity(id_priv, keep_public_identity=False)
        self.assertFalse(db.contains_identity(id_priv.fingerprint))

        # Add and remove private, but keep public
        db.add_private_identity(id_priv)
        db.remove_private_identity(id_priv, keep_public_identity=True)
        self.assertTrue(db.contains_identity(id_priv.fingerprint))
        self.assertFalse(IdentityInfo(db, db.get_identities([id_priv.fingerprint])[1][0]).is_private())
        self.assertRaises(ValueError, db.get_private_identity, id_priv.fingerprint)
    def test_basic_server_transaction(self):
        """Tests the server transaction protocol and logic"""

        db = ContentDB(tempfile.NamedTemporaryFile().name)
        db.add_identities([dandelion.identity.generate(), dandelion.identity.generate()])
        tc = db.add_messages([Message("fubar"), Message("foo"), Message("bar")])

        with TestServerHelper() as server_helper, TestClientHelper() as client_helper:
            srv_transaction = ServerTransaction(server_helper.sock, db)
            test_client = SocketTransaction(client_helper.sock, b"\n")

            """Run the server transaction in a separate thread to allow client access"""
            thread = threading.Thread(target=srv_transaction.process)
            thread.start()

            """Check greeting from server"""
            rcv = test_client._read()
            self.assertEqual(rcv, dandelion.protocol.create_greeting_message(db.id).encode())

            """Check response to mdgid list req"""
            test_client._write(dandelion.protocol.create_message_id_list_request(tc).encode())
            rcv = test_client._read()
            self.assertEqual(rcv, dandelion.protocol.create_message_id_list(tc, None).encode())

            """Check response to identityid list req"""
            test_client._write(dandelion.protocol.create_identity_id_list_request(tc).encode())
            rcv = test_client._read()
            self.assertEqual(rcv, dandelion.protocol.create_identity_id_list(tc, None).encode())

            """Check response to mdg req"""
            test_client._write(
                dandelion.protocol.create_message_list_request([msg.id for msg in db.get_messages()[1]]).encode()
            )
            rcv = test_client._read()
            self.assertEqual(rcv, dandelion.protocol.create_message_list(db.get_messages()[1]).encode())

            """Check response to identity req"""
            test_client._write(
                dandelion.protocol.create_identity_list_request(
                    [id.fingerprint for id in db.get_identities()[1]]
                ).encode()
            )
            rcv = test_client._read()
            self.assertEqual(rcv, dandelion.protocol.create_identity_list(db.get_identities()[1]).encode())

            """Wait for server (will time out if no requests)"""
            thread.join(2 * TIMEOUT)
    def test_client_server_transaction_partial_sync(self):
        """Tests the whole, client driven transaction protocol and logic"""

        client_db = ContentDB(tempfile.NamedTemporaryFile().name)
        server_db = ContentDB(tempfile.NamedTemporaryFile().name)

        id1 = dandelion.identity.generate()
        id2 = dandelion.identity.generate()

        client_db.add_identities([id1])
        server_db.add_identities([id1, id2])
        client_db.add_messages([Message("fubar")])
        server_db.add_messages([Message("fubar"), Message("foo"), Message("bar")])

        self.assertEqual(client_db.identity_count, 1)
        self.assertEqual(server_db.identity_count, 2)
        self.assertEqual(client_db.message_count, 1)
        self.assertEqual(server_db.message_count, 3)

        with TestServerHelper() as server_helper, TestClientHelper() as client_helper:

            client_transaction = ClientTransaction(client_helper.sock, client_db)
            server_transaction = ServerTransaction(server_helper.sock, server_db)

            """Run the client transactions asynchronously"""
            server_thread = threading.Thread(target=server_transaction.process)
            client_thread = threading.Thread(target=client_transaction.process)
            server_thread.start()
            client_thread.start()

            """Wait for client to hang up"""
            client_thread.join(1)  # One sec should be plenty
            server_thread.join(2 * TIMEOUT)

        """Make sure the client has updated the db"""
        self.assertEqual(client_db.identity_count, 2)
        self.assertEqual(server_db.identity_count, 2)
        self.assertEqual(client_db.message_count, 3)
        self.assertEqual(server_db.message_count, 3)
        self.assertEqual(
            len([srvmsg for srvmsg in server_db.get_messages()[1] if srvmsg not in client_db.get_messages()[1]]), 0
        )
        self.assertEqual(
            len([srvids for srvids in server_db.get_identities()[1] if srvids not in client_db.get_identities()[1]]), 0
        )
Ejemplo n.º 5
0
    def test_identity_interface(self):
        """Test functions relating to storing and recovering identities."""

        db = ContentDB(tempfile.NamedTemporaryFile().name)

        _, idlist = db.get_identities()
        self.assertEqual(idlist, [])


        id_a = dandelion.identity.generate()
        id_b = dandelion.identity.generate()
        first_id_list = [id_a, id_b]

        # Try to add junk
        self.assertRaises(TypeError, db.add_identities, None)
        self.assertRaises(TypeError, db.add_identities, 23)
        self.assertRaises(AttributeError, db.add_identities, [None])

        # Add a message list
        self.assertEqual(db.identity_count, 0)
        db.add_identities(first_id_list)
        self.assertNotEqual(db.identity_count, None)
        self.assertEqual(db.identity_count, len(first_id_list))
        self.assertEqual([db.contains_identity(id.fingerprint) for id in first_id_list], [True, True])

        # And for another message list? 
        second_id_list = [dandelion.identity.generate(), id_a]
        self.assertEqual([db.contains_identity(id.fingerprint) for id in second_id_list], [False, True])

        # Adding the second message list
        db.add_identities(second_id_list)
        self.assertEqual(db.identity_count, 3)
        self.assertEqual([db.contains_identity(id.fingerprint) for id in first_id_list], [True, True])
        self.assertEqual([db.contains_identity(id.fingerprint) for id in second_id_list], [True, True])

        # Remove a list
        db.remove_identities(first_id_list)
        self.assertEqual(db.identity_count, 1)
        self.assertEqual([db.contains_identity(id.fingerprint) for id in first_id_list], [False, False])
        self.assertEqual([db.contains_identity(id.fingerprint) for id in second_id_list], [True, False])

        # Remove same message list 
        db.remove_identities(first_id_list)
        self.assertEqual(db.identity_count, 1)
        self.assertEqual([db.contains_identity(id.fingerprint) for id in first_id_list], [False, False])
        self.assertEqual([db.contains_identity(id.fingerprint) for id in second_id_list], [True, False])

        # Remove all messages
        db.remove_identities()
        self.assertEqual(db.identity_count, 0)
        self.assertEqual([db.contains_identity(id.fingerprint) for id in first_id_list], [False, False])
        self.assertEqual([db.contains_identity(id.fingerprint) for id in second_id_list], [False, False])
    def test_basic_client_transaction(self):
        """Tests the client transaction protocol and logic"""

        client_db = ContentDB(tempfile.NamedTemporaryFile().name)
        srv_db = ContentDB(tempfile.NamedTemporaryFile().name)

        self.assertEqual(client_db.message_count, 0)
        srv_db.add_identities([dandelion.identity.generate(), dandelion.identity.generate()])
        tc = srv_db.add_messages([Message("fubar"), Message("foo"), Message("bar")])

        self.assertEqual(client_db.message_count, 0)
        self.assertEqual(client_db.identity_count, 0)
        self.assertEqual(srv_db.message_count, 3)
        self.assertEqual(srv_db.identity_count, 2)

        with TestServerHelper() as server_helper, TestClientHelper() as client_helper:

            client_transaction = ClientTransaction(client_helper.sock, client_db)
            srv_sock = SocketTransaction(server_helper.sock, b"\n")

            """Run the client transaction in a separate thread"""
            thread = threading.Thread(target=client_transaction.process)
            thread.start()
            """Send a greeting (should be req. by client)"""
            srv_sock._write(dandelion.protocol.create_greeting_message(srv_db.id).encode())

            """Reading msg id list request"""
            rcv = srv_sock._read()
            self.assertEqual(rcv, dandelion.protocol.create_message_id_list_request().encode())

            """Sending the msg id list"""
            srv_sock._write(dandelion.protocol.create_message_id_list(tc, srv_db.get_messages()[1]).encode())

            """Reading msg list request"""
            rcv = srv_sock._read()
            expected_msgs = (
                dandelion.protocol.create_message_list_request([msg.id for msg in srv_db.get_messages()[1]])
                .split(" ")[1][:-1]
                .split(";")
            )
            for msg in expected_msgs:
                self.assertNotEqual(rcv.find(msg.encode()), -1)

            """Sending the msg id list"""
            srv_sock._write(dandelion.protocol.create_message_list(srv_db.get_messages()[1]).encode())

            """Reading identity id list request"""
            rcv = srv_sock._read()
            self.assertEqual(rcv, dandelion.protocol.create_identity_id_list_request().encode())

            """Sending the identity id list"""
            srv_sock._write(dandelion.protocol.create_identity_id_list(tc, srv_db.get_identities()[1]).encode())

            """Reading identity list request"""
            rcv = srv_sock._read()
            expected_ids = (
                dandelion.protocol.create_identity_list_request([id.fingerprint for id in srv_db.get_identities()[1]])
                .split(" ")[1][:-1]
                .split(";")
            )
            for id in expected_ids:
                self.assertNotEqual(rcv.find(id.encode()), -1)

            """Sending the msg id list"""
            srv_sock._write(dandelion.protocol.create_identity_list(srv_db.get_identities()[1]).encode())

            """Wait for client to hang up"""
            thread.join(2 * TIMEOUT)

        """Make sure the client has updated the db"""
        self.assertEqual(client_db.message_count, 3)
        self.assertEqual(srv_db.message_count, 3)
        self.assertEqual(
            len([srvmsg for srvmsg in srv_db.get_messages()[1] if srvmsg not in client_db.get_messages()[1]]), 0
        )