Exemplo n.º 1
0
def create_role(new_role, state):
    role_container = role_state_pb2.RoleAttributesContainer()
    role = role_container.role_attributes.add()
    role.role_id = new_role.role_id
    role.name = new_role.name
    role.metadata = new_role.metadata

    entries_to_set = {
        addresser.make_role_attributes_address(new_role.role_id):
        role_container.SerializeToString()
    }

    pubkeys_by_address = {}

    for admin in list(new_role.admins):
        admin_address = addresser.make_role_admins_address(
            role_id=new_role.role_id, user_id=admin)

        if admin_address in pubkeys_by_address:
            pubkeys_by_address[admin_address].append(admin)
        else:
            pubkeys_by_address[admin_address] = [admin]

    for owner in list(new_role.owners):
        owner_address = addresser.make_role_owners_address(
            role_id=new_role.role_id, user_id=owner)

        if owner_address in pubkeys_by_address:
            pubkeys_by_address[owner_address].append(owner)
        else:
            pubkeys_by_address[owner_address] = [owner]

    state_returns = state_accessor.get_state(
        state,
        [
            addresser.make_role_admins_address(role_id=new_role.role_id,
                                               user_id=a)
            for a in new_role.admins
        ] + [
            addresser.make_role_owners_address(role_id=new_role.role_id,
                                               user_id=o)
            for o in new_role.owners
        ],
    )

    for addr, pubkeys in pubkeys_by_address.items():
        try:
            state_entry = state_accessor.get_state_entry(state_returns, addr)
            container = role_state_pb2.RoleRelationshipContainer()
            container.ParseFromString(state_entry.data)
        except KeyError:
            container = role_state_pb2.RoleRelationshipContainer()

        message_accessor.add_role_rel_to_container(container, new_role.role_id,
                                                   pubkeys)

        entries_to_set[addr] = container.SerializeToString()

        state_accessor.set_state(state, entries_to_set)
Exemplo n.º 2
0
    def test_state(self):
        """Grab the entire blockchain state and deserialize it"""
        subtree = addresser.family.namespace
        for item in client.list_state(subtree=subtree)["data"]:
            address_type = item["address_type"] = addresser.address_is(
                item["address"])
            if address_type == addresser.AddressSpace.USER:
                content = user_state_pb2.UserContainer()
                content.ParseFromString(b64decode(item["data"]))
            elif address_type == addresser.AddressSpace.PROPOSALS:
                content = proposal_state_pb2.ProposalsContainer()
                content.ParseFromString(b64decode(item["data"]))
            elif address_type == addresser.AddressSpace.SYSADMIN_ATTRIBUTES:
                content = "SYSADMIN_ATTRIBUTES"
            elif address_type == addresser.AddressSpace.SYSADMIN_MEMBERS:
                content = "SYSADMIN_MEMBERS"
            elif address_type == addresser.AddressSpace.SYSADMIN_OWNERS:
                content = "SYSADMIN_OWNERS"
            elif address_type == addresser.AddressSpace.SYSADMIN_ADMINS:
                content = "SYSADMIN_ADMINS"
            elif address_type == addresser.AddressSpace.ROLES_ATTRIBUTES:
                content = role_state_pb2.RoleAttributesContainer()
                content.ParseFromString(b64decode(item["data"]))
            elif address_type == addresser.AddressSpace.ROLES_MEMBERS:
                content = role_state_pb2.RoleRelationshipContainer()
                content.ParseFromString(b64decode(item["data"]))
            elif address_type == addresser.AddressSpace.ROLES_OWNERS:
                content = role_state_pb2.RoleRelationshipContainer()
                content.ParseFromString(b64decode(item["data"]))
            elif address_type == addresser.AddressSpace.ROLES_ADMINS:
                content = role_state_pb2.RoleRelationshipContainer()
                content.ParseFromString(b64decode(item["data"]))
            elif address_type == addresser.AddressSpace.ROLES_TASKS:
                content = role_state_pb2.RoleRelationshipContainer()
                content.ParseFromString(b64decode(item["data"]))
            elif address_type == addresser.AddressSpace.TASKS_ATTRIBUTES:
                content = task_state_pb2.TaskAttributesContainer()
                content.ParseFromString(b64decode(item["data"]))
            elif address_type == addresser.AddressSpace.TASKS_OWNERS:
                content = task_state_pb2.TaskRelationshipContainer()
                content.ParseFromString(b64decode(item["data"]))
            elif address_type == addresser.AddressSpace.TASKS_ADMINS:
                content = task_state_pb2.TaskRelationshipContainer()
                content.ParseFromString(b64decode(item["data"]))
            else:
                content = "ERROR: unknown type: {}".format(address_type)

            LOGGER.debug("%-80s%-30s%s", item["address"], address_type,
                         content)
 def check_admin(self, role_id, user_id):
     container = role_state_pb2.RoleRelationshipContainer()
     address = addresser.make_role_admins_address(role_id=role_id, user_id=user_id)
     container.ParseFromString(self.client.get_address(address=address))
     items = list(container.relationships)
     if len(items) == 0:
         return False
     elif len(items) > 1:
         LOGGER.warning(
             "role %s admins container for user %s at address %s has more than one record",
             role_id,
             user_id,
             address,
         )
     item = items[0]
     identifiers = list(item.identifiers)
     if len(identifiers) == 0:
         LOGGER.warning(
             "role %s admins container for user %s at address %s has no identifiers",
             role_id,
             user_id,
             address,
         )
         return False
     if len(identifiers) > 1:
         LOGGER.warning(
             "role %s admins container for user %s at address %s has more than one identifier",
             role_id,
             user_id,
             address,
         )
     return bool(user_id in item.identifiers)
 def check_relationship(self, address_function, role_id, user_id):
     """Check the existence of a relationship record"""
     container = role_state_pb2.RoleRelationshipContainer()
     address = address_function(role_id=role_id, user_id=user_id)
     container.ParseFromString(self.client.get_address(address=address))
     items = list(container.relationships)
     if len(items) == 0:
         return False
     elif len(items) > 1:
         LOGGER.warning(
             "role %s relationship container for user %s at address %s has more than one record",
             role_id,
             user_id,
             address,
         )
     item = items[0]
     identifiers = list(item.identifiers)
     if len(identifiers) == 0:
         LOGGER.warning(
             "role %s relationship container for user %s at address %s has no identifiers",
             role_id,
             user_id,
             address,
         )
         return False
     if len(identifiers) > 1:
         LOGGER.warning(
             "role %s relationship container for user %s at address %s has more than one identifier",
             role_id,
             user_id,
             address,
         )
     return bool(user_id in item.identifiers)
def confirm_role_action(state_entries,
                        header,
                        confirm,
                        role_rel_address,
                        state,
                        rel_type="user_id"):
    proposal_address = addresser.proposal.address(object_id=confirm.role_id,
                                                  related_id=getattr(
                                                      confirm, rel_type))

    proposal_entry = state_accessor.get_state_entry(state_entries,
                                                    proposal_address)
    proposal_container = message_accessor.get_prop_container(proposal_entry)
    proposal = message_accessor.get_prop_from_container(
        proposal_container, proposal_id=confirm.proposal_id)

    proposal.status = proposal_state_pb2.Proposal.CONFIRMED
    proposal.closer = header.signer_public_key
    proposal.close_reason = confirm.reason

    address_values = {proposal_address: proposal_container.SerializeToString()}

    try:
        role_rel_entry = state_accessor.get_state_entry(
            state_entries, role_rel_address)
        role_rel_container = message_accessor.get_role_rel_container(
            role_rel_entry)
    except KeyError:
        role_rel_container = role_state_pb2.RoleRelationshipContainer()

    try:
        role_rel = message_accessor.get_role_rel(role_rel_container,
                                                 confirm.role_id)

    except KeyError:
        role_rel = role_rel_container.relationships.add()
        role_rel.role_id = confirm.role_id

    role_rel.identifiers.append(getattr(confirm, rel_type))

    address_values[role_rel_address] = role_rel_container.SerializeToString()

    state_accessor.set_state(state, address_values)