4242from vulnerabilities .package_managers import MavenVersionAPI
4343from vulnerabilities .package_managers import NugetVersionAPI
4444from vulnerabilities .package_managers import ComposerVersionAPI
45+ from vulnerabilities .package_managers import PypiVersionAPI
46+ from vulnerabilities .package_managers import RubyVersionAPI
4547
4648# set of all possible values of first '%s' = {'MAVEN','COMPOSER', 'NUGET'}
4749# second '%s' is interesting, it will have the value '' for the first request,
@@ -132,6 +134,8 @@ def set_version_api(self, ecosystem: str) -> None:
132134 "MAVEN" : MavenVersionAPI ,
133135 "NUGET" : NugetVersionAPI ,
134136 "COMPOSER" : ComposerVersionAPI ,
137+ "PIP" : PypiVersionAPI ,
138+ "RUBYGEMS" : RubyVersionAPI ,
135139 }
136140 versioner = versioners .get (ecosystem )
137141 if versioner :
@@ -147,13 +151,13 @@ def process_name(ecosystem: str, pkg_name: str) -> Optional[Tuple[Optional[str],
147151 ns , name = artifact_comps
148152 return ns , name
149153
150- if ecosystem == "NUGET" :
151- return None , pkg_name
152-
153154 if ecosystem == "COMPOSER" :
154155 vendor , name = pkg_name .split ("/" )
155156 return vendor , name
156157
158+ if ecosystem == "NUGET" or ecosystem == "PIP" or ecosystem == "RUBYGEMS" :
159+ return None , pkg_name
160+
157161 def collect_packages (self , ecosystem ):
158162 packages = set ()
159163 for page in self .advisories [ecosystem ]:
@@ -165,30 +169,29 @@ def process_response(self) -> List[Advisory]:
165169 adv_list = []
166170 for ecosystem in self .advisories :
167171 self .set_version_api (ecosystem )
168- pkg_type = ecosystem . lower ()
172+ pkg_type = self . version_api . package_type
169173 for resp_page in self .advisories [ecosystem ]:
170174 for adv in resp_page ["data" ]["securityVulnerabilities" ]["edges" ]:
171175 name = adv ["node" ]["package" ]["name" ]
172176
173177 if self .process_name (ecosystem , name ):
174178 ns , pkg_name = self .process_name (ecosystem , name )
179+ aff_range = adv ["node" ]["vulnerableVersionRange" ]
180+ aff_vers , unaff_vers = self .categorize_versions (
181+ aff_range , self .version_api .get (name )
182+ )
183+ affected_purls = {
184+ PackageURL (name = pkg_name , namespace = ns , version = version , type = pkg_type )
185+ for version in aff_vers
186+ }
187+
188+ unaffected_purls = {
189+ PackageURL (name = pkg_name , namespace = ns , version = version , type = pkg_type )
190+ for version in unaff_vers
191+ }
175192 else :
176- continue
177- aff_range = adv ["node" ]["vulnerableVersionRange" ]
178- aff_vers , unaff_vers = self .categorize_versions (
179- aff_range , self .version_api .get (name )
180- )
181- affected_purls = {
182- PackageURL (name = pkg_name , namespace = ns ,
183- version = version , type = pkg_type )
184- for version in aff_vers
185- }
186-
187- unaffected_purls = {
188- PackageURL (name = pkg_name , namespace = ns ,
189- version = version , type = pkg_type )
190- for version in unaff_vers
191- }
193+ affected_purls = set ()
194+ unaffected_purls = set ()
192195
193196 cve_ids = set ()
194197 vuln_references = []
@@ -199,12 +202,13 @@ def process_response(self) -> List[Advisory]:
199202 cve_ids .add (vuln ["value" ])
200203
201204 elif vuln ["type" ] == "GHSA" :
202- ghsa = vuln ['value' ]
203- vuln_references .append (Reference (
204- reference_id = ghsa ,
205- url = "https://github.com/advisories/{}" .format (
206- ghsa )
207- ))
205+ ghsa = vuln ["value" ]
206+ vuln_references .append (
207+ Reference (
208+ reference_id = ghsa ,
209+ url = "https://github.com/advisories/{}" .format (ghsa ),
210+ )
211+ )
208212
209213 for cve_id in cve_ids :
210214 adv_list .append (
@@ -219,8 +223,9 @@ def process_response(self) -> List[Advisory]:
219223 return adv_list
220224
221225 @staticmethod
222- def categorize_versions (version_range : str , all_versions : Set [str ]) -> Tuple [Set [str ], Set [str ]]: # nopep8
226+ def categorize_versions (
227+ version_range : str , all_versions : Set [str ]
228+ ) -> Tuple [Set [str ], Set [str ]]: # nopep8
223229 version_range = RangeSpecifier (version_range )
224- affected_versions = {
225- version for version in all_versions if version in version_range }
230+ affected_versions = {version for version in all_versions if version in version_range }
226231 return (affected_versions , all_versions - affected_versions )
0 commit comments