Exemple #1
0
    def test_no_database(self):
        with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"):
            Identifier.get_uuid_list()

        with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"):
            Identifier.get(uuid4())

        operation = Operation(OperationRev(), 'http://example.com/', [])
        sk = SigningKey.generate()
        sign_object(PublicKey.from_signing_key(sk), sk, operation)
        identifier = Identifier.from_operation(operation)

        with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"):
            identifier.put()

        with self.assertRaisesRegex(pmpi.database.Database.InitialisationError, "initialise database first"):
            identifier.remove()
Exemple #2
0
    def test_2_put_remove(self):
        for identifier in self.identifiers:
            identifier.put()

        uuid_list = Identifier.get_uuid_list()

        self.assertEqual(len(uuid_list), 2)
        self.assertCountEqual(uuid_list, [identifier.uuid for identifier in self.identifiers])

        for identifier in self.identifiers:
            new_id = Identifier.get(identifier.uuid)
            self.assertEqual(new_id.uuid, identifier.uuid)
            self.assertEqual(new_id.operation_rev, identifier.operation_rev)

        self.identifiers[0].remove()

        with self.assertRaises(Identifier.DoesNotExist):
            self.identifiers[0].remove()  # already removed identifier

        self.assertCountEqual(Identifier.get_uuid_list(), [self.identifiers[1].uuid])

        with self.assertRaises(Identifier.DoesNotExist):
            Identifier.get(self.identifiers[0].uuid)
Exemple #3
0
    def __set_head(self, new_head_id):
        lca_id = self.__lowest_common_ancestor(self.head, new_head_id)
        blocks_after_lca = self.backward_blocks_chain(self.head, lca_id)[:-1]

        for identifier in [Identifier.get(uuid) for uuid in Identifier.get_uuid_list()]:
            op = identifier.operation_rev.obj
            containing_blocks = list(filter(lambda bl: bl in blocks_after_lca, op.containing_blocks))
            if len(containing_blocks) == 1:
                while len(containing_blocks) == 1:  # while operation is in a block that belongs to path to the LCA
                    op = op.previous_operation_rev.obj
                    if op is not None:
                        containing_blocks = list(filter(lambda bl: bl in blocks_after_lca, op.containing_blocks))
                    else:
                        break

                identifier.remove()
                if op is not None:
                    identifier.operation_rev = op.get_rev()
                    identifier.put()

        for block_id in reversed(self.backward_blocks_chain(new_head_id, lca_id)[:-1]):
            for op in pmpi.block.Block.get(block_id).operations:
                try:
                    identifier = Identifier.get(op.uuid)
                    if identifier.operation_rev == op.previous_operation_rev:
                        identifier.remove()
                        identifier.operation_rev = op.get_rev()
                        identifier.put()
                    else:
                        raise self.TreeError("inconsistency of operations")
                except Identifier.DoesNotExist:
                    if op.previous_operation_rev.is_none():
                        Identifier(op.uuid, op.get_rev()).put()
                    else:
                        raise self.TreeError("multiple minting of the identifier")

        self.__head = new_head_id
Exemple #4
0
    def new_operation(self):
        print("Choose UUID:")
        uuids_number = self.show_uuids()
        print('\n {}) mint new uuid'.format(uuids_number))

        def send_operation(operation):
            self.user.sign_object(operation)
            x = None
            while x not in ('y', 'n'):
                x = input("Send operation? (y/n) ")
            if x == 'y':
                self.transport.write(b'OP' + operation.raw())  # TODO also -- length of operation?

        try:
            x = int(input("index="))
            if x < uuids_number:
                uuid = Identifier.get_uuid_list()[x]
                operation = Identifier.get(uuid).operation_rev.obj

                if self.user._public_key.der not in operation.owners_der:
                    print("You do not own this identifier!")
                    return
                # TODO show sth

                address = input("address=")
                # TODO owners choose owners
                send_operation(Operation(operation.get_rev(), address, [self.user._public_key]))
            elif x == uuids_number:
                address = input("address=")
                # TODO owners choose owners
                send_operation(Operation(OperationRev(), address, [self.user._public_key]))
            else:
                print("Wrong number.")

        except ValueError:
            print("Value Error, aborting.")
Exemple #5
0
 def test_1_get_from_empty(self):
     with self.assertRaises(Identifier.DoesNotExist):
         Identifier.get(self.identifiers[0].uuid)
Exemple #6
0
 def show_uuids():
     uuid_list = Identifier.get_uuid_list()
     digits = len(str(len(uuid_list)))
     for index, identifier in enumerate(Identifier.get_uuid_list()):
         print("{}) {} | {}".format(str(index).rjust(digits), identifier, Identifier.get(identifier).operation_rev.obj.address))
     return len(uuid_list)