{
  "_find_cwes_with_capec": "FunctionDef(name='_find_cwes_with_capec', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='cwe_node', annotation=Name(id='dict', ctx=Load())), arg(arg='results', annotation=Name(id='list', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='\\n        Recursively traverse CWE hierarchy and collect only CWEs that have non-empty related_capec.\\n\\n        Args:\\n            cwe_node: CWE hierarchy node\\n            results: List to collect CWEs with CAPEC (passed by reference)\\n        ')), If(test=UnaryOp(op=Not(), operand=Name(id='cwe_node', ctx=Load())), body=[Return()], orelse=[]), Assign(targets=[Name(id='related_capec', ctx=Store())], value=Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='related_capec'), List(elts=[], ctx=Load())], keywords=[])), If(test=Name(id='related_capec', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='results', ctx=Load()), attr='append', ctx=Load()), args=[Name(id='cwe_node', ctx=Load())], keywords=[]))], orelse=[]), Assign(targets=[Name(id='child', ctx=Store())], value=Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='child')], keywords=[])), If(test=Name(id='child', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='self', ctx=Load()), attr='_find_cwes_with_capec', ctx=Load()), args=[Name(id='child', ctx=Load()), Name(id='results', ctx=Load())], keywords=[]))], orelse=[])], decorator_list=[], type_params=[])",
  "_process_cwe_with_capec": "FunctionDef(name='_process_cwe_with_capec', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='session'), arg(arg='cwe_node', annotation=Name(id='dict', ctx=Load())), arg(arg='cve_id', annotation=Name(id='str', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load())), arg(arg='stats_mitre', annotation=Name(id='dict', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='\\n        Create MitreData (CWE) node and its related Capec nodes, directly connected to CVE.\\n\\n        Args:\\n            session: Neo4j session\\n            cwe_node: CWE node that has related_capec\\n            cve_id: The CVE ID to connect to\\n            user_id: User identifier\\n            project_id: Project identifier\\n            stats_mitre: Dictionary to track created nodes\\n        ')), Assign(targets=[Name(id='cwe_id', ctx=Store())], value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cwe_id')], keywords=[]), Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='id')], keywords=[])])), If(test=UnaryOp(op=Not(), operand=Name(id='cwe_id', ctx=Load())), body=[Return()], orelse=[]), Assign(targets=[Name(id='mitre_id', ctx=Store())], value=JoinedStr(values=[FormattedValue(value=Name(id='cve_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='cwe_id', ctx=Load()), conversion=-1)])), Assign(targets=[Name(id='mitre_props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='cve_id'), Constant(value='cwe_id'), Constant(value='cwe_name'), Constant(value='cwe_description'), Constant(value='cwe_url'), Constant(value='abstraction')], values=[Name(id='mitre_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Name(id='cve_id', ctx=Load()), Name(id='cwe_id', ctx=Load()), Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name')], keywords=[]), Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='description')], keywords=[]), Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='url')], keywords=[]), Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='abstraction')], keywords=[])])), If(test=Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='mapping')], keywords=[]), body=[Assign(targets=[Subscript(value=Name(id='mitre_props', ctx=Load()), slice=Constant(value='mapping'), ctx=Store())], value=Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='mapping')], keywords=[]))], orelse=[]), If(test=Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='structure')], keywords=[]), body=[Assign(targets=[Subscript(value=Name(id='mitre_props', ctx=Load()), slice=Constant(value='structure'), ctx=Store())], value=Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='structure')], keywords=[]))], orelse=[]), If(test=Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='consequences')], keywords=[]), body=[Assign(targets=[Subscript(value=Name(id='mitre_props', ctx=Load()), slice=Constant(value='consequences'), ctx=Store())], value=Call(func=Attribute(value=Name(id='json', ctx=Load()), attr='dumps', ctx=Load()), args=[Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='consequences')], keywords=[])], keywords=[]))], orelse=[]), If(test=Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='mitigations')], keywords=[]), body=[Assign(targets=[Subscript(value=Name(id='mitre_props', ctx=Load()), slice=Constant(value='mitigations'), ctx=Store())], value=Call(func=Attribute(value=Name(id='json', ctx=Load()), attr='dumps', ctx=Load()), args=[Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='mitigations')], keywords=[])], keywords=[]))], orelse=[]), If(test=Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='detection_methods')], keywords=[]), body=[Assign(targets=[Subscript(value=Name(id='mitre_props', ctx=Load()), slice=Constant(value='detection_methods'), ctx=Store())], value=Call(func=Attribute(value=Name(id='json', ctx=Load()), attr='dumps', ctx=Load()), args=[Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='detection_methods')], keywords=[])], keywords=[]))], orelse=[]), Assign(targets=[Name(id='mitre_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='mitre_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n            MERGE (m:MitreData {id: $id})\\n            SET m += $props,\\n                m.updated_at = datetime()\\n            ')], keywords=[keyword(arg='id', value=Name(id='mitre_id', ctx=Load())), keyword(arg='props', value=Name(id='mitre_props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats_mitre', ctx=Load()), slice=Constant(value='nodes'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n            MATCH (c:CVE {id: $cve_id})\\n            MATCH (m:MitreData {id: $mitre_id})\\n            MERGE (c)-[:HAS_CWE]->(m)\\n            ')], keywords=[keyword(arg='cve_id', value=Name(id='cve_id', ctx=Load())), keyword(arg='mitre_id', value=Name(id='mitre_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats_mitre', ctx=Load()), slice=Constant(value='rels'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='related_capec', ctx=Store())], value=Call(func=Attribute(value=Name(id='cwe_node', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='related_capec'), List(elts=[], ctx=Load())], keywords=[])), For(target=Name(id='capec', ctx=Store()), iter=Name(id='related_capec', ctx=Load()), body=[Assign(targets=[Name(id='capec_id_raw', ctx=Store())], value=Call(func=Attribute(value=Name(id='capec', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='id')], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='capec_id_raw', ctx=Load())), body=[Continue()], orelse=[]), If(test=BoolOp(op=And(), values=[Call(func=Name(id='isinstance', ctx=Load()), args=[Name(id='capec_id_raw', ctx=Load()), Name(id='str', ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='capec_id_raw', ctx=Load()), attr='startswith', ctx=Load()), args=[Constant(value='CAPEC-')], keywords=[])]), body=[Assign(targets=[Name(id='capec_node_id', ctx=Store())], value=Name(id='capec_id_raw', ctx=Load())), Try(body=[Assign(targets=[Name(id='numeric_id', ctx=Store())], value=Call(func=Name(id='int', ctx=Load()), args=[Call(func=Attribute(value=Name(id='capec_id_raw', ctx=Load()), attr='replace', ctx=Load()), args=[Constant(value='CAPEC-'), Constant(value='')], keywords=[])], keywords=[]))], handlers=[ExceptHandler(type=Name(id='ValueError', ctx=Load()), body=[Assign(targets=[Name(id='numeric_id', ctx=Store())], value=Constant(value=None))])], orelse=[], finalbody=[])], orelse=[Assign(targets=[Name(id='capec_node_id', ctx=Store())], value=JoinedStr(values=[Constant(value='CAPEC-'), FormattedValue(value=Name(id='capec_id_raw', ctx=Load()), conversion=-1)])), Assign(targets=[Name(id='numeric_id', ctx=Store())], value=IfExp(test=Call(func=Name(id='isinstance', ctx=Load()), args=[Name(id='capec_id_raw', ctx=Load()), Name(id='int', ctx=Load())], keywords=[]), body=Name(id='capec_id_raw', ctx=Load()), orelse=Constant(value=None)))]), Assign(targets=[Name(id='capec_props', ctx=Store())], value=Dict(keys=[Constant(value='capec_id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='numeric_id'), Constant(value='name'), Constant(value='description'), Constant(value='url'), Constant(value='likelihood'), Constant(value='severity'), Constant(value='prerequisites'), Constant(value='examples')], values=[Name(id='capec_node_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Name(id='numeric_id', ctx=Load()), Call(func=Attribute(value=Name(id='capec', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name')], keywords=[]), Call(func=Attribute(value=Name(id='capec', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='description')], keywords=[]), Call(func=Attribute(value=Name(id='capec', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='url')], keywords=[]), Call(func=Attribute(value=Name(id='capec', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='likelihood')], keywords=[]), Call(func=Attribute(value=Name(id='capec', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='severity')], keywords=[]), Call(func=Attribute(value=Name(id='capec', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='prerequisites')], keywords=[]), Call(func=Attribute(value=Name(id='capec', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='examples')], keywords=[])])), Assign(targets=[Name(id='execution_flow', ctx=Store())], value=Call(func=Attribute(value=Name(id='capec', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='execution_flow'), List(elts=[], ctx=Load())], keywords=[])), If(test=Name(id='execution_flow', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='capec_props', ctx=Load()), slice=Constant(value='execution_flow'), ctx=Store())], value=Call(func=Attribute(value=Name(id='json', ctx=Load()), attr='dumps', ctx=Load()), args=[Name(id='execution_flow', ctx=Load())], keywords=[]))], orelse=[]), Assign(targets=[Name(id='related_cwes', ctx=Store())], value=Call(func=Attribute(value=Name(id='capec', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='related_cwes'), List(elts=[], ctx=Load())], keywords=[])), If(test=Name(id='related_cwes', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='capec_props', ctx=Load()), slice=Constant(value='related_cwes'), ctx=Store())], value=Name(id='related_cwes', ctx=Load()))], orelse=[]), Assign(targets=[Name(id='capec_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='capec_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                MERGE (cap:Capec {capec_id: $capec_id})\\n                SET cap += $props,\\n                    cap.updated_at = datetime()\\n                ')], keywords=[keyword(arg='capec_id', value=Name(id='capec_node_id', ctx=Load())), keyword(arg='props', value=Name(id='capec_props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats_mitre', ctx=Load()), slice=Constant(value='capec'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                MATCH (m:MitreData {id: $mitre_id})\\n                MATCH (cap:Capec {capec_id: $capec_id})\\n                MERGE (m)-[:HAS_CAPEC]->(cap)\\n                ')], keywords=[keyword(arg='mitre_id', value=Name(id='mitre_id', ctx=Load())), keyword(arg='capec_id', value=Name(id='capec_node_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats_mitre', ctx=Load()), slice=Constant(value='rels'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], decorator_list=[], type_params=[])",
  "create_user_input_node": "FunctionDef(name='create_user_input_node', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='domain', annotation=Name(id='str', ctx=Load())), arg(arg='user_input_data', annotation=Name(id='dict', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='\\n        Create a UserInput node for partial recon user-provided values.\\n\\n        Args:\\n            domain: Root domain to attach the UserInput to\\n            user_input_data: Dict with keys: id, input_type, values, tool_id\\n            user_id: Tenant user ID\\n            project_id: Tenant project ID\\n\\n        Returns:\\n            The UserInput node ID\\n        ')), Assign(targets=[Name(id='node_id', ctx=Store())], value=Subscript(value=Name(id='user_input_data', ctx=Load()), slice=Constant(value='id'), ctx=Load())), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                MERGE (ui:UserInput {id: $id})\\n                SET ui.input_type = $input_type,\\n                    ui.values = $values,\\n                    ui.tool_id = $tool_id,\\n                    ui.source = 'user',\\n                    ui.status = 'running',\\n                    ui.created_at = datetime(),\\n                    ui.user_id = $user_id,\\n                    ui.project_id = $project_id\\n                \")], keywords=[keyword(arg='id', value=Name(id='node_id', ctx=Load())), keyword(arg='input_type', value=Call(func=Attribute(value=Name(id='user_input_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='input_type'), Constant(value='subdomains')], keywords=[])), keyword(arg='values', value=Call(func=Attribute(value=Name(id='user_input_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='values'), List(elts=[], ctx=Load())], keywords=[])), keyword(arg='tool_id', value=Call(func=Attribute(value=Name(id='user_input_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='tool_id'), Constant(value='')], keywords=[])), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                MERGE (d:Domain {name: $domain, user_id: $user_id, project_id: $project_id})\\n                ON CREATE SET d.updated_at = datetime()\\n                WITH d\\n                MATCH (ui:UserInput {id: $ui_id})\\n                MERGE (d)-[:HAS_USER_INPUT]->(ui)\\n                ')], keywords=[keyword(arg='domain', value=Name(id='domain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='ui_id', value=Name(id='node_id', ctx=Load()))])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created UserInput node '), FormattedValue(value=Name(id='node_id', ctx=Load()), conversion=-1), Constant(value=' for '), FormattedValue(value=Name(id='domain', ctx=Load()), conversion=-1)])], keywords=[]))]), Return(value=Name(id='node_id', ctx=Load()))], decorator_list=[], returns=Name(id='str', ctx=Load()), type_params=[])",
  "get_graph_inputs_for_tool": "FunctionDef(name='get_graph_inputs_for_tool', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='tool_id', annotation=Name(id='str', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='\\n        Query existing graph data to provide inputs for a partial recon tool.\\n\\n        Args:\\n            tool_id: Tool identifier (e.g., \"SubdomainDiscovery\")\\n            user_id: Tenant user ID\\n            project_id: Tenant project ID\\n\\n        Returns:\\n            Dict with tool-specific inputs from the existing graph\\n        ')), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[If(test=Compare(left=Name(id='tool_id', ctx=Load()), ops=[Eq()], comparators=[Constant(value='SubdomainDiscovery')]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    OPTIONAL MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                    OPTIONAL MATCH (d)-[:HAS_SUBDOMAIN]->(s:Subdomain)\\n                    RETURN d.name AS domain, count(s) AS subdomain_count\\n                    ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='record', ctx=Store())], value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[])), Return(value=Dict(keys=[Constant(value='domain'), Constant(value='existing_subdomains_count'), Constant(value='source')], values=[IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), orelse=Constant(value=None)), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='subdomain_count'), ctx=Load()), Constant(value=0)]), IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Constant(value='graph'), orelse=Constant(value='settings'))]))], orelse=[If(test=Compare(left=Name(id='tool_id', ctx=Load()), ops=[In()], comparators=[Tuple(elts=[Constant(value='Naabu'), Constant(value='Masscan')], ctx=Load())]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    OPTIONAL MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                    OPTIONAL MATCH (d)-[:HAS_SUBDOMAIN]->(s:Subdomain)-[:RESOLVES_TO]->(i:IP)\\n                    OPTIONAL MATCH (d)-[:RESOLVES_TO]->(di:IP)\\n                    WITH d, count(DISTINCT s) AS sub_count,\\n                         count(DISTINCT i) + count(DISTINCT di) AS ip_count\\n                    RETURN d.name AS domain, sub_count, ip_count\\n                    ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='record', ctx=Store())], value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[])), Return(value=Dict(keys=[Constant(value='domain'), Constant(value='existing_subdomains_count'), Constant(value='existing_ips_count'), Constant(value='source')], values=[IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), orelse=Constant(value=None)), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='sub_count'), ctx=Load()), Constant(value=0)]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='ip_count'), ctx=Load()), Constant(value=0)]), IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Constant(value='graph'), orelse=Constant(value='settings'))]))], orelse=[If(test=Compare(left=Name(id='tool_id', ctx=Load()), ops=[Eq()], comparators=[Constant(value='Nmap')]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    OPTIONAL MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                    OPTIONAL MATCH (d)-[:HAS_SUBDOMAIN]->(s:Subdomain)-[:RESOLVES_TO]->(i:IP)-[:HAS_PORT]->(p:Port)\\n                    OPTIONAL MATCH (d)-[:RESOLVES_TO]->(di:IP)-[:HAS_PORT]->(dp:Port)\\n                    WITH d, count(DISTINCT s) AS sub_count,\\n                         count(DISTINCT i) + count(DISTINCT di) AS ip_count,\\n                         count(DISTINCT p) + count(DISTINCT dp) AS port_count\\n                    RETURN d.name AS domain, sub_count, ip_count, port_count\\n                    ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='record', ctx=Store())], value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[])), Return(value=Dict(keys=[Constant(value='domain'), Constant(value='existing_subdomains_count'), Constant(value='existing_ips_count'), Constant(value='existing_ports_count'), Constant(value='source')], values=[IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), orelse=Constant(value=None)), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='sub_count'), ctx=Load()), Constant(value=0)]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='ip_count'), ctx=Load()), Constant(value=0)]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='port_count'), ctx=Load()), Constant(value=0)]), IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Constant(value='graph'), orelse=Constant(value='settings'))]))], orelse=[If(test=Compare(left=Name(id='tool_id', ctx=Load()), ops=[Eq()], comparators=[Constant(value='Httpx')]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    OPTIONAL MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                    OPTIONAL MATCH (d)-[:HAS_SUBDOMAIN]->(s:Subdomain)-[:RESOLVES_TO]->(i:IP)-[:HAS_PORT]->(p:Port)\\n                    OPTIONAL MATCH (d)-[:RESOLVES_TO]->(di:IP)-[:HAS_PORT]->(dp:Port)\\n                    OPTIONAL MATCH (p)-[:HAS_SERVICE]->(:Service)-[:SERVES_URL]->(bu:BaseURL)\\n                    OPTIONAL MATCH (dp)-[:HAS_SERVICE]->(:Service)-[:SERVES_URL]->(dbu:BaseURL)\\n                    WITH d, count(DISTINCT s) AS sub_count,\\n                         count(DISTINCT i) + count(DISTINCT di) AS ip_count,\\n                         count(DISTINCT p) + count(DISTINCT dp) AS port_count,\\n                         count(DISTINCT bu) + count(DISTINCT dbu) AS baseurl_count\\n                    RETURN d.name AS domain, sub_count, ip_count, port_count, baseurl_count\\n                    ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='record', ctx=Store())], value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[])), Return(value=Dict(keys=[Constant(value='domain'), Constant(value='existing_subdomains_count'), Constant(value='existing_ips_count'), Constant(value='existing_ports_count'), Constant(value='existing_baseurls_count'), Constant(value='source')], values=[IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), orelse=Constant(value=None)), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='sub_count'), ctx=Load()), Constant(value=0)]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='ip_count'), ctx=Load()), Constant(value=0)]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='port_count'), ctx=Load()), Constant(value=0)]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='baseurl_count'), ctx=Load()), Constant(value=0)]), IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Constant(value='graph'), orelse=Constant(value='settings'))]))], orelse=[If(test=Compare(left=Name(id='tool_id', ctx=Load()), ops=[In()], comparators=[Tuple(elts=[Constant(value='Gau'), Constant(value='ParamSpider')], ctx=Load())]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    OPTIONAL MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                    OPTIONAL MATCH (d)-[:HAS_SUBDOMAIN]->(s:Subdomain)\\n                    WITH d, collect(DISTINCT s.name) AS subdomains\\n                    RETURN d.name AS domain, subdomains, size(subdomains) AS sub_count\\n                    ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='record', ctx=Store())], value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[])), Return(value=Dict(keys=[Constant(value='domain'), Constant(value='existing_subdomains'), Constant(value='existing_subdomains_count'), Constant(value='source')], values=[IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), orelse=Constant(value=None)), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='subdomains'), ctx=Load()), List(elts=[], ctx=Load())]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='sub_count'), ctx=Load()), Constant(value=0)]), IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Constant(value='graph'), orelse=Constant(value='settings'))]))], orelse=[If(test=Compare(left=Name(id='tool_id', ctx=Load()), ops=[Eq()], comparators=[Constant(value='JsRecon')]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    OPTIONAL MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                    WITH d\\n                    OPTIONAL MATCH (b:BaseURL {user_id: $uid, project_id: $pid})\\n                    WITH d, collect(DISTINCT b.url) AS baseurls\\n                    OPTIONAL MATCH (e:Endpoint {user_id: $uid, project_id: $pid})\\n                    WITH d, baseurls, count(DISTINCT e) AS endpoint_count\\n                    RETURN d.name AS domain, baseurls, size(baseurls) AS baseurl_count, endpoint_count\\n                    ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='record', ctx=Store())], value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[])), Return(value=Dict(keys=[Constant(value='domain'), Constant(value='existing_subdomains_count'), Constant(value='existing_baseurls'), Constant(value='existing_baseurls_count'), Constant(value='existing_endpoints_count'), Constant(value='source')], values=[IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), orelse=Constant(value=None)), Constant(value=0), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='baseurls'), ctx=Load()), List(elts=[], ctx=Load())]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='baseurl_count'), ctx=Load()), Constant(value=0)]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='endpoint_count'), ctx=Load()), Constant(value=0)]), IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Constant(value='graph'), orelse=Constant(value='settings'))]))], orelse=[If(test=Compare(left=Name(id='tool_id', ctx=Load()), ops=[Eq()], comparators=[Constant(value='Nuclei')]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    OPTIONAL MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                    WITH d\\n                    OPTIONAL MATCH (b:BaseURL {user_id: $uid, project_id: $pid})\\n                    WITH d, collect(DISTINCT b.url) AS baseurls\\n                    OPTIONAL MATCH (e:Endpoint {user_id: $uid, project_id: $pid})\\n                    WITH d, baseurls, count(DISTINCT e) AS endpoint_count\\n                    RETURN d.name AS domain, baseurls, size(baseurls) AS baseurl_count, endpoint_count\\n                    ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='record', ctx=Store())], value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[])), Return(value=Dict(keys=[Constant(value='domain'), Constant(value='existing_subdomains_count'), Constant(value='existing_baseurls'), Constant(value='existing_baseurls_count'), Constant(value='existing_endpoints_count'), Constant(value='source')], values=[IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), orelse=Constant(value=None)), Constant(value=0), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='baseurls'), ctx=Load()), List(elts=[], ctx=Load())]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='baseurl_count'), ctx=Load()), Constant(value=0)]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='endpoint_count'), ctx=Load()), Constant(value=0)]), IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Constant(value='graph'), orelse=Constant(value='settings'))]))], orelse=[If(test=Compare(left=Name(id='tool_id', ctx=Load()), ops=[Eq()], comparators=[Constant(value='Shodan')]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    OPTIONAL MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                    OPTIONAL MATCH (d)-[:HAS_SUBDOMAIN]->(s:Subdomain)-[:RESOLVES_TO]->(i:IP)\\n                    OPTIONAL MATCH (d)-[:RESOLVES_TO]->(di:IP)\\n                    WITH d, collect(DISTINCT s.name) AS subdomains,\\n                         count(DISTINCT i) + count(DISTINCT di) AS ip_count\\n                    RETURN d.name AS domain, subdomains, size(subdomains) AS sub_count, ip_count\\n                    ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='record', ctx=Store())], value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[])), Return(value=Dict(keys=[Constant(value='domain'), Constant(value='existing_subdomains'), Constant(value='existing_subdomains_count'), Constant(value='existing_ips_count'), Constant(value='source')], values=[IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), orelse=Constant(value=None)), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='subdomains'), ctx=Load()), List(elts=[], ctx=Load())]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='sub_count'), ctx=Load()), Constant(value=0)]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='ip_count'), ctx=Load()), Constant(value=0)]), IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Constant(value='graph'), orelse=Constant(value='settings'))]))], orelse=[If(test=Compare(left=Name(id='tool_id', ctx=Load()), ops=[Eq()], comparators=[Constant(value='Urlscan')]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    OPTIONAL MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                    OPTIONAL MATCH (d)-[:HAS_SUBDOMAIN]->(s:Subdomain)\\n                    RETURN d.name AS domain, count(s) AS subdomain_count\\n                    ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='record', ctx=Store())], value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[])), Return(value=Dict(keys=[Constant(value='domain'), Constant(value='existing_subdomains_count'), Constant(value='source')], values=[IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), orelse=Constant(value=None)), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='subdomain_count'), ctx=Load()), Constant(value=0)]), IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Constant(value='graph'), orelse=Constant(value='settings'))]))], orelse=[If(test=Compare(left=Name(id='tool_id', ctx=Load()), ops=[Eq()], comparators=[Constant(value='Uncover')]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    OPTIONAL MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                    OPTIONAL MATCH (d)-[:HAS_SUBDOMAIN]->(s:Subdomain)\\n                    RETURN d.name AS domain, count(s) AS subdomain_count\\n                    ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='record', ctx=Store())], value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[])), Return(value=Dict(keys=[Constant(value='domain'), Constant(value='existing_subdomains_count'), Constant(value='source')], values=[IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), orelse=Constant(value=None)), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='subdomain_count'), ctx=Load()), Constant(value=0)]), IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Constant(value='graph'), orelse=Constant(value='settings'))]))], orelse=[If(test=Compare(left=Name(id='tool_id', ctx=Load()), ops=[Eq()], comparators=[Constant(value='OsintEnrichment')]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    OPTIONAL MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                    OPTIONAL MATCH (d)-[:HAS_SUBDOMAIN]->(s:Subdomain)-[:RESOLVES_TO]->(i:IP)\\n                    OPTIONAL MATCH (d)-[:RESOLVES_TO]->(di:IP)\\n                    WITH d, collect(DISTINCT s.name) AS subdomains,\\n                         count(DISTINCT i) + count(DISTINCT di) AS ip_count\\n                    RETURN d.name AS domain, subdomains, size(subdomains) AS sub_count, ip_count\\n                    ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='record', ctx=Store())], value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[])), Return(value=Dict(keys=[Constant(value='domain'), Constant(value='existing_subdomains'), Constant(value='existing_subdomains_count'), Constant(value='existing_ips_count'), Constant(value='source')], values=[IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), orelse=Constant(value=None)), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='subdomains'), ctx=Load()), List(elts=[], ctx=Load())]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='sub_count'), ctx=Load()), Constant(value=0)]), BoolOp(op=Or(), values=[Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='ip_count'), ctx=Load()), Constant(value=0)]), IfExp(test=Subscript(value=Name(id='record', ctx=Load()), slice=Constant(value='domain'), ctx=Load()), body=Constant(value='graph'), orelse=Constant(value='settings'))]))], orelse=[])])])])])])])])])])]), Return(value=Dict(keys=[Constant(value='error')], values=[JoinedStr(values=[Constant(value='Unknown tool_id: '), FormattedValue(value=Name(id='tool_id', ctx=Load()), conversion=-1)])]))])], decorator_list=[], returns=Name(id='dict', ctx=Load()), type_params=[])",
  "update_graph_from_domain_discovery": "FunctionDef(name='update_graph_from_domain_discovery', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='recon_data', annotation=Name(id='dict', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='\\n        Initialize the Neo4j graph database with reconnaissance data after domain_discovery.\\n\\n        This function creates:\\n        - Domain node (root) with WHOIS data\\n        - Subdomain nodes\\n        - IP nodes\\n        - DNSRecord nodes\\n        - All relationships between them\\n\\n        Args:\\n            recon_data: The recon JSON data from domain_discovery module\\n            user_id: User identifier for multi-tenant isolation\\n            project_id: Project identifier for multi-tenant isolation\\n\\n        Returns:\\n            Dictionary with statistics about created nodes/relationships\\n        ')), Assign(targets=[Name(id='stats', ctx=Store())], value=Dict(keys=[Constant(value='domain_created'), Constant(value='subdomains_created'), Constant(value='ips_created'), Constant(value='dns_records_created'), Constant(value='relationships_created'), Constant(value='errors')], values=[Constant(value=False), Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), List(elts=[], ctx=Load())])), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[Assign(targets=[Name(id='metadata', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='metadata'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='whois_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='whois'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='subdomains', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomains'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='dns_data', ctx=Store())], value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='dns')], keywords=[]), Dict(keys=[], values=[])])), Assign(targets=[Name(id='root_domain', ctx=Store())], value=Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='root_domain'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='target', ctx=Store())], value=Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='target'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='filtered_mode', ctx=Store())], value=Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='filtered_mode'), Constant(value=False)], keywords=[])), Assign(targets=[Name(id='subdomain_filter', ctx=Store())], value=Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomain_filter'), List(elts=[], ctx=Load())], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='root_domain', ctx=Load())), body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[Constant(value='No root_domain found in metadata')], keywords=[])), Return(value=Name(id='stats', ctx=Load()))], orelse=[]), Try(body=[Assign(targets=[Name(id='domain_props', ctx=Store())], value=Dict(keys=[Constant(value='name'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='scan_timestamp'), Constant(value='scan_type'), Constant(value='target'), Constant(value='filtered_mode'), Constant(value='subdomain_filter'), Constant(value='modules_executed'), Constant(value='anonymous_mode'), Constant(value='bruteforce_mode'), Constant(value='registrar'), Constant(value='registrar_url'), Constant(value='whois_server'), Constant(value='dnssec'), Constant(value='organization'), Constant(value='country'), Constant(value='city'), Constant(value='state'), Constant(value='address'), Constant(value='registrant_postal_code'), Constant(value='registrant_name'), Constant(value='admin_name'), Constant(value='admin_org'), Constant(value='tech_name'), Constant(value='tech_org'), Constant(value='domain_name'), Constant(value='referral_url'), Constant(value='reseller'), Constant(value='name_servers'), Constant(value='whois_emails'), Constant(value='updated_at')], values=[Name(id='root_domain', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_timestamp')], keywords=[]), Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_type')], keywords=[]), Name(id='target', ctx=Load()), Name(id='filtered_mode', ctx=Load()), Name(id='subdomain_filter', ctx=Load()), Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='modules_executed'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='anonymous_mode'), Constant(value=False)], keywords=[]), Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='bruteforce_mode'), Constant(value=False)], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='registrar')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='registrar_url')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='whois_server')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='dnssec')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='org')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='country')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='city')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='state')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='address')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='registrant_postal_code')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='admin_name')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='admin_org')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='tech_name')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='tech_org')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='domain_name')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='referral_url')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='reseller')], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name_servers'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='emails'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Call(func=Attribute(value=Name(id='datetime', ctx=Load()), attr='now', ctx=Load()), args=[], keywords=[]), attr='isoformat', ctx=Load()), args=[], keywords=[])])), For(target=Name(id='date_field', ctx=Store()), iter=List(elts=[Constant(value='creation_date'), Constant(value='expiration_date'), Constant(value='updated_date')], ctx=Load()), body=[Assign(targets=[Name(id='date_val', ctx=Store())], value=Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='date_field', ctx=Load())], keywords=[])), If(test=BoolOp(op=And(), values=[Call(func=Name(id='isinstance', ctx=Load()), args=[Name(id='date_val', ctx=Load()), Name(id='list', ctx=Load())], keywords=[]), Name(id='date_val', ctx=Load())]), body=[Assign(targets=[Subscript(value=Name(id='domain_props', ctx=Load()), slice=Name(id='date_field', ctx=Load()), ctx=Store())], value=Subscript(value=Name(id='date_val', ctx=Load()), slice=Constant(value=0), ctx=Load()))], orelse=[If(test=Name(id='date_val', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='domain_props', ctx=Load()), slice=Name(id='date_field', ctx=Load()), ctx=Store())], value=Name(id='date_val', ctx=Load()))], orelse=[])])], orelse=[]), Assign(targets=[Name(id='status', ctx=Store())], value=Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='status'), List(elts=[], ctx=Load())], keywords=[])), If(test=Call(func=Name(id='isinstance', ctx=Load()), args=[Name(id='status', ctx=Load()), Name(id='list', ctx=Load())], keywords=[]), body=[Assign(targets=[Subscript(value=Name(id='domain_props', ctx=Load()), slice=Constant(value='status'), ctx=Store())], value=ListComp(elt=IfExp(test=Compare(left=Constant(value=' '), ops=[In()], comparators=[Name(id='s', ctx=Load())]), body=Subscript(value=Call(func=Attribute(value=Name(id='s', ctx=Load()), attr='split', ctx=Load()), args=[], keywords=[]), slice=Constant(value=0), ctx=Load()), orelse=Name(id='s', ctx=Load())), generators=[comprehension(target=Name(id='s', ctx=Store()), iter=Name(id='status', ctx=Load()), ifs=[], is_async=0)]))], orelse=[If(test=Name(id='status', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='domain_props', ctx=Load()), slice=Constant(value='status'), ctx=Store())], value=List(elts=[IfExp(test=Compare(left=Constant(value=' '), ops=[In()], comparators=[Name(id='status', ctx=Load())]), body=Subscript(value=Call(func=Attribute(value=Name(id='status', ctx=Load()), attr='split', ctx=Load()), args=[], keywords=[]), slice=Constant(value=0), ctx=Load()), orelse=Name(id='status', ctx=Load()))], ctx=Load()))], orelse=[])]), Assign(targets=[Name(id='domain_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='domain_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    MERGE (d:Domain {name: $name, user_id: $user_id, project_id: $project_id})\\n                    SET d += $props\\n                    ')], keywords=[keyword(arg='name', value=Name(id='root_domain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='props', value=Name(id='domain_props', ctx=Load()))])), Assign(targets=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='domain_created'), ctx=Store())], value=Constant(value=True)), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created Domain node: '), FormattedValue(value=Name(id='root_domain', ctx=Load()), conversion=-1)])], keywords=[]))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Domain creation failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] Domain creation failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[]), Assign(targets=[Name(id='subdomain_dns', ctx=Store())], value=Call(func=Attribute(value=Name(id='dns_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomains'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='domain_dns', ctx=Store())], value=Call(func=Attribute(value=Name(id='dns_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='domain'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='subdomain_status_map', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomain_status_map'), Dict(keys=[], values=[])], keywords=[])), For(target=Name(id='subdomain', ctx=Store()), iter=Name(id='subdomains', ctx=Load()), body=[Try(body=[If(test=Compare(left=Name(id='subdomain', ctx=Load()), ops=[Eq()], comparators=[Name(id='root_domain', ctx=Load())]), body=[Assign(targets=[Name(id='subdomain_info', ctx=Store())], value=Name(id='domain_dns', ctx=Load()))], orelse=[Assign(targets=[Name(id='subdomain_info', ctx=Store())], value=Call(func=Attribute(value=Name(id='subdomain_dns', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='subdomain', ctx=Load()), Dict(keys=[], values=[])], keywords=[]))]), Assign(targets=[Name(id='has_records', ctx=Store())], value=Call(func=Attribute(value=Name(id='subdomain_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='has_records'), Constant(value=False)], keywords=[])), Assign(targets=[Name(id='status', ctx=Store())], value=Call(func=Attribute(value=Name(id='subdomain_status_map', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='subdomain', ctx=Load())], keywords=[])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MERGE (s:Subdomain {name: $name, user_id: $user_id, project_id: $project_id})\\n                        SET s.has_dns_records = $has_records,\\n                            s.status = coalesce(s.status, $status),\\n                            s.discovered_at = coalesce(s.discovered_at, datetime()),\\n                            s.updated_at = datetime()\\n                        ')], keywords=[keyword(arg='name', value=Name(id='subdomain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='has_records', value=Name(id='has_records', ctx=Load())), keyword(arg='status', value=Name(id='status', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MATCH (d:Domain {name: $domain, user_id: $user_id, project_id: $project_id})\\n                        MATCH (s:Subdomain {name: $subdomain, user_id: $user_id, project_id: $project_id})\\n                        MERGE (s)-[:BELONGS_TO]->(d)\\n                        MERGE (d)-[:HAS_SUBDOMAIN]->(s)\\n                        ')], keywords=[keyword(arg='domain', value=Name(id='root_domain', ctx=Load())), keyword(arg='subdomain', value=Name(id='subdomain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='records', ctx=Store())], value=Call(func=Attribute(value=Name(id='subdomain_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='records'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='ips_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='subdomain_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ips'), Dict(keys=[], values=[])], keywords=[])), For(target=Name(id='ip_version', ctx=Store()), iter=List(elts=[Constant(value='ipv4'), Constant(value='ipv6')], ctx=Load()), body=[Assign(targets=[Name(id='ip_list', ctx=Store())], value=Call(func=Attribute(value=Name(id='ips_data', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='ip_version', ctx=Load()), List(elts=[], ctx=Load())], keywords=[])), For(target=Name(id='ip_addr', ctx=Store()), iter=Name(id='ip_list', ctx=Load()), body=[If(test=Name(id='ip_addr', ctx=Load()), body=[Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                        MERGE (i:IP {address: $address, user_id: $user_id, project_id: $project_id})\\n                                        SET i.version = $version,\\n                                            i.updated_at = datetime()\\n                                        ')], keywords=[keyword(arg='address', value=Name(id='ip_addr', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='version', value=Name(id='ip_version', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ips_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='record_type', ctx=Store())], value=IfExp(test=Compare(left=Name(id='ip_version', ctx=Load()), ops=[Eq()], comparators=[Constant(value='ipv4')]), body=Constant(value='A'), orelse=Constant(value='AAAA'))), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                        MATCH (s:Subdomain {name: $subdomain, user_id: $user_id, project_id: $project_id})\\n                                        MATCH (i:IP {address: $ip, user_id: $user_id, project_id: $project_id})\\n                                        MERGE (s)-[:RESOLVES_TO {record_type: $record_type}]->(i)\\n                                        ')], keywords=[keyword(arg='subdomain', value=Name(id='subdomain', ctx=Load())), keyword(arg='ip', value=Name(id='ip_addr', ctx=Load())), keyword(arg='record_type', value=Name(id='record_type', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='IP '), FormattedValue(value=Name(id='ip_addr', ctx=Load()), conversion=-1), Constant(value=' creation failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], orelse=[])], orelse=[]), For(target=Tuple(elts=[Name(id='record_type', ctx=Store()), Name(id='record_values', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='records', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[If(test=BoolOp(op=And(), values=[Name(id='record_values', ctx=Load()), Compare(left=Name(id='record_type', ctx=Load()), ops=[NotIn()], comparators=[List(elts=[Constant(value='A'), Constant(value='AAAA')], ctx=Load())])]), body=[If(test=UnaryOp(op=Not(), operand=Call(func=Name(id='isinstance', ctx=Load()), args=[Name(id='record_values', ctx=Load()), Name(id='list', ctx=Load())], keywords=[])), body=[Assign(targets=[Name(id='record_values', ctx=Store())], value=List(elts=[Name(id='record_values', ctx=Load())], ctx=Load()))], orelse=[]), For(target=Name(id='value', ctx=Store()), iter=Name(id='record_values', ctx=Load()), body=[If(test=Name(id='value', ctx=Load()), body=[Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                            MERGE (dns:DNSRecord {type: $type, value: $value, subdomain: $subdomain, user_id: $user_id, project_id: $project_id})\\n                                            SET dns.user_id = $user_id,\\n                                                dns.project_id = $project_id,\\n                                                dns.updated_at = datetime()\\n                                            ')], keywords=[keyword(arg='type', value=Name(id='record_type', ctx=Load())), keyword(arg='value', value=Call(func=Name(id='str', ctx=Load()), args=[Name(id='value', ctx=Load())], keywords=[])), keyword(arg='subdomain', value=Name(id='subdomain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='dns_records_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                            MATCH (s:Subdomain {name: $subdomain, user_id: $user_id, project_id: $project_id})\\n                                            MATCH (dns:DNSRecord {type: $type, value: $value, subdomain: $subdomain, user_id: $user_id, project_id: $project_id})\\n                                            MERGE (s)-[:HAS_DNS_RECORD]->(dns)\\n                                            ')], keywords=[keyword(arg='subdomain', value=Name(id='subdomain', ctx=Load())), keyword(arg='type', value=Name(id='record_type', ctx=Load())), keyword(arg='value', value=Call(func=Name(id='str', ctx=Load()), args=[Name(id='value', ctx=Load())], keywords=[])), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='DNSRecord '), FormattedValue(value=Name(id='record_type', ctx=Load()), conversion=-1), Constant(value='='), FormattedValue(value=Name(id='value', ctx=Load()), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], orelse=[])], orelse=[])], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Subdomain '), FormattedValue(value=Name(id='subdomain', ctx=Load()), conversion=-1), Constant(value=' processing failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] Subdomain '), FormattedValue(value=Name(id='subdomain', ctx=Load()), conversion=-1), Constant(value=' processing failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_created'), ctx=Load()), conversion=-1), Constant(value=' Subdomain nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ips_created'), ctx=Load()), conversion=-1), Constant(value=' IP nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='dns_records_created'), ctx=Load()), conversion=-1), Constant(value=' DNSRecord nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Load()), conversion=-1), Constant(value=' relationships')])], keywords=[])), If(test=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] '), FormattedValue(value=Call(func=Name(id='len', ctx=Load()), args=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load())], keywords=[]), conversion=-1), Constant(value=' errors occurred')])], keywords=[]))], orelse=[])]), Return(value=Name(id='stats', ctx=Load()))], decorator_list=[], returns=Name(id='dict', ctx=Load()), type_params=[])",
  "update_graph_from_http_probe": "FunctionDef(name='update_graph_from_http_probe', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='recon_data', annotation=Name(id='dict', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='\\n        Update the Neo4j graph database with HTTP probe data.\\n\\n        This function creates/updates:\\n        - BaseURL nodes with HTTP response data (root/base URLs discovered by httpx)\\n        - Technology nodes for detected technologies\\n        - Header nodes for HTTP response headers\\n        - Service nodes (if not existing) for the HTTP/HTTPS service\\n        - Relationships: Service -[:SERVES_URL]-> BaseURL, BaseURL -[:USES_TECHNOLOGY]-> Technology, BaseURL -[:HAS_HEADER]-> Header\\n\\n        Args:\\n            recon_data: The recon JSON data containing http_probe results\\n            user_id: User identifier for multi-tenant isolation\\n            project_id: Project identifier for multi-tenant isolation\\n\\n        Returns:\\n            Dictionary with statistics about created/updated nodes/relationships\\n        ')), Assign(targets=[Name(id='stats', ctx=Store())], value=Dict(keys=[Constant(value='baseurls_created'), Constant(value='certificates_created'), Constant(value='services_created'), Constant(value='technologies_created'), Constant(value='headers_created'), Constant(value='relationships_created'), Constant(value='subdomains_updated'), Constant(value='errors')], values=[Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), List(elts=[], ctx=Load())])), Assign(targets=[Name(id='http_probe_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='http_probe'), Dict(keys=[], values=[])], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='http_probe_data', ctx=Load())), body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[Constant(value='No http_probe data found in recon_data')], keywords=[])), Return(value=Name(id='stats', ctx=Load()))], orelse=[]), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[Assign(targets=[Name(id='scan_metadata', ctx=Store())], value=Call(func=Attribute(value=Name(id='http_probe_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_metadata'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='by_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='http_probe_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='by_url'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='wappalyzer', ctx=Store())], value=Call(func=Attribute(value=Name(id='http_probe_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='wappalyzer'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='all_technologies', ctx=Store())], value=Call(func=Attribute(value=Name(id='wappalyzer', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='all_technologies'), Dict(keys=[], values=[])], keywords=[])), For(target=Tuple(elts=[Name(id='url', ctx=Store()), Name(id='url_info', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='by_url', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='host', ctx=Store())], value=Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='host'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='scheme', ctx=Store())], value=IfExp(test=Call(func=Attribute(value=Name(id='url', ctx=Load()), attr='startswith', ctx=Load()), args=[Constant(value='https://')], keywords=[]), body=Constant(value='https'), orelse=Constant(value='http'))), Assign(targets=[Name(id='baseurl_props', ctx=Store())], value=Dict(keys=[Constant(value='url'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='scheme'), Constant(value='host'), Constant(value='status_code'), Constant(value='content_length'), Constant(value='content_type'), Constant(value='title'), Constant(value='server'), Constant(value='response_time_ms'), Constant(value='word_count'), Constant(value='line_count'), Constant(value='resolved_ip'), Constant(value='cname'), Constant(value='cdn'), Constant(value='is_cdn'), Constant(value='asn'), Constant(value='favicon_hash'), Constant(value='is_live'), Constant(value='source')], values=[Name(id='url', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Name(id='scheme', ctx=Load()), Name(id='host', ctx=Load()), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='status_code')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='content_length')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='content_type')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='title')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='server')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='response_time_ms')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='word_count')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='line_count')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ip')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cname')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cdn')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='is_cdn'), Constant(value=False)], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='asn')], keywords=[]), Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='favicon_hash')], keywords=[]), Compare(left=Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='status_code')], keywords=[]), ops=[IsNot()], comparators=[Constant(value=None)]), Constant(value='http_probe')])), Assign(targets=[Name(id='body_hash', ctx=Store())], value=Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='body_hash'), Dict(keys=[], values=[])], keywords=[])), If(test=Name(id='body_hash', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='baseurl_props', ctx=Load()), slice=Constant(value='body_sha256'), ctx=Store())], value=Call(func=Attribute(value=Name(id='body_hash', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='body_sha256')], keywords=[])), Assign(targets=[Subscript(value=Name(id='baseurl_props', ctx=Load()), slice=Constant(value='header_sha256'), ctx=Store())], value=Call(func=Attribute(value=Name(id='body_hash', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='header_sha256')], keywords=[]))], orelse=[]), Assign(targets=[Name(id='tls_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='tls'), Dict(keys=[], values=[])], keywords=[])), If(test=Name(id='tls_data', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='baseurl_props', ctx=Load()), slice=Constant(value='tls_cipher'), ctx=Store())], value=Call(func=Attribute(value=Name(id='tls_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cipher')], keywords=[])), Assign(targets=[Subscript(value=Name(id='baseurl_props', ctx=Load()), slice=Constant(value='tls_version'), ctx=Store())], value=Call(func=Attribute(value=Name(id='tls_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='version')], keywords=[]))], orelse=[]), Assign(targets=[Name(id='baseurl_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='baseurl_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MERGE (u:BaseURL {url: $url, user_id: $user_id, project_id: $project_id})\\n                        SET u += $props,\\n                            u.updated_at = datetime()\\n                        ')], keywords=[keyword(arg='url', value=Name(id='url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='props', value=Name(id='baseurl_props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='baseurls_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=BoolOp(op=And(), values=[Name(id='tls_data', ctx=Load()), Call(func=Attribute(value=Name(id='tls_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='certificate')], keywords=[])]), body=[Assign(targets=[Name(id='cert_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='tls_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='certificate'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='subject_cn', ctx=Store())], value=Call(func=Attribute(value=Name(id='cert_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subject_cn'), Constant(value='')], keywords=[])), If(test=Name(id='subject_cn', ctx=Load()), body=[Assign(targets=[Name(id='cert_props', ctx=Store())], value=Dict(keys=[Constant(value='subject_cn'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='issuer'), Constant(value='not_before'), Constant(value='not_after'), Constant(value='san'), Constant(value='cipher'), Constant(value='tls_version'), Constant(value='source')], values=[Name(id='subject_cn', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), IfExp(test=Call(func=Name(id='isinstance', ctx=Load()), args=[Call(func=Attribute(value=Name(id='cert_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='issuer')], keywords=[]), Name(id='list', ctx=Load())], keywords=[]), body=Call(func=Attribute(value=Constant(value=', '), attr='join', ctx=Load()), args=[Call(func=Attribute(value=Name(id='cert_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='issuer'), List(elts=[], ctx=Load())], keywords=[])], keywords=[]), orelse=Call(func=Attribute(value=Name(id='cert_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='issuer')], keywords=[])), Call(func=Attribute(value=Name(id='cert_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='not_before')], keywords=[]), Call(func=Attribute(value=Name(id='cert_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='not_after')], keywords=[]), Call(func=Attribute(value=Name(id='cert_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='san'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='tls_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cipher')], keywords=[]), Call(func=Attribute(value=Name(id='tls_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='version')], keywords=[]), Constant(value='http_probe')])), Assign(targets=[Name(id='cert_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='cert_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MERGE (c:Certificate {subject_cn: $subject_cn, user_id: $user_id, project_id: $project_id})\\n                                SET c += $props,\\n                                    c.updated_at = datetime()\\n                                ')], keywords=[keyword(arg='subject_cn', value=Name(id='subject_cn', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='props', value=Name(id='cert_props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='certificates_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (u:BaseURL {url: $url, user_id: $user_id, project_id: $project_id})\\n                                MATCH (c:Certificate {subject_cn: $subject_cn, user_id: $user_id, project_id: $project_id})\\n                                MERGE (u)-[:HAS_CERTIFICATE]->(c)\\n                                ')], keywords=[keyword(arg='url', value=Name(id='url', ctx=Load())), keyword(arg='subject_cn', value=Name(id='subject_cn', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], orelse=[]), If(test=Name(id='host', ctx=Load()), body=[Assign(targets=[Name(id='resolved_ip', ctx=Store())], value=Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ip')], keywords=[])), Assign(targets=[Name(id='parsed_url', ctx=Store())], value=Call(func=Name(id='urlparse', ctx=Load()), args=[Name(id='url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='port_number', ctx=Store())], value=BoolOp(op=Or(), values=[Attribute(value=Name(id='parsed_url', ctx=Load()), attr='port', ctx=Load()), IfExp(test=Compare(left=Name(id='scheme', ctx=Load()), ops=[Eq()], comparators=[Constant(value='https')]), body=Constant(value=443), orelse=Constant(value=80))])), Assign(targets=[Name(id='default_service_name', ctx=Store())], value=IfExp(test=Compare(left=Name(id='scheme', ctx=Load()), ops=[Eq()], comparators=[Constant(value='https')]), body=Constant(value='https'), orelse=Constant(value='http'))), If(test=Name(id='resolved_ip', ctx=Load()), body=[Assign(targets=[Name(id='existing_service', ctx=Store())], value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (svc:Service {port_number: $port_number, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                RETURN svc.name as name LIMIT 1\\n                                ')], keywords=[keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='ip_addr', value=Name(id='resolved_ip', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))]), attr='single', ctx=Load()), args=[], keywords=[])), If(test=Name(id='existing_service', ctx=Load()), body=[Assign(targets=[Name(id='service_name', ctx=Store())], value=Subscript(value=Name(id='existing_service', ctx=Load()), slice=Constant(value='name'), ctx=Load()))], orelse=[Assign(targets=[Name(id='service_name', ctx=Store())], value=Name(id='default_service_name', ctx=Load())), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MERGE (svc:Service {name: $service_name, port_number: $port_number, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                    SET svc.updated_at = datetime()\\n                                    ')], keywords=[keyword(arg='service_name', value=Name(id='service_name', ctx=Load())), keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='ip_addr', value=Name(id='resolved_ip', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='services_created'), ctx=Store()), op=Add(), value=Constant(value=1))]), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (svc:Service {name: $service_name, port_number: $port_number, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                MATCH (u:BaseURL {url: $url, user_id: $user_id, project_id: $project_id})\\n                                MERGE (svc)-[:SERVES_URL]->(u)\\n                                ')], keywords=[keyword(arg='service_name', value=Name(id='service_name', ctx=Load())), keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='ip_addr', value=Name(id='resolved_ip', ctx=Load())), keyword(arg='url', value=Name(id='url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                MERGE (p:Port {number: $port_number, protocol: 'tcp', ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                SET p.state = 'open',\\n                                    p.updated_at = datetime()\\n                                WITH p\\n                                MATCH (svc:Service {name: $service_name, port_number: $port_number, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                MERGE (p)-[:RUNS_SERVICE]->(svc)\\n                                \")], keywords=[keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='ip_addr', value=Name(id='resolved_ip', ctx=Load())), keyword(arg='service_name', value=Name(id='service_name', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                MATCH (i:IP {address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                MATCH (p:Port {number: $port_number, protocol: 'tcp', ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                MERGE (i)-[:HAS_PORT]->(p)\\n                                \")], keywords=[keyword(arg='ip_addr', value=Name(id='resolved_ip', ctx=Load())), keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))]))], orelse=[])], orelse=[]), Assign(targets=[Name(id='processed_techs', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), Assign(targets=[Name(id='httpx_technologies', ctx=Store())], value=Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='technologies'), List(elts=[], ctx=Load())], keywords=[])), For(target=Name(id='tech_str', ctx=Store()), iter=Name(id='httpx_technologies', ctx=Load()), body=[Try(body=[If(test=Compare(left=Constant(value=':'), ops=[In()], comparators=[Name(id='tech_str', ctx=Load())]), body=[Assign(targets=[Tuple(elts=[Name(id='tech_name', ctx=Store()), Name(id='tech_version', ctx=Store())], ctx=Store())], value=Call(func=Attribute(value=Name(id='tech_str', ctx=Load()), attr='split', ctx=Load()), args=[Constant(value=':'), Constant(value=1)], keywords=[]))], orelse=[Assign(targets=[Name(id='tech_name', ctx=Store())], value=Name(id='tech_str', ctx=Load())), Assign(targets=[Name(id='tech_version', ctx=Store())], value=Constant(value=None))]), Assign(targets=[Name(id='wap_info', ctx=Store())], value=Call(func=Attribute(value=Name(id='all_technologies', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='tech_name', ctx=Load()), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='categories', ctx=Store())], value=Call(func=Attribute(value=Name(id='wap_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='categories'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='confidence', ctx=Store())], value=Call(func=Attribute(value=Name(id='wap_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='confidence'), Constant(value=100)], keywords=[])), Assign(targets=[Name(id='tech_props', ctx=Store())], value=Dict(keys=[Constant(value='name'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='version'), Constant(value='categories'), Constant(value='confidence'), Constant(value='detected_by')], values=[Name(id='tech_name', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Name(id='tech_version', ctx=Load()), Name(id='categories', ctx=Load()), Name(id='confidence', ctx=Load()), Constant(value='httpx')])), Assign(targets=[Name(id='tech_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='tech_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), If(test=Name(id='tech_version', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MERGE (t:Technology {name: $name, version: $version, user_id: $user_id, project_id: $project_id})\\n                                    SET t += $props,\\n                                        t.updated_at = datetime()\\n                                    ')], keywords=[keyword(arg='name', value=Name(id='tech_name', ctx=Load())), keyword(arg='version', value=Name(id='tech_version', ctx=Load())), keyword(arg='props', value=Name(id='tech_props', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), Expr(value=Call(func=Attribute(value=Name(id='processed_techs', ctx=Load()), attr='add', ctx=Load()), args=[Tuple(elts=[Name(id='tech_name', ctx=Load()), Name(id='tech_version', ctx=Load())], ctx=Load())], keywords=[]))], orelse=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                    MERGE (t:Technology {name: $name, version: '', user_id: $user_id, project_id: $project_id})\\n                                    ON CREATE SET t += $props, t.updated_at = datetime()\\n                                    ON MATCH SET t.updated_at = datetime()\\n                                    \")], keywords=[keyword(arg='name', value=Name(id='tech_name', ctx=Load())), keyword(arg='props', value=Name(id='tech_props', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), Expr(value=Call(func=Attribute(value=Name(id='processed_techs', ctx=Load()), attr='add', ctx=Load()), args=[Tuple(elts=[Name(id='tech_name', ctx=Load()), Constant(value=None)], ctx=Load())], keywords=[]))]), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='technologies_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='tech_version', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                    MATCH (u:BaseURL {url: $url, user_id: $user_id, project_id: $project_id})\\n                                    MATCH (t:Technology {name: $tech_name, version: $tech_version, user_id: $user_id, project_id: $project_id})\\n                                    MERGE (u)-[:USES_TECHNOLOGY {confidence: $confidence, detected_by: 'httpx'}]->(t)\\n                                    \")], keywords=[keyword(arg='url', value=Name(id='url', ctx=Load())), keyword(arg='tech_name', value=Name(id='tech_name', ctx=Load())), keyword(arg='tech_version', value=Name(id='tech_version', ctx=Load())), keyword(arg='confidence', value=Name(id='confidence', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))]))], orelse=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                    MATCH (u:BaseURL {url: $url, user_id: $user_id, project_id: $project_id})\\n                                    MATCH (t:Technology {name: $tech_name, version: '', user_id: $user_id, project_id: $project_id})\\n                                    MERGE (u)-[:USES_TECHNOLOGY {confidence: $confidence, detected_by: 'httpx'}]->(t)\\n                                    \")], keywords=[keyword(arg='url', value=Name(id='url', ctx=Load())), keyword(arg='tech_name', value=Name(id='tech_name', ctx=Load())), keyword(arg='confidence', value=Name(id='confidence', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))]))]), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Technology '), FormattedValue(value=Name(id='tech_str', ctx=Load()), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='wappalyzer_by_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='wappalyzer', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='by_url'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='wap_techs_for_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='wappalyzer_by_url', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='url', ctx=Load()), List(elts=[], ctx=Load())], keywords=[])), For(target=Name(id='wap_tech', ctx=Store()), iter=Name(id='wap_techs_for_url', ctx=Load()), body=[Try(body=[Assign(targets=[Name(id='tech_name', ctx=Store())], value=Call(func=Attribute(value=Name(id='wap_tech', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='tech_version', ctx=Store())], value=Call(func=Attribute(value=Name(id='wap_tech', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='version')], keywords=[])), If(test=Compare(left=Tuple(elts=[Name(id='tech_name', ctx=Load()), Name(id='tech_version', ctx=Load())], ctx=Load()), ops=[In()], comparators=[Name(id='processed_techs', ctx=Load())]), body=[Continue()], orelse=[]), If(test=Compare(left=Tuple(elts=[Name(id='tech_name', ctx=Load()), Constant(value=None)], ctx=Load()), ops=[In()], comparators=[Name(id='processed_techs', ctx=Load())]), body=[Continue()], orelse=[]), Assign(targets=[Name(id='categories', ctx=Store())], value=Call(func=Attribute(value=Name(id='wap_tech', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='categories'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='confidence', ctx=Store())], value=Call(func=Attribute(value=Name(id='wap_tech', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='confidence'), Constant(value=100)], keywords=[])), Assign(targets=[Name(id='tech_props', ctx=Store())], value=Dict(keys=[Constant(value='name'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='version'), Constant(value='categories'), Constant(value='confidence'), Constant(value='detected_by')], values=[Name(id='tech_name', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Name(id='tech_version', ctx=Load()), Name(id='categories', ctx=Load()), Name(id='confidence', ctx=Load()), Constant(value='wappalyzer')])), Assign(targets=[Name(id='tech_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='tech_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), If(test=Name(id='tech_version', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MERGE (t:Technology {name: $name, version: $version, user_id: $user_id, project_id: $project_id})\\n                                    SET t += $props,\\n                                        t.updated_at = datetime()\\n                                    ')], keywords=[keyword(arg='name', value=Name(id='tech_name', ctx=Load())), keyword(arg='version', value=Name(id='tech_version', ctx=Load())), keyword(arg='props', value=Name(id='tech_props', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))]))], orelse=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                    MERGE (t:Technology {name: $name, version: '', user_id: $user_id, project_id: $project_id})\\n                                    ON CREATE SET t += $props, t.updated_at = datetime()\\n                                    ON MATCH SET t.updated_at = datetime()\\n                                    \")], keywords=[keyword(arg='name', value=Name(id='tech_name', ctx=Load())), keyword(arg='props', value=Name(id='tech_props', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))]))]), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='technologies_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='tech_version', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                    MATCH (u:BaseURL {url: $url, user_id: $user_id, project_id: $project_id})\\n                                    MATCH (t:Technology {name: $tech_name, version: $tech_version, user_id: $user_id, project_id: $project_id})\\n                                    MERGE (u)-[:USES_TECHNOLOGY {confidence: $confidence, detected_by: 'wappalyzer'}]->(t)\\n                                    \")], keywords=[keyword(arg='url', value=Name(id='url', ctx=Load())), keyword(arg='tech_name', value=Name(id='tech_name', ctx=Load())), keyword(arg='tech_version', value=Name(id='tech_version', ctx=Load())), keyword(arg='confidence', value=Name(id='confidence', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))]))], orelse=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                    MATCH (u:BaseURL {url: $url, user_id: $user_id, project_id: $project_id})\\n                                    MATCH (t:Technology {name: $tech_name, version: '', user_id: $user_id, project_id: $project_id})\\n                                    MERGE (u)-[:USES_TECHNOLOGY {confidence: $confidence, detected_by: 'wappalyzer'}]->(t)\\n                                    \")], keywords=[keyword(arg='url', value=Name(id='url', ctx=Load())), keyword(arg='tech_name', value=Name(id='tech_name', ctx=Load())), keyword(arg='confidence', value=Name(id='confidence', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))]))]), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Wappalyzer technology '), FormattedValue(value=Name(id='tech_name', ctx=Load()), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='headers', ctx=Store())], value=Call(func=Attribute(value=Name(id='url_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='headers'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='security_headers', ctx=Store())], value=List(elts=[Constant(value='x-frame-options'), Constant(value='x-xss-protection'), Constant(value='content-security-policy'), Constant(value='strict-transport-security'), Constant(value='x-content-type-options')], ctx=Load())), Assign(targets=[Name(id='tech_revealing_headers', ctx=Store())], value=List(elts=[Constant(value='server'), Constant(value='x-powered-by'), Constant(value='x-aspnet-version')], ctx=Load())), For(target=Tuple(elts=[Name(id='header_name', ctx=Store()), Name(id='header_value', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='headers', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='is_security', ctx=Store())], value=Compare(left=Call(func=Attribute(value=Name(id='header_name', ctx=Load()), attr='lower', ctx=Load()), args=[], keywords=[]), ops=[In()], comparators=[Name(id='security_headers', ctx=Load())])), Assign(targets=[Name(id='reveals_tech', ctx=Store())], value=Compare(left=Call(func=Attribute(value=Name(id='header_name', ctx=Load()), attr='lower', ctx=Load()), args=[], keywords=[]), ops=[In()], comparators=[Name(id='tech_revealing_headers', ctx=Load())])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MERGE (h:Header {name: $name, value: $value, baseurl: $url, user_id: $user_id, project_id: $project_id})\\n                                SET h.user_id = $user_id,\\n                                    h.project_id = $project_id,\\n                                    h.is_security_header = $is_security,\\n                                    h.reveals_technology = $reveals_tech,\\n                                    h.updated_at = datetime()\\n                                ')], keywords=[keyword(arg='name', value=Name(id='header_name', ctx=Load())), keyword(arg='value', value=Call(func=Name(id='str', ctx=Load()), args=[Name(id='header_value', ctx=Load())], keywords=[])), keyword(arg='url', value=Name(id='url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='is_security', value=Name(id='is_security', ctx=Load())), keyword(arg='reveals_tech', value=Name(id='reveals_tech', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='headers_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (u:BaseURL {url: $url, user_id: $user_id, project_id: $project_id})\\n                                MATCH (h:Header {name: $name, value: $value, baseurl: $url, user_id: $user_id, project_id: $project_id})\\n                                MERGE (u)-[:HAS_HEADER]->(h)\\n                                ')], keywords=[keyword(arg='url', value=Name(id='url', ctx=Load())), keyword(arg='name', value=Name(id='header_name', ctx=Load())), keyword(arg='value', value=Call(func=Name(id='str', ctx=Load()), args=[Name(id='header_value', ctx=Load())], keywords=[])), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Header '), FormattedValue(value=Name(id='header_name', ctx=Load()), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='URL '), FormattedValue(value=Name(id='url', ctx=Load()), conversion=-1), Constant(value=' processing failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='metadata', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='metadata'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='root_domain', ctx=Store())], value=Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='root_domain'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='summary', ctx=Store())], value=Call(func=Attribute(value=Name(id='http_probe_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='summary'), Dict(keys=[], values=[])], keywords=[])), If(test=Name(id='root_domain', ctx=Load()), body=[Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MATCH (d:Domain {name: $root_domain, user_id: $user_id, project_id: $project_id})\\n                        SET d.http_probe_timestamp = $scan_timestamp,\\n                            d.http_probe_live_urls = $live_urls,\\n                            d.http_probe_technology_count = $tech_count,\\n                            d.updated_at = datetime()\\n                        ')], keywords=[keyword(arg='root_domain', value=Name(id='root_domain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='scan_timestamp', value=Call(func=Attribute(value=Name(id='scan_metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_timestamp')], keywords=[])), keyword(arg='live_urls', value=Call(func=Attribute(value=Name(id='summary', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='live_urls'), Constant(value=0)], keywords=[])), keyword(arg='tech_count', value=Call(func=Attribute(value=Name(id='summary', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='technology_count'), Constant(value=0)], keywords=[]))]))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Domain update failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='by_host', ctx=Store())], value=Call(func=Attribute(value=Name(id='http_probe_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='by_host'), Dict(keys=[], values=[])], keywords=[])), For(target=Tuple(elts=[Name(id='hostname', ctx=Store()), Name(id='host_info', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='by_host', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='status_codes', ctx=Store())], value=Call(func=Attribute(value=Name(id='host_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='status_codes'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='live_urls', ctx=Store())], value=Call(func=Attribute(value=Name(id='host_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='live_urls'), List(elts=[], ctx=Load())], keywords=[])), If(test=Name(id='status_codes', ctx=Load()), body=[Assign(targets=[Name(id='non_error', ctx=Store())], value=ListComp(elt=Name(id='c', ctx=Load()), generators=[comprehension(target=Name(id='c', ctx=Store()), iter=Name(id='status_codes', ctx=Load()), ifs=[Compare(left=Name(id='c', ctx=Load()), ops=[Lt()], comparators=[Constant(value=500)])], is_async=0)])), Assign(targets=[Name(id='primary', ctx=Store())], value=IfExp(test=Name(id='non_error', ctx=Load()), body=Call(func=Name(id='min', ctx=Load()), args=[Name(id='non_error', ctx=Load())], keywords=[]), orelse=Call(func=Name(id='min', ctx=Load()), args=[Name(id='status_codes', ctx=Load())], keywords=[]))), Assign(targets=[Name(id='http_status', ctx=Store())], value=Call(func=Name(id='str', ctx=Load()), args=[Name(id='primary', ctx=Load())], keywords=[]))], orelse=[Assign(targets=[Name(id='http_status', ctx=Store())], value=Constant(value='no_http'))]), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MATCH (s:Subdomain {name: $hostname, user_id: $user_id, project_id: $project_id})\\n                        SET s.status = $status,\\n                            s.status_codes = $status_codes,\\n                            s.http_live_url_count = $live_count,\\n                            s.http_probed_at = datetime(),\\n                            s.updated_at = datetime()\\n                        ')], keywords=[keyword(arg='hostname', value=Name(id='hostname', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='status', value=Name(id='http_status', ctx=Load())), keyword(arg='status_codes', value=Name(id='status_codes', ctx=Load())), keyword(arg='live_count', value=Call(func=Name(id='len', ctx=Load()), args=[Name(id='live_urls', ctx=Load())], keywords=[]))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_updated'), ctx=Store()), op=Add(), value=Constant(value=1))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Subdomain status update for '), FormattedValue(value=Name(id='hostname', ctx=Load()), conversion=-1), Constant(value=': '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='all_probed_hosts', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[Call(func=Attribute(value=Name(id='by_host', ctx=Load()), attr='keys', ctx=Load()), args=[], keywords=[])], keywords=[])), Assign(targets=[Name(id='all_target_subs', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomains'), List(elts=[], ctx=Load())], keywords=[])], keywords=[])), Assign(targets=[Name(id='no_response_hosts', ctx=Store())], value=BinOp(left=Name(id='all_target_subs', ctx=Load()), op=Sub(), right=Name(id='all_probed_hosts', ctx=Load()))), If(test=Name(id='no_response_hosts', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                    UNWIND $hosts AS hostname\\n                    MATCH (s:Subdomain {name: hostname, user_id: $user_id, project_id: $project_id})\\n                    WHERE s.status = 'resolved'\\n                    SET s.status = 'no_http',\\n                        s.http_probed_at = datetime(),\\n                        s.updated_at = datetime()\\n                    \")], keywords=[keyword(arg='hosts', value=Call(func=Name(id='list', ctx=Load()), args=[Name(id='no_response_hosts', ctx=Load())], keywords=[])), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))]))], orelse=[]), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='baseurls_created'), ctx=Load()), conversion=-1), Constant(value=' BaseURL nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created/Updated '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='services_created'), ctx=Load()), conversion=-1), Constant(value=' Service nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='technologies_created'), ctx=Load()), conversion=-1), Constant(value=' Technology nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='headers_created'), ctx=Load()), conversion=-1), Constant(value=' Header nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Load()), conversion=-1), Constant(value=' relationships')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Updated '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_updated'), ctx=Load()), conversion=-1), Constant(value=' Subdomain statuses')])], keywords=[])), If(test=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] '), FormattedValue(value=Call(func=Name(id='len', ctx=Load()), args=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load())], keywords=[]), conversion=-1), Constant(value=' errors occurred')])], keywords=[]))], orelse=[])]), Return(value=Name(id='stats', ctx=Load()))], decorator_list=[], returns=Name(id='dict', ctx=Load()), type_params=[])",
  "update_graph_from_ip_recon": "FunctionDef(name='update_graph_from_ip_recon', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='recon_data', annotation=Name(id='dict', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='\\n        Initialize the Neo4j graph for IP-based reconnaissance.\\n\\n        Creates:\\n        - Mock Domain node (ip-targets.{project_id}) with ip_mode: True\\n        - Subdomain nodes (real hostnames from PTR or mock IP-based names)\\n        - IP nodes and RESOLVES_TO relationships\\n        - BELONGS_TO relationships from subdomains to mock domain\\n        - Per-IP WHOIS data on IP nodes\\n        ')), Assign(targets=[Name(id='stats', ctx=Store())], value=Dict(keys=[Constant(value='domain_created'), Constant(value='subdomains_created'), Constant(value='ips_created'), Constant(value='relationships_created'), Constant(value='errors')], values=[Constant(value=False), Constant(value=0), Constant(value=0), Constant(value=0), List(elts=[], ctx=Load())])), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[Assign(targets=[Name(id='metadata', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='metadata'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='whois_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='whois'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='subdomains', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomains'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='dns_data', ctx=Store())], value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='dns')], keywords=[]), Dict(keys=[], values=[])])), Assign(targets=[Name(id='ip_to_hostname', ctx=Store())], value=Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ip_to_hostname'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='ip_whois', ctx=Store())], value=Call(func=Attribute(value=Name(id='whois_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ip_whois'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='mock_domain', ctx=Store())], value=Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='root_domain'), JoinedStr(values=[Constant(value='ip-targets.'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1)])], keywords=[])), Try(body=[Assign(targets=[Name(id='domain_props', ctx=Store())], value=Dict(keys=[Constant(value='name'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='ip_mode'), Constant(value='is_mock'), Constant(value='scan_timestamp'), Constant(value='scan_type'), Constant(value='target_ips'), Constant(value='expanded_ips'), Constant(value='modules_executed'), Constant(value='updated_at')], values=[Name(id='mock_domain', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Constant(value=True), Constant(value=True), Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_timestamp')], keywords=[]), Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_type')], keywords=[]), Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='target_ips'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='expanded_ips'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='modules_executed'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Call(func=Attribute(value=Name(id='datetime', ctx=Load()), attr='now', ctx=Load()), args=[], keywords=[]), attr='isoformat', ctx=Load()), args=[], keywords=[])])), Assign(targets=[Name(id='domain_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='domain_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                    MERGE (d:Domain {name: $name, user_id: $user_id, project_id: $project_id})\\n                    SET d += $props\\n                    ')], keywords=[keyword(arg='name', value=Name(id='mock_domain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='props', value=Name(id='domain_props', ctx=Load()))])), Assign(targets=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='domain_created'), ctx=Store())], value=Constant(value=True)), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created mock Domain node: '), FormattedValue(value=Name(id='mock_domain', ctx=Load()), conversion=-1)])], keywords=[]))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Domain creation failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] Domain creation failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[]), Assign(targets=[Name(id='subdomains_dns', ctx=Store())], value=Call(func=Attribute(value=Name(id='dns_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomains'), Dict(keys=[], values=[])], keywords=[])), For(target=Name(id='subdomain_name', ctx=Store()), iter=Name(id='subdomains', ctx=Load()), body=[Try(body=[Assign(targets=[Name(id='sub_dns', ctx=Store())], value=Call(func=Attribute(value=Name(id='subdomains_dns', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='subdomain_name', ctx=Load()), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='is_mock', ctx=Store())], value=Call(func=Attribute(value=Name(id='sub_dns', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='is_mock'), Constant(value=False)], keywords=[])), Assign(targets=[Name(id='actual_ip', ctx=Store())], value=Call(func=Attribute(value=Name(id='sub_dns', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='actual_ip'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='sub_props', ctx=Store())], value=Dict(keys=[Constant(value='name'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='has_records'), Constant(value='is_mock'), Constant(value='ip_mode'), Constant(value='updated_at')], values=[Name(id='subdomain_name', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Call(func=Attribute(value=Name(id='sub_dns', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='has_records'), Constant(value=False)], keywords=[]), Name(id='is_mock', ctx=Load()), Constant(value=True), Call(func=Attribute(value=Call(func=Attribute(value=Name(id='datetime', ctx=Load()), attr='now', ctx=Load()), args=[], keywords=[]), attr='isoformat', ctx=Load()), args=[], keywords=[])])), If(test=Name(id='actual_ip', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='sub_props', ctx=Load()), slice=Constant(value='actual_ip'), ctx=Store())], value=Name(id='actual_ip', ctx=Load()))], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                        MERGE (s:Subdomain {name: $name, user_id: $user_id, project_id: $project_id})\\n                        ON CREATE SET s += $props, s.status = 'resolved'\\n                        ON MATCH SET s += $props\\n                        WITH s\\n                        WHERE s.status IS NULL\\n                        SET s.status = 'resolved'\\n                        \")], keywords=[keyword(arg='name', value=Name(id='subdomain_name', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='props', value=Name(id='sub_props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MATCH (s:Subdomain {name: $sub, user_id: $uid, project_id: $pid})\\n                        MATCH (d:Domain {name: $domain, user_id: $uid, project_id: $pid})\\n                        MERGE (s)-[:BELONGS_TO]->(d)\\n                        MERGE (d)-[:HAS_SUBDOMAIN]->(s)\\n                        ')], keywords=[keyword(arg='sub', value=Name(id='subdomain_name', ctx=Load())), keyword(arg='domain', value=Name(id='mock_domain', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='ips', ctx=Store())], value=Call(func=Attribute(value=Name(id='sub_dns', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ips'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='all_ips', ctx=Store())], value=BinOp(left=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='ips', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ipv4'), List(elts=[], ctx=Load())], keywords=[]), List(elts=[], ctx=Load())]), op=Add(), right=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='ips', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ipv6'), List(elts=[], ctx=Load())], keywords=[]), List(elts=[], ctx=Load())]))), For(target=Name(id='ip', ctx=Store()), iter=Name(id='all_ips', ctx=Load()), body=[Assign(targets=[Name(id='whois_info', ctx=Store())], value=Call(func=Attribute(value=Name(id='ip_whois', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='ip', ctx=Load()), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='ip_props', ctx=Store())], value=Dict(keys=[Constant(value='address'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='version'), Constant(value='ip_mode'), Constant(value='updated_at')], values=[Name(id='ip', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), IfExp(test=Compare(left=Constant(value=':'), ops=[In()], comparators=[Name(id='ip', ctx=Load())]), body=Constant(value='v6'), orelse=Constant(value='v4')), Constant(value=True), Call(func=Attribute(value=Call(func=Attribute(value=Name(id='datetime', ctx=Load()), attr='now', ctx=Load()), args=[], keywords=[]), attr='isoformat', ctx=Load()), args=[], keywords=[])])), If(test=Name(id='whois_info', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='ip_props', ctx=Load()), slice=Constant(value='organization'), ctx=Store())], value=Call(func=Attribute(value=Name(id='whois_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='org'), Constant(value='')], keywords=[])), Assign(targets=[Subscript(value=Name(id='ip_props', ctx=Load()), slice=Constant(value='country'), ctx=Store())], value=Call(func=Attribute(value=Name(id='whois_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='country'), Constant(value='')], keywords=[]))], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MERGE (i:IP {address: $addr, user_id: $uid, project_id: $pid})\\n                            SET i += $props\\n                            ')], keywords=[keyword(arg='addr', value=Name(id='ip', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load())), keyword(arg='props', value=Name(id='ip_props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ips_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (s:Subdomain {name: $sub, user_id: $uid, project_id: $pid})\\n                            MATCH (i:IP {address: $ip, user_id: $uid, project_id: $pid})\\n                            MERGE (s)-[:RESOLVES_TO]->(i)\\n                            ')], keywords=[keyword(arg='sub', value=Name(id='subdomain_name', ctx=Load())), keyword(arg='ip', value=Name(id='ip', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Subdomain '), FormattedValue(value=Name(id='subdomain_name', ctx=Load()), conversion=-1), Constant(value=': '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] Error processing '), FormattedValue(value=Name(id='subdomain_name', ctx=Load()), conversion=-1), Constant(value=': '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] IP Recon graph update complete:')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_created'), ctx=Load()), conversion=-1), Constant(value=' Subdomain nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ips_created'), ctx=Load()), conversion=-1), Constant(value=' IP nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Load()), conversion=-1), Constant(value=' relationships')])], keywords=[])), If(test=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] '), FormattedValue(value=Call(func=Name(id='len', ctx=Load()), args=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load())], keywords=[]), conversion=-1), Constant(value=' errors occurred')])], keywords=[]))], orelse=[])]), Return(value=Name(id='stats', ctx=Load()))], decorator_list=[], returns=Name(id='dict', ctx=Load()), type_params=[])",
  "update_graph_from_js_recon": "FunctionDef(name='update_graph_from_js_recon', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='recon_data', annotation=Name(id='dict', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value=\"\\n        Ingest JS Recon Scanner results into the graph.\\n\\n        Graph structure:\\n        - Domain/BaseURL -[:HAS_JS_FILE]-> JsReconFinding(finding_type='js_file')\\n        - JsReconFinding(js_file) -[:HAS_JS_FINDING]-> JsReconFinding (findings)\\n        - JsReconFinding(js_file) -[:HAS_SECRET]-> Secret\\n        - JsReconFinding(js_file) -[:HAS_ENDPOINT]-> Endpoint\\n\\n        Each analyzed JS file becomes a JsReconFinding node with finding_type='js_file'.\\n        All findings discovered in that file are linked to the file node, not directly\\n        to Domain/BaseURL.\\n        \")), Assign(targets=[Name(id='js_recon_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='js_recon'), Dict(keys=[], values=[])], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='js_recon_data', ctx=Load())), body=[Return(value=Dict(keys=[Constant(value='status'), Constant(value='reason')], values=[Constant(value='skipped'), Constant(value='no js_recon data')]))], orelse=[]), Assign(targets=[Name(id='stats', ctx=Store())], value=Dict(keys=[Constant(value='file_nodes_created'), Constant(value='findings_created'), Constant(value='secrets_created'), Constant(value='endpoints_created'), Constant(value='relationships_created'), Constant(value='errors')], values=[Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), List(elts=[], ctx=Load())])), Assign(targets=[Name(id='scan_ts', ctx=Store())], value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_metadata'), Dict(keys=[], values=[])], keywords=[]), attr='get', ctx=Load()), args=[Constant(value='scan_timestamp'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='domain_name', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='domain'), Constant(value='')], keywords=[])), FunctionDef(name='_is_uploaded', args=arguments(posonlyargs=[], args=[arg(arg='source_url', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Return(value=Call(func=Attribute(value=Name(id='source_url', ctx=Load()), attr='startswith', ctx=Load()), args=[Constant(value='upload://')], keywords=[]))], decorator_list=[], returns=Name(id='bool', ctx=Load()), type_params=[]), FunctionDef(name='_derive_base_url', args=arguments(posonlyargs=[], args=[arg(arg='source_url', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[If(test=BoolOp(op=Or(), values=[UnaryOp(op=Not(), operand=Name(id='source_url', ctx=Load())), Call(func=Name(id='_is_uploaded', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])]), body=[Return(value=Constant(value=''))], orelse=[]), Try(body=[Assign(targets=[Name(id='parsed', ctx=Store())], value=Call(func=Name(id='urlparse', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])), If(test=Attribute(value=Name(id='parsed', ctx=Load()), attr='netloc', ctx=Load()), body=[Return(value=JoinedStr(values=[FormattedValue(value=Attribute(value=Name(id='parsed', ctx=Load()), attr='scheme', ctx=Load()), conversion=-1), Constant(value='://'), FormattedValue(value=Attribute(value=Name(id='parsed', ctx=Load()), attr='netloc', ctx=Load()), conversion=-1)]))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), body=[Pass()])], orelse=[], finalbody=[]), Return(value=Constant(value=''))], decorator_list=[], returns=Name(id='str', ctx=Load()), type_params=[]), FunctionDef(name='_filename_from_url', args=arguments(posonlyargs=[], args=[arg(arg='url', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[If(test=Call(func=Name(id='_is_uploaded', ctx=Load()), args=[Name(id='url', ctx=Load())], keywords=[]), body=[Return(value=Call(func=Attribute(value=Name(id='url', ctx=Load()), attr='replace', ctx=Load()), args=[Constant(value='upload://'), Constant(value='')], keywords=[]))], orelse=[]), Try(body=[Return(value=BoolOp(op=Or(), values=[Subscript(value=Call(func=Attribute(value=Attribute(value=Call(func=Name(id='urlparse', ctx=Load()), args=[Name(id='url', ctx=Load())], keywords=[]), attr='path', ctx=Load()), attr='split', ctx=Load()), args=[Constant(value='/')], keywords=[]), slice=UnaryOp(op=USub(), operand=Constant(value=1)), ctx=Load()), Name(id='url', ctx=Load())]))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), body=[Return(value=Name(id='url', ctx=Load()))])], orelse=[], finalbody=[])], decorator_list=[], returns=Name(id='str', ctx=Load()), type_params=[]), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[Assign(targets=[Name(id='all_source_urls', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), For(target=Name(id='data_key', ctx=Store()), iter=Tuple(elts=[Constant(value='dependencies'), Constant(value='source_maps'), Constant(value='dom_sinks'), Constant(value='dev_comments'), Constant(value='emails'), Constant(value='ip_addresses'), Constant(value='object_references'), Constant(value='cloud_assets')], ctx=Load()), body=[For(target=Name(id='f', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='data_key', ctx=Load()), List(elts=[], ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='url', ctx=Store())], value=Call(func=Attribute(value=Name(id='f', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_url'), Call(func=Attribute(value=Name(id='f', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='js_url'), Constant(value='')], keywords=[])], keywords=[])), If(test=Name(id='url', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='all_source_urls', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='url', ctx=Load())], keywords=[]))], orelse=[])], orelse=[])], orelse=[]), For(target=Name(id='f', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='frameworks'), List(elts=[], ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='url', ctx=Store())], value=Call(func=Attribute(value=Name(id='f', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_url'), Constant(value='')], keywords=[])), If(test=Name(id='url', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='all_source_urls', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='url', ctx=Load())], keywords=[]))], orelse=[])], orelse=[]), For(target=Name(id='s', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='secrets'), List(elts=[], ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='url', ctx=Store())], value=Call(func=Attribute(value=Name(id='s', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_url'), Constant(value='')], keywords=[])), If(test=Name(id='url', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='all_source_urls', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='url', ctx=Load())], keywords=[]))], orelse=[])], orelse=[]), For(target=Name(id='ep', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='endpoints'), List(elts=[], ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='url', ctx=Store())], value=Call(func=Attribute(value=Name(id='ep', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_js'), Constant(value='')], keywords=[])), If(test=Name(id='url', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='all_source_urls', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='url', ctx=Load())], keywords=[]))], orelse=[])], orelse=[]), Assign(targets=[Name(id='file_node_ids', ctx=Store())], value=Dict(keys=[], values=[])), For(target=Name(id='source_url', ctx=Store()), iter=Name(id='all_source_urls', ctx=Load()), body=[Try(body=[Assign(targets=[Name(id='url_hash', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='hashlib', ctx=Load()), attr='sha256', ctx=Load()), args=[Call(func=Attribute(value=Name(id='source_url', ctx=Load()), attr='encode', ctx=Load()), args=[], keywords=[])], keywords=[]), attr='hexdigest', ctx=Load()), args=[], keywords=[]), slice=Slice(upper=Constant(value=16)), ctx=Load())), Assign(targets=[Name(id='file_node_id', ctx=Store())], value=JoinedStr(values=[Constant(value='jsrf-'), FormattedValue(value=Name(id='user_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1), Constant(value='-file-'), FormattedValue(value=Name(id='url_hash', ctx=Load()), conversion=-1)])), Assign(targets=[Name(id='base_url', ctx=Store())], value=Call(func=Name(id='_derive_base_url', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='filename', ctx=Store())], value=Call(func=Name(id='_filename_from_url', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='finding_type'), Constant(value='severity'), Constant(value='confidence'), Constant(value='title'), Constant(value='detail'), Constant(value='evidence'), Constant(value='source_url'), Constant(value='base_url'), Constant(value='source'), Constant(value='is_uploaded'), Constant(value='discovered_at')], values=[Name(id='file_node_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Constant(value='js_file'), Constant(value='info'), Constant(value='high'), Name(id='filename', ctx=Load()), Name(id='source_url', ctx=Load()), Constant(value=''), Name(id='source_url', ctx=Load()), BoolOp(op=Or(), values=[Name(id='base_url', ctx=Load()), Constant(value='upload')]), Constant(value='js_recon'), Call(func=Name(id='_is_uploaded', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[]), Name(id='scan_ts', ctx=Load())])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='MERGE (jf:JsReconFinding {id: $id}) SET jf += $props, jf.updated_at = datetime()')], keywords=[keyword(arg='id', value=Name(id='file_node_id', ctx=Load())), keyword(arg='props', value=Name(id='props', ctx=Load()))])), Assign(targets=[Subscript(value=Name(id='file_node_ids', ctx=Load()), slice=Name(id='source_url', ctx=Load()), ctx=Store())], value=Name(id='file_node_id', ctx=Load())), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='file_nodes_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='base_url', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (bu:BaseURL {url: $base_url, user_id: $uid, project_id: $pid})\\n                            MATCH (jf:JsReconFinding {id: $fid})\\n                            MERGE (bu)-[:HAS_JS_FILE]->(jf)\\n                            ')], keywords=[keyword(arg='base_url', value=Name(id='base_url', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load())), keyword(arg='fid', value=Name(id='file_node_id', ctx=Load()))]))], orelse=[If(test=Name(id='domain_name', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (d:Domain {name: $dname, user_id: $uid, project_id: $pid})\\n                                MATCH (jf:JsReconFinding {id: $fid})\\n                                MERGE (d)-[:HAS_JS_FILE]->(jf)\\n                                ')], keywords=[keyword(arg='dname', value=Name(id='domain_name', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load())), keyword(arg='fid', value=Name(id='file_node_id', ctx=Load()))]))], orelse=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (d:Domain {user_id: $uid, project_id: $pid})\\n                                WITH d LIMIT 1\\n                                MATCH (jf:JsReconFinding {id: $fid})\\n                                MERGE (d)-[:HAS_JS_FILE]->(jf)\\n                                ')], keywords=[keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load())), keyword(arg='fid', value=Name(id='file_node_id', ctx=Load()))]))])]), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='JS file node creation failed ('), FormattedValue(value=Name(id='source_url', ctx=Load()), conversion=-1), Constant(value='): '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), FunctionDef(name='_link_to_file', args=arguments(posonlyargs=[], args=[arg(arg='session'), arg(arg='node_id', annotation=Name(id='str', ctx=Load())), arg(arg='node_label', annotation=Name(id='str', ctx=Load())), arg(arg='rel_type', annotation=Name(id='str', ctx=Load())), arg(arg='source_url', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='Link a finding/secret/endpoint to its parent JS file node.')), Assign(targets=[Name(id='file_node_id', ctx=Store())], value=Call(func=Attribute(value=Name(id='file_node_ids', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='file_node_id', ctx=Load())), body=[Return(value=Constant(value=False))], orelse=[]), If(test=Compare(left=Name(id='node_label', ctx=Load()), ops=[NotIn()], comparators=[Tuple(elts=[Constant(value='JsReconFinding'), Constant(value='Secret'), Constant(value='Endpoint')], ctx=Load())]), body=[Return(value=Constant(value=False))], orelse=[]), If(test=Compare(left=Name(id='rel_type', ctx=Load()), ops=[NotIn()], comparators=[Tuple(elts=[Constant(value='HAS_JS_FINDING'), Constant(value='HAS_SECRET'), Constant(value='HAS_ENDPOINT')], ctx=Load())]), body=[Return(value=Constant(value=False))], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[JoinedStr(values=[Constant(value=\"\\n                    MATCH (file:JsReconFinding {id: $fid, finding_type: 'js_file'})\\n                    MATCH (n:\"), FormattedValue(value=Name(id='node_label', ctx=Load()), conversion=-1), Constant(value=' {id: $nid})\\n                    MERGE (file)-[:'), FormattedValue(value=Name(id='rel_type', ctx=Load()), conversion=-1), Constant(value=']->(n)\\n                    ')])], keywords=[keyword(arg='fid', value=Name(id='file_node_id', ctx=Load())), keyword(arg='nid', value=Name(id='node_id', ctx=Load()))])), Return(value=Constant(value=True))], decorator_list=[], returns=Name(id='bool', ctx=Load()), type_params=[]), Assign(targets=[Name(id='finding_types', ctx=Store())], value=List(elts=[Tuple(elts=[Constant(value='dependencies'), Constant(value='dependency_confusion')], ctx=Load()), Tuple(elts=[Constant(value='source_maps'), Constant(value='source_map_exposure')], ctx=Load()), Tuple(elts=[Constant(value='dom_sinks'), Constant(value='dom_sink')], ctx=Load()), Tuple(elts=[Constant(value='dev_comments'), Constant(value='dev_comment')], ctx=Load())], ctx=Load())), For(target=Tuple(elts=[Name(id='data_key', ctx=Store()), Name(id='finding_type', ctx=Store())], ctx=Store()), iter=Name(id='finding_types', ctx=Load()), body=[For(target=Name(id='finding', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='data_key', ctx=Load()), List(elts=[], ctx=Load())], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='finding_id', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='id')], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='finding_id', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='node_id', ctx=Store())], value=JoinedStr(values=[Constant(value='jsrf-'), FormattedValue(value=Name(id='user_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='finding_id', ctx=Load()), conversion=-1)])), Assign(targets=[Name(id='source_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_url'), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='js_url'), Constant(value='')], keywords=[])], keywords=[])), Assign(targets=[Name(id='base_url', ctx=Store())], value=Call(func=Name(id='_derive_base_url', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='finding_type'), Constant(value='severity'), Constant(value='confidence'), Constant(value='title'), Constant(value='detail'), Constant(value='evidence'), Constant(value='source_url'), Constant(value='base_url'), Constant(value='source'), Constant(value='discovered_at')], values=[Name(id='node_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='finding_type'), Name(id='finding_type', ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='severity'), Constant(value='info')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='confidence'), Constant(value='medium')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='title'), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='type'), Name(id='finding_type', ctx=Load())], keywords=[])], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='detail'), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='content'), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='description'), Constant(value='')], keywords=[])], keywords=[])], keywords=[]), Subscript(value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='evidence'), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='pattern'), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='content'), Constant(value='')], keywords=[])], keywords=[])], keywords=[]), slice=Slice(upper=Constant(value=500)), ctx=Load()), Name(id='source_url', ctx=Load()), BoolOp(op=Or(), values=[Name(id='base_url', ctx=Load()), Constant(value='upload')]), Constant(value='js_recon'), Name(id='scan_ts', ctx=Load())])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='MERGE (jf:JsReconFinding {id: $id}) SET jf += $props, jf.updated_at = datetime()')], keywords=[keyword(arg='id', value=Name(id='node_id', ctx=Load())), keyword(arg='props', value=Name(id='props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='findings_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Call(func=Name(id='_link_to_file', ctx=Load()), args=[Name(id='session', ctx=Load()), Name(id='node_id', ctx=Load()), Constant(value='JsReconFinding'), Constant(value='HAS_JS_FINDING'), Name(id='source_url', ctx=Load())], keywords=[]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='JsReconFinding creation failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], orelse=[]), For(target=Name(id='fw', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='frameworks'), List(elts=[], ctx=Load())], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='fw_id', ctx=Store())], value=Call(func=Attribute(value=Name(id='fw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='id')], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='fw_id', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='node_id', ctx=Store())], value=JoinedStr(values=[Constant(value='jsrf-'), FormattedValue(value=Name(id='user_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='fw_id', ctx=Load()), conversion=-1)])), Assign(targets=[Name(id='source_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='fw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_url'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='base_url', ctx=Store())], value=Call(func=Name(id='_derive_base_url', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='version_str', ctx=Store())], value=IfExp(test=Call(func=Attribute(value=Name(id='fw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='version')], keywords=[]), body=JoinedStr(values=[Constant(value=' '), FormattedValue(value=Subscript(value=Name(id='fw', ctx=Load()), slice=Constant(value='version'), ctx=Load()), conversion=-1)]), orelse=Constant(value=''))), Assign(targets=[Name(id='props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='finding_type'), Constant(value='severity'), Constant(value='confidence'), Constant(value='title'), Constant(value='detail'), Constant(value='evidence'), Constant(value='source_url'), Constant(value='base_url'), Constant(value='source'), Constant(value='discovered_at')], values=[Name(id='node_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Constant(value='framework'), Constant(value='info'), Call(func=Attribute(value=Name(id='fw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='confidence'), Constant(value='medium')], keywords=[]), JoinedStr(values=[FormattedValue(value=Subscript(value=Name(id='fw', ctx=Load()), slice=Constant(value='name'), ctx=Load()), conversion=-1), FormattedValue(value=Name(id='version_str', ctx=Load()), conversion=-1)]), JoinedStr(values=[Constant(value='Framework detected: '), FormattedValue(value=Subscript(value=Name(id='fw', ctx=Load()), slice=Constant(value='name'), ctx=Load()), conversion=-1), FormattedValue(value=Name(id='version_str', ctx=Load()), conversion=-1)]), Call(func=Attribute(value=Name(id='fw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name'), Constant(value='')], keywords=[]), Name(id='source_url', ctx=Load()), BoolOp(op=Or(), values=[Name(id='base_url', ctx=Load()), Constant(value='upload')]), Constant(value='js_recon'), Name(id='scan_ts', ctx=Load())])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='MERGE (jf:JsReconFinding {id: $id}) SET jf += $props, jf.updated_at = datetime()')], keywords=[keyword(arg='id', value=Name(id='node_id', ctx=Load())), keyword(arg='props', value=Name(id='props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='findings_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Call(func=Name(id='_link_to_file', ctx=Load()), args=[Name(id='session', ctx=Load()), Name(id='node_id', ctx=Load()), Constant(value='JsReconFinding'), Constant(value='HAS_JS_FINDING'), Name(id='source_url', ctx=Load())], keywords=[]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Framework finding failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='created_emails', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), For(target=Name(id='email', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='emails'), List(elts=[], ctx=Load())], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='email_addr', ctx=Store())], value=Call(func=Attribute(value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='email', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='email')], keywords=[]), Constant(value='')]), attr='strip', ctx=Load()), args=[], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='email_addr', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='source_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='email', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_url'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='base_url', ctx=Store())], value=Call(func=Name(id='_derive_base_url', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='id_hash', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='hashlib', ctx=Load()), attr='sha256', ctx=Load()), args=[Call(func=Attribute(value=JoinedStr(values=[FormattedValue(value=Name(id='email_addr', ctx=Load()), conversion=-1), Constant(value=':'), FormattedValue(value=Name(id='source_url', ctx=Load()), conversion=-1)]), attr='encode', ctx=Load()), args=[], keywords=[])], keywords=[]), attr='hexdigest', ctx=Load()), args=[], keywords=[]), slice=Slice(upper=Constant(value=16)), ctx=Load())), Assign(targets=[Name(id='node_id', ctx=Store())], value=JoinedStr(values=[Constant(value='jsrf-'), FormattedValue(value=Name(id='user_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1), Constant(value='-email-'), FormattedValue(value=Name(id='id_hash', ctx=Load()), conversion=-1)])), If(test=Compare(left=Name(id='node_id', ctx=Load()), ops=[In()], comparators=[Name(id='created_emails', ctx=Load())]), body=[Continue()], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='created_emails', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='node_id', ctx=Load())], keywords=[])), Assign(targets=[Name(id='props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='finding_type'), Constant(value='severity'), Constant(value='confidence'), Constant(value='title'), Constant(value='detail'), Constant(value='evidence'), Constant(value='source_url'), Constant(value='base_url'), Constant(value='source'), Constant(value='discovered_at')], values=[Name(id='node_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Constant(value='email'), Constant(value='info'), Constant(value='high'), Name(id='email_addr', ctx=Load()), Subscript(value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='email', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='context')], keywords=[]), Constant(value='')]), slice=Slice(upper=Constant(value=500)), ctx=Load()), Name(id='email_addr', ctx=Load()), Name(id='source_url', ctx=Load()), BoolOp(op=Or(), values=[Name(id='base_url', ctx=Load()), Constant(value='upload')]), Constant(value='js_recon'), Name(id='scan_ts', ctx=Load())])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='MERGE (jf:JsReconFinding {id: $id}) SET jf += $props, jf.updated_at = datetime()')], keywords=[keyword(arg='id', value=Name(id='node_id', ctx=Load())), keyword(arg='props', value=Name(id='props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='findings_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Call(func=Name(id='_link_to_file', ctx=Load()), args=[Name(id='session', ctx=Load()), Name(id='node_id', ctx=Load()), Constant(value='JsReconFinding'), Constant(value='HAS_JS_FINDING'), Name(id='source_url', ctx=Load())], keywords=[]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Email finding failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='created_ips', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), For(target=Name(id='ip_entry', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ip_addresses'), List(elts=[], ctx=Load())], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='ip_addr', ctx=Store())], value=Call(func=Attribute(value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='ip_entry', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ip')], keywords=[]), Constant(value='')]), attr='strip', ctx=Load()), args=[], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='ip_addr', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='source_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='ip_entry', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_url'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='base_url', ctx=Store())], value=Call(func=Name(id='_derive_base_url', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='id_hash', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='hashlib', ctx=Load()), attr='sha256', ctx=Load()), args=[Call(func=Attribute(value=JoinedStr(values=[FormattedValue(value=Name(id='ip_addr', ctx=Load()), conversion=-1), Constant(value=':'), FormattedValue(value=Name(id='source_url', ctx=Load()), conversion=-1)]), attr='encode', ctx=Load()), args=[], keywords=[])], keywords=[]), attr='hexdigest', ctx=Load()), args=[], keywords=[]), slice=Slice(upper=Constant(value=16)), ctx=Load())), Assign(targets=[Name(id='node_id', ctx=Store())], value=JoinedStr(values=[Constant(value='jsrf-'), FormattedValue(value=Name(id='user_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1), Constant(value='-ip-'), FormattedValue(value=Name(id='id_hash', ctx=Load()), conversion=-1)])), If(test=Compare(left=Name(id='node_id', ctx=Load()), ops=[In()], comparators=[Name(id='created_ips', ctx=Load())]), body=[Continue()], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='created_ips', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='node_id', ctx=Load())], keywords=[])), Assign(targets=[Name(id='props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='finding_type'), Constant(value='severity'), Constant(value='confidence'), Constant(value='title'), Constant(value='detail'), Constant(value='evidence'), Constant(value='source_url'), Constant(value='base_url'), Constant(value='source'), Constant(value='discovered_at')], values=[Name(id='node_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Constant(value='internal_ip'), Constant(value='low'), Constant(value='high'), Name(id='ip_addr', ctx=Load()), Subscript(value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='ip_entry', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='context')], keywords=[]), Constant(value='')]), slice=Slice(upper=Constant(value=500)), ctx=Load()), Call(func=Attribute(value=Name(id='ip_entry', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='type'), Constant(value='private')], keywords=[]), Name(id='source_url', ctx=Load()), BoolOp(op=Or(), values=[Name(id='base_url', ctx=Load()), Constant(value='upload')]), Constant(value='js_recon'), Name(id='scan_ts', ctx=Load())])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='MERGE (jf:JsReconFinding {id: $id}) SET jf += $props, jf.updated_at = datetime()')], keywords=[keyword(arg='id', value=Name(id='node_id', ctx=Load())), keyword(arg='props', value=Name(id='props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='findings_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Call(func=Name(id='_link_to_file', ctx=Load()), args=[Name(id='session', ctx=Load()), Name(id='node_id', ctx=Load()), Constant(value='JsReconFinding'), Constant(value='HAS_JS_FINDING'), Name(id='source_url', ctx=Load())], keywords=[]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Internal IP finding failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='created_refs', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), For(target=Name(id='ref', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='object_references'), List(elts=[], ctx=Load())], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='value', ctx=Store())], value=Call(func=Attribute(value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='ref', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='value')], keywords=[]), Constant(value='')]), attr='strip', ctx=Load()), args=[], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='value', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='source_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='ref', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_url'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='base_url', ctx=Store())], value=Call(func=Name(id='_derive_base_url', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='id_hash', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='hashlib', ctx=Load()), attr='sha256', ctx=Load()), args=[Call(func=Attribute(value=JoinedStr(values=[FormattedValue(value=Name(id='value', ctx=Load()), conversion=-1), Constant(value=':'), FormattedValue(value=Name(id='source_url', ctx=Load()), conversion=-1)]), attr='encode', ctx=Load()), args=[], keywords=[])], keywords=[]), attr='hexdigest', ctx=Load()), args=[], keywords=[]), slice=Slice(upper=Constant(value=16)), ctx=Load())), Assign(targets=[Name(id='node_id', ctx=Store())], value=JoinedStr(values=[Constant(value='jsrf-'), FormattedValue(value=Name(id='user_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1), Constant(value='-objref-'), FormattedValue(value=Name(id='id_hash', ctx=Load()), conversion=-1)])), If(test=Compare(left=Name(id='node_id', ctx=Load()), ops=[In()], comparators=[Name(id='created_refs', ctx=Load())]), body=[Continue()], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='created_refs', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='node_id', ctx=Load())], keywords=[])), Assign(targets=[Name(id='props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='finding_type'), Constant(value='severity'), Constant(value='confidence'), Constant(value='title'), Constant(value='detail'), Constant(value='evidence'), Constant(value='source_url'), Constant(value='base_url'), Constant(value='source'), Constant(value='potential_idor'), Constant(value='discovered_at')], values=[Name(id='node_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Constant(value='object_reference'), Constant(value='info'), Constant(value='medium'), Name(id='value', ctx=Load()), Subscript(value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='ref', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='context')], keywords=[]), Constant(value='')]), slice=Slice(upper=Constant(value=500)), ctx=Load()), Call(func=Attribute(value=Name(id='ref', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='type'), Constant(value='uuid')], keywords=[]), Name(id='source_url', ctx=Load()), BoolOp(op=Or(), values=[Name(id='base_url', ctx=Load()), Constant(value='upload')]), Constant(value='js_recon'), Call(func=Name(id='bool', ctx=Load()), args=[Call(func=Attribute(value=Name(id='ref', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='potential_idor'), Constant(value=False)], keywords=[])], keywords=[]), Name(id='scan_ts', ctx=Load())])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='MERGE (jf:JsReconFinding {id: $id}) SET jf += $props, jf.updated_at = datetime()')], keywords=[keyword(arg='id', value=Name(id='node_id', ctx=Load())), keyword(arg='props', value=Name(id='props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='findings_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Call(func=Name(id='_link_to_file', ctx=Load()), args=[Name(id='session', ctx=Load()), Name(id='node_id', ctx=Load()), Constant(value='JsReconFinding'), Constant(value='HAS_JS_FINDING'), Name(id='source_url', ctx=Load())], keywords=[]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Object reference finding failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='created_cloud', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), For(target=Name(id='ca', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cloud_assets'), List(elts=[], ctx=Load())], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='url_val', ctx=Store())], value=Call(func=Attribute(value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='ca', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='url')], keywords=[]), Constant(value='')]), attr='strip', ctx=Load()), args=[], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='url_val', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='source_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='ca', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_url'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='base_url', ctx=Store())], value=Call(func=Name(id='_derive_base_url', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='provider', ctx=Store())], value=Call(func=Attribute(value=Name(id='ca', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='provider'), Constant(value='unknown')], keywords=[])), Assign(targets=[Name(id='asset_type', ctx=Store())], value=Call(func=Attribute(value=Name(id='ca', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='type'), Constant(value='cloud_asset')], keywords=[])), Assign(targets=[Name(id='id_hash', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='hashlib', ctx=Load()), attr='sha256', ctx=Load()), args=[Call(func=Attribute(value=JoinedStr(values=[FormattedValue(value=Name(id='url_val', ctx=Load()), conversion=-1), Constant(value=':'), FormattedValue(value=Name(id='source_url', ctx=Load()), conversion=-1)]), attr='encode', ctx=Load()), args=[], keywords=[])], keywords=[]), attr='hexdigest', ctx=Load()), args=[], keywords=[]), slice=Slice(upper=Constant(value=16)), ctx=Load())), Assign(targets=[Name(id='node_id', ctx=Store())], value=JoinedStr(values=[Constant(value='jsrf-'), FormattedValue(value=Name(id='user_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1), Constant(value='-cloud-'), FormattedValue(value=Name(id='id_hash', ctx=Load()), conversion=-1)])), If(test=Compare(left=Name(id='node_id', ctx=Load()), ops=[In()], comparators=[Name(id='created_cloud', ctx=Load())]), body=[Continue()], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='created_cloud', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='node_id', ctx=Load())], keywords=[])), Assign(targets=[Name(id='props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='finding_type'), Constant(value='severity'), Constant(value='confidence'), Constant(value='title'), Constant(value='detail'), Constant(value='evidence'), Constant(value='cloud_provider'), Constant(value='cloud_asset_type'), Constant(value='source_url'), Constant(value='base_url'), Constant(value='source'), Constant(value='discovered_at')], values=[Name(id='node_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Constant(value='cloud_asset'), Constant(value='medium'), Constant(value='high'), Name(id='url_val', ctx=Load()), JoinedStr(values=[FormattedValue(value=Name(id='provider', ctx=Load()), conversion=-1), Constant(value=' \u2014 '), FormattedValue(value=Name(id='asset_type', ctx=Load()), conversion=-1)]), Name(id='provider', ctx=Load()), Name(id='provider', ctx=Load()), Name(id='asset_type', ctx=Load()), Name(id='source_url', ctx=Load()), BoolOp(op=Or(), values=[Name(id='base_url', ctx=Load()), Constant(value='upload')]), Constant(value='js_recon'), Name(id='scan_ts', ctx=Load())])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='MERGE (jf:JsReconFinding {id: $id}) SET jf += $props, jf.updated_at = datetime()')], keywords=[keyword(arg='id', value=Name(id='node_id', ctx=Load())), keyword(arg='props', value=Name(id='props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='findings_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Call(func=Name(id='_link_to_file', ctx=Load()), args=[Name(id='session', ctx=Load()), Name(id='node_id', ctx=Load()), Constant(value='JsReconFinding'), Constant(value='HAS_JS_FINDING'), Name(id='source_url', ctx=Load())], keywords=[]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Cloud asset finding failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='created_ext', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), For(target=Name(id='ext', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='external_domains'), List(elts=[], ctx=Load())], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='domain_val', ctx=Store())], value=Call(func=Attribute(value=Call(func=Attribute(value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='ext', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='domain')], keywords=[]), Constant(value='')]), attr='strip', ctx=Load()), args=[], keywords=[]), attr='lower', ctx=Load()), args=[], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='domain_val', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='times_seen', ctx=Store())], value=Call(func=Name(id='int', ctx=Load()), args=[Call(func=Attribute(value=Name(id='ext', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='times_seen'), Constant(value=1)], keywords=[])], keywords=[])), Assign(targets=[Name(id='sample_urls', ctx=Store())], value=Call(func=Attribute(value=Name(id='ext', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='urls'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='id_hash', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='hashlib', ctx=Load()), attr='sha256', ctx=Load()), args=[Call(func=Attribute(value=Name(id='domain_val', ctx=Load()), attr='encode', ctx=Load()), args=[], keywords=[])], keywords=[]), attr='hexdigest', ctx=Load()), args=[], keywords=[]), slice=Slice(upper=Constant(value=16)), ctx=Load())), Assign(targets=[Name(id='node_id', ctx=Store())], value=JoinedStr(values=[Constant(value='jsrf-'), FormattedValue(value=Name(id='user_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1), Constant(value='-extdom-'), FormattedValue(value=Name(id='id_hash', ctx=Load()), conversion=-1)])), If(test=Compare(left=Name(id='node_id', ctx=Load()), ops=[In()], comparators=[Name(id='created_ext', ctx=Load())]), body=[Continue()], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='created_ext', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='node_id', ctx=Load())], keywords=[])), Assign(targets=[Name(id='props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='finding_type'), Constant(value='severity'), Constant(value='confidence'), Constant(value='title'), Constant(value='detail'), Constant(value='evidence'), Constant(value='times_seen'), Constant(value='sample_urls'), Constant(value='source_url'), Constant(value='base_url'), Constant(value='source'), Constant(value='discovered_at')], values=[Name(id='node_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Constant(value='external_domain'), Constant(value='info'), Constant(value='high'), Name(id='domain_val', ctx=Load()), Subscript(value=JoinedStr(values=[Constant(value='Seen '), FormattedValue(value=Name(id='times_seen', ctx=Load()), conversion=-1), Constant(value='x \u2014 '), FormattedValue(value=Call(func=Attribute(value=Constant(value=', '), attr='join', ctx=Load()), args=[Subscript(value=Name(id='sample_urls', ctx=Load()), slice=Slice(upper=Constant(value=3)), ctx=Load())], keywords=[]), conversion=-1)]), slice=Slice(upper=Constant(value=500)), ctx=Load()), Name(id='domain_val', ctx=Load()), Name(id='times_seen', ctx=Load()), Subscript(value=Name(id='sample_urls', ctx=Load()), slice=Slice(upper=Constant(value=3)), ctx=Load()), Constant(value=''), Constant(value=''), Constant(value='js_recon'), Name(id='scan_ts', ctx=Load())])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='MERGE (jf:JsReconFinding {id: $id}) SET jf += $props, jf.updated_at = datetime()')], keywords=[keyword(arg='id', value=Name(id='node_id', ctx=Load())), keyword(arg='props', value=Name(id='props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='findings_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='domain_name', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (d:Domain {name: $dname, user_id: $uid, project_id: $pid})\\n                            MATCH (jf:JsReconFinding {id: $fid})\\n                            MERGE (d)-[:HAS_JS_FINDING]->(jf)\\n                            ')], keywords=[keyword(arg='dname', value=Name(id='domain_name', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load())), keyword(arg='fid', value=Name(id='node_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='External domain finding failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='created_secrets', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), For(target=Name(id='secret', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='secrets'), List(elts=[], ctx=Load())], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='secret_id', ctx=Store())], value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='id')], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='secret_id', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='node_id', ctx=Store())], value=JoinedStr(values=[Constant(value='secret-'), FormattedValue(value=Name(id='user_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='secret_id', ctx=Load()), conversion=-1)])), If(test=Compare(left=Name(id='node_id', ctx=Load()), ops=[In()], comparators=[Name(id='created_secrets', ctx=Load())]), body=[Continue()], orelse=[]), Assign(targets=[Name(id='source_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_url'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='base_url', ctx=Store())], value=Call(func=Name(id='_derive_base_url', ctx=Load()), args=[Name(id='source_url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='validation', ctx=Store())], value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='validation'), Dict(keys=[], values=[])], keywords=[])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                        MERGE (s:Secret {id: $id})\\n                        SET s.user_id = $user_id,\\n                            s.project_id = $project_id,\\n                            s.secret_type = $secret_type,\\n                            s.severity = $severity,\\n                            s.source = 'js_recon',\\n                            s.source_url = $source_url,\\n                            s.base_url = $base_url,\\n                            s.sample = $sample,\\n                            s.confidence = $confidence,\\n                            s.detection_method = $detection_method,\\n                            s.key_type = $key_type,\\n                            s.validation_status = $validation_status,\\n                            s.matched_text = $matched_text,\\n                            s.validation_info = $validation_info,\\n                            s.discovered_at = $discovered_at,\\n                            s.updated_at = datetime()\\n                        \")], keywords=[keyword(arg='id', value=Name(id='node_id', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='secret_type', value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name'), Constant(value='unknown')], keywords=[])), keyword(arg='severity', value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='severity'), Constant(value='info')], keywords=[])), keyword(arg='source_url', value=Name(id='source_url', ctx=Load())), keyword(arg='base_url', value=BoolOp(op=Or(), values=[Name(id='base_url', ctx=Load()), Constant(value='upload')])), keyword(arg='sample', value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='redacted_value'), Constant(value='')], keywords=[])), keyword(arg='matched_text', value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='matched_text'), Constant(value='')], keywords=[])), keyword(arg='confidence', value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='confidence'), Constant(value='medium')], keywords=[])), keyword(arg='detection_method', value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='detection_method'), Constant(value='regex')], keywords=[])), keyword(arg='key_type', value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='category'), Constant(value='')], keywords=[])), keyword(arg='validation_status', value=Call(func=Attribute(value=Name(id='validation', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='status'), Constant(value='unvalidated')], keywords=[])), keyword(arg='validation_info', value=IfExp(test=Name(id='validation', ctx=Load()), body=Call(func=Attribute(value=Name(id='json', ctx=Load()), attr='dumps', ctx=Load()), args=[Name(id='validation', ctx=Load())], keywords=[]), orelse=Constant(value=''))), keyword(arg='discovered_at', value=Name(id='scan_ts', ctx=Load()))])), Expr(value=Call(func=Attribute(value=Name(id='created_secrets', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='node_id', ctx=Load())], keywords=[])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='secrets_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Call(func=Name(id='_link_to_file', ctx=Load()), args=[Name(id='session', ctx=Load()), Name(id='node_id', ctx=Load()), Constant(value='Secret'), Constant(value='HAS_SECRET'), Name(id='source_url', ctx=Load())], keywords=[]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='JS Recon Secret node failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='created_endpoints', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), For(target=Name(id='ep', ctx=Store()), iter=Call(func=Attribute(value=Name(id='js_recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='endpoints'), List(elts=[], ctx=Load())], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='path', ctx=Store())], value=Call(func=Attribute(value=Name(id='ep', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='path'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='method', ctx=Store())], value=Call(func=Attribute(value=Name(id='ep', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='method'), Constant(value='GET')], keywords=[])), Assign(targets=[Name(id='source_js', ctx=Store())], value=Call(func=Attribute(value=Name(id='ep', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_js'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='base_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='ep', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='base_url'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='is_upload', ctx=Store())], value=Call(func=Name(id='_is_uploaded', ctx=Load()), args=[Name(id='source_js', ctx=Load())], keywords=[])), If(test=BoolOp(op=And(), values=[UnaryOp(op=Not(), operand=Name(id='base_url', ctx=Load())), Name(id='source_js', ctx=Load()), UnaryOp(op=Not(), operand=Name(id='is_upload', ctx=Load()))]), body=[Assign(targets=[Name(id='base_url', ctx=Store())], value=Call(func=Name(id='_derive_base_url', ctx=Load()), args=[Name(id='source_js', ctx=Load())], keywords=[]))], orelse=[]), If(test=UnaryOp(op=Not(), operand=Name(id='path', ctx=Load())), body=[Continue()], orelse=[]), If(test=BoolOp(op=And(), values=[UnaryOp(op=Not(), operand=Name(id='base_url', ctx=Load())), UnaryOp(op=Not(), operand=Name(id='is_upload', ctx=Load()))]), body=[Continue()], orelse=[]), Assign(targets=[Name(id='ep_key', ctx=Store())], value=JoinedStr(values=[FormattedValue(value=Name(id='method', ctx=Load()), conversion=-1), Constant(value=':'), FormattedValue(value=Name(id='path', ctx=Load()), conversion=-1), Constant(value=':'), FormattedValue(value=BoolOp(op=Or(), values=[Name(id='base_url', ctx=Load()), Constant(value='upload')]), conversion=-1)])), If(test=Compare(left=Name(id='ep_key', ctx=Load()), ops=[In()], comparators=[Name(id='created_endpoints', ctx=Load())]), body=[Continue()], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='created_endpoints', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='ep_key', ctx=Load())], keywords=[])), Assign(targets=[Name(id='effective_baseurl', ctx=Store())], value=BoolOp(op=Or(), values=[Name(id='base_url', ctx=Load()), Constant(value='upload')])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                        MERGE (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $uid, project_id: $pid})\\n                        ON CREATE SET e.source = 'js_recon',\\n                            e.category = $category,\\n                            e.full_url = $full_url,\\n                            e.endpoint_type = $ep_type,\\n                            e.updated_at = datetime()\\n                        ON MATCH SET e.js_recon_source = true,\\n                            e.endpoint_type = COALESCE(e.endpoint_type, $ep_type),\\n                            e.full_url = COALESCE(e.full_url, $full_url),\\n                            e.updated_at = datetime()\\n                        \")], keywords=[keyword(arg='path', value=Name(id='path', ctx=Load())), keyword(arg='method', value=Name(id='method', ctx=Load())), keyword(arg='baseurl', value=Name(id='effective_baseurl', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load())), keyword(arg='category', value=Call(func=Attribute(value=Name(id='ep', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='category'), Constant(value='endpoint')], keywords=[])), keyword(arg='full_url', value=Call(func=Attribute(value=Name(id='ep', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='full_url'), Constant(value='')], keywords=[])), keyword(arg='ep_type', value=Call(func=Attribute(value=Name(id='ep', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='type'), Constant(value='rest')], keywords=[]))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='endpoints_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Call(func=Name(id='_link_to_file', ctx=Load()), args=[Name(id='session', ctx=Load()), Name(id='node_id', ctx=Load()), Constant(value='Endpoint'), Constant(value='HAS_ENDPOINT'), Name(id='source_js', ctx=Load())], keywords=[]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='JS Recon Endpoint node failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])]), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] JS Recon: '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='file_nodes_created'), ctx=Load()), conversion=-1), Constant(value=' files, '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='findings_created'), ctx=Load()), conversion=-1), Constant(value=' findings, '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='secrets_created'), ctx=Load()), conversion=-1), Constant(value=' secrets, '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='endpoints_created'), ctx=Load()), conversion=-1), Constant(value=' endpoints, '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Load()), conversion=-1), Constant(value=' relationships')])], keywords=[])), If(test=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] JS Recon: '), FormattedValue(value=Call(func=Name(id='len', ctx=Load()), args=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load())], keywords=[]), conversion=-1), Constant(value=' errors')])], keywords=[]))], orelse=[]), Return(value=Name(id='stats', ctx=Load()))], decorator_list=[], returns=Name(id='dict', ctx=Load()), type_params=[])",
  "update_graph_from_nmap": "FunctionDef(name='update_graph_from_nmap', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='recon_data', annotation=Name(id='dict', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='\\n        Update the Neo4j graph database with Nmap service detection and NSE vuln data.\\n\\n        This function:\\n        - Enriches existing Port nodes with product, version, CPE from Nmap -sV\\n        - Updates existing Service nodes with version info\\n        - Creates Vulnerability nodes from NSE script findings\\n        - Creates CVE nodes if NSE scripts report specific CVEs\\n        - Creates Technology nodes for detected services (for CVE lookup linkage)\\n        ')), Import(names=[alias(name='re')]), Assign(targets=[Name(id='stats', ctx=Store())], value=Dict(keys=[Constant(value='ports_enriched'), Constant(value='services_enriched'), Constant(value='technologies_created'), Constant(value='nse_vulns_created'), Constant(value='cves_created'), Constant(value='relationships_created'), Constant(value='errors')], values=[Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), List(elts=[], ctx=Load())])), Assign(targets=[Name(id='nmap_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='nmap_scan'), Dict(keys=[], values=[])], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='nmap_data', ctx=Load())), body=[Return(value=Name(id='stats', ctx=Load()))], orelse=[]), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[For(target=Tuple(elts=[Name(id='host', ctx=Store()), Name(id='host_info', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='nmap_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='by_host'), Dict(keys=[], values=[])], keywords=[]), attr='items', ctx=Load()), args=[], keywords=[]), body=[Assign(targets=[Name(id='ip_addr', ctx=Store())], value=Call(func=Attribute(value=Name(id='host_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ip'), Constant(value='')], keywords=[])), For(target=Name(id='pd', ctx=Store()), iter=Call(func=Attribute(value=Name(id='host_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port_details'), List(elts=[], ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='port_number', ctx=Store())], value=Call(func=Attribute(value=Name(id='pd', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port')], keywords=[])), Assign(targets=[Name(id='product', ctx=Store())], value=Call(func=Attribute(value=Name(id='pd', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='product')], keywords=[])), Assign(targets=[Name(id='version', ctx=Store())], value=Call(func=Attribute(value=Name(id='pd', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='version')], keywords=[])), Assign(targets=[Name(id='cpe', ctx=Store())], value=Call(func=Attribute(value=Name(id='pd', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cpe')], keywords=[])), If(test=BoolOp(op=Or(), values=[UnaryOp(op=Not(), operand=Name(id='port_number', ctx=Load())), UnaryOp(op=Not(), operand=Name(id='ip_addr', ctx=Load()))]), body=[Continue()], orelse=[]), Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (p:Port {number: $port_number, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                            SET p.product = $product,\\n                                p.version = $version,\\n                                p.cpe = $cpe,\\n                                p.nmap_scanned = true,\\n                                p.updated_at = datetime()\\n                            ')], keywords=[keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='ip_addr', value=Name(id='ip_addr', ctx=Load())), keyword(arg='product', value=Name(id='product', ctx=Load())), keyword(arg='version', value=Name(id='version', ctx=Load())), keyword(arg='cpe', value=Name(id='cpe', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ports_enriched'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='product', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (svc:Service {port_number: $port_number, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                SET svc.product = $product,\\n                                    svc.version = $version,\\n                                    svc.cpe = $cpe,\\n                                    svc.updated_at = datetime()\\n                                ')], keywords=[keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='ip_addr', value=Name(id='ip_addr', ctx=Load())), keyword(arg='product', value=Name(id='product', ctx=Load())), keyword(arg='version', value=Name(id='version', ctx=Load())), keyword(arg='cpe', value=Name(id='cpe', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='services_enriched'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Port '), FormattedValue(value=Name(id='port_number', ctx=Load()), conversion=-1), Constant(value=' enrich failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], orelse=[]), For(target=Name(id='svc', ctx=Store()), iter=Call(func=Attribute(value=Name(id='nmap_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='services_detected'), List(elts=[], ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='product', ctx=Store())], value=Call(func=Attribute(value=Name(id='svc', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='product'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='version', ctx=Store())], value=Call(func=Attribute(value=Name(id='svc', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='version'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='port_number', ctx=Store())], value=Call(func=Attribute(value=Name(id='svc', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port')], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='product', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='tech_name', ctx=Store())], value=IfExp(test=Name(id='version', ctx=Load()), body=JoinedStr(values=[FormattedValue(value=Name(id='product', ctx=Load()), conversion=-1), Constant(value='/'), FormattedValue(value=Name(id='version', ctx=Load()), conversion=-1)]), orelse=Name(id='product', ctx=Load()))), Assign(targets=[Name(id='svc_ip', ctx=Store())], value=Constant(value='')), For(target=Name(id='host_info', ctx=Store()), iter=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='nmap_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='by_host'), Dict(keys=[], values=[])], keywords=[]), attr='values', ctx=Load()), args=[], keywords=[]), body=[If(test=Call(func=Name(id='any', ctx=Load()), args=[GeneratorExp(elt=Compare(left=Call(func=Attribute(value=Name(id='pd', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port')], keywords=[]), ops=[Eq()], comparators=[Name(id='port_number', ctx=Load())]), generators=[comprehension(target=Name(id='pd', ctx=Store()), iter=Call(func=Attribute(value=Name(id='host_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port_details'), List(elts=[], ctx=Load())], keywords=[]), ifs=[], is_async=0)])], keywords=[]), body=[Assign(targets=[Name(id='svc_ip', ctx=Store())], value=Call(func=Attribute(value=Name(id='host_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ip'), Constant(value='')], keywords=[])), Break()], orelse=[])], orelse=[]), Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                        MERGE (t:Technology {name: $name, user_id: $user_id, project_id: $project_id})\\n                        SET t.version = $version,\\n                            t.source = 'nmap',\\n                            t.cpe = $cpe,\\n                            t.updated_at = datetime()\\n                        \")], keywords=[keyword(arg='name', value=Name(id='tech_name', ctx=Load())), keyword(arg='version', value=BoolOp(op=Or(), values=[Name(id='version', ctx=Load()), Constant(value='')])), keyword(arg='cpe', value=Call(func=Attribute(value=Name(id='svc', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cpe'), Constant(value='')], keywords=[])), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='technologies_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=BoolOp(op=And(), values=[Name(id='svc_ip', ctx=Load()), Name(id='port_number', ctx=Load())]), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (svc:Service {port_number: $port_number, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                            MATCH (t:Technology {name: $tech_name, user_id: $user_id, project_id: $project_id})\\n                            MERGE (svc)-[:USES_TECHNOLOGY]->(t)\\n                            ')], keywords=[keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='ip_addr', value=Name(id='svc_ip', ctx=Load())), keyword(arg='tech_name', value=Name(id='tech_name', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (p:Port {number: $port_number, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                            MATCH (t:Technology {name: $tech_name, user_id: $user_id, project_id: $project_id})\\n                            MERGE (p)-[:HAS_TECHNOLOGY]->(t)\\n                            ')], keywords=[keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='ip_addr', value=Name(id='svc_ip', ctx=Load())), keyword(arg='tech_name', value=Name(id='tech_name', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Technology '), FormattedValue(value=Name(id='tech_name', ctx=Load()), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), For(target=Name(id='vuln', ctx=Store()), iter=Call(func=Attribute(value=Name(id='nmap_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='nse_vulns'), List(elts=[], ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='script_id', ctx=Store())], value=Call(func=Attribute(value=Name(id='vuln', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='script_id'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='ip_addr', ctx=Store())], value=Call(func=Attribute(value=Name(id='vuln', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='host'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='port_number', ctx=Store())], value=Call(func=Attribute(value=Name(id='vuln', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port')], keywords=[])), Assign(targets=[Name(id='output', ctx=Store())], value=Call(func=Attribute(value=Name(id='vuln', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='output'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='state', ctx=Store())], value=Call(func=Attribute(value=Name(id='vuln', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='state'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='cve_id', ctx=Store())], value=Call(func=Attribute(value=Name(id='vuln', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cve')], keywords=[])), If(test=BoolOp(op=Or(), values=[UnaryOp(op=Not(), operand=Name(id='script_id', ctx=Load())), UnaryOp(op=Not(), operand=Name(id='ip_addr', ctx=Load()))]), body=[Continue()], orelse=[]), Try(body=[Assign(targets=[Name(id='severity', ctx=Store())], value=IfExp(test=Compare(left=Constant(value='VULNERABLE'), ops=[In()], comparators=[Call(func=Attribute(value=Name(id='state', ctx=Load()), attr='upper', ctx=Load()), args=[], keywords=[])]), body=Constant(value='high'), orelse=Constant(value='medium'))), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                        MERGE (v:Vulnerability {name: $name, ip_address: $ip_addr, port_number: $port_number, user_id: $user_id, project_id: $project_id})\\n                        SET v.severity = $severity,\\n                            v.type = 'nmap_nse',\\n                            v.source = 'nmap_nse',\\n                            v.output = $output,\\n                            v.state = $state,\\n                            v.cve_id = $cve_id,\\n                            v.updated_at = datetime()\\n                        \")], keywords=[keyword(arg='name', value=Name(id='script_id', ctx=Load())), keyword(arg='ip_addr', value=Name(id='ip_addr', ctx=Load())), keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='severity', value=Name(id='severity', ctx=Load())), keyword(arg='output', value=Subscript(value=Name(id='output', ctx=Load()), slice=Slice(upper=Constant(value=2000)), ctx=Load())), keyword(arg='state', value=Name(id='state', ctx=Load())), keyword(arg='cve_id', value=Name(id='cve_id', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='nse_vulns_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='port_number', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (v:Vulnerability {name: $name, ip_address: $ip_addr, port_number: $port_number, user_id: $user_id, project_id: $project_id})\\n                            MATCH (p:Port {number: $port_number, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                            MERGE (v)-[:AFFECTS]->(p)\\n                            ')], keywords=[keyword(arg='name', value=Name(id='script_id', ctx=Load())), keyword(arg='ip_addr', value=Name(id='ip_addr', ctx=Load())), keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[]), If(test=Name(id='port_number', ctx=Load()), body=[For(target=Name(id='svc', ctx=Store()), iter=Call(func=Attribute(value=Name(id='nmap_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='services_detected'), List(elts=[], ctx=Load())], keywords=[]), body=[If(test=BoolOp(op=And(), values=[Compare(left=Call(func=Attribute(value=Name(id='svc', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port')], keywords=[]), ops=[Eq()], comparators=[Name(id='port_number', ctx=Load())]), Call(func=Attribute(value=Name(id='svc', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='product')], keywords=[])]), body=[Assign(targets=[Name(id='svc_product', ctx=Store())], value=Subscript(value=Name(id='svc', ctx=Load()), slice=Constant(value='product'), ctx=Load())), Assign(targets=[Name(id='svc_version', ctx=Store())], value=Call(func=Attribute(value=Name(id='svc', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='version'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='svc_tech_name', ctx=Store())], value=IfExp(test=Name(id='svc_version', ctx=Load()), body=JoinedStr(values=[FormattedValue(value=Name(id='svc_product', ctx=Load()), conversion=-1), Constant(value='/'), FormattedValue(value=Name(id='svc_version', ctx=Load()), conversion=-1)]), orelse=Name(id='svc_product', ctx=Load()))), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MATCH (v:Vulnerability {name: $vuln_name, ip_address: $ip_addr, port_number: $port_number, user_id: $user_id, project_id: $project_id})\\n                                    MATCH (t:Technology {name: $tech_name, user_id: $user_id, project_id: $project_id})\\n                                    MERGE (v)-[:FOUND_ON]->(t)\\n                                    ')], keywords=[keyword(arg='vuln_name', value=Name(id='script_id', ctx=Load())), keyword(arg='ip_addr', value=Name(id='ip_addr', ctx=Load())), keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='tech_name', value=Name(id='svc_tech_name', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Break()], orelse=[])], orelse=[])], orelse=[]), If(test=Name(id='cve_id', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                            MERGE (c:CVE {id: $cve_id, user_id: $user_id, project_id: $project_id})\\n                            SET c.cve_id = $cve_id,\\n                                c.name = $cve_id,\\n                                c.source = 'nmap_nse',\\n                                c.updated_at = datetime()\\n                            \")], keywords=[keyword(arg='cve_id', value=Name(id='cve_id', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='cves_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (v:Vulnerability {name: $name, ip_address: $ip_addr, port_number: $port_number, user_id: $user_id, project_id: $project_id})\\n                            MATCH (c:CVE {id: $cve_id, user_id: $user_id, project_id: $project_id})\\n                            MERGE (v)-[:HAS_CVE]->(c)\\n                            ')], keywords=[keyword(arg='name', value=Name(id='script_id', ctx=Load())), keyword(arg='ip_addr', value=Name(id='ip_addr', ctx=Load())), keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='cve_id', value=Name(id='cve_id', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='port_number', ctx=Load()), body=[For(target=Name(id='svc', ctx=Store()), iter=Call(func=Attribute(value=Name(id='nmap_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='services_detected'), List(elts=[], ctx=Load())], keywords=[]), body=[If(test=BoolOp(op=And(), values=[Compare(left=Call(func=Attribute(value=Name(id='svc', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port')], keywords=[]), ops=[Eq()], comparators=[Name(id='port_number', ctx=Load())]), Call(func=Attribute(value=Name(id='svc', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='product')], keywords=[])]), body=[Assign(targets=[Name(id='svc_product', ctx=Store())], value=Subscript(value=Name(id='svc', ctx=Load()), slice=Constant(value='product'), ctx=Load())), Assign(targets=[Name(id='svc_version', ctx=Store())], value=Call(func=Attribute(value=Name(id='svc', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='version'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='svc_tech_name', ctx=Store())], value=IfExp(test=Name(id='svc_version', ctx=Load()), body=JoinedStr(values=[FormattedValue(value=Name(id='svc_product', ctx=Load()), conversion=-1), Constant(value='/'), FormattedValue(value=Name(id='svc_version', ctx=Load()), conversion=-1)]), orelse=Name(id='svc_product', ctx=Load()))), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                        MATCH (t:Technology {name: $tech_name, user_id: $user_id, project_id: $project_id})\\n                                        MATCH (c:CVE {id: $cve_id, user_id: $user_id, project_id: $project_id})\\n                                        MERGE (t)-[:HAS_KNOWN_CVE]->(c)\\n                                        ')], keywords=[keyword(arg='tech_name', value=Name(id='svc_tech_name', ctx=Load())), keyword(arg='cve_id', value=Name(id='cve_id', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Break()], orelse=[])], orelse=[])], orelse=[])], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='NSE vuln '), FormattedValue(value=Name(id='script_id', ctx=Load()), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])]), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Nmap Graph Update Summary:')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Enriched '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ports_enriched'), ctx=Load()), conversion=-1), Constant(value=' Port nodes with version data')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Enriched '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='services_enriched'), ctx=Load()), conversion=-1), Constant(value=' Service nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='technologies_created'), ctx=Load()), conversion=-1), Constant(value=' Technology nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='nse_vulns_created'), ctx=Load()), conversion=-1), Constant(value=' NSE Vulnerability nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='cves_created'), ctx=Load()), conversion=-1), Constant(value=' CVE nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Load()), conversion=-1), Constant(value=' relationships')])], keywords=[])), If(test=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] '), FormattedValue(value=Call(func=Name(id='len', ctx=Load()), args=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load())], keywords=[]), conversion=-1), Constant(value=' errors occurred')])], keywords=[]))], orelse=[]), Return(value=Name(id='stats', ctx=Load()))], decorator_list=[], returns=Name(id='dict', ctx=Load()), type_params=[])",
  "update_graph_from_partial_discovery": "FunctionDef(name='update_graph_from_partial_discovery', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='recon_data', annotation=Name(id='dict', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load())), arg(arg='user_input_id', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[Constant(value=None)]), body=[Expr(value=Constant(value='\\n        Update Neo4j graph with results from a partial subdomain discovery run.\\n\\n        Creates Subdomain, IP, DNSRecord nodes and relationships using the same\\n        MERGE patterns as update_graph_from_domain_discovery(). Optionally links\\n        all produced nodes to a UserInput node via PRODUCED relationships.\\n\\n        Args:\\n            recon_data: Discovery result dict (same format as domain_recon output)\\n            user_id: Tenant user ID\\n            project_id: Tenant project ID\\n            user_input_id: Optional UserInput node ID to link produced nodes\\n\\n        Returns:\\n            Stats dict with counts\\n        ')), Assign(targets=[Name(id='stats', ctx=Store())], value=Dict(keys=[Constant(value='subdomains_total'), Constant(value='subdomains_new'), Constant(value='subdomains_existing'), Constant(value='ips_total'), Constant(value='ips_new'), Constant(value='dns_records_created'), Constant(value='relationships_created'), Constant(value='errors')], values=[Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), List(elts=[], ctx=Load())])), Assign(targets=[Name(id='subdomains', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomains'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='dns_data', ctx=Store())], value=BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='dns')], keywords=[]), Dict(keys=[], values=[])])), Assign(targets=[Name(id='domain', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='domain'), Constant(value='')], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='domain', ctx=Load())), body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[Constant(value='No domain found in recon_data')], keywords=[])), Return(value=Name(id='stats', ctx=Load()))], orelse=[]), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                MERGE (d:Domain {name: $name, user_id: $user_id, project_id: $project_id})\\n                ON CREATE SET d.updated_at = datetime()\\n                ON MATCH SET d.updated_at = datetime()\\n                ')], keywords=[keyword(arg='name', value=Name(id='domain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='subdomain_dns', ctx=Store())], value=IfExp(test=Name(id='dns_data', ctx=Load()), body=Call(func=Attribute(value=Name(id='dns_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomains'), Dict(keys=[], values=[])], keywords=[]), orelse=Dict(keys=[], values=[]))), Assign(targets=[Name(id='domain_dns', ctx=Store())], value=IfExp(test=Name(id='dns_data', ctx=Load()), body=Call(func=Attribute(value=Name(id='dns_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='domain'), Dict(keys=[], values=[])], keywords=[]), orelse=Dict(keys=[], values=[]))), Assign(targets=[Name(id='subdomain_status_map', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomain_status_map'), Dict(keys=[], values=[])], keywords=[])), For(target=Name(id='subdomain', ctx=Store()), iter=Name(id='subdomains', ctx=Load()), body=[Try(body=[If(test=Compare(left=Name(id='subdomain', ctx=Load()), ops=[Eq()], comparators=[Name(id='domain', ctx=Load())]), body=[Assign(targets=[Name(id='subdomain_info', ctx=Store())], value=Name(id='domain_dns', ctx=Load()))], orelse=[Assign(targets=[Name(id='subdomain_info', ctx=Store())], value=Call(func=Attribute(value=Name(id='subdomain_dns', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='subdomain', ctx=Load()), Dict(keys=[], values=[])], keywords=[]))]), Assign(targets=[Name(id='has_records', ctx=Store())], value=Call(func=Attribute(value=Name(id='subdomain_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='has_records'), Constant(value=False)], keywords=[])), Assign(targets=[Name(id='sub_status', ctx=Store())], value=Call(func=Attribute(value=Name(id='subdomain_status_map', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='subdomain', ctx=Load())], keywords=[])), Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        OPTIONAL MATCH (s:Subdomain {name: $name, user_id: $user_id, project_id: $project_id})\\n                        RETURN s IS NOT NULL AS exists\\n                        ')], keywords=[keyword(arg='name', value=Name(id='subdomain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='existed', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[]), slice=Constant(value='exists'), ctx=Load())), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MERGE (s:Subdomain {name: $name, user_id: $user_id, project_id: $project_id})\\n                        SET s.has_dns_records = $has_records,\\n                            s.status = coalesce(s.status, $status),\\n                            s.discovered_at = coalesce(s.discovered_at, datetime()),\\n                            s.updated_at = datetime()\\n                        ')], keywords=[keyword(arg='name', value=Name(id='subdomain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='has_records', value=Name(id='has_records', ctx=Load())), keyword(arg='status', value=Name(id='sub_status', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_total'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='existed', ctx=Load()), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_existing'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_new'), ctx=Store()), op=Add(), value=Constant(value=1))]), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MATCH (d:Domain {name: $domain, user_id: $uid, project_id: $pid})\\n                        MATCH (s:Subdomain {name: $sub, user_id: $uid, project_id: $pid})\\n                        MERGE (s)-[:BELONGS_TO]->(d)\\n                        MERGE (d)-[:HAS_SUBDOMAIN]->(s)\\n                        ')], keywords=[keyword(arg='domain', value=Name(id='domain', ctx=Load())), keyword(arg='sub', value=Name(id='subdomain', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='user_input_id', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (ui:UserInput {id: $ui_id})\\n                            MATCH (s:Subdomain {name: $name, user_id: $uid, project_id: $pid})\\n                            MERGE (ui)-[:PRODUCED]->(s)\\n                            ')], keywords=[keyword(arg='ui_id', value=Name(id='user_input_id', ctx=Load())), keyword(arg='name', value=Name(id='subdomain', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))]))], orelse=[]), Assign(targets=[Name(id='records', ctx=Store())], value=Call(func=Attribute(value=Name(id='subdomain_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='records'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='ips_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='subdomain_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ips'), Dict(keys=[], values=[])], keywords=[])), For(target=Name(id='ip_version', ctx=Store()), iter=List(elts=[Constant(value='ipv4'), Constant(value='ipv6')], ctx=Load()), body=[For(target=Name(id='ip_addr', ctx=Store()), iter=Call(func=Attribute(value=Name(id='ips_data', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='ip_version', ctx=Load()), List(elts=[], ctx=Load())], keywords=[]), body=[If(test=UnaryOp(op=Not(), operand=Name(id='ip_addr', ctx=Load())), body=[Continue()], orelse=[]), Try(body=[Assign(targets=[Name(id='ip_exists', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    OPTIONAL MATCH (i:IP {address: $address, user_id: $uid, project_id: $pid})\\n                                    RETURN i IS NOT NULL AS exists\\n                                    ')], keywords=[keyword(arg='address', value=Name(id='ip_addr', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))]), attr='single', ctx=Load()), args=[], keywords=[]), slice=Constant(value='exists'), ctx=Load())), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MERGE (i:IP {address: $address, user_id: $uid, project_id: $pid})\\n                                    SET i.version = $version,\\n                                        i.updated_at = datetime()\\n                                    ')], keywords=[keyword(arg='address', value=Name(id='ip_addr', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load())), keyword(arg='version', value=Name(id='ip_version', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ips_total'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=UnaryOp(op=Not(), operand=Name(id='ip_exists', ctx=Load())), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ips_new'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[]), Assign(targets=[Name(id='record_type', ctx=Store())], value=IfExp(test=Compare(left=Name(id='ip_version', ctx=Load()), ops=[Eq()], comparators=[Constant(value='ipv4')]), body=Constant(value='A'), orelse=Constant(value='AAAA'))), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MATCH (s:Subdomain {name: $sub, user_id: $uid, project_id: $pid})\\n                                    MATCH (i:IP {address: $ip, user_id: $uid, project_id: $pid})\\n                                    MERGE (s)-[:RESOLVES_TO {record_type: $rt}]->(i)\\n                                    ')], keywords=[keyword(arg='sub', value=Name(id='subdomain', ctx=Load())), keyword(arg='ip', value=Name(id='ip_addr', ctx=Load())), keyword(arg='rt', value=Name(id='record_type', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='user_input_id', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                        MATCH (ui:UserInput {id: $ui_id})\\n                                        MATCH (i:IP {address: $addr, user_id: $uid, project_id: $pid})\\n                                        MERGE (ui)-[:PRODUCED]->(i)\\n                                        ')], keywords=[keyword(arg='ui_id', value=Name(id='user_input_id', ctx=Load())), keyword(arg='addr', value=Name(id='ip_addr', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))]))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='IP '), FormattedValue(value=Name(id='ip_addr', ctx=Load()), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], orelse=[]), For(target=Tuple(elts=[Name(id='record_type', ctx=Store()), Name(id='record_values', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='records', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[If(test=BoolOp(op=Or(), values=[UnaryOp(op=Not(), operand=Name(id='record_values', ctx=Load())), Compare(left=Name(id='record_type', ctx=Load()), ops=[In()], comparators=[List(elts=[Constant(value='A'), Constant(value='AAAA')], ctx=Load())])]), body=[Continue()], orelse=[]), If(test=UnaryOp(op=Not(), operand=Call(func=Name(id='isinstance', ctx=Load()), args=[Name(id='record_values', ctx=Load()), Name(id='list', ctx=Load())], keywords=[])), body=[Assign(targets=[Name(id='record_values', ctx=Store())], value=List(elts=[Name(id='record_values', ctx=Load())], ctx=Load()))], orelse=[]), For(target=Name(id='value', ctx=Store()), iter=Name(id='record_values', ctx=Load()), body=[If(test=UnaryOp(op=Not(), operand=Name(id='value', ctx=Load())), body=[Continue()], orelse=[]), Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MERGE (dns:DNSRecord {type: $type, value: $value, subdomain: $sub, user_id: $uid, project_id: $pid})\\n                                    SET dns.updated_at = datetime()\\n                                    ')], keywords=[keyword(arg='type', value=Name(id='record_type', ctx=Load())), keyword(arg='value', value=Call(func=Name(id='str', ctx=Load()), args=[Name(id='value', ctx=Load())], keywords=[])), keyword(arg='sub', value=Name(id='subdomain', ctx=Load())), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='dns_records_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MATCH (s:Subdomain {name: $sub, user_id: $uid, project_id: $pid})\\n                                    MATCH (dns:DNSRecord {type: $type, value: $value, subdomain: $sub, user_id: $uid, project_id: $pid})\\n                                    MERGE (s)-[:HAS_DNS_RECORD]->(dns)\\n                                    ')], keywords=[keyword(arg='sub', value=Name(id='subdomain', ctx=Load())), keyword(arg='type', value=Name(id='record_type', ctx=Load())), keyword(arg='value', value=Call(func=Name(id='str', ctx=Load()), args=[Name(id='value', ctx=Load())], keywords=[])), keyword(arg='uid', value=Name(id='user_id', ctx=Load())), keyword(arg='pid', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='DNSRecord '), FormattedValue(value=Name(id='record_type', ctx=Load()), conversion=-1), Constant(value='='), FormattedValue(value=Name(id='value', ctx=Load()), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Subdomain '), FormattedValue(value=Name(id='subdomain', ctx=Load()), conversion=-1), Constant(value=' processing failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] Partial discovery: '), FormattedValue(value=Name(id='subdomain', ctx=Load()), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Partial discovery: '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_total'), ctx=Load()), conversion=-1), Constant(value=' subdomains ('), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_new'), ctx=Load()), conversion=-1), Constant(value=' new, '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='subdomains_existing'), ctx=Load()), conversion=-1), Constant(value=' existing)')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Partial discovery: '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ips_total'), ctx=Load()), conversion=-1), Constant(value=' IPs, '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='dns_records_created'), ctx=Load()), conversion=-1), Constant(value=' DNS records')])], keywords=[])), If(test=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] Partial discovery: '), FormattedValue(value=Call(func=Name(id='len', ctx=Load()), args=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load())], keywords=[]), conversion=-1), Constant(value=' errors')])], keywords=[]))], orelse=[])]), Return(value=Name(id='stats', ctx=Load()))], decorator_list=[], returns=Name(id='dict', ctx=Load()), type_params=[])",
  "update_graph_from_port_scan": "FunctionDef(name='update_graph_from_port_scan', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='recon_data', annotation=Name(id='dict', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='\\n        Update the Neo4j graph database with port scan data.\\n\\n        This function creates/updates:\\n        - Port nodes with open ports\\n        - Service nodes for detected services\\n        - Updates IP nodes with CDN information\\n        - Relationships: IP -[:HAS_PORT]-> Port, Port -[:RUNS_SERVICE]-> Service\\n\\n        Args:\\n            recon_data: The recon JSON data containing port_scan results\\n            user_id: User identifier for multi-tenant isolation\\n            project_id: Project identifier for multi-tenant isolation\\n\\n        Returns:\\n            Dictionary with statistics about created/updated nodes/relationships\\n        ')), Assign(targets=[Name(id='stats', ctx=Store())], value=Dict(keys=[Constant(value='ports_created'), Constant(value='services_created'), Constant(value='ips_updated'), Constant(value='relationships_created'), Constant(value='errors')], values=[Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), List(elts=[], ctx=Load())])), Assign(targets=[Name(id='port_scan_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port_scan'), Dict(keys=[], values=[])], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='port_scan_data', ctx=Load())), body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[Constant(value='No port_scan data found in recon_data')], keywords=[])), Return(value=Name(id='stats', ctx=Load()))], orelse=[]), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[Assign(targets=[Name(id='scan_metadata', ctx=Store())], value=Call(func=Attribute(value=Name(id='port_scan_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_metadata'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='by_ip', ctx=Store())], value=Call(func=Attribute(value=Name(id='port_scan_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='by_ip'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='by_host', ctx=Store())], value=Call(func=Attribute(value=Name(id='port_scan_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='by_host'), Dict(keys=[], values=[])], keywords=[])), For(target=Tuple(elts=[Name(id='ip_addr', ctx=Store()), Name(id='ip_info', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='by_ip', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='ports', ctx=Store())], value=Call(func=Attribute(value=Name(id='ip_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ports'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='hostnames', ctx=Store())], value=Call(func=Attribute(value=Name(id='ip_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='hostnames'), List(elts=[], ctx=Load())], keywords=[])), If(test=BoolOp(op=And(), values=[UnaryOp(op=Not(), operand=Name(id='ports', ctx=Load())), UnaryOp(op=Not(), operand=Name(id='hostnames', ctx=Load()))]), body=[Continue()], orelse=[]), Assign(targets=[Name(id='cdn_name', ctx=Store())], value=Call(func=Attribute(value=Name(id='ip_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cdn')], keywords=[])), Assign(targets=[Name(id='is_cdn', ctx=Store())], value=Call(func=Attribute(value=Name(id='ip_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='is_cdn'), Constant(value=False)], keywords=[])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MERGE (i:IP {address: $address, user_id: $user_id, project_id: $project_id})\\n                        SET i.is_cdn = $is_cdn,\\n                            i.cdn_name = $cdn_name,\\n                            i.updated_at = datetime()\\n                        ')], keywords=[keyword(arg='address', value=Name(id='ip_addr', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='is_cdn', value=Name(id='is_cdn', ctx=Load())), keyword(arg='cdn_name', value=Name(id='cdn_name', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ips_updated'), ctx=Store()), op=Add(), value=Constant(value=1))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='IP '), FormattedValue(value=Name(id='ip_addr', ctx=Load()), conversion=-1), Constant(value=' update failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), For(target=Tuple(elts=[Name(id='hostname', ctx=Store()), Name(id='host_info', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='by_host', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[Assign(targets=[Name(id='ip_addr', ctx=Store())], value=Call(func=Attribute(value=Name(id='host_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ip')], keywords=[])), Assign(targets=[Name(id='port_details', ctx=Store())], value=Call(func=Attribute(value=Name(id='host_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port_details'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='cdn_name', ctx=Store())], value=Call(func=Attribute(value=Name(id='host_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cdn')], keywords=[])), Assign(targets=[Name(id='is_cdn', ctx=Store())], value=Call(func=Attribute(value=Name(id='host_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='is_cdn'), Constant(value=False)], keywords=[])), If(test=Name(id='ip_addr', ctx=Load()), body=[Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MERGE (i:IP {address: $address, user_id: $user_id, project_id: $project_id})\\n                            SET i.is_cdn = $is_cdn,\\n                                i.cdn_name = $cdn_name,\\n                                i.updated_at = datetime()\\n                            ')], keywords=[keyword(arg='address', value=Name(id='ip_addr', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='is_cdn', value=Name(id='is_cdn', ctx=Load())), keyword(arg='cdn_name', value=Name(id='cdn_name', ctx=Load()))]))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='IP '), FormattedValue(value=Name(id='ip_addr', ctx=Load()), conversion=-1), Constant(value=' update failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), For(target=Name(id='port_info', ctx=Store()), iter=Name(id='port_details', ctx=Load()), body=[Assign(targets=[Name(id='port_number', ctx=Store())], value=Call(func=Attribute(value=Name(id='port_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port')], keywords=[])), Assign(targets=[Name(id='protocol', ctx=Store())], value=Call(func=Attribute(value=Name(id='port_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='protocol'), Constant(value='tcp')], keywords=[])), Assign(targets=[Name(id='service_name', ctx=Store())], value=Call(func=Attribute(value=Name(id='port_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='service')], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='port_number', ctx=Load())), body=[Continue()], orelse=[]), Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                            MERGE (p:Port {number: $port_number, protocol: $protocol, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                            SET p.state = 'open',\\n                                p.updated_at = datetime()\\n                            \")], keywords=[keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='protocol', value=Name(id='protocol', ctx=Load())), keyword(arg='ip_addr', value=Name(id='ip_addr', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ports_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='ip_addr', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (i:IP {address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                MATCH (p:Port {number: $port_number, protocol: $protocol, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                MERGE (i)-[:HAS_PORT]->(p)\\n                                ')], keywords=[keyword(arg='ip_addr', value=Name(id='ip_addr', ctx=Load())), keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='protocol', value=Name(id='protocol', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[]), If(test=Name(id='service_name', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MERGE (svc:Service {name: $service_name, port_number: $port_number, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                SET svc.updated_at = datetime()\\n                                ')], keywords=[keyword(arg='service_name', value=Name(id='service_name', ctx=Load())), keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='ip_addr', value=Name(id='ip_addr', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='services_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (p:Port {number: $port_number, protocol: $protocol, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                MATCH (svc:Service {name: $service_name, port_number: $port_number, ip_address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                MERGE (p)-[:RUNS_SERVICE]->(svc)\\n                                ')], keywords=[keyword(arg='port_number', value=Name(id='port_number', ctx=Load())), keyword(arg='protocol', value=Name(id='protocol', ctx=Load())), keyword(arg='ip_addr', value=Name(id='ip_addr', ctx=Load())), keyword(arg='service_name', value=Name(id='service_name', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Port '), FormattedValue(value=Name(id='port_number', ctx=Load()), conversion=-1), Constant(value='/'), FormattedValue(value=Name(id='protocol', ctx=Load()), conversion=-1), Constant(value=' on '), FormattedValue(value=Name(id='ip_addr', ctx=Load()), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], orelse=[]), Assign(targets=[Name(id='metadata', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='metadata'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='root_domain', ctx=Store())], value=Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='root_domain'), Constant(value='')], keywords=[])), If(test=Name(id='root_domain', ctx=Load()), body=[Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MATCH (d:Domain {name: $root_domain, user_id: $user_id, project_id: $project_id})\\n                        SET d.port_scan_timestamp = $scan_timestamp,\\n                            d.port_scan_type = $scan_type,\\n                            d.port_scan_ports_config = $ports_config,\\n                            d.port_scan_total_open_ports = $total_open_ports,\\n                            d.updated_at = datetime()\\n                        ')], keywords=[keyword(arg='root_domain', value=Name(id='root_domain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='scan_timestamp', value=Call(func=Attribute(value=Name(id='scan_metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_timestamp')], keywords=[])), keyword(arg='scan_type', value=Call(func=Attribute(value=Name(id='scan_metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_type')], keywords=[])), keyword(arg='ports_config', value=Call(func=Attribute(value=Name(id='scan_metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ports_config')], keywords=[])), keyword(arg='total_open_ports', value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='port_scan_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='summary'), Dict(keys=[], values=[])], keywords=[]), attr='get', ctx=Load()), args=[Constant(value='total_open_ports'), Constant(value=0)], keywords=[]))]))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Domain update failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Updated '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ips_updated'), ctx=Load()), conversion=-1), Constant(value=' IP nodes with CDN info')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='ports_created'), ctx=Load()), conversion=-1), Constant(value=' Port nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='services_created'), ctx=Load()), conversion=-1), Constant(value=' Service nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Load()), conversion=-1), Constant(value=' relationships')])], keywords=[])), If(test=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] '), FormattedValue(value=Call(func=Name(id='len', ctx=Load()), args=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load())], keywords=[]), conversion=-1), Constant(value=' errors occurred')])], keywords=[]))], orelse=[])]), Return(value=Name(id='stats', ctx=Load()))], decorator_list=[], returns=Name(id='dict', ctx=Load()), type_params=[])",
  "update_graph_from_resource_enum": "FunctionDef(name='update_graph_from_resource_enum', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='recon_data', annotation=Name(id='dict', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='\\n        Update the Neo4j graph database with resource enumeration data.\\n\\n        This function creates/updates:\\n        - Endpoint nodes (discovered paths with their HTTP methods)\\n        - Parameter nodes (query/body parameters)\\n        - Form nodes (POST forms discovered)\\n        - Relationships: BaseURL -[:HAS_ENDPOINT]-> Endpoint -[:HAS_PARAMETER]-> Parameter\\n\\n        Args:\\n            recon_data: The recon JSON data containing resource_enum results\\n            user_id: User identifier for multi-tenant isolation\\n            project_id: Project identifier for multi-tenant isolation\\n\\n        Returns:\\n            Dictionary with statistics about created/updated nodes/relationships\\n        ')), Assign(targets=[Name(id='stats', ctx=Store())], value=Dict(keys=[Constant(value='endpoints_created'), Constant(value='parameters_created'), Constant(value='forms_created'), Constant(value='secrets_created'), Constant(value='relationships_created'), Constant(value='errors')], values=[Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), List(elts=[], ctx=Load())])), Assign(targets=[Name(id='resource_enum_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='resource_enum'), Dict(keys=[], values=[])], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='resource_enum_data', ctx=Load())), body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[Constant(value='No resource_enum data found in recon_data')], keywords=[])), Return(value=Name(id='stats', ctx=Load()))], orelse=[]), Assign(targets=[Name(id='target_subdomains', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomains'), List(elts=[], ctx=Load())], keywords=[])], keywords=[])), Assign(targets=[Name(id='target_domain', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='domain'), Constant(value='')], keywords=[])), If(test=BoolOp(op=And(), values=[Name(id='target_domain', ctx=Load()), UnaryOp(op=Not(), operand=Name(id='target_subdomains', ctx=Load()))]), body=[Expr(value=Call(func=Attribute(value=Name(id='target_subdomains', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='target_domain', ctx=Load())], keywords=[]))], orelse=[]), FunctionDef(name='is_in_scope', args=arguments(posonlyargs=[], args=[arg(arg='base_url', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value=\"Check if a base URL's hostname is within the scan scope.\")), If(test=UnaryOp(op=Not(), operand=Name(id='target_subdomains', ctx=Load())), body=[Return(value=Constant(value=True))], orelse=[]), Assign(targets=[Name(id='parsed', ctx=Store())], value=Call(func=Name(id='urlparse', ctx=Load()), args=[Name(id='base_url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='host', ctx=Store())], value=IfExp(test=Compare(left=Constant(value=':'), ops=[In()], comparators=[Attribute(value=Name(id='parsed', ctx=Load()), attr='netloc', ctx=Load())]), body=Subscript(value=Call(func=Attribute(value=Attribute(value=Name(id='parsed', ctx=Load()), attr='netloc', ctx=Load()), attr='split', ctx=Load()), args=[Constant(value=':')], keywords=[]), slice=Constant(value=0), ctx=Load()), orelse=Attribute(value=Name(id='parsed', ctx=Load()), attr='netloc', ctx=Load()))), Return(value=Compare(left=Name(id='host', ctx=Load()), ops=[In()], comparators=[Name(id='target_subdomains', ctx=Load())]))], decorator_list=[], returns=Name(id='bool', ctx=Load()), type_params=[]), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[Assign(targets=[Name(id='by_base_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='resource_enum_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='by_base_url'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='forms', ctx=Store())], value=Call(func=Attribute(value=Name(id='resource_enum_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='forms'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='created_endpoints', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), Assign(targets=[Name(id='created_parameters', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), Assign(targets=[Name(id='skipped_out_of_scope', ctx=Store())], value=Constant(value=0)), For(target=Tuple(elts=[Name(id='base_url', ctx=Store()), Name(id='base_data', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='by_base_url', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[If(test=UnaryOp(op=Not(), operand=Call(func=Name(id='is_in_scope', ctx=Load()), args=[Name(id='base_url', ctx=Load())], keywords=[])), body=[AugAssign(target=Name(id='skipped_out_of_scope', ctx=Store()), op=Add(), value=Constant(value=1)), Continue()], orelse=[]), Assign(targets=[Name(id='endpoints', ctx=Store())], value=Call(func=Attribute(value=Name(id='base_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='endpoints'), Dict(keys=[], values=[])], keywords=[])), For(target=Tuple(elts=[Name(id='path', ctx=Store()), Name(id='endpoint_info', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='endpoints', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[Try(body=[Assign(targets=[Name(id='methods', ctx=Store())], value=Call(func=Attribute(value=Name(id='endpoint_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='methods'), List(elts=[Constant(value='GET')], ctx=Load())], keywords=[])), Assign(targets=[Name(id='category', ctx=Store())], value=Call(func=Attribute(value=Name(id='endpoint_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='category'), Constant(value='other')], keywords=[])), Assign(targets=[Name(id='param_count', ctx=Store())], value=Call(func=Attribute(value=Name(id='endpoint_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='parameter_count'), Dict(keys=[], values=[])], keywords=[])), For(target=Name(id='method', ctx=Store()), iter=Name(id='methods', ctx=Load()), body=[Assign(targets=[Name(id='endpoint_key', ctx=Store())], value=Tuple(elts=[Name(id='base_url', ctx=Load()), Name(id='path', ctx=Load()), Name(id='method', ctx=Load())], ctx=Load())), If(test=Compare(left=Name(id='endpoint_key', ctx=Load()), ops=[In()], comparators=[Name(id='created_endpoints', ctx=Load())]), body=[Continue()], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                MERGE (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                SET e.user_id = $user_id,\\n                                    e.project_id = $project_id,\\n                                    e.category = $category,\\n                                    e.has_parameters = $has_params,\\n                                    e.query_param_count = $query_count,\\n                                    e.body_param_count = $body_count,\\n                                    e.path_param_count = $path_count,\\n                                    e.urls_found = $urls_found,\\n                                    e.source = 'resource_enum',\\n                                    e.updated_at = datetime()\\n                                \")], keywords=[keyword(arg='path', value=Name(id='path', ctx=Load())), keyword(arg='method', value=Name(id='method', ctx=Load())), keyword(arg='baseurl', value=Name(id='base_url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='category', value=Name(id='category', ctx=Load())), keyword(arg='has_params', value=Compare(left=Call(func=Attribute(value=Name(id='param_count', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='total'), Constant(value=0)], keywords=[]), ops=[Gt()], comparators=[Constant(value=0)])), keyword(arg='query_count', value=Call(func=Attribute(value=Name(id='param_count', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='query'), Constant(value=0)], keywords=[])), keyword(arg='body_count', value=Call(func=Attribute(value=Name(id='param_count', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='body'), Constant(value=0)], keywords=[])), keyword(arg='path_count', value=Call(func=Attribute(value=Name(id='param_count', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='path'), Constant(value=0)], keywords=[])), keyword(arg='urls_found', value=Call(func=Attribute(value=Name(id='endpoint_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='urls_found'), Constant(value=1)], keywords=[]))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='endpoints_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='created_endpoints', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='endpoint_key', ctx=Load())], keywords=[])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                MERGE (bu:BaseURL {url: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                ON CREATE SET bu.source = 'resource_enum',\\n                                              bu.updated_at = datetime()\\n                                WITH bu\\n                                MATCH (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                MERGE (bu)-[:HAS_ENDPOINT]->(e)\\n                                \")], keywords=[keyword(arg='baseurl', value=Name(id='base_url', ctx=Load())), keyword(arg='path', value=Name(id='path', ctx=Load())), keyword(arg='method', value=Name(id='method', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[]), Assign(targets=[Name(id='parameters', ctx=Store())], value=Call(func=Attribute(value=Name(id='endpoint_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='parameters'), Dict(keys=[], values=[])], keywords=[])), For(target=Name(id='param', ctx=Store()), iter=Call(func=Attribute(value=Name(id='parameters', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='query'), List(elts=[], ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='param_name', ctx=Store())], value=Call(func=Attribute(value=Name(id='param', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name')], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='param_name', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='param_key', ctx=Store())], value=Tuple(elts=[Name(id='base_url', ctx=Load()), Name(id='path', ctx=Load()), Name(id='param_name', ctx=Load()), Constant(value='query')], ctx=Load())), If(test=Compare(left=Name(id='param_key', ctx=Load()), ops=[In()], comparators=[Name(id='created_parameters', ctx=Load())]), body=[Continue()], orelse=[]), Assign(targets=[Name(id='sample_values', ctx=Store())], value=Call(func=Attribute(value=Name(id='param', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='sample_values'), List(elts=[], ctx=Load())], keywords=[])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                MERGE (p:Parameter {name: $name, position: $position, endpoint_path: $endpoint_path, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                SET p.user_id = $user_id,\\n                                    p.project_id = $project_id,\\n                                    p.type = $param_type,\\n                                    p.category = $category,\\n                                    p.sample_values = $sample_values,\\n                                    p.is_injectable = false,\\n                                    p.source = 'resource_enum',\\n                                    p.updated_at = datetime()\\n                                \")], keywords=[keyword(arg='name', value=Name(id='param_name', ctx=Load())), keyword(arg='position', value=Constant(value='query')), keyword(arg='endpoint_path', value=Name(id='path', ctx=Load())), keyword(arg='baseurl', value=Name(id='base_url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='param_type', value=Call(func=Attribute(value=Name(id='param', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='type'), Constant(value='string')], keywords=[])), keyword(arg='category', value=Call(func=Attribute(value=Name(id='param', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='category'), Constant(value='other')], keywords=[])), keyword(arg='sample_values', value=Subscript(value=Name(id='sample_values', ctx=Load()), slice=Slice(upper=Constant(value=5)), ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='parameters_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='created_parameters', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='param_key', ctx=Load())], keywords=[])), For(target=Name(id='method', ctx=Store()), iter=Name(id='methods', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MATCH (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                    MATCH (p:Parameter {name: $param_name, position: $position, endpoint_path: $path, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                    MERGE (e)-[:HAS_PARAMETER]->(p)\\n                                    ')], keywords=[keyword(arg='path', value=Name(id='path', ctx=Load())), keyword(arg='method', value=Name(id='method', ctx=Load())), keyword(arg='baseurl', value=Name(id='base_url', ctx=Load())), keyword(arg='param_name', value=Name(id='param_name', ctx=Load())), keyword(arg='position', value=Constant(value='query')), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], orelse=[]), For(target=Name(id='param', ctx=Store()), iter=Call(func=Attribute(value=Name(id='parameters', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='body'), List(elts=[], ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='param_name', ctx=Store())], value=Call(func=Attribute(value=Name(id='param', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name')], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='param_name', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='param_key', ctx=Store())], value=Tuple(elts=[Name(id='base_url', ctx=Load()), Name(id='path', ctx=Load()), Name(id='param_name', ctx=Load()), Constant(value='body')], ctx=Load())), If(test=Compare(left=Name(id='param_key', ctx=Load()), ops=[In()], comparators=[Name(id='created_parameters', ctx=Load())]), body=[Continue()], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                MERGE (p:Parameter {name: $name, position: $position, endpoint_path: $endpoint_path, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                SET p.user_id = $user_id,\\n                                    p.project_id = $project_id,\\n                                    p.type = $param_type,\\n                                    p.category = $category,\\n                                    p.input_type = $input_type,\\n                                    p.required = $required,\\n                                    p.is_injectable = false,\\n                                    p.source = 'resource_enum',\\n                                    p.updated_at = datetime()\\n                                \")], keywords=[keyword(arg='name', value=Name(id='param_name', ctx=Load())), keyword(arg='position', value=Constant(value='body')), keyword(arg='endpoint_path', value=Name(id='path', ctx=Load())), keyword(arg='baseurl', value=Name(id='base_url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='param_type', value=Call(func=Attribute(value=Name(id='param', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='type'), Constant(value='string')], keywords=[])), keyword(arg='category', value=Call(func=Attribute(value=Name(id='param', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='category'), Constant(value='other')], keywords=[])), keyword(arg='input_type', value=Call(func=Attribute(value=Name(id='param', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='input_type'), Constant(value='text')], keywords=[])), keyword(arg='required', value=Call(func=Attribute(value=Name(id='param', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='required'), Constant(value=False)], keywords=[]))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='parameters_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='created_parameters', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='param_key', ctx=Load())], keywords=[])), If(test=Compare(left=Constant(value='POST'), ops=[In()], comparators=[Name(id='methods', ctx=Load())]), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                    MATCH (e:Endpoint {path: $path, method: 'POST', baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                    MATCH (p:Parameter {name: $param_name, position: $position, endpoint_path: $path, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                    MERGE (e)-[:HAS_PARAMETER]->(p)\\n                                    \")], keywords=[keyword(arg='path', value=Name(id='path', ctx=Load())), keyword(arg='baseurl', value=Name(id='base_url', ctx=Load())), keyword(arg='param_name', value=Name(id='param_name', ctx=Load())), keyword(arg='position', value=Constant(value='body')), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Endpoint '), FormattedValue(value=Name(id='path', ctx=Load()), conversion=-1), Constant(value=' processing failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], orelse=[]), Assign(targets=[Name(id='form_data_by_endpoint', ctx=Store())], value=Dict(keys=[], values=[])), For(target=Name(id='form', ctx=Store()), iter=Name(id='forms', ctx=Load()), body=[Try(body=[Assign(targets=[Name(id='action', ctx=Store())], value=Call(func=Attribute(value=Name(id='form', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='action'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='method', ctx=Store())], value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='form', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='method'), Constant(value='POST')], keywords=[]), attr='upper', ctx=Load()), args=[], keywords=[])), Assign(targets=[Name(id='found_at', ctx=Store())], value=Call(func=Attribute(value=Name(id='form', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='found_at'), Constant(value='')], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='action', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='parsed', ctx=Store())], value=Call(func=Name(id='urlparse', ctx=Load()), args=[Name(id='action', ctx=Load())], keywords=[])), Assign(targets=[Name(id='path', ctx=Store())], value=BoolOp(op=Or(), values=[Attribute(value=Name(id='parsed', ctx=Load()), attr='path', ctx=Load()), Constant(value='/')])), Assign(targets=[Name(id='baseurl', ctx=Store())], value=IfExp(test=Attribute(value=Name(id='parsed', ctx=Load()), attr='netloc', ctx=Load()), body=JoinedStr(values=[FormattedValue(value=Attribute(value=Name(id='parsed', ctx=Load()), attr='scheme', ctx=Load()), conversion=-1), Constant(value='://'), FormattedValue(value=Attribute(value=Name(id='parsed', ctx=Load()), attr='netloc', ctx=Load()), conversion=-1)]), orelse=Constant(value=''))), If(test=BoolOp(op=And(), values=[UnaryOp(op=Not(), operand=Name(id='baseurl', ctx=Load())), Name(id='found_at', ctx=Load())]), body=[Assign(targets=[Name(id='found_parsed', ctx=Store())], value=Call(func=Name(id='urlparse', ctx=Load()), args=[Name(id='found_at', ctx=Load())], keywords=[])), Assign(targets=[Name(id='baseurl', ctx=Store())], value=JoinedStr(values=[FormattedValue(value=Attribute(value=Name(id='found_parsed', ctx=Load()), attr='scheme', ctx=Load()), conversion=-1), Constant(value='://'), FormattedValue(value=Attribute(value=Name(id='found_parsed', ctx=Load()), attr='netloc', ctx=Load()), conversion=-1)]))], orelse=[]), Assign(targets=[Name(id='endpoint_key', ctx=Store())], value=Tuple(elts=[Name(id='baseurl', ctx=Load()), Name(id='path', ctx=Load()), Name(id='method', ctx=Load())], ctx=Load())), If(test=Compare(left=Name(id='endpoint_key', ctx=Load()), ops=[NotIn()], comparators=[Name(id='form_data_by_endpoint', ctx=Load())]), body=[Assign(targets=[Subscript(value=Name(id='form_data_by_endpoint', ctx=Load()), slice=Name(id='endpoint_key', ctx=Load()), ctx=Store())], value=Dict(keys=[Constant(value='found_at_pages'), Constant(value='enctype'), Constant(value='input_names'), Constant(value='input_types')], values=[Call(func=Name(id='set', ctx=Load()), args=[], keywords=[]), Call(func=Attribute(value=Name(id='form', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='enctype'), Constant(value='application/x-www-form-urlencoded')], keywords=[]), Call(func=Name(id='set', ctx=Load()), args=[], keywords=[]), Dict(keys=[], values=[])]))], orelse=[]), If(test=Name(id='found_at', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Subscript(value=Subscript(value=Name(id='form_data_by_endpoint', ctx=Load()), slice=Name(id='endpoint_key', ctx=Load()), ctx=Load()), slice=Constant(value='found_at_pages'), ctx=Load()), attr='add', ctx=Load()), args=[Name(id='found_at', ctx=Load())], keywords=[]))], orelse=[]), For(target=Name(id='inp', ctx=Store()), iter=Call(func=Attribute(value=Name(id='form', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='inputs'), List(elts=[], ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='inp_name', ctx=Store())], value=Call(func=Attribute(value=Name(id='inp', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='inp_type', ctx=Store())], value=Call(func=Attribute(value=Name(id='inp', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='type'), Constant(value='text')], keywords=[])), If(test=BoolOp(op=And(), values=[Name(id='inp_name', ctx=Load()), Compare(left=Name(id='inp_type', ctx=Load()), ops=[NotEq()], comparators=[Constant(value='submit')])]), body=[Expr(value=Call(func=Attribute(value=Subscript(value=Subscript(value=Name(id='form_data_by_endpoint', ctx=Load()), slice=Name(id='endpoint_key', ctx=Load()), ctx=Load()), slice=Constant(value='input_names'), ctx=Load()), attr='add', ctx=Load()), args=[Name(id='inp_name', ctx=Load())], keywords=[])), Assign(targets=[Subscript(value=Subscript(value=Subscript(value=Name(id='form_data_by_endpoint', ctx=Load()), slice=Name(id='endpoint_key', ctx=Load()), ctx=Load()), slice=Constant(value='input_types'), ctx=Load()), slice=Name(id='inp_name', ctx=Load()), ctx=Store())], value=Name(id='inp_type', ctx=Load()))], orelse=[])], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Form data collection failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), For(target=Tuple(elts=[Tuple(elts=[Name(id='baseurl', ctx=Store()), Name(id='path', ctx=Store()), Name(id='method', ctx=Store())], ctx=Store()), Name(id='form_info', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='form_data_by_endpoint', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MATCH (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                        SET e.is_form = true,\\n                            e.form_enctype = $enctype,\\n                            e.form_found_at_pages = $found_at_pages,\\n                            e.form_input_names = $input_names,\\n                            e.form_count = $form_count\\n                        ')], keywords=[keyword(arg='path', value=Name(id='path', ctx=Load())), keyword(arg='method', value=Name(id='method', ctx=Load())), keyword(arg='baseurl', value=Name(id='baseurl', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='enctype', value=Subscript(value=Name(id='form_info', ctx=Load()), slice=Constant(value='enctype'), ctx=Load())), keyword(arg='found_at_pages', value=Call(func=Name(id='list', ctx=Load()), args=[Subscript(value=Name(id='form_info', ctx=Load()), slice=Constant(value='found_at_pages'), ctx=Load())], keywords=[])), keyword(arg='input_names', value=Call(func=Name(id='list', ctx=Load()), args=[Subscript(value=Name(id='form_info', ctx=Load()), slice=Constant(value='input_names'), ctx=Load())], keywords=[])), keyword(arg='form_count', value=Call(func=Name(id='len', ctx=Load()), args=[Subscript(value=Name(id='form_info', ctx=Load()), slice=Constant(value='found_at_pages'), ctx=Load())], keywords=[]))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='forms_created'), ctx=Store()), op=Add(), value=Constant(value=1))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Form endpoint update failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='jsluice_secrets', ctx=Store())], value=Call(func=Attribute(value=Name(id='resource_enum_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='jsluice_secrets'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='created_secrets', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), For(target=Name(id='secret', ctx=Store()), iter=Name(id='jsluice_secrets', ctx=Load()), body=[Try(body=[Assign(targets=[Name(id='base_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='base_url'), Constant(value='')], keywords=[])), If(test=BoolOp(op=Or(), values=[UnaryOp(op=Not(), operand=Name(id='base_url', ctx=Load())), UnaryOp(op=Not(), operand=Call(func=Name(id='is_in_scope', ctx=Load()), args=[Name(id='base_url', ctx=Load())], keywords=[]))]), body=[Continue()], orelse=[]), Assign(targets=[Name(id='secret_type', ctx=Store())], value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='kind'), Constant(value='unknown')], keywords=[])), Assign(targets=[Name(id='severity', ctx=Store())], value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='severity'), Constant(value='info')], keywords=[])), Assign(targets=[Name(id='source_url', ctx=Store())], value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source_url'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='data_field', ctx=Store())], value=Call(func=Attribute(value=Name(id='secret', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='data'), Dict(keys=[], values=[])], keywords=[])), If(test=Call(func=Name(id='isinstance', ctx=Load()), args=[Name(id='data_field', ctx=Load()), Name(id='dict', ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='data_str', ctx=Store())], value=Call(func=Attribute(value=Name(id='json', ctx=Load()), attr='dumps', ctx=Load()), args=[Name(id='data_field', ctx=Load())], keywords=[keyword(arg='sort_keys', value=Constant(value=True))]))], orelse=[Assign(targets=[Name(id='data_str', ctx=Store())], value=Call(func=Name(id='str', ctx=Load()), args=[Name(id='data_field', ctx=Load())], keywords=[]))]), Assign(targets=[Name(id='dedup_input', ctx=Store())], value=JoinedStr(values=[FormattedValue(value=Name(id='secret_type', ctx=Load()), conversion=-1), Constant(value='|'), FormattedValue(value=Name(id='source_url', ctx=Load()), conversion=-1), Constant(value='|'), FormattedValue(value=Name(id='data_str', ctx=Load()), conversion=-1), Constant(value='|'), FormattedValue(value=Name(id='user_id', ctx=Load()), conversion=-1), Constant(value='|'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1)])), Assign(targets=[Name(id='dedup_hash', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='hashlib', ctx=Load()), attr='sha256', ctx=Load()), args=[Call(func=Attribute(value=Name(id='dedup_input', ctx=Load()), attr='encode', ctx=Load()), args=[], keywords=[])], keywords=[]), attr='hexdigest', ctx=Load()), args=[], keywords=[]), slice=Slice(upper=Constant(value=16)), ctx=Load())), Assign(targets=[Name(id='node_id', ctx=Store())], value=JoinedStr(values=[Constant(value='secret-'), FormattedValue(value=Name(id='user_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='project_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='dedup_hash', ctx=Load()), conversion=-1)])), If(test=Compare(left=Name(id='node_id', ctx=Load()), ops=[In()], comparators=[Name(id='created_secrets', ctx=Load())]), body=[Continue()], orelse=[]), Assign(targets=[Name(id='matched', ctx=Store())], value=IfExp(test=Call(func=Name(id='isinstance', ctx=Load()), args=[Name(id='data_field', ctx=Load()), Name(id='dict', ctx=Load())], keywords=[]), body=Call(func=Attribute(value=Name(id='data_field', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='match'), Constant(value='')], keywords=[]), orelse=Call(func=Name(id='str', ctx=Load()), args=[Name(id='data_field', ctx=Load())], keywords=[]))), Assign(targets=[Name(id='sample', ctx=Store())], value=IfExp(test=Compare(left=Call(func=Name(id='len', ctx=Load()), args=[Name(id='matched', ctx=Load())], keywords=[]), ops=[Gt()], comparators=[Constant(value=6)]), body=BinOp(left=Subscript(value=Name(id='matched', ctx=Load()), slice=Slice(upper=Constant(value=6)), ctx=Load()), op=Add(), right=Constant(value='...')), orelse=Name(id='matched', ctx=Load()))), Assign(targets=[Name(id='scan_ts', ctx=Store())], value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='resource_enum_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_metadata'), Dict(keys=[], values=[])], keywords=[]), attr='get', ctx=Load()), args=[Constant(value='scan_timestamp'), Constant(value='')], keywords=[])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                        MERGE (s:Secret {id: $id})\\n                        SET s.user_id = $user_id,\\n                            s.project_id = $project_id,\\n                            s.secret_type = $secret_type,\\n                            s.severity = $severity,\\n                            s.source = 'jsluice',\\n                            s.source_url = $source_url,\\n                            s.base_url = $base_url,\\n                            s.sample = $sample,\\n                            s.discovered_at = $discovered_at,\\n                            s.updated_at = datetime()\\n                        WITH s\\n                        MATCH (bu:BaseURL {url: $base_url, user_id: $user_id, project_id: $project_id})\\n                        MERGE (bu)-[:HAS_SECRET]->(s)\\n                        \")], keywords=[keyword(arg='id', value=Name(id='node_id', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='secret_type', value=Name(id='secret_type', ctx=Load())), keyword(arg='severity', value=Name(id='severity', ctx=Load())), keyword(arg='source_url', value=Name(id='source_url', ctx=Load())), keyword(arg='base_url', value=Name(id='base_url', ctx=Load())), keyword(arg='sample', value=Name(id='sample', ctx=Load())), keyword(arg='discovered_at', value=Name(id='scan_ts', ctx=Load()))])), Expr(value=Call(func=Attribute(value=Name(id='created_secrets', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='node_id', ctx=Load())], keywords=[])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='secrets_created'), ctx=Store()), op=Add(), value=Constant(value=1))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Secret node creation failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), If(test=Compare(left=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='secrets_created'), ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='secrets_created'), ctx=Load()), conversion=-1), Constant(value=' Secret nodes')])], keywords=[]))], orelse=[]), Assign(targets=[Name(id='metadata', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='metadata'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='root_domain', ctx=Store())], value=Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='root_domain'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='summary', ctx=Store())], value=Call(func=Attribute(value=Name(id='resource_enum_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='summary'), Dict(keys=[], values=[])], keywords=[])), If(test=Name(id='root_domain', ctx=Load()), body=[Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MATCH (d:Domain {name: $root_domain, user_id: $user_id, project_id: $project_id})\\n                        SET d.resource_enum_timestamp = $scan_timestamp,\\n                            d.resource_enum_total_endpoints = $total_endpoints,\\n                            d.resource_enum_total_parameters = $total_parameters,\\n                            d.resource_enum_total_forms = $total_forms,\\n                            d.updated_at = datetime()\\n                        ')], keywords=[keyword(arg='root_domain', value=Name(id='root_domain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='scan_timestamp', value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='resource_enum_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_metadata'), Dict(keys=[], values=[])], keywords=[]), attr='get', ctx=Load()), args=[Constant(value='scan_timestamp')], keywords=[])), keyword(arg='total_endpoints', value=Call(func=Attribute(value=Name(id='summary', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='total_endpoints'), Constant(value=0)], keywords=[])), keyword(arg='total_parameters', value=Call(func=Attribute(value=Name(id='summary', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='total_parameters'), Constant(value=0)], keywords=[])), keyword(arg='total_forms', value=Call(func=Attribute(value=Name(id='summary', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='total_forms'), Constant(value=0)], keywords=[]))]))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Domain update failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Assign(targets=[Name(id='orphan_result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                MATCH (bu:BaseURL {user_id: $user_id, project_id: $project_id})\\n                WHERE NOT (bu)<-[:SERVES_URL]-()\\n                MATCH (sub:Subdomain {user_id: $user_id, project_id: $project_id})\\n                WHERE bu.url CONTAINS sub.name\\n                MERGE (sub)-[:HAS_BASE_URL]->(bu)\\n                RETURN count(*) AS linked\\n                ')], keywords=[keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), Assign(targets=[Name(id='orphans_linked', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Name(id='orphan_result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[]), slice=Constant(value='linked'), ctx=Load())), If(test=Compare(left=Name(id='orphans_linked', ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Linked '), FormattedValue(value=Name(id='orphans_linked', ctx=Load()), conversion=-1), Constant(value=' orphaned BaseURL(s) to Subdomain')])], keywords=[])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Name(id='orphans_linked', ctx=Load()))], orelse=[]), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='endpoints_created'), ctx=Load()), conversion=-1), Constant(value=' Endpoint nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='parameters_created'), ctx=Load()), conversion=-1), Constant(value=' Parameter nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Processed '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='forms_created'), ctx=Load()), conversion=-1), Constant(value=' form endpoints')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Load()), conversion=-1), Constant(value=' relationships')])], keywords=[])), If(test=Compare(left=Name(id='skipped_out_of_scope', ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[*][graph-db] Skipped '), FormattedValue(value=Name(id='skipped_out_of_scope', ctx=Load()), conversion=-1), Constant(value=' base URLs out of scan scope')])], keywords=[])), Assign(targets=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='skipped_out_of_scope'), ctx=Store())], value=Name(id='skipped_out_of_scope', ctx=Load()))], orelse=[]), If(test=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] '), FormattedValue(value=Call(func=Name(id='len', ctx=Load()), args=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load())], keywords=[]), conversion=-1), Constant(value=' errors occurred')])], keywords=[]))], orelse=[])]), Return(value=Name(id='stats', ctx=Load()))], decorator_list=[], returns=Name(id='dict', ctx=Load()), type_params=[])",
  "update_graph_from_vuln_scan": "FunctionDef(name='update_graph_from_vuln_scan', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='recon_data', annotation=Name(id='dict', ctx=Load())), arg(arg='user_id', annotation=Name(id='str', ctx=Load())), arg(arg='project_id', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='\\n        Update the Neo4j graph database with vulnerability scan data.\\n\\n        This function creates/updates:\\n        - Endpoint nodes (discovered paths/URLs with parameters from Katana crawling)\\n        - Parameter nodes (query/body parameters discovered and tested)\\n        - Vulnerability nodes (DAST findings from Nuclei scanning)\\n        - Relationships: BaseURL -[:HAS_ENDPOINT]-> Endpoint -[:HAS_PARAMETER]-> Parameter\\n        - Relationships: Vulnerability -[:AFFECTS_PARAMETER]-> Parameter, Vulnerability -[:FOUND_AT]-> Endpoint\\n        - Relationships: BaseURL -[:HAS_VULNERABILITY]-> Vulnerability\\n\\n        Args:\\n            recon_data: The recon JSON data containing vuln_scan results\\n            user_id: User identifier for multi-tenant isolation\\n            project_id: Project identifier for multi-tenant isolation\\n\\n        Returns:\\n            Dictionary with statistics about created/updated nodes/relationships\\n        ')), Assign(targets=[Name(id='stats', ctx=Store())], value=Dict(keys=[Constant(value='endpoints_created'), Constant(value='parameters_created'), Constant(value='vulnerabilities_created'), Constant(value='relationships_created'), Constant(value='errors')], values=[Constant(value=0), Constant(value=0), Constant(value=0), Constant(value=0), List(elts=[], ctx=Load())])), Assign(targets=[Name(id='vuln_scan_data', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='vuln_scan'), Dict(keys=[], values=[])], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='vuln_scan_data', ctx=Load())), body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[Constant(value='No vuln_scan data found in recon_data')], keywords=[])), Return(value=Name(id='stats', ctx=Load()))], orelse=[]), Assign(targets=[Name(id='target_subdomains', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='subdomains'), List(elts=[], ctx=Load())], keywords=[])], keywords=[])), Assign(targets=[Name(id='target_domain', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='domain'), Constant(value='')], keywords=[])), If(test=BoolOp(op=And(), values=[Name(id='target_domain', ctx=Load()), UnaryOp(op=Not(), operand=Name(id='target_subdomains', ctx=Load()))]), body=[Expr(value=Call(func=Attribute(value=Name(id='target_subdomains', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='target_domain', ctx=Load())], keywords=[]))], orelse=[]), FunctionDef(name='is_in_scope', args=arguments(posonlyargs=[], args=[arg(arg='hostname', annotation=Name(id='str', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[]), body=[Expr(value=Constant(value='Check if a hostname is within the scan scope (target subdomains).')), If(test=UnaryOp(op=Not(), operand=Name(id='target_subdomains', ctx=Load())), body=[Return(value=Constant(value=True))], orelse=[]), Assign(targets=[Name(id='host_only', ctx=Store())], value=IfExp(test=Compare(left=Constant(value=':'), ops=[In()], comparators=[Name(id='hostname', ctx=Load())]), body=Subscript(value=Call(func=Attribute(value=Name(id='hostname', ctx=Load()), attr='split', ctx=Load()), args=[Constant(value=':')], keywords=[]), slice=Constant(value=0), ctx=Load()), orelse=Name(id='hostname', ctx=Load()))), Return(value=Compare(left=Name(id='host_only', ctx=Load()), ops=[In()], comparators=[Name(id='target_subdomains', ctx=Load())]))], decorator_list=[], returns=Name(id='bool', ctx=Load()), type_params=[]), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[Assign(targets=[Name(id='scan_metadata', ctx=Store())], value=Call(func=Attribute(value=Name(id='vuln_scan_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_metadata'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='discovered_urls', ctx=Store())], value=Call(func=Attribute(value=Name(id='vuln_scan_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='discovered_urls'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='by_target', ctx=Store())], value=Call(func=Attribute(value=Name(id='vuln_scan_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='by_target'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='created_endpoints', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), Assign(targets=[Name(id='created_parameters', ctx=Store())], value=Call(func=Name(id='set', ctx=Load()), args=[], keywords=[])), Assign(targets=[Name(id='skipped_out_of_scope', ctx=Store())], value=Constant(value=0)), Assign(targets=[Name(id='dast_urls', ctx=Store())], value=Call(func=Attribute(value=Name(id='discovered_urls', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='dast_urls_with_params'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='base_urls', ctx=Store())], value=Call(func=Attribute(value=Name(id='discovered_urls', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='base_urls'), List(elts=[], ctx=Load())], keywords=[])), For(target=Name(id='dast_url', ctx=Store()), iter=Name(id='dast_urls', ctx=Load()), body=[Try(body=[Assign(targets=[Name(id='parsed', ctx=Store())], value=Call(func=Name(id='urlparse', ctx=Load()), args=[Name(id='dast_url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='scheme', ctx=Store())], value=BoolOp(op=Or(), values=[Attribute(value=Name(id='parsed', ctx=Load()), attr='scheme', ctx=Load()), Constant(value='http')])), Assign(targets=[Name(id='host', ctx=Store())], value=Attribute(value=Name(id='parsed', ctx=Load()), attr='netloc', ctx=Load())), Assign(targets=[Name(id='path', ctx=Store())], value=BoolOp(op=Or(), values=[Attribute(value=Name(id='parsed', ctx=Load()), attr='path', ctx=Load()), Constant(value='/')])), Assign(targets=[Name(id='query_string', ctx=Store())], value=Attribute(value=Name(id='parsed', ctx=Load()), attr='query', ctx=Load())), If(test=UnaryOp(op=Not(), operand=Call(func=Name(id='is_in_scope', ctx=Load()), args=[Name(id='host', ctx=Load())], keywords=[])), body=[AugAssign(target=Name(id='skipped_out_of_scope', ctx=Store()), op=Add(), value=Constant(value=1)), Continue()], orelse=[]), Assign(targets=[Name(id='base_url', ctx=Store())], value=JoinedStr(values=[FormattedValue(value=Name(id='scheme', ctx=Load()), conversion=-1), Constant(value='://'), FormattedValue(value=Name(id='host', ctx=Load()), conversion=-1)])), Assign(targets=[Name(id='method', ctx=Store())], value=Constant(value='GET')), Assign(targets=[Name(id='endpoint_key', ctx=Store())], value=Tuple(elts=[Name(id='base_url', ctx=Load()), Name(id='path', ctx=Load()), Name(id='method', ctx=Load())], ctx=Load())), If(test=Compare(left=Name(id='endpoint_key', ctx=Load()), ops=[NotIn()], comparators=[Name(id='created_endpoints', ctx=Load())]), body=[Assign(targets=[Name(id='has_parameters', ctx=Store())], value=Call(func=Name(id='bool', ctx=Load()), args=[Name(id='query_string', ctx=Load())], keywords=[])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                            MERGE (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                            SET e.user_id = $user_id,\\n                                e.project_id = $project_id,\\n                                e.has_parameters = $has_parameters,\\n                                e.full_url = $full_url,\\n                                e.source = 'katana_crawl',\\n                                e.updated_at = datetime()\\n                            \")], keywords=[keyword(arg='path', value=Name(id='path', ctx=Load())), keyword(arg='method', value=Name(id='method', ctx=Load())), keyword(arg='baseurl', value=Name(id='base_url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='has_parameters', value=Name(id='has_parameters', ctx=Load())), keyword(arg='full_url', value=Subscript(value=Call(func=Attribute(value=Name(id='dast_url', ctx=Load()), attr='split', ctx=Load()), args=[Constant(value='?')], keywords=[]), slice=Constant(value=0), ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='endpoints_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='created_endpoints', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='endpoint_key', ctx=Load())], keywords=[])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                            MERGE (bu:BaseURL {url: $baseurl, user_id: $user_id, project_id: $project_id})\\n                            ON CREATE SET bu.source = 'resource_enum',\\n                                          bu.updated_at = datetime()\\n                            WITH bu\\n                            MATCH (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                            MERGE (bu)-[:HAS_ENDPOINT]->(e)\\n                            \")], keywords=[keyword(arg='baseurl', value=Name(id='base_url', ctx=Load())), keyword(arg='path', value=Name(id='path', ctx=Load())), keyword(arg='method', value=Name(id='method', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[]), If(test=Name(id='query_string', ctx=Load()), body=[Assign(targets=[Name(id='params', ctx=Store())], value=Call(func=Name(id='parse_qs', ctx=Load()), args=[Name(id='query_string', ctx=Load())], keywords=[keyword(arg='keep_blank_values', value=Constant(value=True))])), For(target=Tuple(elts=[Name(id='param_name', ctx=Store()), Name(id='param_values', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='params', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[Assign(targets=[Name(id='param_key', ctx=Store())], value=Tuple(elts=[Name(id='path', ctx=Load()), Name(id='param_name', ctx=Load()), Constant(value='query')], ctx=Load())), If(test=Compare(left=Name(id='param_key', ctx=Load()), ops=[NotIn()], comparators=[Name(id='created_parameters', ctx=Load())]), body=[Assign(targets=[Name(id='sample_value', ctx=Store())], value=IfExp(test=Name(id='param_values', ctx=Load()), body=Subscript(value=Name(id='param_values', ctx=Load()), slice=Constant(value=0), ctx=Load()), orelse=Constant(value=''))), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MERGE (p:Parameter {name: $name, position: $position, endpoint_path: $endpoint_path, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                    SET p.user_id = $user_id,\\n                                        p.project_id = $project_id,\\n                                        p.sample_value = $sample_value,\\n                                        p.is_injectable = false,\\n                                        p.updated_at = datetime()\\n                                    ')], keywords=[keyword(arg='name', value=Name(id='param_name', ctx=Load())), keyword(arg='position', value=Constant(value='query')), keyword(arg='endpoint_path', value=Name(id='path', ctx=Load())), keyword(arg='baseurl', value=Name(id='base_url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='sample_value', value=Name(id='sample_value', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='parameters_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='created_parameters', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='param_key', ctx=Load())], keywords=[])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MATCH (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                    MATCH (p:Parameter {name: $param_name, position: $position, endpoint_path: $path, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                    MERGE (e)-[:HAS_PARAMETER]->(p)\\n                                    ')], keywords=[keyword(arg='path', value=Name(id='path', ctx=Load())), keyword(arg='method', value=Name(id='method', ctx=Load())), keyword(arg='baseurl', value=Name(id='base_url', ctx=Load())), keyword(arg='param_name', value=Name(id='param_name', ctx=Load())), keyword(arg='position', value=Constant(value='query')), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], orelse=[])], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='DAST URL '), FormattedValue(value=Name(id='dast_url', ctx=Load()), conversion=-1), Constant(value=' processing failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), For(target=Tuple(elts=[Name(id='target_host', ctx=Store()), Name(id='target_data', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='by_target', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[Assign(targets=[Name(id='target_host_only', ctx=Store())], value=IfExp(test=Compare(left=Constant(value=':'), ops=[In()], comparators=[Name(id='target_host', ctx=Load())]), body=Subscript(value=Call(func=Attribute(value=Name(id='target_host', ctx=Load()), attr='split', ctx=Load()), args=[Constant(value=':')], keywords=[]), slice=Constant(value=0), ctx=Load()), orelse=Name(id='target_host', ctx=Load()))), If(test=UnaryOp(op=Not(), operand=Call(func=Name(id='is_in_scope', ctx=Load()), args=[Name(id='target_host_only', ctx=Load())], keywords=[])), body=[AugAssign(target=Name(id='skipped_out_of_scope', ctx=Store()), op=Add(), value=Constant(value=1)), Continue()], orelse=[]), Assign(targets=[Name(id='findings', ctx=Store())], value=Call(func=Attribute(value=Name(id='target_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='findings'), List(elts=[], ctx=Load())], keywords=[])), For(target=Name(id='finding', ctx=Store()), iter=Name(id='findings', ctx=Load()), body=[Try(body=[Assign(targets=[Name(id='raw', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='raw'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='raw_info', ctx=Store())], value=Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='info'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='raw_metadata', ctx=Store())], value=Call(func=Attribute(value=Name(id='raw_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='metadata'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='template_id', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='template_id'), Constant(value='unknown')], keywords=[])), Assign(targets=[Name(id='matched_at', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='matched_at'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='fuzzing_param', ctx=Store())], value=Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='fuzzing_parameter'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='vuln_id', ctx=Store())], value=JoinedStr(values=[FormattedValue(value=Name(id='template_id', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='target_host', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=Name(id='fuzzing_param', ctx=Load()), conversion=-1), Constant(value='-'), FormattedValue(value=BinOp(left=Call(func=Name(id='hash', ctx=Load()), args=[Name(id='matched_at', ctx=Load())], keywords=[]), op=Mod(), right=Constant(value=10000)), conversion=-1)])), Assign(targets=[Name(id='matched_parsed', ctx=Store())], value=Call(func=Name(id='urlparse', ctx=Load()), args=[Name(id='matched_at', ctx=Load())], keywords=[])), Assign(targets=[Name(id='vuln_path', ctx=Store())], value=BoolOp(op=Or(), values=[Attribute(value=Name(id='matched_parsed', ctx=Load()), attr='path', ctx=Load()), Constant(value='/')])), Assign(targets=[Name(id='vuln_scheme', ctx=Store())], value=BoolOp(op=Or(), values=[Attribute(value=Name(id='matched_parsed', ctx=Load()), attr='scheme', ctx=Load()), Constant(value='http')])), Assign(targets=[Name(id='vuln_host', ctx=Store())], value=BoolOp(op=Or(), values=[Attribute(value=Name(id='matched_parsed', ctx=Load()), attr='netloc', ctx=Load()), Name(id='target_host', ctx=Load())])), Assign(targets=[Name(id='vuln_host_only', ctx=Store())], value=IfExp(test=Compare(left=Constant(value=':'), ops=[In()], comparators=[Name(id='vuln_host', ctx=Load())]), body=Subscript(value=Call(func=Attribute(value=Name(id='vuln_host', ctx=Load()), attr='split', ctx=Load()), args=[Constant(value=':')], keywords=[]), slice=Constant(value=0), ctx=Load()), orelse=Name(id='vuln_host', ctx=Load()))), If(test=UnaryOp(op=Not(), operand=Call(func=Name(id='is_in_scope', ctx=Load()), args=[Name(id='vuln_host_only', ctx=Load())], keywords=[])), body=[AugAssign(target=Name(id='skipped_out_of_scope', ctx=Store()), op=Add(), value=Constant(value=1)), Continue()], orelse=[]), Assign(targets=[Name(id='vuln_base_url', ctx=Store())], value=JoinedStr(values=[FormattedValue(value=Name(id='vuln_scheme', ctx=Load()), conversion=-1), Constant(value='://'), FormattedValue(value=Name(id='vuln_host', ctx=Load()), conversion=-1)])), Assign(targets=[Name(id='vuln_props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='source'), Constant(value='template_id'), Constant(value='template_path'), Constant(value='template_url'), Constant(value='name'), Constant(value='description'), Constant(value='severity'), Constant(value='category'), Constant(value='tags'), Constant(value='authors'), Constant(value='references'), Constant(value='cwe_ids'), Constant(value='cves'), Constant(value='cvss_score'), Constant(value='cvss_metrics'), Constant(value='matched_at'), Constant(value='matcher_name'), Constant(value='matcher_status'), Constant(value='extractor_name'), Constant(value='extracted_results'), Constant(value='request_type'), Constant(value='scheme'), Constant(value='host'), Constant(value='port'), Constant(value='path'), Constant(value='matched_ip'), Constant(value='is_dast_finding'), Constant(value='fuzzing_method'), Constant(value='fuzzing_parameter'), Constant(value='fuzzing_position'), Constant(value='max_requests'), Constant(value='curl_command'), Constant(value='raw_request'), Constant(value='raw_response'), Constant(value='timestamp'), Constant(value='discovered_at')], values=[Name(id='vuln_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Constant(value='nuclei'), Name(id='template_id', ctx=Load()), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='template_path')], keywords=[]), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='template-url')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='description')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='severity')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='category')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='tags'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='raw_info', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='author'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='reference'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cwe_id'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cves'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cvss_score')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cvss_metrics')], keywords=[]), Name(id='matched_at', ctx=Load()), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='matcher_name')], keywords=[]), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='matcher-status'), Constant(value=False)], keywords=[]), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='extractor-name')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='extracted_results'), List(elts=[], ctx=Load())], keywords=[]), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='type')], keywords=[]), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scheme')], keywords=[]), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='host')], keywords=[]), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port')], keywords=[]), Name(id='vuln_path', ctx=Load()), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ip')], keywords=[]), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='is_fuzzing_result'), Constant(value=False)], keywords=[]), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='fuzzing_method')], keywords=[]), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='fuzzing_parameter')], keywords=[]), Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='fuzzing_position')], keywords=[]), Call(func=Attribute(value=Name(id='raw_metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='max-request')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='curl_command')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='request')], keywords=[]), IfExp(test=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='response')], keywords=[]), body=Subscript(value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='response'), Constant(value='')], keywords=[]), slice=Slice(upper=Constant(value=5000)), ctx=Load()), orelse=Constant(value=None)), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='timestamp')], keywords=[]), Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='timestamp')], keywords=[])])), Assign(targets=[Name(id='vuln_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='vuln_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MERGE (v:Vulnerability {id: $id})\\n                            SET v += $props,\\n                                v.updated_at = datetime()\\n                            ')], keywords=[keyword(arg='id', value=Name(id='vuln_id', ctx=Load())), keyword(arg='props', value=Name(id='vuln_props', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='vulnerabilities_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='fuzzing_method', ctx=Store())], value=Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='fuzzing_method'), Constant(value='GET')], keywords=[])), Assign(targets=[Name(id='endpoint_key', ctx=Store())], value=Tuple(elts=[Name(id='vuln_base_url', ctx=Load()), Name(id='vuln_path', ctx=Load()), Name(id='fuzzing_method', ctx=Load())], ctx=Load())), If(test=Compare(left=Name(id='endpoint_key', ctx=Load()), ops=[NotIn()], comparators=[Name(id='created_endpoints', ctx=Load())]), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                MERGE (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                SET e.user_id = $user_id,\\n                                    e.project_id = $project_id,\\n                                    e.has_parameters = true,\\n                                    e.source = 'vuln_scan',\\n                                    e.updated_at = datetime()\\n                                \")], keywords=[keyword(arg='path', value=Name(id='vuln_path', ctx=Load())), keyword(arg='method', value=Name(id='fuzzing_method', ctx=Load())), keyword(arg='baseurl', value=Name(id='vuln_base_url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='endpoints_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='created_endpoints', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='endpoint_key', ctx=Load())], keywords=[])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value=\"\\n                                MERGE (bu:BaseURL {url: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                ON CREATE SET bu.source = 'vuln_scan',\\n                                              bu.updated_at = datetime()\\n                                WITH bu\\n                                MATCH (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                MERGE (bu)-[:HAS_ENDPOINT]->(e)\\n                                \")], keywords=[keyword(arg='baseurl', value=Name(id='vuln_base_url', ctx=Load())), keyword(arg='path', value=Name(id='vuln_path', ctx=Load())), keyword(arg='method', value=Name(id='fuzzing_method', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (v:Vulnerability {id: $vuln_id})\\n                            MATCH (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                            MERGE (v)-[:FOUND_AT]->(e)\\n                            ')], keywords=[keyword(arg='vuln_id', value=Name(id='vuln_id', ctx=Load())), keyword(arg='path', value=Name(id='vuln_path', ctx=Load())), keyword(arg='method', value=Name(id='fuzzing_method', ctx=Load())), keyword(arg='baseurl', value=Name(id='vuln_base_url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='fuzzing_param', ctx=Store())], value=Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='fuzzing_parameter')], keywords=[])), Assign(targets=[Name(id='fuzzing_position', ctx=Store())], value=Call(func=Attribute(value=Name(id='raw', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='fuzzing_position'), Constant(value='query')], keywords=[])), If(test=Name(id='fuzzing_param', ctx=Load()), body=[Assign(targets=[Name(id='param_key', ctx=Store())], value=Tuple(elts=[Name(id='vuln_path', ctx=Load()), Name(id='fuzzing_param', ctx=Load()), Name(id='fuzzing_position', ctx=Load())], ctx=Load())), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MERGE (p:Parameter {name: $name, position: $position, endpoint_path: $endpoint_path, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                SET p.user_id = $user_id,\\n                                    p.project_id = $project_id,\\n                                    p.is_injectable = true,\\n                                    p.updated_at = datetime()\\n                                ')], keywords=[keyword(arg='name', value=Name(id='fuzzing_param', ctx=Load())), keyword(arg='position', value=Name(id='fuzzing_position', ctx=Load())), keyword(arg='endpoint_path', value=Name(id='vuln_path', ctx=Load())), keyword(arg='baseurl', value=Name(id='vuln_base_url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), If(test=Compare(left=Name(id='param_key', ctx=Load()), ops=[NotIn()], comparators=[Name(id='created_parameters', ctx=Load())]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='parameters_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Expr(value=Call(func=Attribute(value=Name(id='created_parameters', ctx=Load()), attr='add', ctx=Load()), args=[Name(id='param_key', ctx=Load())], keywords=[])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MATCH (e:Endpoint {path: $path, method: $method, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                    MATCH (p:Parameter {name: $param_name, position: $position, endpoint_path: $path, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                    MERGE (e)-[:HAS_PARAMETER]->(p)\\n                                    ')], keywords=[keyword(arg='path', value=Name(id='vuln_path', ctx=Load())), keyword(arg='method', value=Name(id='fuzzing_method', ctx=Load())), keyword(arg='baseurl', value=Name(id='vuln_base_url', ctx=Load())), keyword(arg='param_name', value=Name(id='fuzzing_param', ctx=Load())), keyword(arg='position', value=Name(id='fuzzing_position', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (v:Vulnerability {id: $vuln_id})\\n                                MATCH (p:Parameter {name: $param_name, position: $position, endpoint_path: $path, baseurl: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                MERGE (v)-[:AFFECTS_PARAMETER]->(p)\\n                                ')], keywords=[keyword(arg='vuln_id', value=Name(id='vuln_id', ctx=Load())), keyword(arg='param_name', value=Name(id='fuzzing_param', ctx=Load())), keyword(arg='position', value=Name(id='fuzzing_position', ctx=Load())), keyword(arg='path', value=Name(id='vuln_path', ctx=Load())), keyword(arg='baseurl', value=Name(id='vuln_base_url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Finding '), FormattedValue(value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='template_id'), Constant(value='unknown')], keywords=[]), conversion=-1), Constant(value=' processing failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], orelse=[]), Assign(targets=[Name(id='technology_cves', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='technology_cves'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='by_technology', ctx=Store())], value=Call(func=Attribute(value=Name(id='technology_cves', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='by_technology'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='cves_created', ctx=Store())], value=Constant(value=0)), Assign(targets=[Name(id='mitre_stats', ctx=Store())], value=Dict(keys=[Constant(value='nodes'), Constant(value='capec'), Constant(value='rels')], values=[Constant(value=0), Constant(value=0), Constant(value=0)])), Assign(targets=[Name(id='cve_relationships_created', ctx=Store())], value=Constant(value=0)), For(target=Tuple(elts=[Name(id='tech_name', ctx=Store()), Name(id='tech_data', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='by_technology', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[Assign(targets=[Name(id='tech_product', ctx=Store())], value=Call(func=Attribute(value=Name(id='tech_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='product'), Name(id='tech_name', ctx=Load())], keywords=[])), Assign(targets=[Name(id='tech_version', ctx=Store())], value=Call(func=Attribute(value=Name(id='tech_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='version')], keywords=[])), Assign(targets=[Name(id='cves', ctx=Store())], value=Call(func=Attribute(value=Name(id='tech_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cves'), List(elts=[], ctx=Load())], keywords=[])), Assign(targets=[Name(id='tech_name_clean', ctx=Store())], value=Name(id='tech_name', ctx=Load())), If(test=Name(id='tech_version', ctx=Load()), body=[For(target=Name(id='sep', ctx=Store()), iter=List(elts=[Constant(value=':'), Constant(value='/')], ctx=Load()), body=[Assign(targets=[Name(id='suffix', ctx=Store())], value=JoinedStr(values=[FormattedValue(value=Name(id='sep', ctx=Load()), conversion=-1), FormattedValue(value=Name(id='tech_version', ctx=Load()), conversion=-1)])), If(test=Call(func=Attribute(value=Name(id='tech_name_clean', ctx=Load()), attr='endswith', ctx=Load()), args=[Name(id='suffix', ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='tech_name_clean', ctx=Store())], value=Subscript(value=Name(id='tech_name_clean', ctx=Load()), slice=Slice(upper=UnaryOp(op=USub(), operand=Call(func=Name(id='len', ctx=Load()), args=[Name(id='suffix', ctx=Load())], keywords=[]))), ctx=Load())), Break()], orelse=[])], orelse=[])], orelse=[]), For(target=Name(id='cve', ctx=Store()), iter=Name(id='cves', ctx=Load()), body=[Try(body=[Assign(targets=[Name(id='cve_id', ctx=Store())], value=Call(func=Attribute(value=Name(id='cve', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='id')], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='cve_id', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='cve_props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='cve_id'), Constant(value='name'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='cvss'), Constant(value='severity'), Constant(value='description'), Constant(value='published'), Constant(value='source'), Constant(value='url')], values=[Name(id='cve_id', ctx=Load()), Name(id='cve_id', ctx=Load()), Name(id='cve_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Call(func=Attribute(value=Name(id='cve', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cvss')], keywords=[]), Call(func=Attribute(value=Name(id='cve', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='severity')], keywords=[]), Call(func=Attribute(value=Name(id='cve', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='description')], keywords=[]), Call(func=Attribute(value=Name(id='cve', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='published')], keywords=[]), Call(func=Attribute(value=Name(id='cve', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='source')], keywords=[]), Call(func=Attribute(value=Name(id='cve', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='url')], keywords=[])])), Assign(targets=[Name(id='references', ctx=Store())], value=Call(func=Attribute(value=Name(id='cve', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='references'), List(elts=[], ctx=Load())], keywords=[])), If(test=Name(id='references', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='cve_props', ctx=Load()), slice=Constant(value='references'), ctx=Store())], value=Name(id='references', ctx=Load()))], orelse=[]), Assign(targets=[Name(id='cve_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='cve_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MERGE (c:CVE {id: $id})\\n                            SET c += $props,\\n                                c.updated_at = datetime()\\n                            ')], keywords=[keyword(arg='id', value=Name(id='cve_id', ctx=Load())), keyword(arg='props', value=Name(id='cve_props', ctx=Load()))])), AugAssign(target=Name(id='cves_created', ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='name_where', ctx=Store())], value=Constant(value='\\n                            (toLower(t.name) = toLower($tech_name_clean)\\n                             OR toLower(t.name) = toLower($tech_product)\\n                             OR toLower(t.name) = toLower($tech_key)\\n                             OR toLower(t.name) CONTAINS toLower($tech_product))\\n                        ')), Assign(targets=[Name(id='matched', ctx=Store())], value=Constant(value=0)), If(test=Name(id='tech_version', ctx=Load()), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[JoinedStr(values=[Constant(value='\\n                                MATCH (t:Technology {user_id: $user_id, project_id: $project_id})\\n                                WHERE '), FormattedValue(value=Name(id='name_where', ctx=Load()), conversion=-1), Constant(value=' AND t.version = $tech_version\\n                                MATCH (c:CVE {id: $cve_id})\\n                                MERGE (t)-[:HAS_KNOWN_CVE]->(c)\\n                                RETURN count(*) as matched\\n                                ')])], keywords=[keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='tech_name_clean', value=Name(id='tech_name_clean', ctx=Load())), keyword(arg='tech_product', value=Name(id='tech_product', ctx=Load())), keyword(arg='tech_key', value=Name(id='tech_name', ctx=Load())), keyword(arg='tech_version', value=Name(id='tech_version', ctx=Load())), keyword(arg='cve_id', value=Name(id='cve_id', ctx=Load()))])), Assign(targets=[Name(id='matched', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[]), slice=Constant(value='matched'), ctx=Load()))], orelse=[]), If(test=Compare(left=Name(id='matched', ctx=Load()), ops=[Eq()], comparators=[Constant(value=0)]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[JoinedStr(values=[Constant(value='\\n                                MATCH (t:Technology {user_id: $user_id, project_id: $project_id})\\n                                WHERE '), FormattedValue(value=Name(id='name_where', ctx=Load()), conversion=-1), Constant(value='\\n                                MATCH (c:CVE {id: $cve_id})\\n                                MERGE (t)-[:HAS_KNOWN_CVE]->(c)\\n                                RETURN count(*) as matched\\n                                ')])], keywords=[keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='tech_name_clean', value=Name(id='tech_name_clean', ctx=Load())), keyword(arg='tech_product', value=Name(id='tech_product', ctx=Load())), keyword(arg='tech_key', value=Name(id='tech_name', ctx=Load())), keyword(arg='cve_id', value=Name(id='cve_id', ctx=Load()))])), Assign(targets=[Name(id='matched', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[]), slice=Constant(value='matched'), ctx=Load()))], orelse=[]), If(test=Compare(left=Name(id='matched', ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[AugAssign(target=Name(id='cve_relationships_created', ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[]), Assign(targets=[Name(id='mitre_attack', ctx=Store())], value=Call(func=Attribute(value=Name(id='cve', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='mitre_attack'), Dict(keys=[], values=[])], keywords=[])), If(test=Call(func=Attribute(value=Name(id='mitre_attack', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='enriched')], keywords=[]), body=[Assign(targets=[Name(id='cwe_hierarchy', ctx=Store())], value=Call(func=Attribute(value=Name(id='mitre_attack', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='cwe_hierarchy')], keywords=[])), If(test=Name(id='cwe_hierarchy', ctx=Load()), body=[Assign(targets=[Name(id='cwes_with_capec', ctx=Store())], value=List(elts=[], ctx=Load())), Expr(value=Call(func=Attribute(value=Name(id='self', ctx=Load()), attr='_find_cwes_with_capec', ctx=Load()), args=[Name(id='cwe_hierarchy', ctx=Load()), Name(id='cwes_with_capec', ctx=Load())], keywords=[])), For(target=Name(id='cwe_node', ctx=Store()), iter=Name(id='cwes_with_capec', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='self', ctx=Load()), attr='_process_cwe_with_capec', ctx=Load()), args=[Name(id='session', ctx=Load()), Name(id='cwe_node', ctx=Load()), Name(id='cve_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load())], keywords=[keyword(arg='stats_mitre', value=Name(id='mitre_stats', ctx=Load()))]))], orelse=[])], orelse=[]), Assign(targets=[Name(id='additional_hierarchies', ctx=Store())], value=Call(func=Attribute(value=Name(id='mitre_attack', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='additional_cwe_hierarchies'), List(elts=[], ctx=Load())], keywords=[])), For(target=Name(id='add_hierarchy', ctx=Store()), iter=Name(id='additional_hierarchies', ctx=Load()), body=[Assign(targets=[Name(id='cwes_with_capec', ctx=Store())], value=List(elts=[], ctx=Load())), Expr(value=Call(func=Attribute(value=Name(id='self', ctx=Load()), attr='_find_cwes_with_capec', ctx=Load()), args=[Name(id='add_hierarchy', ctx=Load()), Name(id='cwes_with_capec', ctx=Load())], keywords=[])), For(target=Name(id='cwe_node', ctx=Store()), iter=Name(id='cwes_with_capec', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='self', ctx=Load()), attr='_process_cwe_with_capec', ctx=Load()), args=[Name(id='session', ctx=Load()), Name(id='cwe_node', ctx=Load()), Name(id='cve_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load())], keywords=[keyword(arg='stats_mitre', value=Name(id='mitre_stats', ctx=Load()))]))], orelse=[])], orelse=[])], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='CVE '), FormattedValue(value=Call(func=Attribute(value=Name(id='cve', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='id'), Constant(value='unknown')], keywords=[]), conversion=-1), Constant(value=' processing failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], orelse=[]), If(test=Compare(left=Name(id='cves_created', ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Name(id='cves_created', ctx=Load()), conversion=-1), Constant(value=' CVE nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Name(id='cve_relationships_created', ctx=Load()), conversion=-1), Constant(value=' Technology-CVE relationships')])], keywords=[]))], orelse=[]), If(test=Compare(left=Subscript(value=Name(id='mitre_stats', ctx=Load()), slice=Constant(value='nodes'), ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='mitre_stats', ctx=Load()), slice=Constant(value='nodes'), ctx=Load()), conversion=-1), Constant(value=' MitreData (CWE) nodes')])], keywords=[]))], orelse=[]), If(test=Compare(left=Subscript(value=Name(id='mitre_stats', ctx=Load()), slice=Constant(value='capec'), ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='mitre_stats', ctx=Load()), slice=Constant(value='capec'), ctx=Load()), conversion=-1), Constant(value=' Capec nodes')])], keywords=[]))], orelse=[]), Assign(targets=[Name(id='security_checks_created', ctx=Store())], value=Constant(value=0)), Assign(targets=[Name(id='waf_bypass_rels', ctx=Store())], value=Constant(value=0)), For(target=Tuple(elts=[Name(id='target_host', ctx=Store()), Name(id='target_data', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='by_target', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), body=[Assign(targets=[Name(id='security_checks', ctx=Store())], value=Call(func=Attribute(value=Name(id='target_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='security_checks'), Dict(keys=[], values=[])], keywords=[])), If(test=UnaryOp(op=Not(), operand=Name(id='security_checks', ctx=Load())), body=[Continue()], orelse=[]), Assign(targets=[Name(id='direct_ip_access', ctx=Store())], value=Call(func=Attribute(value=Name(id='security_checks', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='direct_ip_access'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='ip_address', ctx=Store())], value=Call(func=Attribute(value=Name(id='direct_ip_access', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='ip')], keywords=[])), Assign(targets=[Name(id='checks', ctx=Store())], value=Call(func=Attribute(value=Name(id='direct_ip_access', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='checks'), List(elts=[], ctx=Load())], keywords=[])), For(target=Name(id='check', ctx=Store()), iter=Name(id='checks', ctx=Load()), body=[Try(body=[Assign(targets=[Name(id='check_type', ctx=Store())], value=Call(func=Attribute(value=Name(id='check', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='check_type'), Constant(value='unknown')], keywords=[])), Assign(targets=[Name(id='severity', ctx=Store())], value=Call(func=Attribute(value=Name(id='check', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='severity'), Constant(value='info')], keywords=[])), Assign(targets=[Name(id='url', ctx=Store())], value=Call(func=Attribute(value=Name(id='check', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='url'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='finding', ctx=Store())], value=Call(func=Attribute(value=Name(id='check', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='finding'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='evidence', ctx=Store())], value=Call(func=Attribute(value=Name(id='check', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='evidence')], keywords=[])), Assign(targets=[Name(id='status_code', ctx=Store())], value=Call(func=Attribute(value=Name(id='check', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='status_code')], keywords=[])), Assign(targets=[Name(id='content_length', ctx=Store())], value=Call(func=Attribute(value=Name(id='check', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='content_length')], keywords=[])), Assign(targets=[Name(id='vuln_id', ctx=Store())], value=JoinedStr(values=[Constant(value='sec_'), FormattedValue(value=Name(id='check_type', ctx=Load()), conversion=-1), Constant(value='_'), FormattedValue(value=Name(id='ip_address', ctx=Load()), conversion=-1), Constant(value='_'), FormattedValue(value=BinOp(left=Call(func=Name(id='hash', ctx=Load()), args=[Name(id='url', ctx=Load())], keywords=[]), op=Mod(), right=Constant(value=10000)), conversion=-1)])), Assign(targets=[Name(id='check_names', ctx=Store())], value=Dict(keys=[Constant(value='direct_ip_http'), Constant(value='direct_ip_https'), Constant(value='ip_api_exposed'), Constant(value='waf_bypass'), Constant(value='tls_mismatch'), Constant(value='http_on_ip')], values=[Constant(value='HTTP accessible directly via IP'), Constant(value='HTTPS accessible directly via IP'), Constant(value='API endpoint exposed on IP without TLS'), Constant(value='WAF bypass via direct IP access'), Constant(value='TLS certificate mismatch'), Constant(value='HTTP service on direct IP')])), Assign(targets=[Name(id='vuln_props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='source'), Constant(value='type'), Constant(value='severity'), Constant(value='name'), Constant(value='description'), Constant(value='url'), Constant(value='matched_at'), Constant(value='host'), Constant(value='matched_ip'), Constant(value='template_id'), Constant(value='is_dast_finding')], values=[Name(id='vuln_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Constant(value='security_check'), Name(id='check_type', ctx=Load()), Name(id='severity', ctx=Load()), Call(func=Attribute(value=Name(id='check_names', ctx=Load()), attr='get', ctx=Load()), args=[Name(id='check_type', ctx=Load()), JoinedStr(values=[Constant(value='Security check: '), FormattedValue(value=Name(id='check_type', ctx=Load()), conversion=-1)])], keywords=[]), Name(id='finding', ctx=Load()), Name(id='url', ctx=Load()), Name(id='url', ctx=Load()), Name(id='target_host', ctx=Load()), Name(id='ip_address', ctx=Load()), Constant(value=None), Constant(value=False)])), If(test=Name(id='evidence', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='vuln_props', ctx=Load()), slice=Constant(value='evidence'), ctx=Store())], value=Name(id='evidence', ctx=Load()))], orelse=[]), If(test=Name(id='status_code', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='vuln_props', ctx=Load()), slice=Constant(value='status_code'), ctx=Store())], value=Name(id='status_code', ctx=Load()))], orelse=[]), If(test=Name(id='content_length', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='vuln_props', ctx=Load()), slice=Constant(value='content_length'), ctx=Store())], value=Name(id='content_length', ctx=Load()))], orelse=[]), Assign(targets=[Name(id='vuln_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='vuln_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MERGE (v:Vulnerability {id: $id})\\n                            SET v += $props,\\n                                v.updated_at = datetime()\\n                            ')], keywords=[keyword(arg='id', value=Name(id='vuln_id', ctx=Load())), keyword(arg='props', value=Name(id='vuln_props', ctx=Load()))])), AugAssign(target=Name(id='security_checks_created', ctx=Store()), op=Add(), value=Constant(value=1)), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='vulnerabilities_created'), ctx=Store()), op=Add(), value=Constant(value=1)), If(test=Name(id='ip_address', ctx=Load()), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MERGE (i:IP {address: $address, user_id: $user_id, project_id: $project_id})\\n                                SET i.updated_at = datetime()\\n                                ')], keywords=[keyword(arg='address', value=Name(id='ip_address', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (i:IP {address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                MATCH (v:Vulnerability {id: $vuln_id})\\n                                MERGE (i)-[:HAS_VULNERABILITY]->(v)\\n                                ')], keywords=[keyword(arg='ip_addr', value=Name(id='ip_address', ctx=Load())), keyword(arg='vuln_id', value=Name(id='vuln_id', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[]), If(test=BoolOp(op=And(), values=[Compare(left=Name(id='check_type', ctx=Load()), ops=[Eq()], comparators=[Constant(value='waf_bypass')]), Name(id='target_host', ctx=Load())]), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (s:Subdomain {name: $subdomain, user_id: $user_id, project_id: $project_id})\\n                                MATCH (i:IP {address: $ip_addr, user_id: $user_id, project_id: $project_id})\\n                                MERGE (s)-[:WAF_BYPASS_VIA {\\n                                    discovered_at: datetime(),\\n                                    evidence: $evidence\\n                                }]->(i)\\n                                ')], keywords=[keyword(arg='subdomain', value=Name(id='target_host', ctx=Load())), keyword(arg='ip_addr', value=Name(id='ip_address', ctx=Load())), keyword(arg='evidence', value=BoolOp(op=Or(), values=[Name(id='evidence', ctx=Load()), Constant(value='')])), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load()))])), AugAssign(target=Name(id='waf_bypass_rels', ctx=Store()), op=Add(), value=Constant(value=1))], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Security check '), FormattedValue(value=Name(id='check_type', ctx=Load()), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[])], orelse=[]), If(test=Compare(left=Name(id='security_checks_created', ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Name(id='security_checks_created', ctx=Load()), conversion=-1), Constant(value=' security check Vulnerability nodes')])], keywords=[]))], orelse=[]), If(test=Compare(left=Name(id='waf_bypass_rels', ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Name(id='waf_bypass_rels', ctx=Load()), conversion=-1), Constant(value=' WAF_BYPASS_VIA relationships')])], keywords=[]))], orelse=[]), Assign(targets=[Name(id='top_level_security_checks', ctx=Store())], value=Call(func=Attribute(value=Name(id='vuln_scan_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='security_checks'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='security_findings', ctx=Store())], value=Call(func=Attribute(value=Name(id='top_level_security_checks', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='findings'), List(elts=[], ctx=Load())], keywords=[])), For(target=Name(id='finding', ctx=Store()), iter=Name(id='security_findings', ctx=Load()), body=[Try(body=[Assign(targets=[Name(id='finding_type', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='type'), Constant(value='unknown')], keywords=[])), Assign(targets=[Name(id='severity', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='severity'), Constant(value='info')], keywords=[])), Assign(targets=[Name(id='name', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='name'), JoinedStr(values=[Constant(value='Security Issue: '), FormattedValue(value=Name(id='finding_type', ctx=Load()), conversion=-1)])], keywords=[])), Assign(targets=[Name(id='description', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='description'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='url', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='url'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='matched_ip', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='matched_ip')], keywords=[])), Assign(targets=[Name(id='hostname', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='hostname')], keywords=[])), Assign(targets=[Name(id='evidence', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='evidence')], keywords=[])), Assign(targets=[Name(id='status_code', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='status_code')], keywords=[])), Assign(targets=[Name(id='server', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='server')], keywords=[])), Assign(targets=[Name(id='recommendation', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='recommendation')], keywords=[])), Assign(targets=[Name(id='missing_header', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='missing_header')], keywords=[])), Assign(targets=[Name(id='port', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='port')], keywords=[])), Assign(targets=[Name(id='unique_key', ctx=Store())], value=JoinedStr(values=[FormattedValue(value=Name(id='finding_type', ctx=Load()), conversion=-1), Constant(value='_'), FormattedValue(value=Name(id='url', ctx=Load()), conversion=-1), Constant(value='_'), FormattedValue(value=BoolOp(op=Or(), values=[Name(id='matched_ip', ctx=Load()), Name(id='hostname', ctx=Load()), Constant(value='')]), conversion=-1)])), Assign(targets=[Name(id='vuln_id', ctx=Store())], value=JoinedStr(values=[Constant(value='seccheck_'), FormattedValue(value=Name(id='finding_type', ctx=Load()), conversion=-1), Constant(value='_'), FormattedValue(value=BinOp(left=Call(func=Name(id='hash', ctx=Load()), args=[Name(id='unique_key', ctx=Load())], keywords=[]), op=Mod(), right=Constant(value=100000)), conversion=-1)])), Assign(targets=[Name(id='vuln_props', ctx=Store())], value=Dict(keys=[Constant(value='id'), Constant(value='user_id'), Constant(value='project_id'), Constant(value='source'), Constant(value='type'), Constant(value='severity'), Constant(value='name'), Constant(value='description'), Constant(value='url'), Constant(value='matched_at'), Constant(value='is_dast_finding')], values=[Name(id='vuln_id', ctx=Load()), Name(id='user_id', ctx=Load()), Name(id='project_id', ctx=Load()), Constant(value='security_check'), Name(id='finding_type', ctx=Load()), Name(id='severity', ctx=Load()), Name(id='name', ctx=Load()), Name(id='description', ctx=Load()), Name(id='url', ctx=Load()), Name(id='url', ctx=Load()), Constant(value=False)])), If(test=Name(id='matched_ip', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='vuln_props', ctx=Load()), slice=Constant(value='matched_ip'), ctx=Store())], value=Name(id='matched_ip', ctx=Load()))], orelse=[]), If(test=Name(id='hostname', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='vuln_props', ctx=Load()), slice=Constant(value='hostname'), ctx=Store())], value=Name(id='hostname', ctx=Load()))], orelse=[]), If(test=Name(id='evidence', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='vuln_props', ctx=Load()), slice=Constant(value='evidence'), ctx=Store())], value=Name(id='evidence', ctx=Load()))], orelse=[]), If(test=Name(id='status_code', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='vuln_props', ctx=Load()), slice=Constant(value='status_code'), ctx=Store())], value=Name(id='status_code', ctx=Load()))], orelse=[]), If(test=Name(id='server', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='vuln_props', ctx=Load()), slice=Constant(value='server'), ctx=Store())], value=Name(id='server', ctx=Load()))], orelse=[]), If(test=Name(id='recommendation', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='vuln_props', ctx=Load()), slice=Constant(value='recommendation'), ctx=Store())], value=Name(id='recommendation', ctx=Load()))], orelse=[]), If(test=Name(id='missing_header', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='vuln_props', ctx=Load()), slice=Constant(value='missing_header'), ctx=Store())], value=Name(id='missing_header', ctx=Load()))], orelse=[]), If(test=Name(id='port', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='vuln_props', ctx=Load()), slice=Constant(value='port'), ctx=Store())], value=Name(id='port', ctx=Load()))], orelse=[]), Assign(targets=[Name(id='vuln_props', ctx=Store())], value=DictComp(key=Name(id='k', ctx=Load()), value=Name(id='v', ctx=Load()), generators=[comprehension(target=Tuple(elts=[Name(id='k', ctx=Store()), Name(id='v', ctx=Store())], ctx=Store()), iter=Call(func=Attribute(value=Name(id='vuln_props', ctx=Load()), attr='items', ctx=Load()), args=[], keywords=[]), ifs=[Compare(left=Name(id='v', ctx=Load()), ops=[IsNot()], comparators=[Constant(value=None)])], is_async=0)])), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MERGE (v:Vulnerability {id: $id})\\n                        SET v += $props,\\n                            v.updated_at = datetime()\\n                        ')], keywords=[keyword(arg='id', value=Name(id='vuln_id', ctx=Load())), keyword(arg='props', value=Name(id='vuln_props', ctx=Load()))])), AugAssign(target=Name(id='security_checks_created', ctx=Store()), op=Add(), value=Constant(value=1)), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='vulnerabilities_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='relationship_created', ctx=Store())], value=Constant(value=False)), If(test=BoolOp(op=And(), values=[Name(id='url', ctx=Load()), BoolOp(op=Or(), values=[Call(func=Attribute(value=Name(id='url', ctx=Load()), attr='startswith', ctx=Load()), args=[Constant(value='http://')], keywords=[]), Call(func=Attribute(value=Name(id='url', ctx=Load()), attr='startswith', ctx=Load()), args=[Constant(value='https://')], keywords=[])])]), body=[Assign(targets=[Name(id='parsed', ctx=Store())], value=Call(func=Name(id='urlparse', ctx=Load()), args=[Name(id='url', ctx=Load())], keywords=[])), Assign(targets=[Name(id='url_host', ctx=Store())], value=Subscript(value=Call(func=Attribute(value=Attribute(value=Name(id='parsed', ctx=Load()), attr='netloc', ctx=Load()), attr='split', ctx=Load()), args=[Constant(value=':')], keywords=[]), slice=Constant(value=0), ctx=Load())), If(test=Call(func=Name(id='_is_ip_address', ctx=Load()), args=[Name(id='url_host', ctx=Load())], keywords=[]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (i:IP {address: $address, user_id: $user_id, project_id: $project_id})\\n                                MATCH (v:Vulnerability {id: $vuln_id})\\n                                MERGE (i)-[:HAS_VULNERABILITY]->(v)\\n                                RETURN count(*) as matched\\n                                ')], keywords=[keyword(arg='address', value=Name(id='url_host', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='vuln_id', value=Name(id='vuln_id', ctx=Load()))])), If(test=Compare(left=Subscript(value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[]), slice=Constant(value='matched'), ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='relationship_created', ctx=Store())], value=Constant(value=True))], orelse=[])], orelse=[Assign(targets=[Name(id='base_url', ctx=Store())], value=JoinedStr(values=[FormattedValue(value=Attribute(value=Name(id='parsed', ctx=Load()), attr='scheme', ctx=Load()), conversion=-1), Constant(value='://'), FormattedValue(value=Attribute(value=Name(id='parsed', ctx=Load()), attr='netloc', ctx=Load()), conversion=-1)])), Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (bu:BaseURL {url: $baseurl, user_id: $user_id, project_id: $project_id})\\n                                MATCH (v:Vulnerability {id: $vuln_id})\\n                                MERGE (bu)-[:HAS_VULNERABILITY]->(v)\\n                                RETURN count(*) as matched\\n                                ')], keywords=[keyword(arg='baseurl', value=Name(id='base_url', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='vuln_id', value=Name(id='vuln_id', ctx=Load()))])), If(test=Compare(left=Subscript(value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[]), slice=Constant(value='matched'), ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='relationship_created', ctx=Store())], value=Constant(value=True))], orelse=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                    MATCH (s:Subdomain {name: $hostname, user_id: $user_id, project_id: $project_id})\\n                                    MATCH (v:Vulnerability {id: $vuln_id})\\n                                    MERGE (s)-[:HAS_VULNERABILITY]->(v)\\n                                    RETURN count(*) as matched\\n                                    ')], keywords=[keyword(arg='hostname', value=Name(id='url_host', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='vuln_id', value=Name(id='vuln_id', ctx=Load()))])), If(test=Compare(left=Subscript(value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[]), slice=Constant(value='matched'), ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='relationship_created', ctx=Store())], value=Constant(value=True))], orelse=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                        MATCH (d:Domain {name: $hostname, user_id: $user_id, project_id: $project_id})\\n                                        MATCH (v:Vulnerability {id: $vuln_id})\\n                                        MERGE (d)-[:HAS_VULNERABILITY]->(v)\\n                                        ')], keywords=[keyword(arg='hostname', value=Name(id='url_host', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='vuln_id', value=Name(id='vuln_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='relationship_created', ctx=Store())], value=Constant(value=True))])])])], orelse=[If(test=BoolOp(op=And(), values=[Name(id='hostname', ctx=Load()), UnaryOp(op=Not(), operand=Name(id='relationship_created', ctx=Load()))]), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (s:Subdomain {name: $hostname, user_id: $user_id, project_id: $project_id})\\n                            MATCH (v:Vulnerability {id: $vuln_id})\\n                            MERGE (s)-[:HAS_VULNERABILITY]->(v)\\n                            RETURN count(*) as matched\\n                            ')], keywords=[keyword(arg='hostname', value=Name(id='hostname', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='vuln_id', value=Name(id='vuln_id', ctx=Load()))])), If(test=Compare(left=Subscript(value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[]), slice=Constant(value='matched'), ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='relationship_created', ctx=Store())], value=Constant(value=True))], orelse=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (d:Domain {name: $hostname, user_id: $user_id, project_id: $project_id})\\n                                MATCH (v:Vulnerability {id: $vuln_id})\\n                                MERGE (d)-[:HAS_VULNERABILITY]->(v)\\n                                ')], keywords=[keyword(arg='hostname', value=Name(id='hostname', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='vuln_id', value=Name(id='vuln_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='relationship_created', ctx=Store())], value=Constant(value=True))])], orelse=[If(test=BoolOp(op=And(), values=[Name(id='matched_ip', ctx=Load()), UnaryOp(op=Not(), operand=Name(id='relationship_created', ctx=Load()))]), body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                            MATCH (i:IP {address: $address, user_id: $user_id, project_id: $project_id})\\n                            MATCH (v:Vulnerability {id: $vuln_id})\\n                            MERGE (i)-[:HAS_VULNERABILITY]->(v)\\n                            ')], keywords=[keyword(arg='address', value=Name(id='matched_ip', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='vuln_id', value=Name(id='vuln_id', ctx=Load()))])), AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='relationship_created', ctx=Store())], value=Constant(value=True))], orelse=[])])]), If(test=UnaryOp(op=Not(), operand=Name(id='relationship_created', ctx=Load())), body=[Assign(targets=[Name(id='finding_domain', ctx=Store())], value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='domain')], keywords=[])), If(test=Name(id='finding_domain', ctx=Load()), body=[Assign(targets=[Name(id='result', ctx=Store())], value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                                MATCH (d:Domain {name: $domain, user_id: $user_id, project_id: $project_id})\\n                                MATCH (v:Vulnerability {id: $vuln_id})\\n                                MERGE (d)-[:HAS_VULNERABILITY]->(v)\\n                                RETURN count(*) as matched\\n                                ')], keywords=[keyword(arg='domain', value=Name(id='finding_domain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='vuln_id', value=Name(id='vuln_id', ctx=Load()))])), If(test=Compare(left=Subscript(value=Call(func=Attribute(value=Name(id='result', ctx=Load()), attr='single', ctx=Load()), args=[], keywords=[]), slice=Constant(value='matched'), ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[AugAssign(target=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Store()), op=Add(), value=Constant(value=1)), Assign(targets=[Name(id='relationship_created', ctx=Store())], value=Constant(value=True))], orelse=[])], orelse=[])], orelse=[])], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Security finding '), FormattedValue(value=Call(func=Attribute(value=Name(id='finding', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='type'), Constant(value='unknown')], keywords=[]), conversion=-1), Constant(value=' failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), If(test=Compare(left=Name(id='security_checks_created', ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Name(id='security_checks_created', ctx=Load()), conversion=-1), Constant(value=' SecurityCheck Vulnerability nodes')])], keywords=[]))], orelse=[]), Assign(targets=[Name(id='metadata', ctx=Store())], value=Call(func=Attribute(value=Name(id='recon_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='metadata'), Dict(keys=[], values=[])], keywords=[])), Assign(targets=[Name(id='root_domain', ctx=Store())], value=Call(func=Attribute(value=Name(id='metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='root_domain'), Constant(value='')], keywords=[])), Assign(targets=[Name(id='summary', ctx=Store())], value=Call(func=Attribute(value=Name(id='vuln_scan_data', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='summary'), Dict(keys=[], values=[])], keywords=[])), If(test=Name(id='root_domain', ctx=Load()), body=[Try(body=[Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                        MATCH (d:Domain {name: $root_domain, user_id: $user_id, project_id: $project_id})\\n                        SET d.vuln_scan_timestamp = $scan_timestamp,\\n                            d.vuln_scan_dast_mode = $dast_mode,\\n                            d.vuln_scan_total_urls_scanned = $total_urls,\\n                            d.vuln_scan_dast_urls_discovered = $dast_urls,\\n                            d.vuln_scan_critical_count = $critical_count,\\n                            d.vuln_scan_high_count = $high_count,\\n                            d.vuln_scan_medium_count = $medium_count,\\n                            d.vuln_scan_low_count = $low_count,\\n                            d.updated_at = datetime()\\n                        ')], keywords=[keyword(arg='root_domain', value=Name(id='root_domain', ctx=Load())), keyword(arg='user_id', value=Name(id='user_id', ctx=Load())), keyword(arg='project_id', value=Name(id='project_id', ctx=Load())), keyword(arg='scan_timestamp', value=Call(func=Attribute(value=Name(id='scan_metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='scan_timestamp')], keywords=[])), keyword(arg='dast_mode', value=Call(func=Attribute(value=Name(id='scan_metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='dast_mode'), Constant(value=False)], keywords=[])), keyword(arg='total_urls', value=Call(func=Attribute(value=Name(id='scan_metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='total_urls_scanned'), Constant(value=0)], keywords=[])), keyword(arg='dast_urls', value=Call(func=Attribute(value=Name(id='scan_metadata', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='dast_urls_discovered'), Constant(value=0)], keywords=[])), keyword(arg='critical_count', value=Call(func=Attribute(value=Name(id='summary', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='critical'), Constant(value=0)], keywords=[])), keyword(arg='high_count', value=Call(func=Attribute(value=Name(id='summary', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='high'), Constant(value=0)], keywords=[])), keyword(arg='medium_count', value=Call(func=Attribute(value=Name(id='summary', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='medium'), Constant(value=0)], keywords=[])), keyword(arg='low_count', value=Call(func=Attribute(value=Name(id='summary', ctx=Load()), attr='get', ctx=Load()), args=[Constant(value='low'), Constant(value=0)], keywords=[]))]))], handlers=[ExceptHandler(type=Name(id='Exception', ctx=Load()), name='e', body=[Expr(value=Call(func=Attribute(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), attr='append', ctx=Load()), args=[JoinedStr(values=[Constant(value='Domain update failed: '), FormattedValue(value=Name(id='e', ctx=Load()), conversion=-1)])], keywords=[]))])], orelse=[], finalbody=[])], orelse=[]), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='endpoints_created'), ctx=Load()), conversion=-1), Constant(value=' Endpoint nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='parameters_created'), ctx=Load()), conversion=-1), Constant(value=' Parameter nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='vulnerabilities_created'), ctx=Load()), conversion=-1), Constant(value=' Vulnerability nodes')])], keywords=[])), Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[+][graph-db] Created '), FormattedValue(value=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='relationships_created'), ctx=Load()), conversion=-1), Constant(value=' relationships')])], keywords=[])), If(test=Compare(left=Name(id='skipped_out_of_scope', ctx=Load()), ops=[Gt()], comparators=[Constant(value=0)]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[*][graph-db] Skipped '), FormattedValue(value=Name(id='skipped_out_of_scope', ctx=Load()), conversion=-1), Constant(value=' items out of scan scope')])], keywords=[])), Assign(targets=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='skipped_out_of_scope'), ctx=Store())], value=Name(id='skipped_out_of_scope', ctx=Load()))], orelse=[]), If(test=Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load()), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[JoinedStr(values=[Constant(value='[!][graph-db] '), FormattedValue(value=Call(func=Name(id='len', ctx=Load()), args=[Subscript(value=Name(id='stats', ctx=Load()), slice=Constant(value='errors'), ctx=Load())], keywords=[]), conversion=-1), Constant(value=' errors occurred')])], keywords=[]))], orelse=[])]), Return(value=Name(id='stats', ctx=Load()))], decorator_list=[], returns=Name(id='dict', ctx=Load()), type_params=[])",
  "update_user_input_status": "FunctionDef(name='update_user_input_status', args=arguments(posonlyargs=[], args=[arg(arg='self'), arg(arg='user_input_id', annotation=Name(id='str', ctx=Load())), arg(arg='status', annotation=Name(id='str', ctx=Load())), arg(arg='stats', annotation=Name(id='dict', ctx=Load()))], kwonlyargs=[], kw_defaults=[], defaults=[Constant(value=None)]), body=[Expr(value=Constant(value='Update the status and stats of a UserInput node.')), With(items=[withitem(context_expr=Call(func=Attribute(value=Attribute(value=Name(id='self', ctx=Load()), attr='driver', ctx=Load()), attr='session', ctx=Load()), args=[], keywords=[]), optional_vars=Name(id='session', ctx=Store()))], body=[Assign(targets=[Name(id='props', ctx=Store())], value=Dict(keys=[Constant(value='status'), Constant(value='updated_at')], values=[Name(id='status', ctx=Load()), Call(func=Attribute(value=Call(func=Attribute(value=Name(id='datetime', ctx=Load()), attr='now', ctx=Load()), args=[], keywords=[]), attr='isoformat', ctx=Load()), args=[], keywords=[])])), If(test=Compare(left=Name(id='status', ctx=Load()), ops=[Eq()], comparators=[Constant(value='completed')]), body=[Assign(targets=[Subscript(value=Name(id='props', ctx=Load()), slice=Constant(value='completed_at'), ctx=Store())], value=Call(func=Attribute(value=Call(func=Attribute(value=Name(id='datetime', ctx=Load()), attr='now', ctx=Load()), args=[], keywords=[]), attr='isoformat', ctx=Load()), args=[], keywords=[]))], orelse=[]), If(test=Name(id='stats', ctx=Load()), body=[Assign(targets=[Subscript(value=Name(id='props', ctx=Load()), slice=Constant(value='stats'), ctx=Store())], value=Call(func=Attribute(value=Name(id='json', ctx=Load()), attr='dumps', ctx=Load()), args=[Name(id='stats', ctx=Load())], keywords=[]))], orelse=[]), Expr(value=Call(func=Attribute(value=Name(id='session', ctx=Load()), attr='run', ctx=Load()), args=[Constant(value='\\n                MATCH (ui:UserInput {id: $id})\\n                SET ui += $props\\n                ')], keywords=[keyword(arg='id', value=Name(id='user_input_id', ctx=Load())), keyword(arg='props', value=Name(id='props', ctx=Load()))]))])], decorator_list=[], returns=Constant(value=None), type_params=[])"
}