async def create_delete_role_owner_txns(key_pair, next_id, txn_list): """Create the delete transactions for an owner if ownership of a role(s) exists. Args: key_pair: obj: public and private keys for user next_id: next_ str: next_id to search for the roles where user is the admin txn_list: list: transactions for batch submission Returns: txn_list: list: extended list of transactions for batch submission """ conn = await create_connection() roles = (await r.table("role_owners").filter({ "related_id": next_id }).coerce_to("array").run(conn)) conn.close() if roles: owner_delete = DeleteRoleOwner() for role in roles: owner_delete_message = owner_delete.make(signer_keypair=key_pair, related_id=next_id, role_id=role["role_id"]) payload = owner_delete.make_payload( message=owner_delete_message, signer_keypair=key_pair, signer_user_id=key_pair.public_key, ) transaction = batcher.make_transaction(payload=payload, signer_keypair=key_pair) txn_list.extend([transaction]) return txn_list
def delete_user_transaction(inbound_entry, user_in_db, key_pair): """Composes transactions for deleting a user. This includes deleting role_owner, role_admin, and role_member relationships and user object. """ user_delete = DeleteUser() next_id = user_in_db[0]["next_id"] inbound_entry = add_sawtooth_prereqs(entry_id=next_id, inbound_entry=inbound_entry, data_type="user") txn_list = [] # Compile role relationship transactions for removal from blockchain txn_list = create_reject_ppsls_user_txns(key_pair, next_id, txn_list) txn_list = create_delete_role_owner_txns(key_pair, next_id, txn_list) txn_list = create_delete_role_admin_txns(key_pair, next_id, txn_list) txn_list = create_delete_role_member_txns(key_pair, next_id, txn_list) # Compile user delete transaction for removal from blockchain message = user_delete.make(signer_keypair=key_pair, next_id=next_id) payload = user_delete.make_payload(message=message, signer_keypair=key_pair, signer_user_id=key_pair.public_key) transaction = batcher.make_transaction(payload=payload, signer_keypair=key_pair) txn_list.extend([transaction]) if txn_list: batch = batcher.make_batch_from_txns(transactions=txn_list, signer_keypair=key_pair) inbound_entry["batch"] = batch.SerializeToString()
def create_delete_user_txns(txn_key, next_id, txn_list): """Create the delete transactions for user.""" user_delete = DeleteUser() message = user_delete.make(signer_keypair=txn_key, next_id=next_id) payload = user_delete.make_payload(message=message, signer_keypair=txn_key, signer_user_id=next_id) transaction = batcher.make_transaction(payload=payload, signer_keypair=txn_key) txn_list.extend([transaction]) return txn_list
def test_make_transaction(self): """Test the make transaction batch function""" payload, signer = self.get_test_payload() transaction = batcher.make_transaction(payload=payload, signer_keypair=signer) self.assertValidTransaction( transaction=transaction, payload=payload, signer_public_key=signer.public_key, )
def test_make_batch_list(self): """Test the make batch list batch function""" payload, signer = self.get_test_payload() transaction = batcher.make_transaction(payload=payload, signer_keypair=signer) batch_list = batcher.make_batch_list(transaction=transaction) self.assertValidBatchList( batch_list=batch_list, payload=payload, signer_public_key=signer.public_key, batcher_public_key=BATCHER_KEY_PAIR.public_key, )
async def create_rjct_ppsls_role_txns(key_pair, role_id, txn_user_id, txn_list): """Create the reject open proposals transactions for a role that has been deleted. Args: key_pair: obj: public and private keys for user role_id: str: role_id parameter of the targeted role to close proposals for txn_list: list: transactions for batch submission Returns: txn_list: list: extended list of transactions for batch submission """ conn = await create_connection() proposals = await fetch_open_proposals_by_role(conn, role_id) conn.close() if proposals: for proposal in proposals: reason = "Target Role was deleted." reject_proposal = PROPOSAL_TRANSACTION[proposal["proposal_type"]][ "REJECTED" ] reject_proposal_msg = reject_proposal.make( signer_keypair=key_pair, signer_user_id=txn_user_id, proposal_id=proposal["proposal_id"], object_id=proposal["object_id"], related_id=proposal["related_id"], reason=reason, ) payload = reject_proposal.make_payload( message=reject_proposal_msg, signer_keypair=key_pair, signer_user_id=key_pair.public_key, ) transaction = batcher.make_transaction( payload=payload, signer_keypair=key_pair ) txn_list.extend([transaction]) else: LOGGER.warning("No proposals found for role: %s", role_id) return txn_list
async def create_del_ownr_by_role_txns(key_pair, role_id, txn_list): """Create the delete transactions for role_owners. Used when fully deleting a role. Args: key_pair: obj: public and private keys for user role_id: str: next_id of the role to search for txn_list: list: transactions for batch submission Returns: txn_list: list: extended list of transactions for batch submission """ conn = await create_connection() role_owners = ( await r.table("role_owners") .filter({"role_id": role_id}) .coerce_to("array") .run(conn) ) conn.close() if role_owners: owner_delete = DeleteRoleOwner() for owner in role_owners: owner_delete_message = owner_delete.make( signer_keypair=key_pair, related_id=owner["related_id"], role_id=owner["role_id"], ) payload = owner_delete.make_payload( message=owner_delete_message, signer_keypair=key_pair, signer_user_id=key_pair.public_key, ) transaction = batcher.make_transaction( payload=payload, signer_keypair=key_pair ) txn_list.extend([transaction]) else: LOGGER.info("No role_owners found for role: %s", role_id) return txn_list
def create_reject_ppsls_user_txns(key_pair, next_id, txn_list): """Create the reject open proposals transactions for user that has been deleted. Args: key_pair: obj: public and private keys for user next_id: str: next_id for of the targeted user to close proposals for txn_list: list: transactions for batch submission """ conn = connect_to_db() proposals = (fetch_open_proposals_by_opener(next_id).union( get_open_proposals_by_approver(next_id)).distinct().coerce_to( "array").run(conn)) conn.close() if proposals: for proposal in proposals: if proposal["opener"] == next_id: reason = "Opener was deleted" else: reason = "Assigned Appover was deleted." reject_proposal = PROPOSAL_TRANSACTION[ proposal["proposal_type"]]["REJECTED"] reject_proposal_msg = reject_proposal.make( signer_keypair=key_pair, signer_user_id=next_id, proposal_id=proposal["proposal_id"], object_id=proposal["object_id"], related_id=proposal["related_id"], reason=reason, ) payload = reject_proposal.make_payload( message=reject_proposal_msg, signer_keypair=key_pair, signer_user_id=key_pair.public_key, ) transaction = batcher.make_transaction(payload=payload, signer_keypair=key_pair) txn_list.extend([transaction]) return txn_list
def create_del_role_txns(key_pair, role_id, txn_list): """Create the delete transactions for a role object. Args: key_pair: obj: public and private keys for user next_id: next_ str: next_id to search for the roles where user is the admin txn_list: list: transactions for batch submission Returns: txn_list: list: extended list of transactions for batch submission """ role_delete = DeleteRole() message = role_delete.make(signer_keypair=key_pair, role_id=role_id) payload = role_delete.make_payload( message=message, signer_keypair=key_pair, signer_user_id=key_pair.public_key ) transaction = batcher.make_transaction(payload=payload, signer_keypair=key_pair) txn_list.extend([transaction]) return txn_list
async def create_del_mmbr_by_user_txns(key_pair, next_id, txn_list): """Create the delete transactions for a member if user is an member of any roles. Args: key_pair: obj: public and private keys for user next_id: next_ str: next_id to search for the roles where user is the admin txn_list: list: transactions for batch submission Returns: txn_list: list: extended list of transactions for batch submission """ conn = await create_connection() roles = ( await r.table("role_members") .filter({"related_id": next_id}) .coerce_to("array") .run(conn) ) conn.close() if roles: member_delete = DeleteRoleMember() for role in roles: admin_delete_message = member_delete.make( signer_keypair=key_pair, related_id=next_id, role_id=role["role_id"] ) payload = member_delete.make_payload( message=admin_delete_message, signer_keypair=key_pair, signer_user_id=key_pair.public_key, ) transaction = batcher.make_transaction( payload=payload, signer_keypair=key_pair ) txn_list.extend([transaction]) else: LOGGER.info("No role_members found for user: %s", next_id) return txn_list
def create_delete_role_member_txns(key_pair, next_id, txn_list): """Create the delete transactions for a member if user is an member of any roles.""" conn = connect_to_db() roles = (r.table("role_members").filter({ "related_id": next_id }).coerce_to("array").run(conn)) conn.close() if roles: member_delete = DeleteRoleMember() for role in roles: admin_delete_message = member_delete.make(signer_keypair=key_pair, related_id=next_id, role_id=role["role_id"]) payload = member_delete.make_payload( message=admin_delete_message, signer_keypair=key_pair, signer_user_id=key_pair.public_key, ) transaction = batcher.make_transaction(payload=payload, signer_keypair=key_pair) txn_list.extend([transaction]) return txn_list
async def create_delete_role_owner_txns(key_pair, next_id, txn_list): """Create the delete transactions for an owner if ownership of a role(s) exists.""" conn = await create_connection() roles = (await r.table("role_owners").filter({ "related_id": next_id }).coerce_to("array").run(conn)) conn.close() if roles: owner_delete = DeleteRoleOwner() for role in roles: owner_delete_message = owner_delete.make(signer_keypair=key_pair, related_id=next_id, role_id=role["role_id"]) payload = owner_delete.make_payload( message=owner_delete_message, signer_keypair=key_pair, signer_user_id=key_pair.public_key, ) transaction = batcher.make_transaction(payload=payload, signer_keypair=key_pair) txn_list.extend([transaction]) return txn_list