<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def how_vulnerable( chain, blackbox_mapping, sanitiser_nodes, potential_sanitiser, blackbox_assignments, interactive, vuln_deets ):
 """Iterates through the chain of nodes and checks the blackbox nodes against the blackbox mapping and sanitiser dictionary. Note: potential_sanitiser is the only hack here, it is because we do not take p-use's into account yet. e.g. we can only say potentially instead of definitely sanitised in the path_traversal_sanitised_2.py test. Args: chain(list(Node)):
 A path of nodes between source and sink. blackbox_mapping(dict):
 A map of blackbox functions containing whether or not they propagate taint. sanitiser_nodes(set):
 A set of nodes that are sanitisers for the sink. potential_sanitiser(Node):
 An if or elif node that can potentially cause sanitisation. blackbox_assignments(set[AssignmentNode]):
 set of blackbox assignments, includes the ReturnNode's of BBorBInode's. interactive(bool):
 determines if we ask the user about blackbox functions not in the mapping file. vuln_deets(dict):
 vulnerability details. Returns: A VulnerabilityType depending on how vulnerable the chain is. """

    for i, current_node in enumerate(chain):
        if current_node in sanitiser_nodes:
            vuln_deets['sanitiser'] = current_node
            vuln_deets['confident'] = True
            return VulnerabilityType.SANITISED, interactive

        if isinstance(current_node, BBorBInode):
            if current_node.func_name in blackbox_mapping['propagates']:
                continue
            elif current_node.func_name in blackbox_mapping['does_not_propagate']:
                return VulnerabilityType.FALSE, interactive
            elif interactive:
                user_says = input(
                    'Is the return value of {} with tainted argument "{}" vulnerable? ([Y]es/[N]o/[S]top asking)'.format(
                        current_node.label,
                        chain[i - 1].left_hand_side
                    )
                ).lower()
                if user_says.startswith('s'):
                    interactive = False
                    vuln_deets['unknown_assignment'] = current_node
                    return VulnerabilityType.UNKNOWN, interactive
                if user_says.startswith('n'):
                    blackbox_mapping['does_not_propagate'].append(current_node.func_name)
                    return VulnerabilityType.FALSE, interactive
                blackbox_mapping['propagates'].append(current_node.func_name)
            else:
                vuln_deets['unknown_assignment'] = current_node
                return VulnerabilityType.UNKNOWN, interactive

    if potential_sanitiser:
        vuln_deets['sanitiser'] = potential_sanitiser
        vuln_deets['confident'] = False
        return VulnerabilityType.SANITISED, interactive

    return VulnerabilityType.TRUE, interactive