@@ -28,66 +28,72 @@ def all_versions_of_crate(crate):
2828 yield version_info ['num' ]
2929
3030
31+ def load_advisory (advisory ):
32+ affected_version_range_lists = list (advisory .get (
33+ 'affected' , {}).get ('functions' , {}).values ())
34+ unaffected_version_range_list = advisory ['versions' ].get (
35+ 'unaffected' , [])
36+
37+ patched_version_range_list = advisory ['versions' ]['patched' ]
38+ # FIXME: Make distinction between unaffected and patched packages
39+ # Check https://github.com/nexB/vulnerablecode/issues/144
40+ unaffected_version_range_list += patched_version_range_list
41+
42+ have_unaffected_version_range = len (unaffected_version_range_list ) != 0
43+ have_affected_version_range = len (affected_version_range_lists ) != 0
44+
45+ if not (have_affected_version_range or have_unaffected_version_range ):
46+ return False
47+
48+ vuln_id = advisory ['advisory' ]['id' ]
49+ crate_name = advisory ['advisory' ]['package' ]
50+ description = advisory ['advisory' ]['description' ]
51+ reference = advisory ['advisory' ].get ('url' , '' )
52+
53+ all_versions = set (all_versions_of_crate (crate_name ))
54+ affected_versions = set ()
55+ unaffected_versions = set ()
56+
57+ for version in all_versions :
58+ categorised = False
59+ for affected_version_range_list in affected_version_range_lists :
60+ for affected_version_range in affected_version_range_list :
61+ affected_version_range = RangeSpecifier (
62+ affected_version_range )
63+ if version in affected_version_range :
64+ affected_versions .add (version )
65+ categorised = True
66+ break
67+
68+ if have_unaffected_version_range and not categorised :
69+ for unaffected_version_range in unaffected_version_range_list :
70+ if version in RangeSpecifier (unaffected_version_range ):
71+ unaffected_versions .add (version )
72+ break
73+
74+ if not have_unaffected_version_range :
75+ unaffected_versions = all_versions - affected_versions
76+
77+ elif not have_affected_version_range :
78+ affected_versions = all_versions - unaffected_versions
79+
80+ return {
81+ 'package_name' : crate_name ,
82+ 'vuln_id' : vuln_id ,
83+ 'fixed_versions' : unaffected_versions ,
84+ 'affected_versions' : affected_versions ,
85+ 'advisory' : reference ,
86+ 'description' : description
87+ }
88+
89+
3190def import_vulnerabilities ():
3291
3392 vulnerability_package_dicts = []
3493 for advisory in rust_crate_advisories (RUSTSEC_DB_URL ):
3594
36- affected_version_range_lists = list (advisory .get (
37- 'affected' , {}).get ('functions' , {}).values ())
38- unaffected_version_range_list = advisory ['versions' ].get (
39- 'unaffected' , [])
40-
41- patched_version_range_list = advisory ['versions' ]['patched' ]
42- # FIXME: Make distinction between unaffected and patched packages
43- # Check https://github.com/nexB/vulnerablecode/issues/144
44- unaffected_version_range_list += patched_version_range_list
45-
46- have_unaffected_version_range = len (unaffected_version_range_list ) != 0
47- have_affected_version_range = len (affected_version_range_lists ) != 0
48-
49- if not (have_affected_version_range or have_unaffected_version_range ):
50- continue
51-
52- vuln_id = advisory ['advisory' ]['id' ]
53- crate_name = advisory ['advisory' ]['package' ]
54- description = advisory ['advisory' ]['description' ]
55- reference = advisory ['advisory' ].get ('url' , '' )
56-
57- all_versions = set (all_versions_of_crate (crate_name ))
58- affected_versions = set ()
59- unaffected_versions = set ()
60-
61- for version in all_versions :
62- categorised = False
63- for affected_version_range_list in affected_version_range_lists :
64- for affected_version_range in affected_version_range_list :
65- affected_version_range = RangeSpecifier (
66- affected_version_range )
67- if version in affected_version_range :
68- affected_versions .add (version )
69- categorised = True
70- break
71-
72- if have_unaffected_version_range and not categorised :
73- for unaffected_version_range in unaffected_version_range_list :
74- if version in RangeSpecifier (unaffected_version_range ):
75- unaffected_versions .add (version )
76- break
77-
78- if not have_unaffected_version_range :
79- unaffected_versions = all_versions - affected_versions
80-
81- elif not have_affected_version_range :
82- affected_versions = all_versions - unaffected_versions
83-
84- vulnerability_package_dicts .append ({
85- 'package_name' : crate_name ,
86- 'vuln_id' : vuln_id ,
87- 'fixed_versions' : unaffected_versions ,
88- 'affected_versions' : affected_versions ,
89- 'advisory' : reference ,
90- 'description' : description
91- })
95+ loaded_advisory = load_advisory (advisory )
96+ if loaded_advisory :
97+ vulnerability_package_dicts .append (loaded_advisory )
9298
9399 return vulnerability_package_dicts
0 commit comments