@@ -37,41 +37,47 @@ def get_patched_range(spec_list):
3737 yield RangeSpecifier (spec )
3838
3939
40- def import_vulnerabilities ( ):
41- vulnerability_package_dicts = []
42- for vulnerability in rubygem_advisories ( RUBYSEC_DB_URL ):
40+ def load_vulnerability_package ( vulnerability ):
41+ package_name = vulnerability . get (
42+ 'gem' )
4343
44- package_name = vulnerability . get (
45- 'gem' )
44+ if not package_name :
45+ return
4646
47- if not package_name :
48- continue
47+ if 'cve' in vulnerability :
48+ vulnerability_id = 'CVE-{}' .format (vulnerability ['cve' ])
49+ else :
50+ return
4951
50- if 'cve' in vulnerability :
51- vulnerability_id = 'CVE-{}' .format (vulnerability ['cve' ])
52- else :
53- continue
52+ advisory_url = vulnerability .get ('url' )
53+ patched_version_ranges = list (
54+ get_patched_range (
55+ vulnerability .get ('patched_versions' , [])))
56+ all_versions = set (get_all_versions_of_package (package_name ))
57+ unaffected_versions = set ()
58+
59+ if patched_version_ranges :
60+ for version in all_versions :
61+ for spec in patched_version_ranges :
62+ if version in spec :
63+ unaffected_versions .add (version )
64+ break
65+
66+ affected_versions = all_versions - unaffected_versions
67+
68+ return {
69+ 'package_name' : package_name ,
70+ 'cve_id' : vulnerability_id ,
71+ 'fixed_versions' : unaffected_versions ,
72+ 'affected_versions' : affected_versions ,
73+ 'advisory' : advisory_url
74+ }
75+
76+
77+ def import_vulnerabilities ():
78+ vulnerability_package_dicts = []
79+ for vulnerability in rubygem_advisories (RUBYSEC_DB_URL ):
80+ package = load_vulnerability_package (vulnerability )
81+ vulnerability_package_dicts .append (package )
5482
55- advisory_url = vulnerability .get ('url' )
56- patched_version_ranges = list (
57- get_patched_range (
58- vulnerability .get ('patched_versions' , [])))
59- all_versions = set (get_all_versions_of_package (package_name ))
60- unaffected_versions = set ()
61-
62- if patched_version_ranges :
63- for version in all_versions :
64- for spec in patched_version_ranges :
65- if version in spec :
66- unaffected_versions .add (version )
67- break
68-
69- affected_versions = all_versions - unaffected_versions
70- vulnerability_package_dicts .append ({
71- 'package_name' : package_name ,
72- 'cve_id' : vulnerability_id ,
73- 'fixed_versions' : unaffected_versions ,
74- 'affected_versions' : affected_versions ,
75- 'advisory' : advisory_url
76- })
7783 return vulnerability_package_dicts
0 commit comments