3737from vulnerabilities import helpers
3838from vulnerabilities import severity_systems
3939from vulnerabilities .helpers import AffectedPackage as LegacyAffectedPackage
40+ from vulnerabilities .helpers import extract_references
4041from vulnerabilities .helpers import get_item
42+ from vulnerabilities .helpers import get_reference_id
4143from vulnerabilities .helpers import nearest_patched_package
44+ from vulnerabilities .helpers import resolve_version_range
4245from vulnerabilities .importer import AdvisoryData
4346from vulnerabilities .importer import AffectedPackage
4447from vulnerabilities .importer import Importer
4851from vulnerabilities .improver import Improver
4952from vulnerabilities .improver import Inference
5053from vulnerabilities .models import Advisory
54+ from vulnerabilities .package_managers import VERSION_API_CLASSES_BY_PACKAGE_TYPE
5155from vulnerabilities .package_managers import ComposerVersionAPI
5256from vulnerabilities .package_managers import GoproxyVersionAPI
5357from vulnerabilities .package_managers import MavenVersionAPI
58+ from vulnerabilities .package_managers import NpmVersionAPI
5459from vulnerabilities .package_managers import NugetVersionAPI
5560from vulnerabilities .package_managers import PypiVersionAPI
5661from vulnerabilities .package_managers import RubyVersionAPI
5762from vulnerabilities .package_managers import VersionAPI
63+ from vulnerabilities .package_managers import get_api_package_name
5864
5965logger = logging .getLogger (__name__ )
6066
170176}
171177"""
172178
173- VERSION_API_CLASSES = [
174- MavenVersionAPI ,
175- NugetVersionAPI ,
176- ComposerVersionAPI ,
177- PypiVersionAPI ,
178- RubyVersionAPI ,
179- GoproxyVersionAPI ,
180- ]
181-
182- VERSION_API_CLASSES_BY_PACKAGE_TYPE = {cls .package_type : cls for cls in VERSION_API_CLASSES }
183-
184179
185180class GitHubAPIImporter (Importer ):
186181 spdx_license_expression = "CC-BY-4.0"
@@ -204,36 +199,12 @@ def advisory_data(self) -> Iterable[AdvisoryData]:
204199 break
205200
206201
207- def get_reference_id ( url : str ):
202+ def extract_urls ( references : List [ Reference ] ):
208203 """
209- Return the reference id from a URL
210- For example:
211- >>> get_reference_id("https://github.com/advisories/GHSA-c9hw-wf7x-jp9j")
212- 'GHSA-c9hw-wf7x-jp9j'
204+ Yield `url` by iterating over `references`
213205 """
214- url_parts = url .split ("/" )
215- last_url_part = url_parts [- 1 ]
216- return last_url_part
217-
218-
219- def extract_references (reference_data : List [dict ]) -> Iterable [Reference ]:
220- """
221- Yield `reference` by iterating over `reference_data`
222- >>> list(extract_references([{'url': "https://github.com/advisories/GHSA-c9hw-wf7x-jp9j"}]))
223- [Reference(url="https://github.com/advisories/GHSA-c9hw-wf7x-jp9j"), reference_id = "GHSA-c9hw-wf7x-jp9j" ]
224- >>> list(extract_references([{'url': "https://github.com/advisories/c9hw-wf7x-jp9j"}]))
225- [Reference(url="https://github.com/advisories/c9hw-wf7x-jp9j")]
226- """
227- for ref in reference_data :
228- url = ref ["url" ]
229- if not isinstance (url , str ):
230- logger .error (f"extract_references: url is not of type `str`: { url } " )
231- continue
232- if "GHSA-" in url .upper ():
233- reference = Reference (url = url , reference_id = get_reference_id (url ))
234- else :
235- reference = Reference (url = url )
236- yield reference
206+ for ref in references :
207+ yield ref ["url" ]
237208
238209
239210def get_purl (pkg_type : str , github_name : str ) -> Optional [PackageURL ]:
@@ -271,26 +242,6 @@ class InvalidVersionRange(Exception):
271242 """
272243
273244
274- def get_api_package_name (purl : PackageURL ) -> str :
275- """
276- Return the package name expected by the GitHub API given a PackageURL
277- >>> get_api_package_name(PackageURL(type="maven", namespace="org.apache.commons", name="commons-lang3"))
278- "org.apache.commons:commons-lang3"
279- >>> get_api_package_name(PackageURL(type="composer", namespace="foo", name="bar"))
280- "foo/bar"
281- """
282- if purl .type == "maven" :
283- return f"{ purl .namespace } :{ purl .name } "
284-
285- if purl .type == "composer" :
286- return f"{ purl .namespace } /{ purl .name } "
287-
288- if purl .type in ("nuget" , "pypi" , "gem" , "golang" ):
289- return purl .name
290-
291- logger .error (f"get_api_package_name: Unknown PURL { purl !r} " )
292-
293-
294245def process_response (resp : dict , package_type : str ) -> Iterable [AdvisoryData ]:
295246 """
296247 Yield `AdvisoryData` by taking `resp` and `ecosystem` as input
@@ -348,7 +299,8 @@ def process_response(resp: dict, package_type: str) -> Iterable[AdvisoryData]:
348299
349300 references = get_item (advisory , "references" ) or []
350301 if references :
351- references : List [Reference ] = list (extract_references (references ))
302+ urls : List [str ] = list (extract_urls (references ))
303+ references : List [Reference ] = list (extract_references (urls ))
352304
353305 summary = get_item (advisory , "summary" )
354306 identifiers = get_item (advisory , "identifiers" ) or []
@@ -450,6 +402,7 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
450402 aff_vers , unaff_vers = resolve_version_range (
451403 affected_version_range = affected_version_range ,
452404 package_versions = valid_versions ,
405+ ignorable_versions = WEIRD_IGNORABLE_VERSIONS ,
453406 )
454407 affected_purls = [
455408 PackageURL (type = pkg_type , namespace = pkg_namespace , name = pkg_name , version = version )
@@ -483,37 +436,3 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]:
483436 affected_purls = affected_packages ,
484437 fixed_purl = fixed_package ,
485438 )
486-
487-
488- def resolve_version_range (
489- affected_version_range : VersionRange ,
490- package_versions : List [str ],
491- ignorable_versions = WEIRD_IGNORABLE_VERSIONS ,
492- ) -> Tuple [List [str ], List [str ]]:
493- """
494- Given an affected version range and a list of `package_versions`, resolve
495- which versions are in this range and return a tuple of two lists of
496- `affected_versions` and `unaffected_versions`.
497- """
498- if not affected_version_range :
499- logger .error (f"affected version range is { affected_version_range !r} " )
500- return [], []
501- affected_versions = []
502- unaffected_versions = []
503- for package_version in package_versions or []:
504- if package_version in ignorable_versions :
505- continue
506- # Remove whitespace
507- package_version = package_version .replace (" " , "" )
508- # Remove leading 'v'
509- package_version = package_version .lstrip ("vV" )
510- try :
511- version = affected_version_range .version_class (package_version )
512- except Exception :
513- logger .error (f"Could not parse version { package_version !r} " )
514- continue
515- if version in affected_version_range :
516- affected_versions .append (package_version )
517- else :
518- unaffected_versions .append (package_version )
519- return affected_versions , unaffected_versions
0 commit comments