@@ -18,63 +18,73 @@ def get_label_for_scan_types(self, scan_type):
1818 def get_description_for_scan_types (self , scan_type ):
1919 return "Safety scan (--json) output file can be imported in JSON format."
2020
21- def get_safetydb (self ):
22- """Grab Safety DB for CVE lookup"""
21+ def get_findings (self , json_output , test ):
22+
23+ # Grab Safety DB for CVE lookup
2324 url = "https://raw.githubusercontent.com/pyupio/safety-db/master/data/insecure_full.json"
2425 try :
2526 response = urllib .request .urlopen (url )
26- return json .load (response )
27+ safety_db = json .loads (response . read (). decode ( 'utf-8' ) )
2728 except urllib .error .URLError as e :
2829 logger .warn ("Error Message: %s" , e )
2930 logger .warn ("Could not resolve %s. Fallback is using the offline version from dojo/tools/safety/insecure_full.json." , url )
30- with open ("dojo/tools/safety/insecure_full.json" , "r" ) as insecure_full :
31- return json .load (insecure_full )
31+ with open ("dojo/tools/safety/insecure_full.json" , "r" ) as f :
32+ safety_db = json .load (f )
33+ f .close ()
3234
33- def get_findings ( self , json_output , test ):
34- safety_db = self .get_safetydb ( )
35+ tree = self . parse_json ( json_output )
36+ return self .get_items ( tree , test , safety_db )
3537
36- tree = json .load (json_output )
38+ def parse_json (self , json_output ):
39+ data = json_output .read () or '[]'
40+ try :
41+ json_obj = json .loads (str (data , 'utf-8' ))
42+ except :
43+ json_obj = json .loads (data )
44+ tree = {l [4 ]: {'package' : str (l [0 ]),
45+ 'affected' : str (l [1 ]),
46+ 'installed' : str (l [2 ]),
47+ 'description' : str (l [3 ]),
48+ 'id' : str (l [4 ])}
49+ for l in json_obj } # noqa: E741
50+ return tree
3751
52+ def get_items (self , tree , test , safety_db ):
3853 items = {}
39- for node in tree :
40- item_node = {
41- 'package' : str (node [0 ]),
42- 'affected' : str (node [1 ]),
43- 'installed' : str (node [2 ]),
44- 'description' : str (node [3 ]),
45- 'id' : str (node [4 ])
46- }
47- severity = 'Medium' # Because Safety doesn't include severity rating
48- cve = None
49- for a in safety_db [item_node ['package' ]]:
50- if a ['id' ] == 'pyup.io-' + item_node ['id' ]:
51- if a ['cve' ]:
52- cve = a ['cve' ]
53- title = item_node ['package' ] + " (" + item_node ['affected' ] + ")"
54-
55- finding = Finding (title = title + " | " + cve if cve else title ,
56- test = test ,
57- severity = severity ,
58- description = "**Description:** " + item_node ['description' ] +
59- "\n **Vulnerable Package:** " + item_node ['package' ] +
60- "\n **Installed Version:** " + item_node ['installed' ] +
61- "\n **Vulnerable Versions:** " + item_node ['affected' ] +
62- "\n **CVE:** " + (cve or "N/A" ) +
63- "\n **ID:** " + item_node ['id' ],
64- cve = cve ,
65- cwe = 1035 , # Vulnerable Third Party Component
66- mitigation = "No mitigation provided" ,
67- references = "No reference provided" ,
68- active = False ,
69- verified = False ,
70- false_p = False ,
71- duplicate = False ,
72- out_of_scope = False ,
73- mitigated = None ,
74- impact = "No impact provided" ,
75- component_name = item_node ['package' ],
76- component_version = item_node ['installed' ],
77- unique_id_from_tool = item_node ['id' ])
78- items [finding .unique_id_from_tool ] = finding
54+
55+ for key , node in tree .items ():
56+ item = get_item (node , test , safety_db )
57+ items [key ] = item
7958
8059 return list (items .values ())
60+
61+
62+ def get_item (item_node , test , safety_db ):
63+ severity = 'Info' # Because Safety doesn't include severity rating
64+ cve = '' .join (a ['cve' ] or ''
65+ for a in safety_db [item_node ['package' ]]
66+ if a ['id' ] == 'pyup.io-' + item_node ['id' ]) or None
67+ title = item_node ['package' ] + " (" + item_node ['affected' ] + ")"
68+
69+ finding = Finding (title = title + " | " + cve if cve else title ,
70+ test = test ,
71+ severity = severity ,
72+ description = item_node ['description' ] +
73+ "\n Vulnerable Package: " + item_node ['package' ] +
74+ "\n Installed Version: " + item_node ['installed' ] +
75+ "\n Vulnerable Versions: " + item_node ['affected' ] +
76+ "\n CVE: " + (cve or "N/A" ) +
77+ "\n ID: " + item_node ['id' ],
78+ cve = cve ,
79+ cwe = 1035 , # Vulnerable Third Party Component
80+ mitigation = "No mitigation provided" ,
81+ references = "No reference provided" ,
82+ active = False ,
83+ verified = False ,
84+ false_p = False ,
85+ duplicate = False ,
86+ out_of_scope = False ,
87+ mitigated = None ,
88+ impact = "No impact provided" )
89+
90+ return finding
0 commit comments