1717# OR CONDITIONS OF ANY KIND, either express or implied. No content created from
1818# VulnerableCode should be considered or used as legal advice. Consult an Attorney
1919# for any legal advice.
20- # VulnerableCode is a free software code scanning tool from nexB Inc. and others.
20+ # VulnerableCode is a free software tool from nexB Inc. and others.
2121# Visit https://github.com/nexB/vulnerablecode/ for support and download.
2222
2323import asyncio
24- import yaml
25- import json
26- import requests
27- import re
28- from typing import Set
29- from typing import List
24+ from typing import List , Set
3025
26+ import yaml
3127from dephell_specifier import RangeSpecifier
3228from packageurl import PackageURL
3329
@@ -74,23 +70,18 @@ def collect_packages(self):
7470 packages = set ()
7571 files = self ._updated_files .union (self ._added_files )
7672 for f in files :
77- with open (f ) as file :
78- data = yaml .safe_load (file )
79- if data .get ("package" ):
80- packages .add (data ["package" ])
73+ data = load_yaml (f )
74+ if data .get ("package" ):
75+ packages .add (data ["package" ])
8176
8277 return packages
8378
84- def generate_all_version_list (self , pkg_name ):
79+ def get_versions_from_range (self , version_list , pkg_name ):
80+ pkg_versions = []
8581 if not getattr (self , 'pkg_manager_api' , None ):
8682 self .pkg_manager_api = HexVersionAPI ()
87- version_list = self .pkg_manager_api .get (
83+ all_version_list = self .pkg_manager_api .get (
8884 pkg_name )
89- return version_list
90-
91- def get_versions_from_range (self , version_list , pkg_name ):
92- pkg_versions = []
93- all_version_list = self .generate_all_version_list (pkg_name )
9485 if version_list is None :
9586 return
9687 version_ranges = {RangeSpecifier (r ) for r in version_list }
@@ -100,40 +91,49 @@ def get_versions_from_range(self, version_list, pkg_name):
10091 return pkg_versions
10192
10293 def process_file (self , path ):
103- with open (path ) as f :
104- yaml_file = yaml .safe_load (f )
105- pkg_name = yaml_file ["package" ]
106- safe_pkg_versions = []
107- if yaml_file .get ("unaffected_versions" ):
108- safe_pkg_versions = self .get_versions_from_range (
109- yaml_file ["patched_versions" ] +
110- yaml_file ["unaffected_versions" ],
111- pkg_name ,
112- )
113- else :
114- safe_pkg_versions = self .get_versions_from_range (
115- yaml_file ["patched_versions" ], pkg_name
116- )
117-
118- cve_id = "CVE-" + str (yaml_file ["cve" ])
119- safe_purls = []
120- if safe_pkg_versions is not None :
121- safe_purls = {
122- PackageURL (name = pkg_name , type = "hex" , version = version )
123- for version in safe_pkg_versions
124- }
125-
126- vuln_reference = [
127- Reference (
128- reference_id = yaml_file ["id" ],
129- url = yaml_file ["link" ],
130- )
131- ]
132-
133- return Advisory (
134- summary = yaml_file ["description" ],
135- impacted_package_urls = [],
136- resolved_package_urls = safe_purls ,
137- cve_id = cve_id ,
138- vuln_references = vuln_reference ,
94+ yaml_file = load_yaml (path )
95+ pkg_name = yaml_file ["package" ]
96+ safe_pkg_versions = []
97+ if yaml_file .get ("unaffected_versions" ):
98+ safe_pkg_versions = self .get_versions_from_range (
99+ yaml_file ["patched_versions" ] +
100+ yaml_file ["unaffected_versions" ],
101+ pkg_name ,
102+ )
103+ else :
104+ safe_pkg_versions = self .get_versions_from_range (
105+ yaml_file ["patched_versions" ], pkg_name
106+ )
107+ if yaml_file .get ('cve' ):
108+ cve_id = "CVE-" + yaml_file ["cve" ]
109+ else :
110+ cve_id = ""
111+
112+ safe_purls = []
113+ if safe_pkg_versions is not None :
114+ safe_purls = {
115+ PackageURL (name = pkg_name , type = "hex" , version = version )
116+ for version in safe_pkg_versions
117+ }
118+
119+ vuln_reference = [
120+ Reference (
121+ reference_id = yaml_file ["id" ],
122+ ),
123+ Reference (
124+ url = yaml_file ["link" ],
139125 )
126+ ]
127+
128+ return Advisory (
129+ summary = yaml_file ["description" ],
130+ impacted_package_urls = [],
131+ resolved_package_urls = safe_purls ,
132+ cve_id = cve_id ,
133+ vuln_references = vuln_reference ,
134+ )
135+
136+
137+ def load_yaml (path ):
138+ with open (path ) as f :
139+ return yaml .safe_load (f )
0 commit comments