diff --git a/pyproject.toml b/pyproject.toml index 0a09273b9..f9b73e098 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,6 +6,9 @@ build-backend = "setuptools.build_meta" [tool.pytest.ini_options] DJANGO_SETTINGS_MODULE = "vulnerablecode.settings" +# Fail tests that render templates which make use of invalid template variables. +FAIL_INVALID_TEMPLATE_VARS = true + markers = [ "webtest", ] @@ -85,3 +88,4 @@ profile = "black" line_length = 100 force_single_line = true skip_gitignore = true +skip_glob = "*/migrations/*" diff --git a/setup.cfg b/setup.cfg index 2c49eb5a9..d8e2eb341 100644 --- a/setup.cfg +++ b/setup.cfg @@ -99,6 +99,8 @@ dev = # misc docker-compose ipython==8.0.1 + # used for testing + commoncode [options.entry_points] console_scripts = diff --git a/vulnerabilities/api.py b/vulnerabilities/api.py index be4dffde8..f15a884eb 100644 --- a/vulnerabilities/api.py +++ b/vulnerabilities/api.py @@ -147,7 +147,7 @@ def bulk_search(self, request): try: purl_string = purl purl = PackageURL.from_string(purl).to_dict() - except ValueError as ve: + except ValueError: return Response(status=400, data={"Error": f"Invalid Package URL: {purl}"}) purl_data = Package.objects.filter( **{key: value for key, value in purl.items() if value} diff --git a/vulnerabilities/helpers.py b/vulnerabilities/helpers.py index bcd447a48..16587f64f 100644 --- a/vulnerabilities/helpers.py +++ b/vulnerabilities/helpers.py @@ -24,6 +24,7 @@ import dataclasses import json import logging +import os import re from functools import total_ordering from typing import List @@ -38,7 +39,7 @@ from packageurl import PackageURL from univers.version_range import RANGE_CLASS_BY_SCHEMES -LOGGER = logging.getLogger(__name__) +logger = logging.getLogger(__name__) cve_regex = re.compile(r"CVE-\d{4}-\d{4,7}", re.IGNORECASE) is_cve = cve_regex.match @@ -75,39 +76,23 @@ def fetch_yaml(url): create_etag = MagicMock() -def split_markdown_front_matter(lines: str) -> Tuple[str, str]: +def split_markdown_front_matter(text: str) -> Tuple[str, str]: """ - This function splits lines into markdown front matter and the markdown body - and returns list of lines for both - - for example : - lines = - --- - title: ISTIO-SECURITY-2019-001 - description: Incorrect access control. - cves: [CVE-2019-12243] - --- - # Markdown starts here - - split_markdown_front_matter(lines) would return - ['title: ISTIO-SECURITY-2019-001','description: Incorrect access control.' - ,'cves: [CVE-2019-12243]'], - ["# Markdown starts here"] + Return a tuple of (front matter, markdown body) strings split from a + ``text`` string. Each can be an empty string. This is used when security + advisories are provided in this format. """ + lines = text.splitlines() + if not lines: + return "", "" - fmlines = [] - mdlines = [] - splitter = mdlines - - for index, line in enumerate(lines.split("\n")): - if index == 0 and line.strip().startswith("---"): - splitter = fmlines - elif line.strip().startswith("---"): - splitter = mdlines - else: - splitter.append(line) + if lines[0] == "---": + lines = lines[1:] + text = "\n".join(lines) + frontmatter, _, markdown = text.partition("\n---\n") + return frontmatter, markdown - return "\n".join(fmlines), "\n".join(mdlines) + return "", text def contains_alpha(string): @@ -123,7 +108,7 @@ def requests_with_5xx_retry(max_retries=5, backoff_factor=0.5): Returns a requests sessions which retries on 5xx errors with a backoff_factor """ - retries = urllib3.util.Retry( + retries = urllib3.Retry( total=max_retries, backoff_factor=backoff_factor, raise_on_status=True, @@ -157,6 +142,30 @@ def __lt__(self, other): return self.version < other.version +def evolve_purl(purl, **kwargs): + """ + Return a new PackageURL derived from the ``purl`` PackageURL where any of + the provided kwarg replaces the corresponding attribute of this PackageURL. + Qaulifiers if provided must be a mapping + For example:: + >>> purl = PackageURL.from_string("pkg:generic/this@1.2.3") + >>> evolved = PackageURL.from_string("pkg:npm/@baz/that@2.2.3?foo=bar") + >>> evolve_purl(purl, + ... type="npm", namespace="@baz", name="that", + ... version="2.2.3", qualifiers={"foo": "bar"} + ... ) == evolved + True + + """ + if not kwargs: + return PackageURL.from_string(str(purl)) + + kwargs = {name: value for name, value in kwargs.items() if hasattr(purl, name)} + merged = purl.to_dict() + merged.update(kwargs) + return PackageURL(**merged) + + def nearest_patched_package( vulnerable_packages: List[PackageURL], resolved_packages: List[PackageURL] ) -> List[AffectedPackage]: @@ -186,32 +195,6 @@ def nearest_patched_package( return affected_package_with_patched_package_objects -def split_markdown_front_matter(text: str) -> Tuple[str, str]: - r""" - Return a tuple of (front matter, markdown body) strings split from ``text``. - Each can be an empty string. - - >>> text='''--- - ... title: DUMMY-SECURITY-2019-001 - ... description: Incorrect access control. - ... cves: [CVE-2042-1337] - ... --- - ... # Markdown starts here - ... ''' - >>> split_markdown_front_matter(text) - ('title: DUMMY-SECURITY-2019-001\ndescription: Incorrect access control.\ncves: [CVE-2042-1337]', '# Markdown starts here') - """ - # The doctest contains \n and for the sake of clarity I chose raw strings than escaping those. - lines = text.splitlines() - if lines[0] == "---": - lines = lines[1:] - text = "\n".join(lines) - frontmatter, _, markdown = text.partition("\n---\n") - return frontmatter, markdown - - return "", text - - # TODO: Replace this with combination of @classmethod and @property after upgrading to python 3.9 class classproperty(object): def __init__(self, fget): @@ -233,12 +216,54 @@ def get_item(object: dict, *attributes): >>> assert(get_item({'a': {'b': {'c': 'd'}}}, 'a', 'b', 'e')) == None """ if not object: - LOGGER.error(f"Object is empty: {object}") return item = object for attribute in attributes: if attribute not in item: - LOGGER.error(f"Missing attribute {attribute} in {item}") + logger.error(f"Missing attribute {attribute} in {item}") return None item = item[attribute] return item + + +class GitHubTokenError(Exception): + pass + + +class GraphQLError(Exception): + pass + + +def fetch_github_graphql_query(graphql_query: dict): + """ + Return results from calling the Github graphql API with the ``graphql_query`` mapping. + Raise a GitHubTokenError if the "GH_TOKEN" environment variable is not set. + Raise a GraphQLError on query errors. + """ + gh_token = os.environ.get("GH_TOKEN", None) + # graphql api cannot work without api token + if not gh_token: + msg = "Cannot call GitHub API without a token set in the GH_TOKEN environment variable." + logger.error(msg) + raise GitHubTokenError(msg) + + response = _get_gh_response(gh_token=gh_token, graphql_query=graphql_query) + + message = response.get("message") + if message and message == "Bad credentials": + raise GitHubTokenError(f"Invalid GitHub token: {message}") + + errors = response.get("errors") + if errors: + raise GraphQLError(errors) + + return response + + +def _get_gh_response(gh_token, graphql_query): + """ + Convenience function to easy mocking in tests + """ + endpoint = "https://api.github.com/graphql" + headers = {"Authorization": f"bearer {gh_token}"} + return requests.post(endpoint, headers=headers, json=graphql_query).json() diff --git a/vulnerabilities/import_runner.py b/vulnerabilities/import_runner.py index 6f90e2492..172fda349 100644 --- a/vulnerabilities/import_runner.py +++ b/vulnerabilities/import_runner.py @@ -21,14 +21,11 @@ # VulnerableCode is a free software tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. -import dataclasses import datetime -import json import logging from typing import Iterable from typing import List -from vulnerabilities import models from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.models import Advisory diff --git a/vulnerabilities/importer.py b/vulnerabilities/importer.py index 08093dcd7..aaac910a1 100644 --- a/vulnerabilities/importer.py +++ b/vulnerabilities/importer.py @@ -44,6 +44,7 @@ from univers.versions import Version from vulnerabilities.helpers import classproperty +from vulnerabilities.helpers import evolve_purl from vulnerabilities.helpers import nearest_patched_package from vulnerabilities.oval_parser import OvalParser from vulnerabilities.severity_systems import SCORING_SYSTEMS @@ -58,9 +59,6 @@ class VulnerabilitySeverity: value: str def to_dict(self): - """ - Return a serializable dict that can be converted back using self.from_dict - """ return { "system": self.system.identifier, "value": self.value, @@ -69,7 +67,8 @@ def to_dict(self): @classmethod def from_dict(cls, severity: dict): """ - Return a VulnerabilitySeverity object from dict generated by self.to_dict + Return a VulnerabilitySeverity object from a ``severity`` mapping of + VulnerabilitySeverity data. """ return cls(system=SCORING_SYSTEMS[severity["system"]], value=severity["value"]) @@ -90,9 +89,6 @@ def normalized(self): return Reference(reference_id=self.reference_id, url=self.url, severities=severities) def to_dict(self): - """ - Return a serializable dict that can be converted back using self.from_dict - """ return { "reference_id": self.reference_id, "url": self.url, @@ -101,9 +97,6 @@ def to_dict(self): @classmethod def from_dict(cls, ref: dict): - """ - Return a Reference object from dict generated by self.to_dict - """ return cls( reference_id=ref["reference_id"], url=ref["url"], @@ -128,9 +121,9 @@ class NoAffectedPackages(Exception): @dataclasses.dataclass(order=True, frozen=True) class AffectedPackage: """ - Contains a range of affected versions and a fixed version of a given package - The PackageURL supplied must *not* have a version - It must contain either `affected_version_range` or `fixed_version` + Relate a Package URL with a range of affected versions and a fixed version. + The Package URL must *not* have a version. + AffectedPackage must contain either ``affected_version_range`` or ``fixed_version``. """ package: PackageURL @@ -139,19 +132,21 @@ class AffectedPackage: def __post_init__(self): if self.package.version: - raise ValueError("The PackageURL supplied must not have a version") + raise ValueError(f"Affected Package URL {self.package!r} cannot have a version.") + if not (self.affected_version_range or self.fixed_version): raise ValueError( - "Affected Package should at least have either a fixed version or affected version range" + f"Affected Package {self.package!r} should have either a fixed version or an " + "affected version range." ) def get_fixed_purl(self): """ - Return PackageURL corresponding to object's fixed_version + Return a Package URL corresponding to object's fixed_version """ if not self.fixed_version: - raise ValueError("Affected package should have a fixed version") - fixed_purl = self.package._replace(version=str(self.fixed_version)) + raise ValueError(f"Affected Package {self.package!r} does not have a fixed version") + fixed_purl = evolve_purl(purl=self.package, version=str(self.fixed_version)) return fixed_purl @classmethod @@ -256,6 +251,20 @@ def to_dict(self): "date_published": self.date_published.isoformat() if self.date_published else None, } + @classmethod + def from_dict(cls, advisory_data): + date_published = advisory_data["date_published"] + transformed = { + "aliases": advisory_data["aliases"], + "summary": advisory_data["summary"], + "affected_packages": [ + AffectedPackage.from_dict(pkg) for pkg in advisory_data["affected_packages"] + ], + "references": [Reference.from_dict(ref) for ref in advisory_data["references"]], + "date_published": date_published.isoformat() if date_published else None, + } + return cls(**transformed) + class NoLicenseError(Exception): pass @@ -592,7 +601,7 @@ def get_data_from_xml_doc(self, xml_doc: ET.ElementTree, pkg_metadata={}) -> Lis version_class = version_class_by_package_type[pkg_metadata["type"]] version_scheme = version_class.scheme - affected_version_range = VersionSpecifier.from_scheme_version_spec_string( + affected_version_range = VersionRange.from_scheme_version_spec_string( version_scheme, affected_version_range ) all_versions = self.pkg_manager_api.get(package_name).valid_versions @@ -623,7 +632,7 @@ def get_data_from_xml_doc(self, xml_doc: ET.ElementTree, pkg_metadata={}) -> Lis ) all_adv.append( - Advisory( + AdvisoryData( summary=description, affected_packages=affected_packages, vulnerability_id=vuln_id, diff --git a/vulnerabilities/importers/apache_httpd.py b/vulnerabilities/importers/apache_httpd.py index 8f79c8b41..0481a550f 100644 --- a/vulnerabilities/importers/apache_httpd.py +++ b/vulnerabilities/importers/apache_httpd.py @@ -21,22 +21,21 @@ # Visit https://github.com/nexB/vulnerablecode/ for support and download. import asyncio -import dataclasses import urllib import requests from bs4 import BeautifulSoup from packageurl import PackageURL -from univers.version_specifier import VersionSpecifier +from univers.version_range import VersionRange from univers.versions import SemverVersion from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity from vulnerabilities.package_managers import GitHubTagsAPI -from vulnerabilities.severity_systems import scoring_systems +from vulnerabilities.severity_systems import APACHE_HTTPD class ApacheHTTPDImporter(Importer): @@ -78,7 +77,7 @@ def to_advisory(self, data): if value: severities.append( VulnerabilitySeverity( - system=scoring_systems["apache_httpd"], + system=APACHE_HTTPD, value=value, ) ) @@ -118,7 +117,7 @@ def to_advisory(self, data): ] ) - return Advisory( + return AdvisoryData( vulnerability_id=cve, summary=description, affected_packages=nearest_patched_package(affected_packages, fixed_packages), @@ -133,13 +132,13 @@ def to_version_ranges(self, versions_data): range_expression = version_data["version_affected"] if range_expression == "<": fixed_version_ranges.append( - VersionSpecifier.from_scheme_version_spec_string( + VersionRange.from_scheme_version_spec_string( "semver", ">={}".format(version_value) ) ) elif range_expression == "=" or range_expression == "?=": affected_version_ranges.append( - VersionSpecifier.from_scheme_version_spec_string( + VersionRange.from_scheme_version_spec_string( "semver", "{}".format(version_value) ) ) diff --git a/vulnerabilities/importers/apache_kafka.py b/vulnerabilities/importers/apache_kafka.py index 71e406031..38d14662f 100644 --- a/vulnerabilities/importers/apache_kafka.py +++ b/vulnerabilities/importers/apache_kafka.py @@ -25,11 +25,11 @@ import requests from bs4 import BeautifulSoup from packageurl import PackageURL -from univers.version_specifier import VersionSpecifier +from univers.version_range import VersionRange from univers.versions import MavenVersion from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference from vulnerabilities.package_managers import GitHubTagsAPI @@ -93,7 +93,7 @@ def to_advisory(self, advisory_page): ] advisories.append( - Advisory( + AdvisoryData( vulnerability_id=cve_id, summary=cve_description_paragraph.text, affected_packages=nearest_patched_package(affected_packages, fixed_packages), @@ -119,7 +119,7 @@ def to_version_ranges(version_range_text): lower_bound = f">={lower_bound}" upper_bound = f"<={upper_bound}" version_ranges.append( - VersionSpecifier.from_scheme_version_spec_string( + VersionRange.from_scheme_version_spec_string( "maven", f"{lower_bound},{upper_bound}" ) ) @@ -128,12 +128,12 @@ def to_version_ranges(version_range_text): # eg range_expression == "2.1.1 and later" range_expression = range_expression.replace("and later", "") version_ranges.append( - VersionSpecifier.from_scheme_version_spec_string("maven", f">={range_expression}") + VersionRange.from_scheme_version_spec_string("maven", f">={range_expression}") ) else: # eg range_expression == "3.0.0" version_ranges.append( - VersionSpecifier.from_scheme_version_spec_string("maven", range_expression) + VersionRange.from_scheme_version_spec_string("maven", range_expression) ) return version_ranges diff --git a/vulnerabilities/importers/apache_tomcat.py b/vulnerabilities/importers/apache_tomcat.py index 82dbd55ec..1f9681202 100644 --- a/vulnerabilities/importers/apache_tomcat.py +++ b/vulnerabilities/importers/apache_tomcat.py @@ -21,19 +21,18 @@ # Visit https://github.com/nexB/vulnerablecode/ for support and download. import asyncio -import dataclasses import re import requests from bs4 import BeautifulSoup from packageurl import PackageURL -from univers.version_specifier import VersionSpecifier +from univers.version_range import MavenVersionRange from univers.versions import MavenVersion from univers.versions import SemverVersion from vulnerabilities.helpers import create_etag from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference from vulnerabilities.package_managers import MavenVersionAPI @@ -113,7 +112,7 @@ def to_advisories(self, apache_tomcat_advisory_html): ] advisories.append( - Advisory( + AdvisoryData( summary="", affected_packages=nearest_patched_package(affected_packages, fixed_package), vulnerability_id=cve_id, @@ -126,19 +125,19 @@ def to_advisories(self, apache_tomcat_advisory_html): def parse_version_ranges(string): """ - This method yields VersionSpecifier objects obtained by + This method yields VersionRange objects obtained by parsing `string`. >>> list(parse_version_ranges("Affects: 9.0.0.M1 to 9.0.0.M9")) == [ - ... VersionSpecifier.from_scheme_version_spec_string('maven','<=9.0.0.M9,>=9.0.0.M1') + ... VersionRange.from_scheme_version_spec_string('maven','<=9.0.0.M9,>=9.0.0.M1') ... ] True >>> list(parse_version_ranges("Affects: 9.0.0.M1")) == [ - ... VersionSpecifier.from_scheme_version_spec_string('maven','>=9.0.0.M1,<=9.0.0.M1') + ... VersionRange.from_scheme_version_spec_string('maven','>=9.0.0.M1,<=9.0.0.M1') ... ] True >>> list(parse_version_ranges("Affects: 9.0.0.M1 to 9.0.0.M9, 1.2.3 to 3.4.5")) == [ - ... VersionSpecifier.from_scheme_version_spec_string('maven','<=9.0.0.M9,>=9.0.0.M1'), - ... VersionSpecifier.from_scheme_version_spec_string('maven','<=3.4.5,>=1.2.3') + ... VersionRange.from_scheme_version_spec_string('maven','<=9.0.0.M9,>=9.0.0.M1'), + ... VersionRange.from_scheme_version_spec_string('maven','<=3.4.5,>=1.2.3') ... ] True """ @@ -152,6 +151,4 @@ def parse_version_ranges(string): else: lower_bound = upper_bound = version_range - yield VersionSpecifier.from_scheme_version_spec_string( - "maven", f">={lower_bound},<={upper_bound}" - ) + yield MavenVersionRange.from_native(f">={lower_bound},<={upper_bound}") diff --git a/vulnerabilities/importers/archlinux.py b/vulnerabilities/importers/archlinux.py index b3ca2a231..174fb19d8 100644 --- a/vulnerabilities/importers/archlinux.py +++ b/vulnerabilities/importers/archlinux.py @@ -30,19 +30,19 @@ from packageurl import PackageURL +from vulnerabilities import severity_systems from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity -from vulnerabilities.severity_systems import scoring_systems class ArchlinuxImporter(Importer): def __enter__(self): self._api_response = self._fetch() - def updated_advisories(self) -> Set[Advisory]: + def updated_advisories(self) -> Set[AdvisoryData]: advisories = [] for record in self._api_response: @@ -54,7 +54,7 @@ def _fetch(self) -> Iterable[Mapping]: with urlopen(self.config.archlinux_tracker_url) as response: return json.load(response) - def _parse(self, record) -> List[Advisory]: + def _parse(self, record) -> List[AdvisoryData]: advisories = [] for cve_id in record["issues"]: @@ -88,7 +88,7 @@ def _parse(self, record) -> List[Advisory]: url="https://security.archlinux.org/{}".format(record["name"]), severities=[ VulnerabilitySeverity( - system=scoring_systems["avgs"], value=record["severity"] + system=severity_systems.ARCHLINUX, value=record["severity"] ) ], ) diff --git a/vulnerabilities/importers/debian.py b/vulnerabilities/importers/debian.py index 6dedd4f94..b829ad064 100644 --- a/vulnerabilities/importers/debian.py +++ b/vulnerabilities/importers/debian.py @@ -32,7 +32,7 @@ from packageurl import PackageURL from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference @@ -45,7 +45,7 @@ def __enter__(self): else: self._api_response = {} - def updated_advisories(self) -> Set[Advisory]: + def updated_advisories(self) -> Set[AdvisoryData]: advisories = [] for pkg_name, records in self._api_response.items(): @@ -56,7 +56,7 @@ def updated_advisories(self) -> Set[Advisory]: def _fetch(self) -> Mapping[str, Any]: return requests.get(self.config.debian_tracker_url).json() - def _parse(self, pkg_name: str, records: Mapping[str, Any]) -> List[Advisory]: + def _parse(self, pkg_name: str, records: Mapping[str, Any]) -> List[AdvisoryData]: advisories = [] ignored_versions = {"3.8.20-4."} @@ -111,7 +111,7 @@ def _parse(self, pkg_name: str, records: Mapping[str, Any]) -> List[Advisory]: bug_url = f"https://bugs.debian.org/cgi-bin/bugreport.cgi?bug={debianbug}" references.append(Reference(url=bug_url, reference_id=debianbug)) advisories.append( - Advisory( + AdvisoryData( vulnerability_id=cve_id, affected_packages=nearest_patched_package(impacted_purls, resolved_purls), summary=record.get("description", ""), diff --git a/vulnerabilities/importers/debian_oval.py b/vulnerabilities/importers/debian_oval.py index 942f33509..7e88b4e55 100644 --- a/vulnerabilities/importers/debian_oval.py +++ b/vulnerabilities/importers/debian_oval.py @@ -22,7 +22,6 @@ import asyncio -import dataclasses import xml.etree.ElementTree as ET import requests diff --git a/vulnerabilities/importers/elixir_security.py b/vulnerabilities/importers/elixir_security.py index 9f8ccedb3..5e5006a25 100644 --- a/vulnerabilities/importers/elixir_security.py +++ b/vulnerabilities/importers/elixir_security.py @@ -23,12 +23,12 @@ from typing import Set from packageurl import PackageURL -from univers.version_specifier import VersionSpecifier +from univers.version_range import VersionRange from univers.versions import SemverVersion from vulnerabilities.helpers import load_yaml from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import GitImporter from vulnerabilities.importer import Reference from vulnerabilities.package_managers import HexVersionAPI @@ -48,7 +48,7 @@ def __enter__(self): def set_api(self, packages): asyncio.run(self.pkg_manager_api.load_api(packages)) - def updated_advisories(self) -> Set[Advisory]: + def updated_advisories(self) -> Set[AdvisoryData]: files = self._updated_files.union(self._added_files) advisories = [] for f in files: @@ -78,8 +78,7 @@ def get_versions_for_pkg_from_range_list(self, version_range_list, pkg_name): if not version_range_list: return [], all_version_list version_ranges = [ - VersionSpecifier.from_scheme_version_spec_string("semver", r) - for r in version_range_list + VersionRange.from_scheme_version_spec_string("semver", r) for r in version_range_list ] for version in all_version_list: version_obj = SemverVersion(version) @@ -130,7 +129,7 @@ def process_file(self, path): ), ] - return Advisory( + return AdvisoryData( summary=yaml_file["description"], affected_packages=nearest_patched_package(vuln_purls, safe_purls), vulnerability_id=cve_id, diff --git a/vulnerabilities/importers/gentoo.py b/vulnerabilities/importers/gentoo.py index 73d3492f6..f850194bd 100644 --- a/vulnerabilities/importers/gentoo.py +++ b/vulnerabilities/importers/gentoo.py @@ -27,7 +27,7 @@ from packageurl import PackageURL from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import GitImporter from vulnerabilities.importer import Reference @@ -41,7 +41,7 @@ def __enter__(self): recursive=True, file_ext="xml" ) - def updated_advisories(self) -> Set[Advisory]: + def updated_advisories(self) -> Set[AdvisoryData]: files = self._updated_files.union(self._added_files) advisories = [] for f in files: @@ -79,7 +79,7 @@ def process_file(self, file): # It is very inefficient, to create new Advisory for each CVE # this way, but there seems no alternative. for cve in xml_data["cves"]: - advisory = Advisory( + advisory = AdvisoryData( vulnerability_id=cve, summary=xml_data["description"], affected_packages=nearest_patched_package( diff --git a/vulnerabilities/importers/github.py b/vulnerabilities/importers/github.py index 281585f03..cfba31c9e 100644 --- a/vulnerabilities/importers/github.py +++ b/vulnerabilities/importers/github.py @@ -21,7 +21,6 @@ # Visit https://github.com/nexB/vulnerablecode/ for support and download. import logging -import os from datetime import datetime from typing import Iterable from typing import List @@ -29,13 +28,14 @@ from typing import Optional from typing import Tuple -import requests from dateutil import parser as dateparser from django.db.models.query import QuerySet from packageurl import PackageURL from univers.version_range import VersionRange from univers.version_range import build_range_from_github_advisory_constraint +from vulnerabilities import helpers +from vulnerabilities import severity_systems from vulnerabilities.helpers import AffectedPackage as LegacyAffectedPackage from vulnerabilities.helpers import get_item from vulnerabilities.helpers import nearest_patched_package @@ -48,16 +48,15 @@ from vulnerabilities.improver import Improver from vulnerabilities.improver import Inference from vulnerabilities.models import Advisory -from vulnerabilities.package_managers_2 import ComposerVersionAPI -from vulnerabilities.package_managers_2 import GoproxyVersionAPI -from vulnerabilities.package_managers_2 import MavenVersionAPI -from vulnerabilities.package_managers_2 import NugetVersionAPI -from vulnerabilities.package_managers_2 import PypiVersionAPI -from vulnerabilities.package_managers_2 import RubyVersionAPI -from vulnerabilities.package_managers_2 import VersionAPI -from vulnerabilities.severity_systems import SCORING_SYSTEMS +from vulnerabilities.package_managers import ComposerVersionAPI +from vulnerabilities.package_managers import GoproxyVersionAPI +from vulnerabilities.package_managers import MavenVersionAPI +from vulnerabilities.package_managers import NugetVersionAPI +from vulnerabilities.package_managers import PypiVersionAPI +from vulnerabilities.package_managers import RubyVersionAPI +from vulnerabilities.package_managers import VersionAPI -LOGGER = logging.getLogger(__name__) +logger = logging.getLogger(__name__) WEIRD_IGNORABLE_VERSIONS = frozenset( [ @@ -132,7 +131,6 @@ "GO": "golang", } - GITHUB_ECOSYSTEM_BY_PACKAGE_TYPE = { value: key for (key, value) in PACKAGE_TYPE_BY_GITHUB_ECOSYSTEM.items() } @@ -141,34 +139,34 @@ # Check https://github.com/nexB/vulnerablecode/issues/645 # set of all possible values of first '%s' = {'MAVEN','COMPOSER', 'NUGET', 'RUBYGEMS', 'PYPI'} # second '%s' is interesting, it will have the value '' for the first request, -GRAPHQL_VULNERABILITY_QUERY_TEMPLATE = """ +GRAPHQL_QUERY_TEMPLATE = """ query{ -securityVulnerabilities(first: 100, ecosystem: %s, %s) { - edges { - node { - advisory { - identifiers { - type - value - } - summary - references { - url - } - severity - publishedAt + securityVulnerabilities(first: 100, ecosystem: %s, %s) { + edges { + node { + advisory { + identifiers { + type + value + } + summary + references { + url + } + severity + publishedAt + } + package { + name + } + vulnerableVersionRange + } } - package { - name + pageInfo { + hasNextPage + endCursor } - vulnerableVersionRange - } } - pageInfo { - hasNextPage - endCursor - } -} } """ @@ -184,49 +182,26 @@ VERSION_API_CLASSES_BY_PACKAGE_TYPE = {cls.package_type: cls for cls in VERSION_API_CLASSES} -class GitHubTokenError(Exception): - pass - - -# Isolated network call for simplicity of testing -def get_response(endpoint: str, headers: dict, query: dict): - return requests.post(endpoint, headers=headers, json=query).json() - - class GitHubAPIImporter(Importer): spdx_license_expression = "CC-BY-4.0" - endpoint = "https://api.github.com/graphql" def advisory_data(self) -> Iterable[AdvisoryData]: - """ - Return a list of AdvisoryData objects - """ - try: - token = os.environ["GH_TOKEN"] - except Exception as e: - LOGGER.error("No GitHub token found. Please set the GH_TOKEN environment variable.") - raise GitHubTokenError(e) - headers = {"Authorization": f"token {token}"} - advisories = [] for ecosystem, package_type in PACKAGE_TYPE_BY_GITHUB_ECOSYSTEM.items(): end_cursor_exp = "" while True: - query = { - "query": GRAPHQL_VULNERABILITY_QUERY_TEMPLATE % (ecosystem, end_cursor_exp) - } - resp = get_response(endpoint=self.endpoint, headers=headers, query=query) - message = resp.get("message") - if message and message == "Bad credentials": - raise GitHubTokenError("Invalid GitHub token") - page_info = get_item(resp, "data", "securityVulnerabilities", "pageInfo") + graphql_query = {"query": GRAPHQL_QUERY_TEMPLATE % (ecosystem, end_cursor_exp)} + response = helpers.fetch_github_graphql_query(graphql_query) + + page_info = get_item(response, "data", "securityVulnerabilities", "pageInfo") end_cursor = get_item(page_info, "endCursor") if end_cursor: end_cursor = f'"{end_cursor}"' end_cursor_exp = f"after: {end_cursor}" - advisories.extend(process_response(resp, package_type=package_type)) + + yield from process_response(response, package_type=package_type) + if not get_item(page_info, "hasNextPage"): break - return advisories def get_reference_id(url: str): @@ -252,7 +227,7 @@ def extract_references(reference_data: List[dict]) -> Iterable[Reference]: for ref in reference_data: url = ref["url"] if not isinstance(url, str): - LOGGER.error(f"extract_references: url is not of type `str`: {url}") + logger.error(f"extract_references: url is not of type `str`: {url}") continue if "GHSA-" in url.upper(): reference = Reference(url=url, reference_id=get_reference_id(url)) @@ -272,14 +247,14 @@ def get_purl(pkg_type: str, github_name: str) -> Optional[PackageURL]: """ if pkg_type == "maven": if ":" not in github_name: - LOGGER.error(f"get_purl: Invalid maven package name {github_name}") + logger.error(f"get_purl: Invalid maven package name {github_name}") return ns, _, name = github_name.partition(":") return PackageURL(type=pkg_type, namespace=ns, name=name) if pkg_type == "composer": if "/" not in github_name: - LOGGER.error(f"get_purl: Invalid composer package name {github_name}") + logger.error(f"get_purl: Invalid composer package name {github_name}") return vendor, _, name = github_name.partition("/") return PackageURL(type=pkg_type, namespace=vendor, name=name) @@ -287,7 +262,7 @@ def get_purl(pkg_type: str, github_name: str) -> Optional[PackageURL]: if pkg_type in ("nuget", "pypi", "gem", "golang"): return PackageURL(type=pkg_type, name=github_name) - LOGGER.error(f"get_purl: Unknown package type {pkg_type}") + logger.error(f"get_purl: Unknown package type {pkg_type}") class InvalidVersionRange(Exception): @@ -313,17 +288,16 @@ def get_api_package_name(purl: PackageURL) -> str: if purl.type in ("nuget", "pypi", "gem", "golang"): return purl.name - LOGGER.error(f"get_api_package_name: Unknown PURL {purl!r}") + logger.error(f"get_api_package_name: Unknown PURL {purl!r}") def process_response(resp: dict, package_type: str) -> Iterable[AdvisoryData]: """ - Yield `AdvisoryData` by taking - `resp` and `ecosystem` as input + Yield `AdvisoryData` by taking `resp` and `ecosystem` as input """ vulnerabilities = get_item(resp, "data", "securityVulnerabilities", "edges") or [] if not vulnerabilities: - LOGGER.error( + logger.error( f"No vulnerabilities found for package_type: {package_type!r} in response: {resp!r}" ) return @@ -333,12 +307,12 @@ def process_response(resp: dict, package_type: str) -> Iterable[AdvisoryData]: aliases = set() github_advisory = get_item(vulnerability, "node") if not github_advisory: - LOGGER.error(f"No node found in {vulnerability!r}") + logger.error(f"No node found in {vulnerability!r}") continue name = get_item(github_advisory, "package", "name") if not name: - LOGGER.error(f"No name found in {github_advisory!r}") + logger.error(f"No name found in {github_advisory!r}") continue purl = get_purl(pkg_type=package_type, github_name=name) @@ -347,7 +321,7 @@ def process_response(resp: dict, package_type: str) -> Iterable[AdvisoryData]: vulnerable_range = get_item(github_advisory, "vulnerableVersionRange") if not vulnerable_range: - LOGGER.error(f"No affected range found in {github_advisory!r}") + logger.error(f"No affected range found in {github_advisory!r}") continue affected_range = None @@ -356,7 +330,7 @@ def process_response(resp: dict, package_type: str) -> Iterable[AdvisoryData]: package_type, vulnerable_range ) except InvalidVersionRange: - LOGGER.error(f"Could not parse affected range {vulnerable_range!r}") + logger.error(f"Could not parse affected range {vulnerable_range!r}") continue if affected_range != NotImplementedError: @@ -369,7 +343,7 @@ def process_response(resp: dict, package_type: str) -> Iterable[AdvisoryData]: advisory = get_item(github_advisory, "advisory") if not advisory: - LOGGER.error(f"No advisory found in {github_advisory!r}") + logger.error(f"No advisory found in {github_advisory!r}") continue references = get_item(advisory, "references") or [] @@ -392,7 +366,7 @@ def process_response(resp: dict, package_type: str) -> Iterable[AdvisoryData]: if severity: ref.severities = [ VulnerabilitySeverity( - system=SCORING_SYSTEMS["cvssv3.1_qr"], + system=severity_systems.CVSS31_QUALITY, value=severity, ) ] @@ -400,7 +374,7 @@ def process_response(resp: dict, package_type: str) -> Iterable[AdvisoryData]: elif identifier_type == "CVE": pass else: - LOGGER.error(f"Unknown identifier type {identifier_type!r} and value {value!r}") + logger.error(f"Unknown identifier type {identifier_type!r} and value {value!r}") date_published = get_item(advisory, "publishedAt") if date_published: @@ -417,7 +391,7 @@ def process_response(resp: dict, package_type: str) -> Iterable[AdvisoryData]: class GitHubBasicImprover(Improver): def __init__(self) -> None: - self.version_api_by_purl_type: Mapping[str, VersionAPI] = {} + self.versions_fetcher_by_purl: Mapping[str, VersionAPI] = {} @property def interesting_advisories(self) -> QuerySet: @@ -431,16 +405,17 @@ def get_package_versions( """ api_name = get_api_package_name(package_url) if not api_name: - LOGGER.error(f"Could not get versions for {package_url!r}") + logger.error(f"Could not get versions for {package_url!r}") return [] - version_api = self.version_api_by_purl_type.get(package_url.type) - if not version_api: - version_api: VersionAPI = VERSION_API_CLASSES_BY_PACKAGE_TYPE[package_url.type] - self.version_api_by_purl_type[package_url.type] = version_api() - api_object = self.version_api_by_purl_type[package_url.type] - api_object.load_api([api_name]) - self.version_api_by_purl_type[package_url.type] = api_object - return api_object.get(package_name=api_name, until=until).valid_versions + versions_fetcher = self.versions_fetcher_by_purl.get(package_url) + if not versions_fetcher: + versions_fetcher: VersionAPI = VERSION_API_CLASSES_BY_PACKAGE_TYPE[package_url.type] + self.versions_fetcher_by_purl[package_url] = versions_fetcher() + + versions_fetcher = self.versions_fetcher_by_purl[package_url] + + self.versions_fetcher_by_purl[package_url] = versions_fetcher + return versions_fetcher.get_until(package_name=api_name, until=until).valid_versions def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]: """ @@ -453,7 +428,7 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]: advisory_data.affected_packages ) except UnMergeablePackageError: - LOGGER.error(f"Cannot merge with different purls {advisory_data.affected_packages!r}") + logger.error(f"Cannot merge with different purls {advisory_data.affected_packages!r}") return iter([]) pkg_type = purl.type @@ -462,11 +437,11 @@ def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]: if purl.type == "golang": # Problem with the Golang and Go that they provide full path # FIXME: We need to get the PURL subpath for Go module - version_api_object = self.version_api_by_purl_type.get(purl.type) - if not version_api_object: - version_api_object = GoproxyVersionAPI() - self.version_api_by_purl_type[purl.type] = version_api_object - pkg_name = version_api_object.module_name_by_package_name.get(pkg_name, pkg_name) + versions_fetcher = self.versions_fetcher_by_purl.get(purl) + if not versions_fetcher: + versions_fetcher = GoproxyVersionAPI() + self.versions_fetcher_by_purl[purl] = versions_fetcher + pkg_name = versions_fetcher.module_name_by_package_name.get(pkg_name, pkg_name) valid_versions = self.get_package_versions( package_url=purl, until=advisory_data.date_published @@ -516,11 +491,12 @@ def resolve_version_range( ignorable_versions=WEIRD_IGNORABLE_VERSIONS, ) -> Tuple[List[str], List[str]]: """ - Given an affected version range and a list of `package_versions`, resolve which versions are in this range - and return a tuple of two lists of `affected_versions` and `unaffected_versions`. + Given an affected version range and a list of `package_versions`, resolve + which versions are in this range and return a tuple of two lists of + `affected_versions` and `unaffected_versions`. """ if not affected_version_range: - LOGGER.error(f"affected version range is {affected_version_range!r}") + logger.error(f"affected version range is {affected_version_range!r}") return [], [] affected_versions = [] unaffected_versions = [] @@ -534,7 +510,7 @@ def resolve_version_range( try: version = affected_version_range.version_class(package_version) except Exception: - LOGGER.error(f"Could not parse version {package_version!r}") + logger.error(f"Could not parse version {package_version!r}") continue if version in affected_version_range: affected_versions.append(package_version) diff --git a/vulnerabilities/importers/istio.py b/vulnerabilities/importers/istio.py index 12b7d45bc..9b628e7af 100644 --- a/vulnerabilities/importers/istio.py +++ b/vulnerabilities/importers/istio.py @@ -27,12 +27,12 @@ import saneyaml from dateutil import parser from packageurl import PackageURL -from univers.version_specifier import VersionSpecifier +from univers.version_range import VersionRange from univers.versions import SemverVersion from vulnerabilities.helpers import nearest_patched_package from vulnerabilities.helpers import split_markdown_front_matter -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import GitImporter from vulnerabilities.importer import Reference from vulnerabilities.package_managers import GitHubTagsAPI @@ -54,7 +54,7 @@ def __enter__(self): def set_api(self): asyncio.run(self.version_api.load_api(["istio/istio"])) - def updated_advisories(self) -> Set[Advisory]: + def updated_advisories(self) -> Set[AdvisoryData]: files = self._added_files.union(self._updated_files) advisories = [] for f in files: @@ -76,8 +76,7 @@ def get_pkg_versions_from_ranges(self, version_range_list, release_date): safe_pkg_versions = [] vuln_pkg_versions = [] version_ranges = [ - VersionSpecifier.from_scheme_version_spec_string("semver", r) - for r in version_range_list + VersionRange.from_scheme_version_spec_string("semver", r) for r in version_range_list ] for version in all_version: version_obj = SemverVersion(version) @@ -165,7 +164,7 @@ def process_file(self, path): affected_packages.extend(nearest_patched_package(vuln_purls_github, safe_purls_github)) advisories.append( - Advisory( + AdvisoryData( vulnerability_id=cve_id, summary=data["description"], affected_packages=affected_packages, diff --git a/vulnerabilities/importers/kaybee.py b/vulnerabilities/importers/kaybee.py index be94a2770..b30529b80 100644 --- a/vulnerabilities/importers/kaybee.py +++ b/vulnerabilities/importers/kaybee.py @@ -24,7 +24,7 @@ from vulnerabilities.helpers import load_yaml from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import GitImporter from vulnerabilities.importer import Reference @@ -67,7 +67,7 @@ def yaml_file_to_advisory(yaml_path): for commit in fix["commits"]: references.append(Reference(url=f"{commit['repository']}/{commit['id']}")) - return Advisory( + return AdvisoryData( vulnerability_id=vuln_id, summary=summary, affected_packages=nearest_patched_package(impacted_packages, resolved_packages), diff --git a/vulnerabilities/importers/mattermost.py b/vulnerabilities/importers/mattermost.py index 290281ea2..4c1cdd38c 100644 --- a/vulnerabilities/importers/mattermost.py +++ b/vulnerabilities/importers/mattermost.py @@ -6,14 +6,16 @@ import requests from bs4 import BeautifulSoup from dephell_specifier import RangeSpecifier + +# from univers.version_range import VersionRange from packageurl import PackageURL -from vulnerabilities.data_source import Advisory -from vulnerabilities.data_source import DataSource -from vulnerabilities.data_source import Reference -from vulnerabilities.data_source import VulnerabilitySeverity +from vulnerabilities import severity_systems +from vulnerabilities.importer import AdvisoryData +from vulnerabilities.importer import Importer +from vulnerabilities.importer import Reference +from vulnerabilities.importer import VulnerabilitySeverity from vulnerabilities.package_managers import GitHubTagsAPI -from vulnerabilities.severity_systems import scoring_systems SECURITY_UPDATES_URL = "https://mattermost.com/security-updates" MM_REPO = { @@ -23,7 +25,7 @@ } -class MattermostDataSource(DataSource): +class MattermostDataSource(Importer): def updated_advisories(self): # FIXME: Change after this https://forum.mattermost.org/t/mattermost-website-returning-403-when-headers-contain-the-word-python/11412 self.set_api() @@ -94,7 +96,7 @@ def to_advisories(self, data): url=SECURITY_UPDATES_URL, severities=[ VulnerabilitySeverity( - system=scoring_systems["cvssv3.1_qr"], value=severity_col.text + system=severity_systems.CVSS31_QUALITY, value=severity_col.text ) ] if severity_col.text.lower() != "na" @@ -110,7 +112,7 @@ def to_advisories(self, data): ) ) advisories.append( - Advisory( + AdvisoryData( vulnerability_id="", summary=desc_col.text, references=references, diff --git a/vulnerabilities/importers/mozilla.py b/vulnerabilities/importers/mozilla.py index 7ee154e89..8c89b3864 100644 --- a/vulnerabilities/importers/mozilla.py +++ b/vulnerabilities/importers/mozilla.py @@ -7,13 +7,13 @@ from markdown import markdown from packageurl import PackageURL +from vulnerabilities import severity_systems from vulnerabilities.helpers import is_cve from vulnerabilities.helpers import split_markdown_front_matter -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import GitImporter from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity -from vulnerabilities.severity_systems import SCORING_SYSTEMS REPOSITORY = "mozilla/foundation-security-advisories" MFSA_FILENAME_RE = re.compile(r"mfsa(\d{4}-\d{2,3})\.(md|yml)$") @@ -28,7 +28,7 @@ def __enter__(self): recursive=True, subdir="announce" ) - def updated_advisories(self) -> Set[Advisory]: + def updated_advisories(self) -> Set[AdvisoryData]: files = self._updated_files.union(self._added_files) files = [ f for f in files if f.endswith(".md") or f.endswith(".yml") @@ -41,7 +41,7 @@ def updated_advisories(self) -> Set[Advisory]: return self.batch_advisories(advisories) -def to_advisories(path: str) -> List[Advisory]: +def to_advisories(path: str) -> List[AdvisoryData]: """ Convert a file to corresponding advisories. This calls proper method to handle yml/md files. @@ -59,7 +59,7 @@ def to_advisories(path: str) -> List[Advisory]: return [] -def get_advisories_from_yml(mfsa_id, lines) -> List[Advisory]: +def get_advisories_from_yml(mfsa_id, lines) -> List[AdvisoryData]: advisories = [] data = yaml.safe_load(lines) data["mfsa_id"] = mfsa_id @@ -75,7 +75,7 @@ def get_advisories_from_yml(mfsa_id, lines) -> List[Advisory]: summary = BeautifulSoup(advisory.get("description", ""), features="lxml").get_text() advisories.append( - Advisory( + AdvisoryData( summary=summary, vulnerability_id=cve if is_cve(cve) else "", impacted_package_urls=[], @@ -87,7 +87,7 @@ def get_advisories_from_yml(mfsa_id, lines) -> List[Advisory]: return advisories -def get_advisories_from_md(mfsa_id, lines) -> List[Advisory]: +def get_advisories_from_md(mfsa_id, lines) -> List[AdvisoryData]: yamltext, mdtext = split_markdown_front_matter(lines.read()) data = yaml.safe_load(yamltext) data["mfsa_id"] = mfsa_id @@ -106,7 +106,7 @@ def get_advisories_from_md(mfsa_id, lines) -> List[Advisory]: description = html_get_p_under_h3(markdown(mdtext), "description") return [ - Advisory( + AdvisoryData( summary=description, vulnerability_id="", impacted_package_urls=[], @@ -175,6 +175,6 @@ def get_yml_references(data: any) -> List[Reference]: Reference( reference_id=data["mfsa_id"], url="https://www.mozilla.org/en-US/security/advisories/{}".format(data["mfsa_id"]), - severities=[VulnerabilitySeverity(scoring_systems["generic_textual"], severity)], + severities=[VulnerabilitySeverity(system=severity_systems.GENERIC, value=severity)], ) ] diff --git a/vulnerabilities/importers/nginx.py b/vulnerabilities/importers/nginx.py index 7aa217747..b5c3ff8ea 100644 --- a/vulnerabilities/importers/nginx.py +++ b/vulnerabilities/importers/nginx.py @@ -19,9 +19,11 @@ # for any legal advice. # VulnerableCode is a free software tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. -import asyncio + import logging from typing import Iterable +from typing import List +from typing import NamedTuple import requests from bs4 import BeautifulSoup @@ -30,6 +32,7 @@ from univers.version_range import NginxVersionRange from univers.versions import SemverVersion +from vulnerabilities.helpers import evolve_purl from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import AffectedPackage from vulnerabilities.importer import Importer @@ -40,9 +43,8 @@ from vulnerabilities.improver import Inference from vulnerabilities.models import Advisory from vulnerabilities.package_managers import GitHubTagsAPI -from vulnerabilities.package_managers import Version -from vulnerabilities.severity_systems import SCORING_SYSTEMS -from vulnerabilities.severity_systems import ScoringSystem +from vulnerabilities.package_managers import PackageVersion +from vulnerabilities.severity_systems import GENERIC logger = logging.getLogger(__name__) @@ -51,43 +53,61 @@ class NginxImporter(Importer): url = "https://nginx.org/en/security_advisories.html" - # TODO: Populate this properly - spdx_license_expression = "TODO" + spdx_license_expression = "BSD-2-Clause" + license_url = "https://nginx.org/LICENSE" def advisory_data(self) -> Iterable[AdvisoryData]: - data = requests.get(self.url).content - soup = BeautifulSoup(data, features="lxml") - vuln_list = soup.select("li p") - for vuln_info in vuln_list: - yield to_advisory_data(**parse_advisory_data_from_paragraph(vuln_info)) + text = self.fetch() + yield from advisory_data_from_text(text) + + def fetch(self): + return requests.get(self.url).content -def to_advisory_data( - aliases, summary, advisory_severity, not_vulnerable, vulnerable, references -) -> AdvisoryData: +def advisory_data_from_text(text): """ - Return AdvisoryData formed by given parameters - An advisory paragraph, without html markup, looks like: - - 1-byte memory overwrite in resolver - Severity: medium - Advisory - CVE-2021-23017 - Not vulnerable: 1.21.0+, 1.20.1+ - Vulnerable: 0.6.18-1.20.0 - The patch pgp + Yield AdvisoryData from the ``text`` of the nginx security advisories HTML + web page. """ + soup = BeautifulSoup(text, features="lxml") + vuln_list = soup.select("li p") + for vuln_info in vuln_list: + ngnix_adv = parse_advisory_data_from_paragraph(vuln_info) + yield to_advisory_data(ngnix_adv) + + +class NginxAdvisory(NamedTuple): + aliases: list + summary: str + advisory_severity: str + not_vulnerable: str + vulnerable: str + references: list + + def to_dict(self): + return self._asdict() + +def to_advisory_data(ngnx_adv: NginxAdvisory) -> AdvisoryData: + """ + Return AdvisoryData from an NginxAdvisory tuple. + """ + package_name = "nginx" + package_type = "nginx" qualifiers = {} - _, _, affected_version_range = vulnerable.partition(":") + _, _, affected_version_range = ngnx_adv.vulnerable.partition(":") if "nginx/Windows" in affected_version_range: qualifiers["os"] = "windows" affected_version_range = affected_version_range.replace("nginx/Windows", "") + + purl = PackageURL(type=package_type, name=package_name, qualifiers=qualifiers) + affected_version_range = NginxVersionRange.from_native(affected_version_range) affected_packages = [] - _, _, fixed_versions = not_vulnerable.partition(":") + _, _, fixed_versions = ngnx_adv.not_vulnerable.partition(":") + for fixed_version in fixed_versions.split(","): fixed_version = fixed_version.rstrip("+") @@ -95,14 +115,13 @@ def to_advisory_data( if "none" in fixed_version: affected_packages.append( AffectedPackage( - package=PackageURL(type="generic", name="nginx", qualifiers=qualifiers), + package=purl, affected_version_range=affected_version_range, ) ) break fixed_version = SemverVersion(fixed_version) - purl = PackageURL(type="generic", name="nginx", qualifiers=qualifiers) affected_packages.append( AffectedPackage( package=purl, @@ -112,182 +131,223 @@ def to_advisory_data( ) return AdvisoryData( - aliases=aliases, - summary=summary, + aliases=ngnx_adv.aliases, + summary=ngnx_adv.summary, affected_packages=affected_packages, - references=references, + references=ngnx_adv.references, ) def parse_advisory_data_from_paragraph(vuln_info): """ - Return a dict with keys (aliases, summary, advisory_severity, - not_vulnerable, vulnerable, references) from bs4 paragraph + Return an NginxAdvisory from a ``vuln_info`` bs4 paragraph. + + An advisory paragraph, without html markup, looks like this: + + 1-byte memory overwrite in resolver + Severity: medium + Advisory + CVE-2021-23017 + Not vulnerable: 1.21.0+, 1.20.1+ + Vulnerable: 0.6.18-1.20.0 + The patch pgp - For example: - >>> paragraph = ('

1-byte memory overwrite in resolver
Severity: medium
' - ... '' - ... 'Advisory
CVE-2021-23017
Not vulnerable: 1.21.0+, 1.20.1+
' - ... 'Vulnerable: 0.6.18-1.20.0
' - ... 'The patch  pgp

') - >>> vuln_info = BeautifulSoup(paragraph, features="lxml").p - >>> expected = { - ... 'aliases': ['CVE-2021-23017'], - ... 'summary': '1-byte memory overwrite in resolver', - ... 'advisory_severity': 'Severity: medium', - ... 'not_vulnerable': 'Not vulnerable: 1.21.0+, 1.20.1+', - ... 'vulnerable': 'Vulnerable: 0.6.18-1.20.0', - ... 'references': [ - ... Reference( - ... reference_id='', - ... url='http://mailman.nginx.org/pipermail/nginx-announce/2021/000300.html', - ... severities=[VulnerabilitySeverity( - ... system=ScoringSystem( - ... identifier='generic_textual', - ... name='Generic textual severity rating', - ... url='', - ... notes='Severity for unknown scoring systems. ' - ... 'Contains generic textual values like High, Low etc'), - ... value='Severity: medium' - ... )] - ... ), - ... Reference( - ... reference_id='', - ... url='https://nginx.org/download/patch.2021.resolver.txt', - ... severities=[] - ... ), - ... Reference( - ... reference_id='', - ... url='https://nginx.org/download/patch.2021.resolver.txt.asc', - ... severities=[] - ... ) - ... ] - ... } - >>> assert parse_advisory_data_from_paragraph(vuln_info) == expected """ aliases = [] - summary = advisory_severity = not_vulnerable = vulnerable = None + summary = None + advisory_severity = None + not_vulnerable = None + vulnerable = None references = [] is_first = True + + # we iterate on the children to accumulate values in variables + # FIXME: using an explicit xpath-like query could be simpler for child in vuln_info.children: if is_first: summary = child is_first = False + continue - elif child.text.startswith( + text = child.text.strip() + text_low = text.lower() + + if text.startswith( ( "CVE-", "CORE-", "VU#", ) ): - aliases.append(child.text) + aliases.append(text) + if text.startswith("CVE-"): - elif "severity" in child.text.lower(): - advisory_severity = child.text + # always keep the CVE as a reference too + link = f"https://nvd.nist.gov/vuln/detail/{text}" + reference = Reference(reference_id=text, url=link) + references.append(reference) - elif "not vulnerable" in child.text.lower(): - not_vulnerable = child.text + elif "severity" in text_low: + advisory_severity = build_severity(severity=text) + + elif "not vulnerable" in text_low: + not_vulnerable = text + + elif "vulnerable" in text_low: + vulnerable = text + + elif hasattr(child, "attrs"): + link = child.attrs.get("href") + if link: + if "cve.mitre.org" in link: + references.append(Reference(reference_id=text, url=link)) + elif "mailman.nginx.org" in link: + if advisory_severity: + severities = [advisory_severity] + else: + severities = [] + references.append(Reference(url=link, severities=severities)) + else: + link = requests.compat.urljoin("https://nginx.org", link) + references.append(Reference(url=link)) + + return NginxAdvisory( + aliases=aliases, + summary=summary, + advisory_severity=advisory_severity, + not_vulnerable=not_vulnerable, + vulnerable=vulnerable, + references=references, + ) - elif "vulnerable" in child.text.lower(): - vulnerable = child.text - elif hasattr(child, "attrs") and child.attrs.get("href"): - link = child.attrs["href"] - # Take care of relative urls - link = requests.compat.urljoin("https://nginx.org", link) - if "cve.mitre.org" in link: - cve = child.text.strip() - reference = Reference(reference_id=cve, url=link) - references.append(reference) - elif "http://mailman.nginx.org" in link: - ss = SCORING_SYSTEMS["generic_textual"] - severity = VulnerabilitySeverity(system=ss, value=advisory_severity) - references.append(Reference(url=link, severities=[severity])) - else: - references.append(Reference(url=link)) - - return { - "aliases": aliases, - "summary": summary, - "advisory_severity": advisory_severity, - "not_vulnerable": not_vulnerable, - "vulnerable": vulnerable, - "references": references, - } +def build_severity(severity): + """ + Return a VulnerabilitySeverity built from a ``severity`` string, or None. + + For example:: + >>> severity = "Severity: medium" + >>> expected = VulnerabilitySeverity(system=GENERIC, value="medium") + >>> assert build_severity(severity) == expected + """ + if severity.startswith("Severity:"): + _, _, severity = severity.partition("Severity:") + + severity = severity.strip() + if severity: + return VulnerabilitySeverity(system=GENERIC, value=severity) class NginxBasicImprover(Improver): - def __init__(self): - self.set_api() + """ + Improve Nginx data by fetching the its GitHub repo versions and resolving + the vulnerable ranges. + """ @property def interesting_advisories(self) -> QuerySet: return Advisory.objects.filter(created_by=NginxImporter.qualified_name) def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]: + all_versions = list(self.fetch_nginx_version_from_git_tags()) + yield from self.get_inferences_from_versions( + advisory_data=advisory_data, all_versions=all_versions + ) + + def get_inferences_from_versions( + self, advisory_data: AdvisoryData, all_versions: List[PackageVersion] + ) -> Iterable[Inference]: """ - Generate and return Inferences for the given advisory data + Yield inferences given an ``advisory_data`` and a ``all_versions`` of + PackageVersion. """ + try: purl, affected_version_ranges, fixed_versions = AffectedPackage.merge( advisory_data.affected_packages ) except UnMergeablePackageError: - logger.error(f"Cannot merge with different purls {advisory_data.affected_packages!r}") + logger.error( + f"NginxBasicImprover: Cannot merge with different purls: " + f"{advisory_data.affected_packages!r}" + ) return iter([]) - all_versions = self.version_api.get("nginx/nginx").valid_versions affected_purls = [] for affected_version_range in affected_version_ranges: - for version in all_versions: - version = SemverVersion(version) + for package_version in all_versions: + # FIXME: we should reference an NginxVersion tbd in univers + version = SemverVersion(package_version.value) if is_vulnerable( version=version, affected_version_range=affected_version_range, fixed_versions=fixed_versions, ): - affected_purls.append(purl._replace(version=version)) + new_purl = evolve_purl(purl=purl, version=str(version)) + affected_purls.append(new_purl) + # TODO: This also yields with a lower fixed version, maybe we should + # only yield fixes that are upgrades ? for fixed_version in fixed_versions: - # TODO: This also yields with a lower fixed version, maybe we should - # only yield fixes that are upgrades ? - fixed_purl = purl._replace(version=fixed_version) + fixed_purl = evolve_purl(purl=purl, version=str(fixed_version)) + yield Inference.from_advisory_data( advisory_data, - confidence=90, # TODO: Decide properly + # TODO: is 90 a correct confidence?? + confidence=90, affected_purls=affected_purls, fixed_purl=fixed_purl, ) - def set_api(self): - self.version_api = GitHubTagsAPI() - asyncio.run(self.version_api.load_api(["nginx/nginx"])) + def fetch_nginx_version_from_git_tags(self): + """ + Yield all nginx PackageVersion from its git tags. + """ + nginx_versions = GitHubTagsAPI().fetch("nginx/nginx") + for version in nginx_versions: + cleaned = clean_nginx_git_tag(version.value) + yield PackageVersion(value=cleaned, release_date=version.release_date) + - # Nginx tags it's releases are in the form of `release-1.2.3` - # Chop off the `release-` part here. - normalized_versions = set() - while self.version_api.cache["nginx/nginx"]: - version = self.version_api.cache["nginx/nginx"].pop() - cleaned = version.value.replace("release-", "") - normalized_version = Version(value=cleaned, release_date=version.release_date) - normalized_versions.add(normalized_version) - self.version_api.cache["nginx/nginx"] = normalized_versions +def clean_nginx_git_tag(tag): + """ + Return a cleaned ``version`` string from an nginx git tag. + + Nginx tags git release as in `release-1.2.3` + This removes the the `release-` prefix. + + For example: + >>> clean_nginx_git_tag("release-1.2.3") == "1.2.3" + True + >>> clean_nginx_git_tag("1.2.3") == "1.2.3" + True + """ + if tag.startswith("release-"): + _, _, tag = tag.partition("release-") + return tag def is_vulnerable(version, affected_version_range, fixed_versions): """ - Check if the version is in "Vulnerable" range. If it's not, the - version is not vulnerable. + Return True if the ``version`` Version for nginx is vulnerable according to + the nginx approach. + + A ``version`` is vulnerable as explained by @mdounin + in https://marc.info/?l=nginx&m=164070162912710&w=2 : + + "Note that it is generally trivial to find out if a version is + vulnerable or not from the information about a vulnerability, + without any knowledge about nginx branches. That is: + + - Check if the version is in "Vulnerable" range. If it's not, the + version is not vulnerable. - If it is, check if the branch is explicitly listed in the "Not - vulnerable". If it's not, the version is vulnerable. If it - is, check the minor number: if it's greater or equal to the - version listed as not vulnerable, the version is not vulnerable, - else the version is vulnerable. + - If it is, check if the branch is explicitly listed in the "Not + vulnerable". If it's not, the version is vulnerable. If it + is, check the minor number: if it's greater or equal to the + version listed as not vulnerable, the version is not vulnerable, + else the version is vulnerable." - See: https://marc.info/?l=nginx&m=164070162912710&w=2 """ if version in NginxVersionRange.from_string(affected_version_range.to_string()): for fixed_version in fixed_versions: diff --git a/vulnerabilities/importers/npm.py b/vulnerabilities/importers/npm.py index e55eddae1..03f7253ec 100644 --- a/vulnerabilities/importers/npm.py +++ b/vulnerabilities/importers/npm.py @@ -30,12 +30,12 @@ import pytz from dateutil.parser import parse from packageurl import PackageURL -from univers.version_specifier import VersionSpecifier +from univers.version_range import VersionRange from univers.versions import SemverVersion from vulnerabilities.helpers import load_json from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import GitImporter from vulnerabilities.importer import Reference from vulnerabilities.package_managers import NpmVersionAPI @@ -54,7 +54,7 @@ def __enter__(self): self._versions = NpmVersionAPI() self.set_api(self.collect_packages()) - def updated_advisories(self) -> Set[Advisory]: + def updated_advisories(self) -> Set[AdvisoryData]: files = self._updated_files.union(self._added_files) advisories = [] for f in files: @@ -79,7 +79,7 @@ def collect_packages(self): def versions(self): # quick hack to make it patchable return self._versions - def process_file(self, file) -> List[Advisory]: + def process_file(self, file) -> List[AdvisoryData]: record = load_json(file) advisories = [] @@ -114,7 +114,7 @@ def process_file(self, file) -> List[Advisory]: for cve_id in record.get("cves") or [""]: advisories.append( - Advisory( + AdvisoryData( summary=record.get("overview", ""), vulnerability_id=cve_id, affected_packages=nearest_patched_package(impacted_purls, resolved_purls), @@ -182,7 +182,7 @@ def categorize_versions( if affected_version_range: aff_specs = normalize_ranges(affected_version_range) aff_spec = [ - VersionSpecifier.from_scheme_version_spec_string("semver", spec) + VersionRange.from_scheme_version_spec_string("semver", spec) for spec in aff_specs if len(spec) >= 3 ] @@ -190,7 +190,7 @@ def categorize_versions( if fixed_version_range: fix_specs = normalize_ranges(fixed_version_range) fix_spec = [ - VersionSpecifier.from_scheme_version_spec_string("semver", spec) + VersionRange.from_scheme_version_spec_string("semver", spec) for spec in fix_specs if len(spec) >= 3 ] diff --git a/vulnerabilities/importers/nvd.py b/vulnerabilities/importers/nvd.py index 4f34dbb4e..75a3a0332 100644 --- a/vulnerabilities/importers/nvd.py +++ b/vulnerabilities/importers/nvd.py @@ -29,6 +29,7 @@ from dateutil import parser as dateparser from django.db.models.query import QuerySet +from vulnerabilities import severity_systems from vulnerabilities.helpers import get_item from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer @@ -37,7 +38,6 @@ from vulnerabilities.improver import Improver from vulnerabilities.improver import Inference from vulnerabilities.models import Advisory -from vulnerabilities.severity_systems import SCORING_SYSTEMS class NVDImporter(Importer): @@ -176,11 +176,11 @@ def extract_severity_scores(cve_item): if base_metric_v3: cvss_v3 = get_item(base_metric_v3, "cvssV3") yield VulnerabilitySeverity( - system=SCORING_SYSTEMS["cvssv3"], + system=severity_systems.CVSSV3, value=str(cvss_v3.get("baseScore") or ""), ) yield VulnerabilitySeverity( - system=SCORING_SYSTEMS["cvssv3_vector"], + system=severity_systems.CVSSV3_VECTOR, value=str(cvss_v3.get("vectorString") or ""), ) @@ -188,11 +188,11 @@ def extract_severity_scores(cve_item): if base_metric_v2: cvss_v2 = base_metric_v2.get("cvssV2") or {} yield VulnerabilitySeverity( - system=SCORING_SYSTEMS["cvssv2"], + system=severity_systems.CVSSV2, value=str(cvss_v2.get("baseScore") or ""), ) yield VulnerabilitySeverity( - system=SCORING_SYSTEMS["cvssv2_vector"], + system=severity_systems.CVSSV2_VECTOR, value=str(cvss_v2.get("vectorString") or ""), ) diff --git a/vulnerabilities/importers/postgresql.py b/vulnerabilities/importers/postgresql.py index 3530800a4..fac4540fa 100644 --- a/vulnerabilities/importers/postgresql.py +++ b/vulnerabilities/importers/postgresql.py @@ -20,21 +20,18 @@ # VulnerableCode is a free software from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. -import dataclasses import urllib.parse as urlparse import requests from bs4 import BeautifulSoup from packageurl import PackageURL +from vulnerabilities import severity_systems from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity -from vulnerabilities.severity_systems import scoring_systems - -BASE_URL = "https://www.postgresql.org/" class PostgreSQLImporter(Importer): @@ -105,7 +102,7 @@ def to_advisories(data): if link.startswith("/"): # Convert relative urls to absolute url. # All links qualify this criteria, so this `if` statement is kind of a defensive mechanism - link = urlparse.urljoin(BASE_URL, link) + link = urlparse.urljoin("https://www.postgresql.org/", link) severities = [] if "support/security/CVE" in link and vector_link_tag: parsed_link = urlparse.urlparse(vector_link_tag["href"]) @@ -114,17 +111,17 @@ def to_advisories(data): severities.extend( [ VulnerabilitySeverity( - system=scoring_systems["cvssv3"], value=cvss3_base_score + system=severity_systems.CVSSV3, value=cvss3_base_score ), VulnerabilitySeverity( - system=scoring_systems["cvssv3_vector"], value=cvss3_vector + system=severity_systems.CVSSV3_VECTOR, value=cvss3_vector ), ] ) references.append(Reference(url=link, severities=severities)) advisories.append( - Advisory( + AdvisoryData( vulnerability_id=cve_id, summary=summary, references=references, @@ -137,4 +134,7 @@ def to_advisories(data): def find_advisory_urls(page_data): soup = BeautifulSoup(page_data) - return {urlparse.urljoin(BASE_URL, a_tag.attrs["href"]) for a_tag in soup.select("h3+ p a")} + return { + urlparse.urljoin("https://www.postgresql.org/", a_tag.attrs["href"]) + for a_tag in soup.select("h3+ p a") + } diff --git a/vulnerabilities/importers/project_kb_msr2019.py b/vulnerabilities/importers/project_kb_msr2019.py index e4cf9b18b..c75e78782 100644 --- a/vulnerabilities/importers/project_kb_msr2019.py +++ b/vulnerabilities/importers/project_kb_msr2019.py @@ -21,12 +21,11 @@ # Visit https://github.com/nexB/vulnerablecode/ for support and download. import csv -import dataclasses import urllib.request from vulnerabilities.helpers import create_etag from vulnerabilities.helpers import is_cve -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference @@ -67,7 +66,7 @@ def to_advisories(csv_reader): vuln_id = "" advisories.append( - Advisory( + AdvisoryData( summary="", affected_packages=[], references=[reference], diff --git a/vulnerabilities/importers/redhat.py b/vulnerabilities/importers/redhat.py index 16860c584..bba7d28c2 100644 --- a/vulnerabilities/importers/redhat.py +++ b/vulnerabilities/importers/redhat.py @@ -23,13 +23,13 @@ import requests from packageurl import PackageURL +from vulnerabilities import severity_systems from vulnerabilities.helpers import nearest_patched_package from vulnerabilities.helpers import requests_with_5xx_retry -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity -from vulnerabilities.severity_systems import scoring_systems class RedhatImporter(Importer): @@ -102,7 +102,7 @@ def to_advisory(advisory_data): ): bugzilla_severity_val = bugzilla_data["bugs"][0]["severity"] bugzilla_severity = VulnerabilitySeverity( - system=scoring_systems["rhbs"], + system=severity_systems.REDHAT_BUGZILLA, value=bugzilla_severity_val, ) @@ -129,7 +129,7 @@ def to_advisory(advisory_data): value = rhsa_data["cvrfdoc"]["aggregate_severity"] rhsa_aggregate_severities.append( VulnerabilitySeverity( - system=scoring_systems["rhas"], + system=severity_systems.REDHAT_AGGREGATE, value=value, ) ) @@ -150,7 +150,7 @@ def to_advisory(advisory_data): if cvssv3_score: redhat_scores.append( VulnerabilitySeverity( - system=scoring_systems["cvssv3"], + system=severity_systems.CVSSV3, value=cvssv3_score, ) ) @@ -159,13 +159,13 @@ def to_advisory(advisory_data): if cvssv3_vector: redhat_scores.append( VulnerabilitySeverity( - system=scoring_systems["cvssv3_vector"], + system=severity_systems.CVSSV3_VECTOR, value=cvssv3_vector, ) ) references.append(Reference(severities=redhat_scores, url=advisory_data["resource_url"])) - return Advisory( + return AdvisoryData( vulnerability_id=advisory_data["CVE"], summary=advisory_data["bugzilla_description"], affected_packages=nearest_patched_package(affected_purls, []), @@ -177,6 +177,7 @@ def rpm_to_purl(rpm_string): # FIXME: there is code in scancode to handle RPM conversion AND this should # be all be part of the packageurl library + # FIXME: the comment below is not correct, this is the Epoch in the RPM version and not redhat specific # Red Hat uses `-:0` instead of just `-` to separate # package name and version components = rpm_string.split("-0:") diff --git a/vulnerabilities/importers/retiredotnet.py b/vulnerabilities/importers/retiredotnet.py index 3a3f2257a..e8f3eb7ee 100644 --- a/vulnerabilities/importers/retiredotnet.py +++ b/vulnerabilities/importers/retiredotnet.py @@ -28,7 +28,7 @@ from packageurl import PackageURL from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import GitImporter from vulnerabilities.importer import Reference @@ -42,7 +42,7 @@ def __enter__(self): recursive=True, file_ext="json", subdir="./Content" ) - def updated_advisories(self) -> Set[Advisory]: + def updated_advisories(self) -> Set[AdvisoryData]: files = self._updated_files.union(self._added_files) advisories = [] for f in files: @@ -60,7 +60,7 @@ def vuln_id_from_desc(desc): else: return None - def process_file(self, path) -> List[Advisory]: + def process_file(self, path) -> List[AdvisoryData]: with open(path) as f: json_doc = json.load(f) if self.vuln_id_from_desc(json_doc["description"]): @@ -87,7 +87,7 @@ def process_file(self, path) -> List[Advisory]: ) ] - return Advisory( + return AdvisoryData( vulnerability_id=vuln_id, summary=json_doc["description"], affected_packages=affected_packages, diff --git a/vulnerabilities/importers/ruby.py b/vulnerabilities/importers/ruby.py index 56d06d02b..da280aea5 100644 --- a/vulnerabilities/importers/ruby.py +++ b/vulnerabilities/importers/ruby.py @@ -27,12 +27,12 @@ from dateutil.parser import parse from packageurl import PackageURL from pytz import UTC -from univers.version_specifier import VersionSpecifier +from univers.version_range import VersionRange from univers.versions import SemverVersion from vulnerabilities.helpers import load_yaml from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import GitImporter from vulnerabilities.importer import Reference from vulnerabilities.package_managers import RubyVersionAPI @@ -53,7 +53,7 @@ def __enter__(self): def set_api(self, packages): asyncio.run(self.pkg_manager_api.load_api(packages)) - def updated_advisories(self) -> Set[Advisory]: + def updated_advisories(self) -> Set[AdvisoryData]: files = self._updated_files.union(self._added_files) advisories = [] for f in files: @@ -72,7 +72,7 @@ def collect_packages(self): return packages - def process_file(self, path) -> List[Advisory]: + def process_file(self, path) -> List[AdvisoryData]: record = load_yaml(path) package_name = record.get("gem") if not package_name: @@ -119,7 +119,7 @@ def process_file(self, path) -> List[Advisory]: if record.get("url"): references.append(Reference(url=record.get("url"))) - return Advisory( + return AdvisoryData( summary=record.get("description", ""), affected_packages=nearest_patched_package(impacted_purls, resolved_purls), references=references, @@ -130,7 +130,7 @@ def process_file(self, path) -> List[Advisory]: def categorize_versions(all_versions, unaffected_version_ranges): for id, elem in enumerate(unaffected_version_ranges): - unaffected_version_ranges[id] = VersionSpecifier.from_scheme_version_spec_string( + unaffected_version_ranges[id] = VersionRange.from_scheme_version_spec_string( "semver", elem ) diff --git a/vulnerabilities/importers/rust.py b/vulnerabilities/importers/rust.py index fc725aa93..9f15bfde3 100644 --- a/vulnerabilities/importers/rust.py +++ b/vulnerabilities/importers/rust.py @@ -31,11 +31,11 @@ import toml from dateutil.parser import parse from packageurl import PackageURL -from univers.version_specifier import VersionSpecifier +from univers.version_range import VersionRange from univers.versions import SemverVersion from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import GitImporter from vulnerabilities.importer import Reference from vulnerabilities.package_managers import CratesVersionAPI @@ -61,10 +61,10 @@ def crates_api(self): def set_api(self, packages): asyncio.run(self.crates_api.load_api(packages)) - def updated_advisories(self) -> Set[Advisory]: + def updated_advisories(self) -> Set[AdvisoryData]: return self._load_advisories(self._updated_files.union(self._added_files)) - def _load_advisories(self, files) -> Set[Advisory]: + def _load_advisories(self, files) -> Set[AdvisoryData]: # per @tarcieri It will always be named RUSTSEC-0000-0000.md # https://github.com/nexB/vulnerablecode/pull/281/files#r528899864 files = [f for f in files if not f.endswith("-0000.md")] # skip temporary files @@ -88,7 +88,7 @@ def collect_packages(self, paths): return packages - def _load_advisory(self, path: str) -> Optional[Advisory]: + def _load_advisory(self, path: str) -> Optional[AdvisoryData]: record = get_advisory_data(path) advisory = record.get("advisory", {}) crate_name = advisory["package"] @@ -102,18 +102,18 @@ def _load_advisory(self, path: str) -> Optional[Advisory]: # FIXME: Avoid wildcard version ranges for now. # See https://github.com/RustSec/advisory-db/discussions/831 affected_ranges = [ - VersionSpecifier.from_scheme_version_spec_string("semver", r) + VersionRange.from_scheme_version_spec_string("semver", r) for r in chain.from_iterable(record.get("affected", {}).get("functions", {}).values()) if r != "*" ] unaffected_ranges = [ - VersionSpecifier.from_scheme_version_spec_string("semver", r) + VersionRange.from_scheme_version_spec_string("semver", r) for r in record.get("versions", {}).get("unaffected", []) if r != "*" ] resolved_ranges = [ - VersionSpecifier.from_scheme_version_spec_string("semver", r) + VersionRange.from_scheme_version_spec_string("semver", r) for r in record.get("versions", {}).get("patched", []) if r != "*" ] @@ -139,7 +139,7 @@ def _load_advisory(self, path: str) -> Optional[Advisory]: ) ) - return Advisory( + return AdvisoryData( summary=advisory.get("description", ""), affected_packages=nearest_patched_package(impacted_purls, resolved_purls), vulnerability_id=cve_id, @@ -149,9 +149,9 @@ def _load_advisory(self, path: str) -> Optional[Advisory]: def categorize_versions( all_versions: Set[str], - unaffected_version_ranges: List[VersionSpecifier], - affected_version_ranges: List[VersionSpecifier], - resolved_version_ranges: List[VersionSpecifier], + unaffected_version_ranges: List[VersionRange], + affected_version_ranges: List[VersionRange], + resolved_version_ranges: List[VersionRange], ) -> Tuple[Set[str], Set[str]]: """ Categorize all versions of a crate according to the given version ranges. diff --git a/vulnerabilities/importers/safety_db.py b/vulnerabilities/importers/safety_db.py index 04c9ce998..b31d07a22 100755 --- a/vulnerabilities/importers/safety_db.py +++ b/vulnerabilities/importers/safety_db.py @@ -24,7 +24,6 @@ # Data Imported from https://github.com/pyupio/safety-db import asyncio -import dataclasses import logging import re from typing import Any @@ -35,12 +34,12 @@ import requests from packageurl import PackageURL -from univers.version_specifier import VersionSpecifier +from univers.version_range import PypiVersionRange from univers.versions import InvalidVersion -from univers.versions import PYPIVersion +from univers.versions import PypiVersion from vulnerabilities.helpers import nearest_patched_package -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference from vulnerabilities.package_managers import PypiVersionAPI @@ -69,7 +68,7 @@ def _fetch(self) -> Mapping[str, Any]: def collect_packages(self): return {pkg for pkg in self._api_response} - def updated_advisories(self) -> Set[Advisory]: + def updated_advisories(self) -> Set[AdvisoryData]: for package_name in self._api_response: if package_name == "$meta" or package_name == "cumin": # This is the first entry in the data feed. It contains metadata of the feed. @@ -96,7 +95,7 @@ def updated_advisories(self) -> Set[Advisory]: advisories = [] for cve_id in cve_ids: advisories.append( - Advisory( + AdvisoryData( vulnerability_id=cve_id, summary=advisory["advisory"], references=reference, @@ -134,12 +133,12 @@ def categorize_versions( impacted_versions, impacted_purls = set(), [] vurl_specs = [] for version_spec in version_specs: - vurl_specs.append(VersionSpecifier.from_scheme_version_spec_string("pypi", version_spec)) + vurl_specs.append(PypiVersionRange.from_native(version_spec)) invalid_versions = set() for version in all_versions: try: - version_object = PYPIVersion(version) + version_object = PypiVersion(version) except InvalidVersion: invalid_versions.add(version) continue diff --git a/vulnerabilities/importers/suse_backports.py b/vulnerabilities/importers/suse_backports.py index a7b50e159..906511b2e 100644 --- a/vulnerabilities/importers/suse_backports.py +++ b/vulnerabilities/importers/suse_backports.py @@ -19,7 +19,6 @@ # for any legal advice. # VulnerableCode is a free software code scanning tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. -import dataclasses import requests import saneyaml @@ -27,7 +26,7 @@ from packageurl import PackageURL from vulnerabilities.helpers import create_etag -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer @@ -71,7 +70,7 @@ def process_file(yaml_file): PackageURL(name=pkg, type="rpm", version=version, namespace="opensuse") ] advisories.append( - Advisory( + AdvisoryData( vulnerability_id=vuln, resolved_package_urls=purl, summary="", diff --git a/vulnerabilities/importers/suse_scores.py b/vulnerabilities/importers/suse_scores.py index ff6915eba..e3976b42b 100644 --- a/vulnerabilities/importers/suse_scores.py +++ b/vulnerabilities/importers/suse_scores.py @@ -20,12 +20,12 @@ # VulnerableCode is a free software tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. +from vulnerabilities import severity_systems from vulnerabilities.helpers import fetch_yaml -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity -from vulnerabilities.severity_systems import scoring_systems URL = "https://ftp.suse.com/pub/projects/security/yaml/suse-cvss-scores.yaml" @@ -47,32 +47,32 @@ def to_advisory(score_data): vector = None if cvss_score["version"] == "2.0": score = VulnerabilitySeverity( - system=scoring_systems["cvssv2"], value=str(cvss_score["score"]) + system=severity_systems.CVSSV2, value=str(cvss_score["score"]) ) vector = VulnerabilitySeverity( - system=scoring_systems["cvssv2_vector"], value=str(cvss_score["vector"]) + system=severity_systems.CVSSV2_VECTOR, value=str(cvss_score["vector"]) ) elif cvss_score["version"] == "3": score = VulnerabilitySeverity( - system=scoring_systems["cvssv3"], value=str(cvss_score["score"]) + system=severity_systems.CVSSV3, value=str(cvss_score["score"]) ) vector = VulnerabilitySeverity( - system=scoring_systems["cvssv3_vector"], value=str(cvss_score["vector"]) + system=severity_systems.CVSSV3_VECTOR, value=str(cvss_score["vector"]) ) elif cvss_score["version"] == "3.1": score = VulnerabilitySeverity( - system=scoring_systems["cvssv3.1"], value=str(cvss_score["score"]) + system=severity_systems.CVSSV31, value=str(cvss_score["score"]) ) vector = VulnerabilitySeverity( - system=scoring_systems["cvssv3.1_vector"], value=str(cvss_score["vector"]) + system=severity_systems.CVSSV31_VECTOR, value=str(cvss_score["vector"]) ) severities.extend([score, vector]) advisories.append( - Advisory( + AdvisoryData( vulnerability_id=cve_id, summary="", references=[Reference(url=URL, severities=severities)], diff --git a/vulnerabilities/importers/ubuntu.py b/vulnerabilities/importers/ubuntu.py index 1ef647831..c0e475d59 100644 --- a/vulnerabilities/importers/ubuntu.py +++ b/vulnerabilities/importers/ubuntu.py @@ -23,7 +23,6 @@ import asyncio import bz2 -import dataclasses import logging import xml.etree.ElementTree as ET diff --git a/vulnerabilities/importers/ubuntu_usn.py b/vulnerabilities/importers/ubuntu_usn.py index f4dfd3f2f..3e36f0fd7 100644 --- a/vulnerabilities/importers/ubuntu_usn.py +++ b/vulnerabilities/importers/ubuntu_usn.py @@ -21,15 +21,13 @@ # Visit https://github.com/nexB/vulnerablecode/ for support and download. import bz2 -import dataclasses import json import requests -from packageurl import PackageURL from vulnerabilities.helpers import create_etag from vulnerabilities.helpers import is_cve -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference @@ -67,7 +65,7 @@ def to_advisories(usn_db): cve = "" advisories.append( - Advisory( + AdvisoryData( vulnerability_id=cve, summary="", references=[reference], diff --git a/vulnerabilities/importers/xen.py b/vulnerabilities/importers/xen.py index 1e9e3d179..201aa5f51 100644 --- a/vulnerabilities/importers/xen.py +++ b/vulnerabilities/importers/xen.py @@ -20,22 +20,19 @@ # VulnerableCode is a free software code scanning tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. -import bz2 -import dataclasses import json import requests -from packageurl import PackageURL from vulnerabilities.helpers import create_etag from vulnerabilities.helpers import is_cve -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference class XenImporter(Importer): - CONFIG_CLASS = XenDBConfiguration + # CONFIG_CLASS = XenDBConfiguration def updated_advisories(self): advisories = [] @@ -67,7 +64,7 @@ def to_advisories(xen_db): cve = "" advisories.append( - Advisory( + AdvisoryData( vulnerability_id=cve, summary=title, references=[reference], diff --git a/vulnerabilities/improve_runner.py b/vulnerabilities/improve_runner.py index 06a035d37..3672a78de 100644 --- a/vulnerabilities/improve_runner.py +++ b/vulnerabilities/improve_runner.py @@ -67,14 +67,14 @@ def process_inferences(inferences: List[Inference], advisory: Advisory, improver ) for severity in ref.severities: - obj, updated = models.VulnerabilitySeverity.objects.update_or_create( + _vs, updated = models.VulnerabilitySeverity.objects.update_or_create( vulnerability=vuln, scoring_system=severity.system.identifier, reference=reference, defaults={"value": str(severity.value)}, ) if updated: - logger.info("Severity updated for reference {ref!r} to {severity.value!r}") + logger.info(f"Severity updated for reference {ref!r} to {severity.value!r}") if inference.affected_purls: for pkg in inference.affected_purls: diff --git a/vulnerabilities/improver.py b/vulnerabilities/improver.py index fa8064fa1..f0ec5cd9d 100644 --- a/vulnerabilities/improver.py +++ b/vulnerabilities/improver.py @@ -109,12 +109,16 @@ def qualified_name(cls): @property def interesting_advisories(self) -> QuerySet: """ - Return QuerySet for the advisories this improver is interested in + Return QuerySet for the advisories this improver is interested in. + + Subclasses must implement. """ raise NotImplementedError def get_inferences(self, advisory_data: AdvisoryData) -> Iterable[Inference]: """ - Generate and return Inferences for the given advisory data + Return an iterable of Inferences from the ``advisory data``. + + Subclasses must implement. """ raise NotImplementedError diff --git a/vulnerabilities/improvers/__init__.py b/vulnerabilities/improvers/__init__.py index 0dbb2a424..fb9b8e145 100644 --- a/vulnerabilities/improvers/__init__.py +++ b/vulnerabilities/improvers/__init__.py @@ -1,3 +1,26 @@ +# +# Copyright (c) nexB Inc. and others. All rights reserved. +# http://nexb.com and https://github.com/nexB/vulnerablecode/ +# The VulnerableCode software is licensed under the Apache License version 2.0. +# Data generated with VulnerableCode require an acknowledgment. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. +# +# When you publish or redistribute any data created with VulnerableCode or any VulnerableCode +# derivative work, you must accompany this data with the following acknowledgment: +# +# Generated with VulnerableCode and provided on an "AS IS" BASIS, WITHOUT WARRANTIES +# OR CONDITIONS OF ANY KIND, either express or implied. No content created from +# VulnerableCode should be considered or used as legal advice. Consult an Attorney +# for any legal advice. +# VulnerableCode is a free software tool from nexB Inc. and others. +# Visit https://github.com/nexB/vulnerablecode/ for support and download. + from vulnerabilities import importers from vulnerabilities.improvers import default diff --git a/vulnerabilities/improvers/default.py b/vulnerabilities/improvers/default.py index 2572a0604..176b0bbc6 100644 --- a/vulnerabilities/improvers/default.py +++ b/vulnerabilities/improvers/default.py @@ -1,4 +1,26 @@ -from itertools import chain +# +# Copyright (c) nexB Inc. and others. All rights reserved. +# http://nexb.com and https://github.com/nexB/vulnerablecode/ +# The VulnerableCode software is licensed under the Apache License version 2.0. +# Data generated with VulnerableCode require an acknowledgment. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. +# +# When you publish or redistribute any data created with VulnerableCode or any VulnerableCode +# derivative work, you must accompany this data with the following acknowledgment: +# +# Generated with VulnerableCode and provided on an "AS IS" BASIS, WITHOUT WARRANTIES +# OR CONDITIONS OF ANY KIND, either express or implied. No content created from +# VulnerableCode should be considered or used as legal advice. Consult an Attorney +# for any legal advice. +# VulnerableCode is a free software tool from nexB Inc. and others. +# Visit https://github.com/nexB/vulnerablecode/ for support and download. + from typing import Iterable from typing import List from typing import Tuple @@ -6,6 +28,7 @@ from django.db.models.query import QuerySet from packageurl import PackageURL +from vulnerabilities.helpers import evolve_purl from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import AffectedPackage from vulnerabilities.improver import MAX_CONFIDENCE @@ -70,7 +93,7 @@ def get_exact_purls(affected_package: AffectedPackage) -> Tuple[List[PackageURL] range_versions = [c.version for c in vr.constraints if c] resolved_versions = [v for v in range_versions if v and v in vr] for version in resolved_versions: - affected_purl = affected_package.package._replace(version=str(version)) + affected_purl = evolve_purl(purl=affected_package.package, version=str(version)) affected_purls.append(affected_purl) fixed_purl = affected_package.get_fixed_purl() if affected_package.fixed_version else None diff --git a/vulnerabilities/management/commands/improve.py b/vulnerabilities/management/commands/improve.py index 8352dfe74..aca1ea7f3 100644 --- a/vulnerabilities/management/commands/improve.py +++ b/vulnerabilities/management/commands/improve.py @@ -26,7 +26,6 @@ from django.core.management.base import BaseCommand from django.core.management.base import CommandError -from vulnerabilities.import_runner import ImportRunner from vulnerabilities.improve_runner import ImproveRunner from vulnerabilities.improvers import IMPROVERS_REGISTRY diff --git a/vulnerabilities/migrations/0008_alter_vulnerabilityseverity_scoring_system.py b/vulnerabilities/migrations/0008_alter_vulnerabilityseverity_scoring_system.py new file mode 100644 index 000000000..9b8524b95 --- /dev/null +++ b/vulnerabilities/migrations/0008_alter_vulnerabilityseverity_scoring_system.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.3 on 2022-04-15 11:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('vulnerabilities', '0007_alter_vulnerabilityreference_reference_id'), + ] + + operations = [ + migrations.AlterField( + model_name='vulnerabilityseverity', + name='scoring_system', + field=models.CharField(choices=[('cvssv2', 'CVSSv2 Base Score'), ('cvssv2_vector', 'CVSSv2 Vector'), ('cvssv3', 'CVSSv3 Base Score'), ('cvssv3_vector', 'CVSSv3 Vector'), ('cvssv3.1', 'CVSSv3.1 Base Score'), ('cvssv3.1_vector', 'CVSSv3.1 Vector'), ('rhbs', 'RedHat Bugzilla severity'), ('rhas', 'RedHat Aggregate severity'), ('archlinux', 'Archlinux Vulnerability Group Severity'), ('cvssv3.1_qr', 'CVSSv3.1 Qualitative Severity Rating'), ('generic_textual', 'Generic textual severity rating'), ('apache_httpd', 'Apache Httpd Severity')], help_text='Identifier for the scoring system used. Available choices are: cvssv2 is vulnerability_id for CVSSv2 Base Score system, cvssv2_vector is vulnerability_id for CVSSv2 Vector system, cvssv3 is vulnerability_id for CVSSv3 Base Score system, cvssv3_vector is vulnerability_id for CVSSv3 Vector system, cvssv3.1 is vulnerability_id for CVSSv3.1 Base Score system, cvssv3.1_vector is vulnerability_id for CVSSv3.1 Vector system, rhbs is vulnerability_id for RedHat Bugzilla severity system, rhas is vulnerability_id for RedHat Aggregate severity system, archlinux is vulnerability_id for Archlinux Vulnerability Group Severity system, cvssv3.1_qr is vulnerability_id for CVSSv3.1 Qualitative Severity Rating system, generic_textual is vulnerability_id for Generic textual severity rating system, apache_httpd is vulnerability_id for Apache Httpd Severity system ', max_length=50), + ), + ] diff --git a/vulnerabilities/models.py b/vulnerabilities/models.py index 6d2d9694d..ebc9bf141 100644 --- a/vulnerabilities/models.py +++ b/vulnerabilities/models.py @@ -20,15 +20,10 @@ # VulnerableCode is a free software tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. -import dataclasses import hashlib -import importlib import json import logging import uuid -from datetime import datetime -from typing import List -from typing import Optional from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator @@ -39,7 +34,6 @@ from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import AffectedPackage -from vulnerabilities.importer import Importer from vulnerabilities.importer import Reference from vulnerabilities.improver import MAX_CONFIDENCE from vulnerabilities.severity_systems import SCORING_SYSTEMS @@ -125,7 +119,7 @@ class Meta: ) def __str__(self): - reference_id = " {self.reference_id}" if self.reference_id else "" + reference_id = f" {self.reference_id}" if self.reference_id else "" return f"{self.url}{reference_id}" @@ -330,14 +324,6 @@ class Advisory(models.Model): into structured data """ - def save(self, *args, **kwargs): - checksum = hashlib.md5() - for field in (self.summary, self.affected_packages, self.references): - value = json.dumps(field, separators=(",", ":")).encode("utf-8") - checksum.update(value) - self.unique_content_id = checksum.hexdigest() - super().save(*args, **kwargs) - unique_content_id = models.CharField(max_length=32, blank=True, null=True) aliases = models.JSONField(blank=True, default=list, help_text="A list of alias strings") summary = models.TextField(blank=True, null=True) @@ -373,6 +359,14 @@ class Meta: "date_published", ) + def save(self, *args, **kwargs): + checksum = hashlib.md5() + for field in (self.summary, self.affected_packages, self.references): + value = json.dumps(field, separators=(",", ":")).encode("utf-8") + checksum.update(value) + self.unique_content_id = checksum.hexdigest() + super().save(*args, **kwargs) + def to_advisory_data(self) -> AdvisoryData: return AdvisoryData( aliases=self.aliases, diff --git a/vulnerabilities/package_managers.py b/vulnerabilities/package_managers.py index 6fbe86d01..ae98613c1 100644 --- a/vulnerabilities/package_managers.py +++ b/vulnerabilities/package_managers.py @@ -19,34 +19,49 @@ # for any legal advice. # VulnerableCode is a free software code scanning tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. -import asyncio + import dataclasses -import os +import json +import logging import traceback import xml.etree.ElementTree as ET from datetime import datetime -from json import JSONDecodeError -from subprocess import check_output +from typing import Iterable from typing import List -from typing import MutableMapping from typing import Optional from typing import Set +from urllib.parse import urlparse -import aiohttp -from aiohttp import ClientSession -from aiohttp.client_exceptions import ClientResponseError -from aiohttp.client_exceptions import ServerDisconnectedError -from aiohttp.web_exceptions import HTTPGone -from bs4 import BeautifulSoup +import requests from dateutil import parser as dateparser from django.utils.dateparse import parse_datetime +from vulnerabilities import helpers +from vulnerabilities.helpers import get_item + +logger = logging.getLogger(__name__) + +""" +Utilities to retrieve lists of package versions from remote package +repositories, registries or APIs. +""" + +# FIXME: use purl for cache key, rather than an undefined package_name key +# FIXME: DO NOT cache by default as this is an optimization that does not work for long running processes +# FIXME: DO NOT use set() for storing version lists: they lose the original ordering +# FIXME: DO NOT use aiohttp that makes the code more complex before this is can be tested for correctness first + @dataclasses.dataclass(frozen=True) -class Version: +class PackageVersion: value: str release_date: Optional[datetime] = None + def to_dict(self): + release_date = self.release_date + release_date = release_date and release_date.isoformat() + return dict(value=self.value, release_date=release_date) + @dataclasses.dataclass class VersionResponse: @@ -54,18 +69,49 @@ class VersionResponse: newer_versions: Set[str] = dataclasses.field(default_factory=set) -class GraphQLError(Exception): - pass +def get_response(url, content_type="json", headers=None): + """ + Fetch ``url`` and return its content as ``content_type`` which is one of + binary, text or json. + """ + assert content_type in ("binary", "text", "json") + + try: + resp = requests.get(url=url, headers=headers) + except: + logger.error(traceback.format_exc()) + return + if not resp.status_code == 200: + logger.error(f"Error while fetching {url!r}: {resp.status_code!r}") + return + + if content_type == "binary": + return resp.content + elif content_type == "text": + return resp.text + elif content_type == "json": + return resp.json() class VersionAPI: - def __init__(self, cache: MutableMapping[str, Set[Version]] = None): - self.cache = cache or {} + """ + Base class for version APIs classes that fetch package versions from remote + package repositories, registries or APIs. + """ + + # subclasses must define the purl package_type they catter to + package_type = None - def get(self, package_name, until=None) -> VersionResponse: + def get_until(self, package_name, until=None) -> VersionResponse: + """ + Return a VersionResponse given a ``package_name`` cache key and an + optional ``until`` datetime object for a date "until" which to fetch + versions. + """ new_versions = set() valid_versions = set() - for version in self.cache.get(package_name, set()): + + for version in self.fetch(package_name): if until and version.release_date and version.release_date > until: new_versions.add(version.value) else: @@ -73,223 +119,208 @@ def get(self, package_name, until=None) -> VersionResponse: return VersionResponse(valid_versions=valid_versions, newer_versions=new_versions) - async def load_api(self, pkg_set): + def fetch(self, pkg: str) -> Iterable[PackageVersion]: """ - Populate the cache with the versions of the packages in pkg_set - """ - async with client_session() as session: - await asyncio.gather( - *[self.fetch(pkg, session) for pkg in pkg_set if pkg not in self.cache] - ) - - async def fetch(self, pkg, session): - """ - Override this method to fetch the pkg's version in the cache + Yield PackageVersion versions given a ``pkg`` package name. + Subclasses must override this method and can create caches as needed. """ raise NotImplementedError -def client_session(**kwargs): - # trust_env is important so that https_proxy environment variable is used - # in proxy protected environments - return ClientSession(raise_for_status=True, trust_env=True, **kwargs) +def remove_debian_default_epoch(version): + """ + Remove the default epoch from a Debian ``version`` string. + """ + return version and version.replace("0:", "") class LaunchpadVersionAPI(VersionAPI): + """ + Fetch versions of Ubuntu debian packages from Launchpad + """ package_type = "deb" - async def fetch(self, pkg, session): + def fetch(self, pkg: str) -> Iterable[PackageVersion]: url = ( - "https://api.launchpad.net/1.0/ubuntu/+archive/" - "primary?ws.op=getPublishedSources&" - "source_name={}&exact_match=true".format(pkg) + f"https://api.launchpad.net/1.0/ubuntu/+archive/primary?" + "ws.op=getPublishedSources&source_name={pkg}&exact_match=true" ) - try: - all_versions = set() - while True: - response = await session.request(method="GET", url=url) - resp_json = await response.json() - if resp_json["entries"] == []: - self.cache[pkg] = set() - break - for release in resp_json["entries"]: - all_versions.add( - Version( - value=release["source_package_version"].replace("0:", ""), - release_date=release["date_published"], - ) - ) - if resp_json.get("next_collection_link"): - url = resp_json["next_collection_link"] - else: - break - self.cache[pkg] = all_versions - except ( - ClientResponseError, - asyncio.exceptions.TimeoutError, - ServerDisconnectedError, - ): - self.cache[pkg] = set() + + while True: + response = get_response(url=url, content_type="json") + + entries = response["entries"] + if not entries: + break + + for release in entries: + source_package_version = release["source_package_version"] + source_package_version = remove_debian_default_epoch(source_package_version) + yield PackageVersion( + value=source_package_version, + release_date=release["date_published"], + ) + if response.get("next_collection_link"): + url = response["next_collection_link"] + else: + break class PypiVersionAPI(VersionAPI): + """ + Fetch versions of Python pypi packages from the PyPI API. + """ package_type = "pypi" - async def fetch(self, pkg, session): - url = f"https://pypi.org/pypi/{pkg}/json" - versions = set() - try: - response = await session.request(method="GET", url=url) - response = await response.json() - for version, download_items in response["releases"].items(): - if download_items: - latest_download_item = max( - download_items, - key=lambda download_item: dateparser.parse( - download_item["upload_time_iso_8601"] - ), - ) - versions.add( - Version( - value=version, - release_date=dateparser.parse( - latest_download_item["upload_time_iso_8601"] - ), - ) - ) - except ClientResponseError: - # PYPI removed this package. - # https://www.zdnet.com/article/twelve-malicious-python-libraries-found-and-removed-from-pypi/ # nopep8 - pass - self.cache[pkg] = versions + def fetch(self, pkg): + response = get_response(url=f"https://pypi.org/pypi/{pkg}/json") + if not response: + # FIXME: raise! + return + + releases = response.get("releases") or {} + for version, download_items in releases.items(): + if not download_items: + continue + + release_date = self.get_latest_date(download_items) + yield PackageVersion( + value=version, + release_date=release_date, + ) + + def get_latest_date(self, downloads): + """ + Return the latest date from a list of mapping of PyPI ``downloadss`` or None. + + The data has this shape: + [ + { + .... + "upload_time_iso_8601": "2010-12-23T05:14:23.509436Z", + "url": "https://files.pythonhosted.org/packages/8f/1f/c20ca80fa5df025cc/Django-1.1.3.tar.gz", + }, + { + .... + "upload_time_iso_8601": "2010-12-23T05:20:23.509436Z", + "url": "https://files.pythonhosted.org/packages/8f/1f/561bddc20ca80fa5df025cc/Django-1.1.3.wheel", + }, + ] + """ + latest_date = None + for download in downloads: + upload_time = download.get("upload_time_iso_8601") + if upload_time: + current_date = dateparser.parse(upload_time) + if not latest_date: + latest_date = current_date + else: + if current_date > latest_date: + latest_date = current_date + return latest_date class CratesVersionAPI(VersionAPI): + """ + Fetch versions of Rust cargo packages from the crates.io API. + """ package_type = "cargo" - async def fetch(self, pkg, session): + def fetch(self, pkg): url = f"https://crates.io/api/v1/crates/{pkg}" - response = await session.request(method="GET", url=url) - response = await response.json() - versions = set() + response = get_response(url=url, content_type="json") for version_info in response["versions"]: - versions.add( - Version( - value=version_info["num"], - release_date=dateparser.parse(version_info["updated_at"]), - ) + yield PackageVersion( + value=version_info["num"], + release_date=dateparser.parse(version_info["updated_at"]), ) - self.cache[pkg] = versions - class RubyVersionAPI(VersionAPI): + """ + Fetch versions of Rubygems packages from the rubygems API. + """ package_type = "gem" - async def fetch(self, pkg, session): + def fetch(self, pkg): url = f"https://rubygems.org/api/v1/versions/{pkg}.json" - versions = set() - try: - response = await session.request(method="GET", url=url) - response = await response.json() - for release in response: - versions.add( - Version( - value=release["number"], - release_date=dateparser.parse(release["created_at"]), - ) - ) - except (ClientResponseError, JSONDecodeError): - pass - - self.cache[pkg] = versions + response = get_response(url=url, content_type="json") + if not response: + return + for release in response: + if release.get("published_at"): + release_date = dateparser.parse(release["published_at"]) + elif release.get("created_at"): + release_date = dateparser.parse(release["created_at"]) + else: + release_date = None + if release.get("number"): + yield PackageVersion(value=release["number"], release_date=release_date) + else: + logger.error(f"Failed to parse release {release} from url: {url}") class NpmVersionAPI(VersionAPI): + """ + Fetch versions of npm packages from the npm registry API. + """ package_type = "npm" - async def fetch(self, pkg, session): + def fetch(self, pkg): url = f"https://registry.npmjs.org/{pkg}" - versions = set() - try: - response = await session.request(method="GET", url=url) - response = await response.json() - for version in response.get("versions", []): - release_date = response.get("time", {}).get(version) - if release_date: - release_date = dateparser.parse(release_date) - versions.add(Version(value=version, release_date=release_date)) - else: - versions.add(Version(value=version, release_date=None)) - - except ClientResponseError: - pass - - self.cache[pkg] = versions + response = get_response(url=url, content_type="json") + for version in response.get("versions") or []: + release_date = response.get("time", {}).get(version) + release_date = release_date and dateparser.parse(release_date) or None + yield PackageVersion(value=version, release_date=release_date) class DebianVersionAPI(VersionAPI): + """ + Fetch versions of Debian debian packages from the sources.debian.org API + """ package_type = "deb" - async def load_api(self, pkg_set): + def fetch(self, pkg): # Need to set the headers, because the Debian API upgrades # the connection to HTTP 2.0 - async with client_session(headers={"Connection": "keep-alive"}) as session: - await asyncio.gather( - *[self.fetch(pkg, session) for pkg in pkg_set if pkg not in self.cache] - ) + response = get_response( + url=f"https://sources.debian.org/api/src/{pkg}", + headers={"Connection": "keep-alive"}, + content_type="json", + ) + if response.get("error") or not response.get("versions"): + return - async def fetch(self, pkg, session, retry_count=5): - url = "https://sources.debian.org/api/src/{}".format(pkg) - try: - all_versions = set() - response = await session.request(method="GET", url=url) - resp_json = await response.json() - - if resp_json.get("error") or not resp_json.get("versions"): - self.cache[pkg] = set() - return - for release in resp_json["versions"]: - all_versions.add(Version(value=release["version"].replace("0:", ""))) - - self.cache[pkg] = all_versions - # TODO : Handle ServerDisconnectedError by using some sort of - # retry mechanism - except ( - ClientResponseError, - asyncio.exceptions.TimeoutError, - ServerDisconnectedError, - ): - self.cache[pkg] = set() + for release in response["versions"]: + version = release["version"] + version = remove_debian_default_epoch(version) + yield PackageVersion(value=version) class MavenVersionAPI(VersionAPI): + """ + Fetch versions of Maven packages from Maven Central maven-metadata.xml data + """ package_type = "maven" - async def fetch(self, pkg, session) -> None: + def fetch(self, pkg: str) -> Iterable[PackageVersion]: artifact_comps = pkg.split(":") endpoint = self.artifact_url(artifact_comps) - try: - resp = await session.request(method="GET", url=endpoint) - resp = await resp.read() - - except ClientResponseError: - self.cache[pkg] = set() - return - - xml_resp = ET.ElementTree(ET.fromstring(resp.decode("utf-8"))) - self.cache[pkg] = self.extract_versions(xml_resp) + response = get_response(url=endpoint, content_type="binary") + if response: + xml_resp = ET.ElementTree(ET.fromstring(response.decode("utf-8"))) + yield from self.extract_versions(xml_resp) @staticmethod def artifact_url(artifact_comps: List[str]) -> str: - base_url = "https://repo1.maven.org/maven2/{}" try: group_id, artifact_id = artifact_comps except ValueError: @@ -304,100 +335,105 @@ def artifact_url(artifact_comps: List[str]) -> str: raise group_url = group_id.replace(".", "/") - suffix = group_url + "/" + artifact_id + "/" + "maven-metadata.xml" - endpoint = base_url.format(suffix) - + endpoint = f"https://repo1.maven.org/maven2/{group_url}/{artifact_id}/maven-metadata.xml" return endpoint @staticmethod - def extract_versions(xml_response: ET.ElementTree) -> Set[Version]: - all_versions = set() + def extract_versions(xml_response: ET.ElementTree) -> Iterable[PackageVersion]: for child in xml_response.getroot().iter(): if child.tag == "version" and child.text: - all_versions.add(Version(child.text)) - - return all_versions + yield PackageVersion(value=child.text) class NugetVersionAPI(VersionAPI): + """ + Fetch versions of NuGet packages from the nuget.org API + """ package_type = "nuget" - async def fetch(self, pkg, session) -> None: - endpoint = self.nuget_url(pkg) - resp = await session.request(method="GET", url=endpoint) - resp = await resp.json() - self.cache[pkg] = self.extract_versions(resp) + def fetch(self, pkg: str) -> Iterable[PackageVersion]: + pkg = pkg.lower().strip() + url = f"https://api.nuget.org/v3/registration5-semver1/{pkg}/index.json" + resp = get_response(url=url) + if resp: + yield from self.extract_versions(resp) @staticmethod - def nuget_url(pkg_name: str) -> str: - pkg_name = pkg_name.lower().strip() - base_url = "https://api.nuget.org/v3/registration5-semver1/{}/index.json" - return base_url.format(pkg_name) + def extract_versions(response: dict) -> Iterable[PackageVersion]: + for entry_group in response.get("items") or []: + for entry in entry_group.get("items") or []: + catalog_entry = entry.get("catalogEntry") or {} + version = catalog_entry.get("version") + if not version: + continue + release_date = catalog_entry.get("published") + if release_date: + release_date = dateparser.parse(release_date) + yield PackageVersion( + value=version, + release_date=release_date, + ) - @staticmethod - def extract_versions(resp: dict) -> Set[Version]: - all_versions = set() - try: - for entry_group in resp["items"]: - for entry in entry_group["items"]: - all_versions.add( - Version( - value=entry["catalogEntry"]["version"], - release_date=dateparser.parse(entry["catalogEntry"]["published"]), - ) - ) - # FIXME: json response for YamlDotNet.Signed triggers this exception. - # Some packages with many versions give a response of a list of endpoints. - # In such cases rather, we should collect data from those endpoints. - except KeyError: - pass - - return all_versions + +def cleaned_version(version): + """ + Return a ``version`` string stripped from leading "v" prefix. + """ + return (version.lstrip("vV"),) class ComposerVersionAPI(VersionAPI): + """ + Fetch versions of PHP Composer packages from the packagist.org API + """ package_type = "composer" - async def fetch(self, pkg, session) -> None: - endpoint = self.composer_url(pkg) - if endpoint: - resp = await session.request(method="GET", url=endpoint) - resp = await resp.json() - self.cache[pkg] = self.extract_versions(resp, pkg) + def fetch(self, pkg: str) -> Iterable[PackageVersion]: + if "/" not in pkg: + raise Exception(f"Composer package: {pkg!r} does not have a vendor/name structure.") - @staticmethod - def composer_url(pkg_name: str) -> Optional[str]: - try: - vendor, name = pkg_name.split("/") - except ValueError: - # TODO Log this - return - return f"https://repo.packagist.org/p/{vendor}/{name}.json" + response = get_response(url=f"https://repo.packagist.org/p/{pkg}.json") + if response: + yield from self.extract_versions(response, pkg) @staticmethod - def extract_versions(resp: dict, pkg_name: str) -> Set[Version]: - all_versions = set() - for version in resp["packages"][pkg_name]: + def extract_versions(resp: dict, pkg: str) -> Iterable[PackageVersion]: + for version in get_item(resp, "packages", pkg) or []: if "dev" in version: continue # This if statement ensures, that all_versions contains only released versions # See https://github.com/composer/composer/blob/44a4429978d1b3c6223277b875762b2930e83e8c/doc/articles/versions.md#tags # nopep8 # for explanation of removing 'v' - all_versions.add( - Version( - value=version.lstrip("v"), - release_date=dateparser.parse(resp["packages"][pkg_name][version]["time"]), - ) + time = get_item(resp, "packages", pkg, version, "time") + yield PackageVersion( + value=cleaned_version(version), + release_date=dateparser.parse(time) if time else None, ) - return all_versions + + +class GraphQLError(Exception): + pass + + +# Isolated network call for simplicity of testing +def get_gh_response(endpoint: str, headers: dict, query: dict): + return requests.post(endpoint, headers=headers, json=query).json() + + +# FIXME: this code is duplicated with the imports/github.py code class GitHubTagsAPI(VersionAPI): + """ + Fetch tags of Git repositories from the GitHub graphql API + This requires the "GH_TOKEN" environment variable to be set. + """ package_type = "github" + GQL_QUERY = """ query getTags($name: String!, $owner: String!, $after: String) { @@ -427,98 +463,116 @@ class GitHubTagsAPI(VersionAPI): } }""" - def __init__(self, cache: MutableMapping[str, Set[Version]] = None): - self.gh_token = os.getenv("GH_TOKEN") - super().__init__(cache=cache) - - async def fetch(self, owner_repo: str, session: aiohttp.ClientSession) -> None: + def fetch(self, pkg: str) -> Iterable[PackageVersion]: """ - owner_repo is a string of format "{repo_owner}/{repo_name}" - Example value of owner_repo = "nexB/scancode-toolkit" + Yield PackageVersion from the Git tags of the ``pkg`` "{owner}/{repo}" + repository using the GitHub API. + ``pkg`` is a string of format "{repo_owner}/{repo_name}" Example value + of owner_repo = "nexB/scancode-toolkit" """ - self.cache[owner_repo] = set() - if self.gh_token: - # graphql api cannot work without api token - session.headers["Authorization"] = "token " + self.gh_token - endpoint = f"https://api.github.com/graphql" - owner, name = owner_repo.split("/") - query = { - "query": self.GQL_QUERY, - "variables": {"name": name, "owner": owner}, + + for node in self.fetch_tag_nodes(pkg): + name = node["name"] + target = node["target"] + + # in case the tag is a signed tag, then the commit info is in target['target'] + if "committedDate" not in target: + target = target["target"] + + committed_date = target.get("committedDate") + if committed_date: + release_date = dateparser.parse(committed_date) + else: + # Tags can actually point to tree and not commit, so + # there is no guaranteed date. This is seen in the linux kernel. + # Github cannot even properly display it. + # https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux/+/refs/tags/v2.6.11 + release_date = None + + yield PackageVersion(value=name, release_date=release_date) + + def fetch_tag_nodes(self, pkg: str, _DUMP_TO_FILE=False) -> Iterable[PackageVersion]: + """ + Yield node "name/target} mappings for Git tags of the ``pkg`` "{owner}/{repo}" + GitHub repository using the GitHub graphql API. ``pkg`` is a string of + format "{repo_owner}/{repo_name}" as in "nexB /scancode-toolkit" + + Each node has this shape: + { + "name": "v2.6.24-rc5", + "target": { + "target": { + "committedDate": "2007-12-11T03:48:43Z" + } } + }, + """ + repo_owner, repo_name = pkg.split("/") - while True: - response = await session.post(endpoint, json=query) - resp_json = await response.json() - - if "errors" in resp_json: - raise GraphQLError(resp_json["errors"]) - - refs = resp_json["data"]["repository"]["refs"] - - for entry in refs["nodes"]: - name = entry["name"] - target = entry["target"] - # in case the tag is a signed tag, then the commit info is in target['target'] - if "committedDate" not in target: - target = target["target"] - if "committedDate" in target: - release_date = dateparser.parse(target["committedDate"]) - else: - # but tags can actually point to tree and not commit, so there is no date - # probably this only happened for linux. Github cannot even properly display it. - # https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux/+/refs/tags/v2.6.11 - release_date = None - self.cache[owner_repo].add(Version(value=name, release_date=release_date)) - - if not refs["pageInfo"]["hasNextPage"]: - break - # to fetch next page, we just set the after variable to endCursor - query["variables"]["after"] = refs["pageInfo"]["endCursor"] + variables = { + "owner": repo_owner, + "name": repo_name, + } + graphql_query = { + "query": self.GQL_QUERY, + "variables": variables, + } - else: - # In case we don't have GH_TOKEN, we use the svn ls method to get the tags - # It allows to get all the information needed in one request without any rate limiting - # this method is however not scalable for larger repo and the api is unresponsive - # for repo with > 50 tags - endpoint = f"https://github.com/{owner_repo}" - tags_xml = check_output(["svn", "ls", "--xml", f"{endpoint}/tags"], text=True) - elements = ET.fromstring(tags_xml) - for entry in elements.iter("entry"): - name = entry.find("name").text - release_date = dateparser.parse(entry.find("commit/date").text) + idx = 0 + while True: + response = helpers.fetch_github_graphql_query(graphql_query) + + # this is a convenience for testing to dump results to a file + if _DUMP_TO_FILE: + fn = f"github-{repo_owner}-{repo_name}-{idx}.json" + print(f"fetch_tag_nodes: Dumping to file: {fn}") + with open(fn, "w") as o: + json.dump(response, o, indent=2) + idx += 1 + + refs = response["data"]["repository"]["refs"] + for node in refs["nodes"]: + yield node + + page_info = refs["pageInfo"] + if not page_info["hasNextPage"]: + break + + # to fetch next page, we just set the after variable to endCursor + variables["after"] = page_info["endCursor"] class HexVersionAPI(VersionAPI): - async def fetch(self, pkg, session): - url = f"https://hex.pm/api/packages/{pkg}" - versions = set() - try: - response = await session.request(method="GET", url=url) - response = await response.json() - for release in response["releases"]: - versions.add( - Version( - value=release["version"], - release_date=dateparser.parse(release["inserted_at"]), - ) - ) - except (ClientResponseError, JSONDecodeError): - pass + """ + Fetch versions of Erlang packages from the hex API + """ - self.cache[pkg] = versions + package_type = "hex" + + def fetch(self, pkg: str) -> Iterable[PackageVersion]: + response = get_response( + url=f"https://hex.pm/api/packages/{pkg}", + content_type="json", + ) + for release in response["releases"]: + yield PackageVersion( + value=release["version"], + release_date=dateparser.parse(release["inserted_at"]), + ) class GoproxyVersionAPI(VersionAPI): + """ + Fetch versions of Go "golang" packages from the Go proxy API + """ package_type = "golang" - def __init__(self, cache: MutableMapping[str, Set[Version]] = None): - super().__init__(cache) + def __init__(self): self.module_name_by_package_name = {} @staticmethod - def trim_url_path(url_path: str) -> Optional[str]: + def trim_go_url_path(url_path: str) -> Optional[str]: """ Return a trimmed Go `url_path` removing trailing package references and keeping only the module @@ -533,17 +587,21 @@ def trim_url_path(url_path: str) -> Optional[str]: This functions trims the trailing part(s) of a package URL and returns the remaining the module name. For example: - >>> module = "https://github.com/xx/a" - >>> assert GoproxyVersionAPI.trim_url_path("https://github.com/xx/a/b") == module + >>> module = "github.com/xx/a" + >>> assert GoproxyVersionAPI.trim_go_url_path("https://github.com/xx/a/b") == module """ # some advisories contains this prefix in package name, e.g. https://github.com/advisories/GHSA-7h6j-2268-fhcm if url_path.startswith("https://pkg.go.dev/"): - url_path = url_path.removeprefix("https://pkg.go.dev/") - parts = url_path.split("/") - if len(parts) >= 2: - return "/".join(parts[:-1]) + url_path = url_path[len("https://pkg.go.dev/") :] + parsed_url_path = urlparse(url_path) + path = parsed_url_path.path + parts = path.split("/") + if len(parts) < 3: + logger.error(f"Not a valid Go URL path {url_path} trim_go_url_path") + return else: - return None + joined_path = "/".join(parts[:3]) + return f"{parsed_url_path.netloc}{joined_path}" @staticmethod def escape_path(path: str) -> str: @@ -565,56 +623,54 @@ def escape_path(path: str) -> str: return escaped_path @staticmethod - async def parse_version_info( - version_info: str, escaped_pkg: str, session: ClientSession - ) -> Optional[Version]: + def fetch_version_info(version_info: str, escaped_pkg: str) -> Optional[PackageVersion]: v = version_info.split() if not v: return None + value = v[0] if len(v) > 1: - # get release date from the second part. see https://github.com/golang/go/blob/master/src/cmd/go/internal/modfetch/proxy.go#latest() + # get release date from the second part. see + # https://github.com/golang/go/blob/master/src/cmd/go/internal/modfetch/proxy.go#latest() release_date = parse_datetime(v[1]) else: escaped_ver = GoproxyVersionAPI.escape_path(value) - try: - response = await session.request( - method="GET", - url=f"https://proxy.golang.org/{escaped_pkg}/@v/{escaped_ver}.info", - ) - resp_json = await response.json() - release_date = parse_datetime(resp_json.get("Time", "")) - except: - traceback.print_exc() - print( - f"error while fetching version info for {escaped_pkg}/{escaped_ver} from goproxy" + response = get_response( + url=f"https://proxy.golang.org/{escaped_pkg}/@v/{escaped_ver}.info", + content_type="json", + ) + + if not response: + logger.error( + f"Error while fetching version info for {escaped_pkg}/{escaped_ver} " + f"from goproxy:\n{traceback.format_exc()}" ) - release_date = None - return Version(value=value, release_date=release_date) + release_date = parse_datetime(response.get("Time", "")) if response else None + + return PackageVersion(value=value, release_date=release_date) + + def fetch(self, pkg: str) -> Iterable[PackageVersion]: - async def fetch(self, pkg: str, session: ClientSession): # escape uppercase in module path - escaped_pkg = GoproxyVersionAPI.escape_path(pkg) + escaped_pkg = self.escape_path(pkg) trimmed_pkg = pkg - resp_text = None + response = None # resolve module name from package name, see https://go.dev/ref/mod#resolve-pkg-mod while escaped_pkg is not None: url = f"https://proxy.golang.org/{escaped_pkg}/@v/list" - try: - response = await session.request(method="GET", url=url) - resp_text = await response.text() - except HTTPGone: - escaped_pkg = GoproxyVersionAPI.trim_url_path(escaped_pkg) - trimmed_pkg = GoproxyVersionAPI.trim_url_path(trimmed_pkg) or "" + response = get_response(url=url, content_type="text") + if not response: + escaped_pkg = self.trim_go_url_path(escaped_pkg) + trimmed_pkg = self.trim_go_url_path(trimmed_pkg) or "" continue + break - if resp_text is None or escaped_pkg is None or trimmed_pkg is None: - print(f"error while fetching versions for {pkg} from goproxy") + + if response is None or escaped_pkg is None or trimmed_pkg is None: + logger.error(f"Error while fetching versions for {pkg!r} from goproxy") return self.module_name_by_package_name[pkg] = trimmed_pkg - versions = set() - for version_info in resp_text.split("\n"): - version = await GoproxyVersionAPI.parse_version_info(version_info, escaped_pkg, session) - if version is not None: - versions.add(version) - self.cache[pkg] = versions + for version_info in response.split("\n"): + version = self.fetch_version_info(version_info, escaped_pkg) + if version: + yield version diff --git a/vulnerabilities/package_managers_2.py b/vulnerabilities/package_managers_2.py deleted file mode 100644 index 68eee5e82..000000000 --- a/vulnerabilities/package_managers_2.py +++ /dev/null @@ -1,379 +0,0 @@ -import dataclasses -import logging -import traceback -import xml.etree.ElementTree as ET -from datetime import datetime -from typing import List -from typing import MutableMapping -from typing import Optional -from typing import Set -from urllib.parse import urlparse - -import requests -from dateutil import parser as dateparser -from django.utils.dateparse import parse_datetime - -from vulnerabilities.helpers import get_item -from vulnerabilities.package_managers import VersionResponse - -LOGGER = logging.getLogger(__name__) - - -@dataclasses.dataclass(frozen=True) -class LegacyVersion: - value: str - release_date: Optional[datetime] = None - - -@dataclasses.dataclass -class VersionResponse: - valid_versions: Set[str] = dataclasses.field(default_factory=set) - newer_versions: Set[str] = dataclasses.field(default_factory=set) - - -def get_response(url, type="json"): - try: - resp = requests.get(url=url) - except: - LOGGER.error(traceback.format_exc()) - return None - if not resp.status_code == 200: - LOGGER.error(f"Error while fetching {url}: {resp.status_code}") - return None - if type == "read": - return resp.content - if type == "text": - return resp.text - return resp.json() - - -class VersionAPI: - def __init__(self, cache: MutableMapping[str, Set[LegacyVersion]] = None): - self.cache = cache or {} - - def get(self, package_name, until=None) -> VersionResponse: - new_versions = set() - valid_versions = set() - for version in self.cache.get(package_name, set()): - if until and version.release_date and version.release_date > until: - new_versions.add(version.value) - else: - valid_versions.add(version.value) - - return VersionResponse(valid_versions=valid_versions, newer_versions=new_versions) - - def load_api(self, pkg_set): - """ - Populate the cache with the versions of the packages in pkg_set - """ - for pkg in pkg_set: - if pkg in self.cache: - continue - self.fetch(pkg) - - def fetch(self, pkg): - """ - Override this method to fetch the pkg's version in the cache - """ - raise NotImplementedError - - -class PypiVersionAPI(VersionAPI): - - package_type = "pypi" - - def fetch(self, pkg): - url = f"https://pypi.org/pypi/{pkg}/json" - versions = set() - response = get_response(url=url) - - if not response: - self.cache[pkg] = versions - return - - releases = response.get("releases") or {} - for version, download_items in releases.items(): - if download_items: - latest_download_item = max( - download_items, - key=lambda download_item: dateparser.parse( - download_item["upload_time_iso_8601"] - ) - if download_item.get("upload_time_iso_8601") - else None, - ) - versions.add( - LegacyVersion( - value=version, - release_date=dateparser.parse(latest_download_item["upload_time_iso_8601"]) - if latest_download_item.get("upload_time_iso_8601") - else None, - ) - ) - self.cache[pkg] = versions - - -class RubyVersionAPI(VersionAPI): - - package_type = "gem" - - def fetch(self, pkg): - url = f"https://rubygems.org/api/v1/versions/{pkg}.json" - versions = set() - response = get_response(url=url) - if not response: - self.cache[pkg] = versions - return - for release in response: - if release.get("published_at"): - release_date = dateparser.parse(release["published_at"]) - elif release.get("created_at"): - release_date = dateparser.parse(release["created_at"]) - else: - release_date = None - if release.get("number"): - versions.add(LegacyVersion(value=release["number"], release_date=release_date)) - else: - LOGGER.error(f"Failed to parse release {release}") - - self.cache[pkg] = versions - - -class MavenVersionAPI(VersionAPI): - - package_type = "maven" - - def fetch(self, pkg) -> None: - artifact_comps = pkg.split(":") - endpoint = self.artifact_url(artifact_comps) - - resp = get_response(url=endpoint, type="read") - - if not resp: - self.cache[pkg] = set() - return - - xml_resp = ET.ElementTree(ET.fromstring(resp.decode("utf-8"))) - self.cache[pkg] = self.extract_versions(xml_resp) - - @staticmethod - def artifact_url(artifact_comps: List[str]) -> str: - base_url = "https://repo1.maven.org/maven2/{}" - try: - group_id, artifact_id = artifact_comps - except ValueError: - if len(artifact_comps) == 1: - group_id = artifact_comps[0] - artifact_id = artifact_comps[0].split(".")[-1] - - elif len(artifact_comps) == 3: - group_id, artifact_id = list(dict.fromkeys(artifact_comps)) - - else: - raise - - group_url = group_id.replace(".", "/") - suffix = group_url + "/" + artifact_id + "/" + "maven-metadata.xml" - endpoint = base_url.format(suffix) - - return endpoint - - @staticmethod - def extract_versions(xml_response: ET.ElementTree) -> Set[LegacyVersion]: - all_versions = set() - for child in xml_response.getroot().iter(): - if child.tag == "version" and child.text: - all_versions.add(LegacyVersion(child.text)) - - return all_versions - - -class NugetVersionAPI(VersionAPI): - - package_type = "nuget" - - def fetch(self, pkg) -> None: - endpoint = self.nuget_url(pkg) - resp = get_response(url=endpoint) - if not resp: - self.cache[pkg] = set() - return - self.cache[pkg] = self.extract_versions(resp) - - @staticmethod - def nuget_url(pkg_name: str) -> str: - pkg_name = pkg_name.lower().strip() - base_url = f"https://api.nuget.org/v3/registration5-semver1/{pkg_name}/index.json" - return base_url - - @staticmethod - def extract_versions(resp: dict) -> Set[LegacyVersion]: - all_versions = set() - for entry_group in resp.get("items") or []: - for entry in entry_group.get("items") or []: - catalog_entry = entry.get("catalogEntry") or {} - version = catalog_entry.get("version") - release_date = ( - dateparser.parse(catalog_entry["published"]) - if catalog_entry.get("published") - else None - ) - if version: - all_versions.add( - LegacyVersion( - value=version, - release_date=release_date, - ) - ) - - return all_versions - - -class GoproxyVersionAPI(VersionAPI): - - package_type = "golang" - - def __init__(self, cache: MutableMapping[str, Set[LegacyVersion]] = None): - super().__init__(cache) - self.module_name_by_package_name = {} - - @staticmethod - def trim_go_url_path(url_path: str) -> Optional[str]: - """ - Return a trimmed Go `url_path` removing trailing - package references and keeping only the module - references. - - Github advisories for Go are using package names - such as "https://github.com/nats-io/nats-server/v2/server" - (e.g., https://github.com/advisories/GHSA-jp4j-47f9-2vc3 ), - yet goproxy works with module names instead such as - "https://github.com/nats-io/nats-server" (see for details - https://golang.org/ref/mod#goproxy-protocol ). - This functions trims the trailing part(s) of a package URL - and returns the remaining the module name. - For example: - >>> module = "github.com/xx/a" - >>> assert GoproxyVersionAPI.trim_go_url_path("https://github.com/xx/a/b") == module - """ - # some advisories contains this prefix in package name, e.g. https://github.com/advisories/GHSA-7h6j-2268-fhcm - if url_path.startswith("https://pkg.go.dev/"): - url_path = url_path[len("https://pkg.go.dev/") :] - parsed_url_path = urlparse(url_path) - path = parsed_url_path.path - parts = path.split("/") - if len(parts) < 3: - LOGGER.error(f"Not a valid Go URL path {url_path} trim_go_url_path") - return None - else: - joined_path = "/".join(parts[:3]) - return f"{parsed_url_path.netloc}{joined_path}" - - @staticmethod - def escape_path(path: str) -> str: - """ - Return an case-encoded module path or version name. - - This is done by replacing every uppercase letter with an exclamation - mark followed by the corresponding lower-case letter, in order to - avoid ambiguity when serving from case-insensitive file systems. - Refer to https://golang.org/ref/mod#goproxy-protocol. - """ - escaped_path = "" - for c in path: - if c >= "A" and c <= "Z": - # replace uppercase with !lowercase - escaped_path += "!" + chr(ord(c) + ord("a") - ord("A")) - else: - escaped_path += c - return escaped_path - - @staticmethod - def parse_version_info(version_info: str, escaped_pkg: str) -> Optional[LegacyVersion]: - v = version_info.split() - if not v: - return None - value = v[0] - if len(v) > 1: - # get release date from the second part. see https://github.com/golang/go/blob/master/src/cmd/go/internal/modfetch/proxy.go#latest() - release_date = parse_datetime(v[1]) - else: - escaped_ver = GoproxyVersionAPI.escape_path(value) - resp_json = get_response( - url=f"https://proxy.golang.org/{escaped_pkg}/@v/{escaped_ver}.info" - ) - if not resp_json: - traceback.print_exc() - print( - f"error while fetching version info for {escaped_pkg}/{escaped_ver} from goproxy" - ) - release_date = parse_datetime(resp_json.get("Time", "")) if resp_json else None - - return LegacyVersion(value=value, release_date=release_date) - - def fetch(self, pkg: str): - # escape uppercase in module path - escaped_pkg = GoproxyVersionAPI.escape_path(pkg) - trimmed_pkg = pkg - resp_text = None - # resolve module name from package name, see https://go.dev/ref/mod#resolve-pkg-mod - while escaped_pkg is not None: - url = f"https://proxy.golang.org/{escaped_pkg}/@v/list" - resp_text = get_response(url=url, type="text") - if not resp_text: - escaped_pkg = GoproxyVersionAPI.trim_go_url_path(escaped_pkg) - trimmed_pkg = GoproxyVersionAPI.trim_go_url_path(trimmed_pkg) or "" - continue - break - if resp_text is None or escaped_pkg is None or trimmed_pkg is None: - print(f"error while fetching versions for {pkg} from goproxy") - return - self.module_name_by_package_name[pkg] = trimmed_pkg - versions = set() - for version_info in resp_text.split("\n"): - version = GoproxyVersionAPI.parse_version_info(version_info, escaped_pkg) - if version is not None: - versions.add(version) - self.cache[pkg] = versions - - -class ComposerVersionAPI(VersionAPI): - - package_type = "composer" - - def fetch(self, pkg) -> None: - endpoint = self.composer_url(pkg) - if endpoint: - resp = get_response(url=endpoint) - if not resp: - self.cache[pkg] = set() - return - self.cache[pkg] = self.extract_versions(resp, pkg) - - @staticmethod - def composer_url(pkg_name: str) -> Optional[str]: - try: - vendor, name = pkg_name.split("/") - except ValueError: - # TODO Log this - return - return f"https://repo.packagist.org/p/{vendor}/{name}.json" - - @staticmethod - def extract_versions(resp: dict, pkg_name: str) -> Set[LegacyVersion]: - all_versions = set() - for version in get_item(resp, "packages", pkg_name) or []: - if "dev" in version: - continue - - # This if statement ensures, that all_versions contains only released versions - # See https://github.com/composer/composer/blob/44a4429978d1b3c6223277b875762b2930e83e8c/doc/articles/versions.md#tags # nopep8 - # for explanation of removing 'v' - time = get_item(resp, "packages", pkg_name, version, "time") - all_versions.add( - LegacyVersion( - value=version.lstrip("v"), - release_date=dateparser.parse(time) if time else None, - ) - ) - return all_versions diff --git a/vulnerabilities/severity_systems.py b/vulnerabilities/severity_systems.py index fa02650cd..2895694ea 100644 --- a/vulnerabilities/severity_systems.py +++ b/vulnerabilities/severity_systems.py @@ -1,5 +1,32 @@ +# Copyright (c) nexB Inc. and others. All rights reserved. +# http://nexb.com and https://github.com/nexB/vulnerablecode/ +# The VulnerableCode software is licensed under the Apache License version 2.0. +# Data generated with VulnerableCode require an acknowledgment. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. +# +# When you publish or redistribute any data created with VulnerableCode or any VulnerableCode +# derivative work, you must accompany this data with the following acknowledgment: +# +# Generated with VulnerableCode and provided on an "AS IS" BASIS, WITHOUT WARRANTIES +# OR CONDITIONS OF ANY KIND, either express or implied. No content created from +# VulnerableCode should be considered or used as legal advice. Consult an Attorney +# for any legal advice. +# VulnerableCode is a free software tool from nexB Inc. and others. +# Visit https://github.com/nexB/vulnerablecode/ for support and download. + import dataclasses +""" +Vulnerability scoring systems define scales, values and approach to score a +vulnerability severity. +""" + @dataclasses.dataclass(order=True) class ScoringSystem: @@ -23,73 +50,104 @@ def as_score(self, value): raise NotImplementedError +CVSSV2 = ScoringSystem( + identifier="cvssv2", + name="CVSSv2 Base Score", + url="https://www.first.org/cvss/v2/", + notes="cvssv2 base score", +) + +CVSSV2_VECTOR = ScoringSystem( + identifier="cvssv2_vector", + name="CVSSv2 Vector", + url="https://www.first.org/cvss/v2/", + notes="cvssv2 vector, used to get additional info about " + "nature and severity of vulnerability", +) + +CVSSV3 = ScoringSystem( + identifier="cvssv3", + name="CVSSv3 Base Score", + url="https://www.first.org/cvss/v3-0/", + notes="cvssv3 base score", +) + +CVSSV3_VECTOR = ScoringSystem( + identifier="cvssv3_vector", + name="CVSSv3 Vector", + url="https://www.first.org/cvss/v3-0/", + notes="cvssv3 vector, used to get additional info about " + "nature and severity of vulnerability", +) + +CVSSV31 = ScoringSystem( + identifier="cvssv3.1", + name="CVSSv3.1 Base Score", + url="https://www.first.org/cvss/v3-1/", + notes="cvssv3.1 base score", +) + +CVSSV31_VECTOR = ScoringSystem( + identifier="cvssv3.1_vector", + name="CVSSv3.1 Vector", + url="https://www.first.org/cvss/v3-1/", + notes="cvssv3.1 vector, used to get additional info about " + "nature and severity of vulnerability", +) + +REDHAT_BUGZILLA = ScoringSystem( + identifier="rhbs", + name="RedHat Bugzilla severity", + url="https://bugzilla.redhat.com/page.cgi?id=fields.html#bug_severity", +) + +REDHAT_AGGREGATE = ScoringSystem( + identifier="rhas", + name="RedHat Aggregate severity", + url="https://access.redhat.com/security/updates/classification/", +) + +ARCHLINUX = ScoringSystem( + identifier="archlinux", + name="Archlinux Vulnerability Group Severity", + url="https://wiki.archlinux.org/index.php/Bug_reporting_guidelines#Severity", +) + +CVSS31_QUALITY = ScoringSystem( + identifier="cvssv3.1_qr", + name="CVSSv3.1 Qualitative Severity Rating", + url="https://www.first.org/cvss/specification-document#Qualitative-Severity-Rating-Scale", + notes="A textual interpretation of severity. Has values like HIGH, MEDIUM etc", +) + +GENERIC = ScoringSystem( + identifier="generic_textual", + name="Generic textual severity rating", + url="", + notes="Severity for generic scoring systems. Contains generic textual " + "values like High, Low etc", +) + +APACHE_HTTPD = ScoringSystem( + identifier="apache_httpd", + name="Apache Httpd Severity", + url="https://httpd.apache.org/security/impact_levels.html", +) + SCORING_SYSTEMS = { - "cvssv2": ScoringSystem( - identifier="cvssv2", - name="CVSSv2 Base Score", - url="https://www.first.org/cvss/v2/", - notes="cvssv2 base score", - ), - "cvssv2_vector": ScoringSystem( - identifier="cvssv2_vector", - name="CVSSv2 Vector", - url="https://www.first.org/cvss/v2/", - notes="cvssv2 vector, used to get additional info about nature and severity of vulnerability", # nopep8 - ), - "cvssv3": ScoringSystem( - identifier="cvssv3", - name="CVSSv3 Base Score", - url="https://www.first.org/cvss/v3-0/", - notes="cvssv3 base score", - ), - "cvssv3_vector": ScoringSystem( - identifier="cvssv3_vector", - name="CVSSv3 Vector", - url="https://www.first.org/cvss/v3-0/", - notes="cvssv3 vector, used to get additional info about nature and severity of vulnerability", # nopep8 - ), - "cvssv3.1": ScoringSystem( - identifier="cvssv3.1", - name="CVSSv3.1 Base Score", - url="https://www.first.org/cvss/v3-1/", - notes="cvssv3.1 base score", - ), - "cvssv3.1_vector": ScoringSystem( - identifier="cvssv3.1_vector", - name="CVSSv3.1 Vector", - url="https://www.first.org/cvss/v3-1/", - notes="cvssv3.1 vector, used to get additional info about nature and severity of vulnerability", # nopep8 - ), - "rhbs": ScoringSystem( - identifier="rhbs", - name="RedHat Bugzilla severity", - url="https://bugzilla.redhat.com/page.cgi?id=fields.html#bug_severity", - ), - "rhas": ScoringSystem( - identifier="rhas", - name="RedHat Aggregate severity", - url="https://access.redhat.com/security/updates/classification/", - ), - "avgs": ScoringSystem( - identifier="avgs", - name="Archlinux Vulnerability Group Severity", - url="https://wiki.archlinux.org/index.php/Bug_reporting_guidelines#Severity", - ), - "cvssv3.1_qr": ScoringSystem( - identifier="cvssv3.1_qr", - name="CVSSv3.1 Qualitative Severity Rating", - url="https://www.first.org/cvss/specification-document#Qualitative-Severity-Rating-Scale", - notes="A textual interpretation of severity. Has values like HIGH, MEDIUM etc", - ), - "generic_textual": ScoringSystem( - identifier="generic_textual", - name="Generic textual severity rating", - url="", - notes="Severity for unknown scoring systems. Contains generic textual values like High, Low etc", - ), - "apache_httpd": ScoringSystem( - identifier="apache_httpd", - name="Apache Httpd Severity", - url="https://httpd.apache.org/security/impact_levels.html", - ), + system.identifier: system + for system in ( + CVSSV2, + CVSSV2_VECTOR, + CVSSV3, + CVSSV3_VECTOR, + CVSSV31, + CVSSV31_VECTOR, + REDHAT_BUGZILLA, + REDHAT_AGGREGATE, + ARCHLINUX, + CVSS31_QUALITY, + GENERIC, + APACHE_HTTPD, + ) } diff --git a/vulnerabilities/tests/conftest.py b/vulnerabilities/tests/conftest.py index 6cd796789..2d0830978 100644 --- a/vulnerabilities/tests/conftest.py +++ b/vulnerabilities/tests/conftest.py @@ -21,8 +21,6 @@ # VulnerableCode is a free software code scanning tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. -import os - import pytest @@ -41,34 +39,33 @@ def no_rmtree(monkeypatch): # Step 2: Run test for importer only if it is activated (pytestmark = pytest.mark.skipif(...)) # Step 3: Migrate all the tests collect_ignore = [ - "test_models.py", - "test_msr2019.py", - "test_nginx.py", "test_apache_httpd.py", - "test_npm.py", "test_apache_kafka.py", "test_apache_tomcat.py", "test_api.py", - "test_package_managers.py", "test_archlinux.py", + "test_data_source.py", + "test_debian_oval.py", + "test_debian.py", + "test_elixir_security.py", + "test_gentoo.py", + "test_importer_yielder.py", + "test_istio.py", + "test_models.py", + "test_mozilla.py", + "test_msr2019.py", + "test_npm.py", + "test_package_managers.py", "test_postgresql.py", "test_redhat_importer.py", - "test_data_source.py", "test_retiredotnet.py", - "test_debian.py", "test_ruby.py", - "test_debian_oval.py", "test_rust.py", - "test_elixir_security.py", "test_safety_db.py", - "test_gentoo.py", - "test_suse.py", "test_suse_backports.py", + "test_suse.py", "test_suse_scores.py", "test_ubuntu.py", "test_ubuntu_usn.py", - "test_importer_yielder.py", "test_upstream.py", - "test_istio.py", - "test_mozilla.py", ] diff --git a/vulnerabilities/tests/example_importer_improver.py b/vulnerabilities/tests/example_importer_improver.py index bdecf3204..c01f41eb6 100644 --- a/vulnerabilities/tests/example_importer_improver.py +++ b/vulnerabilities/tests/example_importer_improver.py @@ -54,6 +54,9 @@ def fetch_advisory_data(): def parse_advisory_data(raw_data) -> AdvisoryData: + """ + Return AdvisoryData build from a mapping of ``raw_data`` example advisory. + """ purl = PackageURL(type="example", name="dummy_package") affected_version_range = NginxVersionRange.from_native(raw_data["vulnerable"]) fixed_version = SemverVersion(raw_data["fixed"]) @@ -64,6 +67,7 @@ def parse_advisory_data(raw_data) -> AdvisoryData: system=SCORING_SYSTEMS["generic_textual"], value=raw_data["advisory_severity"] ) references = [Reference(url=raw_data["reference"], severities=[severity])] + # The original format is "06-10-2021 UTC" and we convert this a date_published = datetime.strptime(raw_data["published_on"], "%d-%m-%Y %Z").replace( tzinfo=timezone.utc ) diff --git a/vulnerabilities/tests/test_apache_httpd.py b/vulnerabilities/tests/test_apache_httpd.py index 50ed2e599..9d9255fc2 100644 --- a/vulnerabilities/tests/test_apache_httpd.py +++ b/vulnerabilities/tests/test_apache_httpd.py @@ -25,16 +25,16 @@ from unittest import TestCase from packageurl import PackageURL -from univers.version_specifier import VersionSpecifier +from univers.version_range import VersionRange +from vulnerabilities import severity_systems from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity from vulnerabilities.importers.apache_httpd import ApacheHTTPDImporter from vulnerabilities.package_managers import GitHubTagsAPI -from vulnerabilities.package_managers import Version -from vulnerabilities.severity_systems import scoring_systems +from vulnerabilities.package_managers import PackageVersion BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TEST_DATA = os.path.join(BASE_DIR, "test_data", "apache_httpd", "CVE-1999-1199.json") @@ -45,7 +45,7 @@ class TestApacheHTTPDImporter(TestCase): def setUpClass(cls): data_source_cfg = {"etags": {}} cls.data_src = ApacheHTTPDImporter(1, config=data_source_cfg) - known_versions = [Version("1.3.2"), Version("1.3.1"), Version("1.3.0")] + known_versions = [PackageVersion("1.3.2"), PackageVersion("1.3.1"), PackageVersion("1.3.0")] cls.data_src.version_api = GitHubTagsAPI(cache={"apache/httpd": known_versions}) with open(TEST_DATA) as f: cls.data = json.load(f) @@ -69,18 +69,18 @@ def test_to_version_ranges(self): # Check fixed packages assert [ - VersionSpecifier.from_scheme_version_spec_string("semver", ">=1.3.2") + VersionRange.from_scheme_version_spec_string("semver", ">=1.3.2") ] == fixed_version_ranges # Check vulnerable packages assert [ - VersionSpecifier.from_scheme_version_spec_string("semver", "==1.3.0"), - VersionSpecifier.from_scheme_version_spec_string("semver", "==1.3.1"), + VersionRange.from_scheme_version_spec_string("semver", "==1.3.0"), + VersionRange.from_scheme_version_spec_string("semver", "==1.3.1"), ] == affected_version_ranges def test_to_advisory(self): expected_advisories = [ - Advisory( + AdvisoryData( summary="A serious problem exists when a client sends a large number of " "headers with the same header name. Apache uses up memory faster than the " "amount of memory required to simply store the received data itself. That " @@ -109,7 +109,7 @@ def test_to_advisory(self): url="https://httpd.apache.org/security/json/CVE-1999-1199.json", severities=[ VulnerabilitySeverity( - system=scoring_systems["apache_httpd"], + system=severity_systems.APACHE_HTTPD, value="important", ), ], @@ -120,6 +120,6 @@ def test_to_advisory(self): ) ] found_advisories = [self.data_src.to_advisory(self.data)] - found_advisories = list(map(Advisory.normalized, found_advisories)) - expected_advisories = list(map(Advisory.normalized, expected_advisories)) + found_advisories = list(map(AdvisoryData.normalized, found_advisories)) + expected_advisories = list(map(AdvisoryData.normalized, expected_advisories)) assert sorted(found_advisories) == sorted(expected_advisories) diff --git a/vulnerabilities/tests/test_apache_kafka.py b/vulnerabilities/tests/test_apache_kafka.py index ddac6adc6..dfa856529 100644 --- a/vulnerabilities/tests/test_apache_kafka.py +++ b/vulnerabilities/tests/test_apache_kafka.py @@ -24,10 +24,10 @@ from unittest import TestCase from packageurl import PackageURL -from univers.version_specifier import VersionSpecifier +from univers.version_range import VersionRange from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importers.apache_kafka import ApacheKafkaImporter from vulnerabilities.importers.apache_kafka import to_version_ranges @@ -42,24 +42,24 @@ class TestApacheKafkaImporter(TestCase): def test_to_version_ranges(self): # Check single version assert [ - VersionSpecifier.from_scheme_version_spec_string("maven", "=3.2.2") + VersionRange.from_scheme_version_spec_string("maven", "=3.2.2") ] == to_version_ranges("3.2.2") # Check range with lower and upper bounds assert [ - VersionSpecifier.from_scheme_version_spec_string("maven", ">=3.2.2, <=3.2.3") + VersionRange.from_scheme_version_spec_string("maven", ">=3.2.2, <=3.2.3") ] == to_version_ranges("3.2.2 to 3.2.3") # Check range with "and later" assert [ - VersionSpecifier.from_scheme_version_spec_string("maven", ">=3.2.2") + VersionRange.from_scheme_version_spec_string("maven", ">=3.2.2") ] == to_version_ranges("3.2.2 and later") # Check combination of above cases assert [ - VersionSpecifier.from_scheme_version_spec_string("maven", ">=3.2.2"), - VersionSpecifier.from_scheme_version_spec_string("maven", ">=3.2.2, <=3.2.3"), - VersionSpecifier.from_scheme_version_spec_string("maven", "==3.2.2"), + VersionRange.from_scheme_version_spec_string("maven", ">=3.2.2"), + VersionRange.from_scheme_version_spec_string("maven", ">=3.2.2, <=3.2.3"), + VersionRange.from_scheme_version_spec_string("maven", "==3.2.2"), ] == to_version_ranges("3.2.2 and later, 3.2.2 to 3.2.3, 3.2.2") def test_to_advisory(self): diff --git a/vulnerabilities/tests/test_apache_tomcat.py b/vulnerabilities/tests/test_apache_tomcat.py index c4da559b9..b6fcce119 100644 --- a/vulnerabilities/tests/test_apache_tomcat.py +++ b/vulnerabilities/tests/test_apache_tomcat.py @@ -27,11 +27,11 @@ from packageurl import PackageURL from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importers.apache_tomcat import ApacheTomcatImporter from vulnerabilities.package_managers import MavenVersionAPI -from vulnerabilities.package_managers import Version +from vulnerabilities.package_managers import PackageVersion BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TEST_DATA = os.path.join(BASE_DIR, "test_data", "apache_tomcat", "security-9.html") @@ -44,10 +44,10 @@ def setUpClass(cls): mock_api = MavenVersionAPI( cache={ "org.apache.tomcat:tomcat": [ - Version("9.0.0.M1"), - Version("9.0.0.M2"), - Version("8.0.0.M1"), - Version("6.0.0M2"), + PackageVersion("9.0.0.M1"), + PackageVersion("9.0.0.M2"), + PackageVersion("8.0.0.M1"), + PackageVersion("6.0.0M2"), ] } ) @@ -58,7 +58,7 @@ def setUpClass(cls): def test_to_advisories(self): expected_advisories = [ - Advisory( + AdvisoryData( summary="", vulnerability_id="CVE-2015-5351", affected_packages=[ @@ -127,7 +127,7 @@ def test_to_advisories(self): ), ], ), - Advisory( + AdvisoryData( summary="", vulnerability_id="CVE-2016-0706", affected_packages=[ @@ -159,7 +159,7 @@ def test_to_advisories(self): ), ], ), - Advisory( + AdvisoryData( summary="", vulnerability_id="CVE-2016-0714", affected_packages={}, @@ -181,7 +181,7 @@ def test_to_advisories(self): ), ], ), - Advisory( + AdvisoryData( summary="", vulnerability_id="CVE-2016-0763", affected_packages=[ @@ -232,6 +232,6 @@ def test_to_advisories(self): with open(TEST_DATA) as f: found_advisories = self.data_src.to_advisories(f) - found_advisories = list(map(Advisory.normalized, found_advisories)) - expected_advisories = list(map(Advisory.normalized, expected_advisories)) + found_advisories = list(map(AdvisoryData.normalized, found_advisories)) + expected_advisories = list(map(AdvisoryData.normalized, expected_advisories)) assert sorted(found_advisories) == sorted(expected_advisories) diff --git a/vulnerabilities/tests/test_cpe_reference.py b/vulnerabilities/tests/test_cpe_reference.py index 3c9440417..26f9f6df4 100644 --- a/vulnerabilities/tests/test_cpe_reference.py +++ b/vulnerabilities/tests/test_cpe_reference.py @@ -21,7 +21,6 @@ # Visit https://github.com/nexB/vulnerablecode/ for support and download. import pytest -from vulnerabilities.improve_runner import get_or_create_vulnerability_and_aliases from vulnerabilities.models import Vulnerability from vulnerabilities.models import VulnerabilityReference diff --git a/vulnerabilities/tests/test_data/example/parse_advisory_data-expected.json b/vulnerabilities/tests/test_data/example/parse_advisory_data-expected.json new file mode 100644 index 000000000..804742f2d --- /dev/null +++ b/vulnerabilities/tests/test_data/example/parse_advisory_data-expected.json @@ -0,0 +1,33 @@ +{ + "aliases": [ + "CVE-2021-12341337" + ], + "summary": "Dummy advisory", + "affected_packages": [ + { + "package": { + "type": "example", + "namespace": null, + "name": "dummy_package", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.20.0", + "fixed_version": "1.20.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://example.com/cve-2021-1234", + "severities": [ + { + "system": "generic_textual", + "value": "high" + } + ] + } + ], + "date_published": "2021-10-06T00:00:00+00:00" +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/goproxy_api/ferretdb_versions b/vulnerabilities/tests/test_data/goproxy_api/ferretdb_versions deleted file mode 100644 index 70230bc4b..000000000 --- a/vulnerabilities/tests/test_data/goproxy_api/ferretdb_versions +++ /dev/null @@ -1,5 +0,0 @@ -v0.0.1 -v0.0.5 -v0.0.3 -v0.0.4 -v0.0.2 diff --git a/vulnerabilities/tests/test_data/goproxy_api/version_info b/vulnerabilities/tests/test_data/goproxy_api/version_info deleted file mode 100644 index 7774c4a3f..000000000 --- a/vulnerabilities/tests/test_data/goproxy_api/version_info +++ /dev/null @@ -1 +0,0 @@ -{"Version":"v0.0.5","Time":"2022-01-04T13:54:01Z"} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/maven_api/easygcm.html b/vulnerabilities/tests/test_data/maven_api/easygcm.html deleted file mode 100644 index 280faf6a2..000000000 --- a/vulnerabilities/tests/test_data/maven_api/easygcm.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - Central Repository: eu/inloop/easygcm - - - - - -
-

eu/inloop/easygcm

-
-
-
-
../
-1.2.2/                                            2014-12-22 10:29         -      
-1.2.3/                                            2014-12-22 10:53         -      
-1.3.0/                                            2015-03-12 15:20         -      
-maven-metadata.xml                                2015-03-12 15:22       385      
-maven-metadata.xml.md5                            2015-03-12 15:22        32      
-maven-metadata.xml.sha1                           2015-03-12 15:22        40      
-		
-
-
- - - \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-0.json b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-0.json new file mode 100644 index 000000000..d45299c3a --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-0.json @@ -0,0 +1,615 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 547, + "pageInfo": { + "endCursor": "MTAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "release-0.1.0", + "target": { + "committedDate": "2004-10-04T15:04:06Z" + } + }, + { + "name": "release-0.1.1", + "target": { + "committedDate": "2004-10-11T15:07:03Z" + } + }, + { + "name": "release-0.1.2", + "target": { + "committedDate": "2004-10-21T15:34:38Z" + } + }, + { + "name": "release-0.1.3", + "target": { + "committedDate": "2004-10-25T15:29:23Z" + } + }, + { + "name": "release-0.1.4", + "target": { + "committedDate": "2004-10-26T06:27:24Z" + } + }, + { + "name": "release-0.1.5", + "target": { + "committedDate": "2004-11-11T14:07:14Z" + } + }, + { + "name": "release-0.1.6", + "target": { + "committedDate": "2004-11-11T20:58:09Z" + } + }, + { + "name": "release-0.1.7", + "target": { + "committedDate": "2004-11-12T14:35:09Z" + } + }, + { + "name": "release-0.1.8", + "target": { + "committedDate": "2004-11-20T19:52:20Z" + } + }, + { + "name": "release-0.1.9", + "target": { + "committedDate": "2004-11-25T16:17:31Z" + } + }, + { + "name": "release-0.1.10", + "target": { + "committedDate": "2004-11-26T09:33:59Z" + } + }, + { + "name": "release-0.1.11", + "target": { + "committedDate": "2004-12-02T18:40:46Z" + } + }, + { + "name": "release-0.1.12", + "target": { + "committedDate": "2004-12-06T14:45:08Z" + } + }, + { + "name": "release-0.1.13", + "target": { + "committedDate": "2004-12-21T12:30:30Z" + } + }, + { + "name": "release-0.1.14", + "target": { + "committedDate": "2005-01-18T13:03:58Z" + } + }, + { + "name": "release-0.1.15", + "target": { + "committedDate": "2005-01-19T13:10:56Z" + } + }, + { + "name": "release-0.1.16", + "target": { + "committedDate": "2005-01-25T12:27:35Z" + } + }, + { + "name": "release-0.1.17", + "target": { + "committedDate": "2005-02-03T19:33:37Z" + } + }, + { + "name": "release-0.1.18", + "target": { + "committedDate": "2005-02-09T14:31:07Z" + } + }, + { + "name": "release-0.1.19", + "target": { + "committedDate": "2005-02-16T13:40:36Z" + } + }, + { + "name": "release-0.1.20", + "target": { + "committedDate": "2005-02-17T11:59:36Z" + } + }, + { + "name": "release-0.1.21", + "target": { + "committedDate": "2005-02-22T14:40:13Z" + } + }, + { + "name": "release-0.1.22", + "target": { + "committedDate": "2005-02-24T12:29:09Z" + } + }, + { + "name": "release-0.1.23", + "target": { + "committedDate": "2005-03-01T15:20:36Z" + } + }, + { + "name": "release-0.1.24", + "target": { + "committedDate": "2005-03-04T14:06:57Z" + } + }, + { + "name": "release-0.1.25", + "target": { + "committedDate": "2005-03-19T12:38:37Z" + } + }, + { + "name": "release-0.1.26", + "target": { + "committedDate": "2005-03-22T16:02:46Z" + } + }, + { + "name": "release-0.1.27", + "target": { + "committedDate": "2005-03-28T14:43:02Z" + } + }, + { + "name": "release-0.1.28", + "target": { + "committedDate": "2005-04-08T15:18:55Z" + } + }, + { + "name": "release-0.1.29", + "target": { + "committedDate": "2005-05-12T14:58:06Z" + } + }, + { + "name": "release-0.1.30", + "target": { + "committedDate": "2005-05-14T18:42:03Z" + } + }, + { + "name": "release-0.1.31", + "target": { + "committedDate": "2005-05-16T13:53:20Z" + } + }, + { + "name": "release-0.1.32", + "target": { + "committedDate": "2005-05-19T13:25:22Z" + } + }, + { + "name": "release-0.1.33", + "target": { + "committedDate": "2005-05-23T12:07:45Z" + } + }, + { + "name": "release-0.1.34", + "target": { + "committedDate": "2005-05-26T18:12:40Z" + } + }, + { + "name": "release-0.1.35", + "target": { + "committedDate": "2005-06-07T15:56:31Z" + } + }, + { + "name": "release-0.1.36", + "target": { + "committedDate": "2005-06-15T18:33:41Z" + } + }, + { + "name": "release-0.1.37", + "target": { + "committedDate": "2005-06-23T13:41:06Z" + } + }, + { + "name": "release-0.1.38", + "target": { + "committedDate": "2005-07-08T14:34:20Z" + } + }, + { + "name": "release-0.1.39", + "target": { + "committedDate": "2005-07-14T12:51:53Z" + } + }, + { + "name": "release-0.1.40", + "target": { + "committedDate": "2005-07-25T09:41:38Z" + } + }, + { + "name": "release-0.1.41", + "target": { + "committedDate": "2005-08-19T08:54:17Z" + } + }, + { + "name": "release-0.1.42", + "target": { + "committedDate": "2005-08-23T15:36:54Z" + } + }, + { + "name": "release-0.1.43", + "target": { + "committedDate": "2005-08-30T10:55:07Z" + } + }, + { + "name": "release-0.1.44", + "target": { + "committedDate": "2005-09-06T16:09:32Z" + } + }, + { + "name": "release-0.1.45", + "target": { + "committedDate": "2005-09-08T14:36:09Z" + } + }, + { + "name": "release-0.2.0", + "target": { + "committedDate": "2005-09-23T11:02:22Z" + } + }, + { + "name": "release-0.2.1", + "target": { + "committedDate": "2005-09-23T14:43:49Z" + } + }, + { + "name": "release-0.2.2", + "target": { + "committedDate": "2005-09-30T14:41:25Z" + } + }, + { + "name": "release-0.2.3", + "target": { + "committedDate": "2005-09-30T16:02:34Z" + } + }, + { + "name": "release-0.2.4", + "target": { + "committedDate": "2005-10-03T12:53:14Z" + } + }, + { + "name": "release-0.2.5", + "target": { + "committedDate": "2005-10-04T10:38:53Z" + } + }, + { + "name": "release-0.2.6", + "target": { + "committedDate": "2005-10-05T14:46:21Z" + } + }, + { + "name": "release-0.3.0", + "target": { + "committedDate": "2005-10-07T13:30:52Z" + } + }, + { + "name": "release-0.3.1", + "target": { + "committedDate": "2005-10-10T12:59:41Z" + } + }, + { + "name": "release-0.3.2", + "target": { + "committedDate": "2005-10-12T13:50:36Z" + } + }, + { + "name": "release-0.3.3", + "target": { + "committedDate": "2005-10-19T12:33:58Z" + } + }, + { + "name": "release-0.3.4", + "target": { + "committedDate": "2005-10-19T13:34:28Z" + } + }, + { + "name": "release-0.3.5", + "target": { + "committedDate": "2005-10-21T19:12:18Z" + } + }, + { + "name": "release-0.3.6", + "target": { + "committedDate": "2005-10-24T15:09:41Z" + } + }, + { + "name": "release-0.3.7", + "target": { + "committedDate": "2005-10-27T15:46:13Z" + } + }, + { + "name": "release-0.3.8", + "target": { + "committedDate": "2005-11-09T17:25:55Z" + } + }, + { + "name": "release-0.3.9", + "target": { + "committedDate": "2005-11-10T07:44:53Z" + } + }, + { + "name": "release-0.3.10", + "target": { + "committedDate": "2005-11-15T13:30:52Z" + } + }, + { + "name": "release-0.3.11", + "target": { + "committedDate": "2005-11-15T14:49:57Z" + } + }, + { + "name": "release-0.3.12", + "target": { + "committedDate": "2005-11-26T10:11:11Z" + } + }, + { + "name": "release-0.3.13", + "target": { + "committedDate": "2005-12-05T13:18:09Z" + } + }, + { + "name": "release-0.3.14", + "target": { + "committedDate": "2005-12-05T16:59:05Z" + } + }, + { + "name": "release-0.3.15", + "target": { + "committedDate": "2005-12-07T14:51:31Z" + } + }, + { + "name": "release-0.3.16", + "target": { + "committedDate": "2005-12-16T15:07:08Z" + } + }, + { + "name": "release-0.3.17", + "target": { + "committedDate": "2005-12-18T16:02:44Z" + } + }, + { + "name": "release-0.3.18", + "target": { + "committedDate": "2005-12-26T17:07:48Z" + } + }, + { + "name": "release-0.3.19", + "target": { + "committedDate": "2005-12-28T14:23:52Z" + } + }, + { + "name": "release-0.3.20", + "target": { + "committedDate": "2006-01-11T15:26:57Z" + } + }, + { + "name": "release-0.3.21", + "target": { + "committedDate": "2006-01-16T14:56:53Z" + } + }, + { + "name": "release-0.3.22", + "target": { + "committedDate": "2006-01-17T20:04:32Z" + } + }, + { + "name": "release-0.3.23", + "target": { + "committedDate": "2006-01-24T16:08:27Z" + } + }, + { + "name": "release-0.3.24", + "target": { + "committedDate": "2006-02-01T18:22:15Z" + } + }, + { + "name": "release-0.3.25", + "target": { + "committedDate": "2006-02-01T20:01:51Z" + } + }, + { + "name": "release-0.3.26", + "target": { + "committedDate": "2006-02-03T12:58:48Z" + } + }, + { + "name": "release-0.3.27", + "target": { + "committedDate": "2006-02-08T15:33:12Z" + } + }, + { + "name": "release-0.3.28", + "target": { + "committedDate": "2006-02-16T15:26:46Z" + } + }, + { + "name": "release-0.3.29", + "target": { + "committedDate": "2006-02-20T16:48:17Z" + } + }, + { + "name": "release-0.3.30", + "target": { + "committedDate": "2006-02-22T19:41:39Z" + } + }, + { + "name": "release-0.3.31", + "target": { + "committedDate": "2006-03-10T12:51:52Z" + } + }, + { + "name": "release-0.3.32", + "target": { + "committedDate": "2006-03-11T06:40:30Z" + } + }, + { + "name": "release-0.3.33", + "target": { + "committedDate": "2006-03-15T09:53:04Z" + } + }, + { + "name": "release-0.3.34", + "target": { + "committedDate": "2006-03-21T08:20:41Z" + } + }, + { + "name": "release-0.3.35", + "target": { + "committedDate": "2006-03-28T12:24:47Z" + } + }, + { + "name": "release-0.3.36", + "target": { + "committedDate": "2006-04-05T13:40:54Z" + } + }, + { + "name": "release-0.3.37", + "target": { + "committedDate": "2006-04-07T14:08:04Z" + } + }, + { + "name": "release-0.3.38", + "target": { + "committedDate": "2006-04-14T09:53:38Z" + } + }, + { + "name": "release-0.3.39", + "target": { + "committedDate": "2006-04-17T19:55:41Z" + } + }, + { + "name": "release-0.3.40", + "target": { + "committedDate": "2006-04-19T15:30:56Z" + } + }, + { + "name": "release-0.3.41", + "target": { + "committedDate": "2006-04-21T12:06:44Z" + } + }, + { + "name": "release-0.3.42", + "target": { + "committedDate": "2006-04-26T09:52:47Z" + } + }, + { + "name": "release-0.3.43", + "target": { + "committedDate": "2006-04-26T15:21:08Z" + } + }, + { + "name": "release-0.3.44", + "target": { + "committedDate": "2006-05-04T15:32:46Z" + } + }, + { + "name": "release-0.3.45", + "target": { + "committedDate": "2006-05-06T16:28:56Z" + } + }, + { + "name": "release-0.3.46", + "target": { + "committedDate": "2006-05-11T14:43:47Z" + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-1.json b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-1.json new file mode 100644 index 000000000..eed1dd858 --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-1.json @@ -0,0 +1,615 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 547, + "pageInfo": { + "endCursor": "MjAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "release-0.3.47", + "target": { + "committedDate": "2006-05-23T14:54:58Z" + } + }, + { + "name": "release-0.3.48", + "target": { + "committedDate": "2006-05-29T17:28:12Z" + } + }, + { + "name": "release-0.3.49", + "target": { + "committedDate": "2006-05-31T14:11:45Z" + } + }, + { + "name": "release-0.3.50", + "target": { + "committedDate": "2006-06-28T16:00:26Z" + } + }, + { + "name": "release-0.3.51", + "target": { + "committedDate": "2006-06-30T12:19:32Z" + } + }, + { + "name": "release-0.3.52", + "target": { + "committedDate": "2006-07-03T16:49:20Z" + } + }, + { + "name": "release-0.3.53", + "target": { + "committedDate": "2006-07-07T16:33:19Z" + } + }, + { + "name": "release-0.3.54", + "target": { + "committedDate": "2006-07-11T13:20:19Z" + } + }, + { + "name": "release-0.3.55", + "target": { + "committedDate": "2006-07-28T15:16:17Z" + } + }, + { + "name": "release-0.3.56", + "target": { + "committedDate": "2006-08-04T16:04:04Z" + } + }, + { + "name": "release-0.3.57", + "target": { + "committedDate": "2006-08-09T19:59:45Z" + } + }, + { + "name": "release-0.3.58", + "target": { + "committedDate": "2006-08-14T15:09:38Z" + } + }, + { + "name": "release-0.3.59", + "target": { + "committedDate": "2006-08-16T13:09:33Z" + } + }, + { + "name": "release-0.3.60", + "target": { + "committedDate": "2006-08-18T14:17:54Z" + } + }, + { + "name": "release-0.3.61", + "target": { + "committedDate": "2006-08-28T16:57:48Z" + } + }, + { + "name": "release-0.4.0", + "target": { + "committedDate": "2006-08-30T10:39:17Z" + } + }, + { + "name": "release-0.4.1", + "target": { + "committedDate": "2006-09-14T13:28:04Z" + } + }, + { + "name": "release-0.4.2", + "target": { + "committedDate": "2006-09-14T15:29:09Z" + } + }, + { + "name": "release-0.4.3", + "target": { + "committedDate": "2006-09-26T12:23:14Z" + } + }, + { + "name": "release-0.4.4", + "target": { + "committedDate": "2006-10-02T11:44:21Z" + } + }, + { + "name": "release-0.4.5", + "target": { + "committedDate": "2006-10-02T15:07:23Z" + } + }, + { + "name": "release-0.4.6", + "target": { + "committedDate": "2006-10-06T14:23:44Z" + } + }, + { + "name": "release-0.4.7", + "target": { + "committedDate": "2006-10-10T16:10:29Z" + } + }, + { + "name": "release-0.4.8", + "target": { + "committedDate": "2006-10-11T15:11:22Z" + } + }, + { + "name": "release-0.4.9", + "target": { + "committedDate": "2006-10-13T15:43:19Z" + } + }, + { + "name": "release-0.4.10", + "target": { + "committedDate": "2006-10-23T13:25:27Z" + } + }, + { + "name": "release-0.4.11", + "target": { + "committedDate": "2006-10-25T16:29:25Z" + } + }, + { + "name": "release-0.4.12", + "target": { + "committedDate": "2006-10-31T15:28:43Z" + } + }, + { + "name": "release-0.4.13", + "target": { + "committedDate": "2006-11-15T20:02:11Z" + } + }, + { + "name": "release-0.4.14", + "target": { + "committedDate": "2006-11-27T14:28:44Z" + } + }, + { + "name": "release-0.5.0", + "target": { + "committedDate": "2006-12-04T16:56:53Z" + } + }, + { + "name": "release-0.5.1", + "target": { + "committedDate": "2006-12-11T10:00:05Z" + } + }, + { + "name": "release-0.5.2", + "target": { + "committedDate": "2006-12-11T15:23:27Z" + } + }, + { + "name": "release-0.5.3", + "target": { + "committedDate": "2006-12-13T15:06:55Z" + } + }, + { + "name": "release-0.5.4", + "target": { + "committedDate": "2006-12-14T23:14:11Z" + } + }, + { + "name": "release-0.5.5", + "target": { + "committedDate": "2006-12-24T18:32:58Z" + } + }, + { + "name": "release-0.5.6", + "target": { + "committedDate": "2007-01-09T17:08:42Z" + } + }, + { + "name": "release-0.5.7", + "target": { + "committedDate": "2007-01-15T17:49:11Z" + } + }, + { + "name": "release-0.5.8", + "target": { + "committedDate": "2007-01-19T16:13:59Z" + } + }, + { + "name": "release-0.5.9", + "target": { + "committedDate": "2007-01-25T16:34:51Z" + } + }, + { + "name": "release-0.5.10", + "target": { + "committedDate": "2007-01-25T22:09:28Z" + } + }, + { + "name": "release-0.5.11", + "target": { + "committedDate": "2007-02-05T14:02:51Z" + } + }, + { + "name": "release-0.5.12", + "target": { + "committedDate": "2007-02-12T14:59:20Z" + } + }, + { + "name": "release-0.5.13", + "target": { + "committedDate": "2007-02-19T13:25:54Z" + } + }, + { + "name": "release-0.5.14", + "target": { + "committedDate": "2007-02-23T12:37:06Z" + } + }, + { + "name": "release-0.5.15", + "target": { + "committedDate": "2007-03-19T13:44:24Z" + } + }, + { + "name": "release-0.5.16", + "target": { + "committedDate": "2007-03-26T14:32:00Z" + } + }, + { + "name": "release-0.5.17", + "target": { + "committedDate": "2007-04-02T10:44:44Z" + } + }, + { + "name": "release-0.5.18", + "target": { + "committedDate": "2007-04-19T18:16:53Z" + } + }, + { + "name": "release-0.5.19", + "target": { + "committedDate": "2007-04-24T06:20:59Z" + } + }, + { + "name": "release-0.5.20", + "target": { + "committedDate": "2007-05-07T14:24:25Z" + } + }, + { + "name": "release-0.5.21", + "target": { + "committedDate": "2007-05-28T14:32:02Z" + } + }, + { + "name": "release-0.5.22", + "target": { + "committedDate": "2007-05-29T12:07:48Z" + } + }, + { + "name": "release-0.5.23", + "target": { + "committedDate": "2007-06-04T13:57:56Z" + } + }, + { + "name": "release-0.5.24", + "target": { + "committedDate": "2007-06-06T06:05:05Z" + } + }, + { + "name": "release-0.5.25", + "target": { + "committedDate": "2007-06-11T18:42:55Z" + } + }, + { + "name": "release-0.5.26", + "target": { + "committedDate": "2007-06-17T19:07:55Z" + } + }, + { + "name": "release-0.5.27", + "target": { + "committedDate": "2007-07-09T06:53:54Z" + } + }, + { + "name": "release-0.5.28", + "target": { + "committedDate": "2007-07-17T10:01:17Z" + } + }, + { + "name": "release-0.5.29", + "target": { + "committedDate": "2007-07-23T07:58:59Z" + } + }, + { + "name": "release-0.5.30", + "target": { + "committedDate": "2007-07-30T09:14:34Z" + } + }, + { + "name": "release-0.5.31", + "target": { + "committedDate": "2007-08-15T12:47:26Z" + } + }, + { + "name": "release-0.5.32", + "target": { + "committedDate": "2007-09-24T04:11:20Z" + } + }, + { + "name": "release-0.5.33", + "target": { + "committedDate": "2007-11-07T14:31:56Z" + } + }, + { + "name": "release-0.5.34", + "target": { + "committedDate": "2007-12-13T10:49:26Z" + } + }, + { + "name": "release-0.5.35", + "target": { + "committedDate": "2008-01-08T17:42:10Z" + } + }, + { + "name": "release-0.5.36", + "target": { + "committedDate": "2008-05-04T11:17:13Z" + } + }, + { + "name": "release-0.5.37", + "target": { + "committedDate": "2008-07-07T12:09:02Z" + } + }, + { + "name": "release-0.5.38", + "target": { + "committedDate": "2009-09-14T13:17:16Z" + } + }, + { + "name": "release-0.6.0", + "target": { + "committedDate": "2007-06-14T05:41:42Z" + } + }, + { + "name": "release-0.6.1", + "target": { + "committedDate": "2007-06-17T19:13:33Z" + } + }, + { + "name": "release-0.6.2", + "target": { + "committedDate": "2007-07-09T06:54:47Z" + } + }, + { + "name": "release-0.6.3", + "target": { + "committedDate": "2007-07-12T11:21:56Z" + } + }, + { + "name": "release-0.6.4", + "target": { + "committedDate": "2007-07-17T09:57:37Z" + } + }, + { + "name": "release-0.6.5", + "target": { + "committedDate": "2007-07-23T07:57:08Z" + } + }, + { + "name": "release-0.6.6", + "target": { + "committedDate": "2007-07-30T09:13:17Z" + } + }, + { + "name": "release-0.6.7", + "target": { + "committedDate": "2007-08-15T12:44:26Z" + } + }, + { + "name": "release-0.6.8", + "target": { + "committedDate": "2007-08-20T13:05:32Z" + } + }, + { + "name": "release-0.6.9", + "target": { + "committedDate": "2007-08-28T16:22:48Z" + } + }, + { + "name": "release-0.6.10", + "target": { + "committedDate": "2007-09-03T10:29:59Z" + } + }, + { + "name": "release-0.6.11", + "target": { + "committedDate": "2007-09-11T13:15:48Z" + } + }, + { + "name": "release-0.6.12", + "target": { + "committedDate": "2007-09-21T14:36:10Z" + } + }, + { + "name": "release-0.6.13", + "target": { + "committedDate": "2007-09-24T04:10:01Z" + } + }, + { + "name": "release-0.6.14", + "target": { + "committedDate": "2007-10-15T11:24:11Z" + } + }, + { + "name": "release-0.6.15", + "target": { + "committedDate": "2007-10-22T11:16:55Z" + } + }, + { + "name": "release-0.6.16", + "target": { + "committedDate": "2007-10-29T13:41:41Z" + } + }, + { + "name": "release-0.6.17", + "target": { + "committedDate": "2007-11-15T15:04:22Z" + } + }, + { + "name": "release-0.6.18", + "target": { + "committedDate": "2007-11-27T16:20:11Z" + } + }, + { + "name": "release-0.6.19", + "target": { + "committedDate": "2007-11-27T16:53:14Z" + } + }, + { + "name": "release-0.6.20", + "target": { + "committedDate": "2007-11-28T19:13:23Z" + } + }, + { + "name": "release-0.6.21", + "target": { + "committedDate": "2007-12-03T17:18:48Z" + } + }, + { + "name": "release-0.6.22", + "target": { + "committedDate": "2007-12-19T16:44:38Z" + } + }, + { + "name": "release-0.6.23", + "target": { + "committedDate": "2007-12-27T14:59:57Z" + } + }, + { + "name": "release-0.6.24", + "target": { + "committedDate": "2007-12-27T18:43:53Z" + } + }, + { + "name": "release-0.6.25", + "target": { + "committedDate": "2008-01-08T12:31:35Z" + } + }, + { + "name": "release-0.6.26", + "target": { + "committedDate": "2008-02-11T15:22:25Z" + } + }, + { + "name": "release-0.6.27", + "target": { + "committedDate": "2008-03-12T13:27:10Z" + } + }, + { + "name": "release-0.6.28", + "target": { + "committedDate": "2008-03-13T06:10:32Z" + } + }, + { + "name": "release-0.6.29", + "target": { + "committedDate": "2008-03-18T14:11:55Z" + } + }, + { + "name": "release-0.6.30", + "target": { + "committedDate": "2008-04-29T12:36:39Z" + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-2.json b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-2.json new file mode 100644 index 000000000..ead9c4f73 --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-2.json @@ -0,0 +1,615 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 547, + "pageInfo": { + "endCursor": "MzAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "release-0.6.31", + "target": { + "committedDate": "2008-05-12T09:48:43Z" + } + }, + { + "name": "release-0.6.32", + "target": { + "committedDate": "2008-07-07T11:44:11Z" + } + }, + { + "name": "release-0.6.33", + "target": { + "committedDate": "2008-11-20T17:26:44Z" + } + }, + { + "name": "release-0.6.34", + "target": { + "committedDate": "2008-11-27T15:32:51Z" + } + }, + { + "name": "release-0.6.35", + "target": { + "committedDate": "2009-01-26T15:31:47Z" + } + }, + { + "name": "release-0.6.36", + "target": { + "committedDate": "2009-04-02T06:48:50Z" + } + }, + { + "name": "release-0.6.37", + "target": { + "committedDate": "2009-05-18T16:29:57Z" + } + }, + { + "name": "release-0.6.38", + "target": { + "committedDate": "2009-06-22T10:11:55Z" + } + }, + { + "name": "release-0.6.39", + "target": { + "committedDate": "2009-09-14T13:13:21Z" + } + }, + { + "name": "release-0.7.0", + "target": { + "committedDate": "2008-05-19T10:34:41Z" + } + }, + { + "name": "release-0.7.1", + "target": { + "committedDate": "2008-05-26T09:32:30Z" + } + }, + { + "name": "release-0.7.2", + "target": { + "committedDate": "2008-06-16T09:04:22Z" + } + }, + { + "name": "release-0.7.3", + "target": { + "committedDate": "2008-06-23T10:34:57Z" + } + }, + { + "name": "release-0.7.4", + "target": { + "committedDate": "2008-06-30T12:38:49Z" + } + }, + { + "name": "release-0.7.5", + "target": { + "committedDate": "2008-07-01T07:22:00Z" + } + }, + { + "name": "release-0.7.6", + "target": { + "committedDate": "2008-07-07T09:43:21Z" + } + }, + { + "name": "release-0.7.7", + "target": { + "committedDate": "2008-07-30T12:55:03Z" + } + }, + { + "name": "release-0.7.8", + "target": { + "committedDate": "2008-08-04T15:46:34Z" + } + }, + { + "name": "release-0.7.9", + "target": { + "committedDate": "2008-08-12T15:34:08Z" + } + }, + { + "name": "release-0.7.10", + "target": { + "committedDate": "2008-08-13T16:53:31Z" + } + }, + { + "name": "release-0.7.11", + "target": { + "committedDate": "2008-08-18T14:22:50Z" + } + }, + { + "name": "release-0.7.12", + "target": { + "committedDate": "2008-08-26T16:13:43Z" + } + }, + { + "name": "release-0.7.13", + "target": { + "committedDate": "2008-08-26T17:19:07Z" + } + }, + { + "name": "release-0.7.14", + "target": { + "committedDate": "2008-09-01T15:31:56Z" + } + }, + { + "name": "release-0.7.15", + "target": { + "committedDate": "2008-09-08T08:36:22Z" + } + }, + { + "name": "release-0.7.16", + "target": { + "committedDate": "2008-09-08T09:42:41Z" + } + }, + { + "name": "release-0.7.17", + "target": { + "committedDate": "2008-09-15T16:59:30Z" + } + }, + { + "name": "release-0.7.18", + "target": { + "committedDate": "2008-10-13T13:18:28Z" + } + }, + { + "name": "release-0.7.19", + "target": { + "committedDate": "2008-10-13T15:16:11Z" + } + }, + { + "name": "release-0.7.20", + "target": { + "committedDate": "2008-11-10T16:30:45Z" + } + }, + { + "name": "release-0.7.21", + "target": { + "committedDate": "2008-11-11T20:04:58Z" + } + }, + { + "name": "release-0.7.22", + "target": { + "committedDate": "2008-11-20T16:47:36Z" + } + }, + { + "name": "release-0.7.23", + "target": { + "committedDate": "2008-11-27T13:05:34Z" + } + }, + { + "name": "release-0.7.24", + "target": { + "committedDate": "2008-12-01T14:54:42Z" + } + }, + { + "name": "release-0.7.25", + "target": { + "committedDate": "2008-12-08T14:43:16Z" + } + }, + { + "name": "release-0.7.26", + "target": { + "committedDate": "2008-12-08T18:32:42Z" + } + }, + { + "name": "release-0.7.27", + "target": { + "committedDate": "2008-12-15T11:30:08Z" + } + }, + { + "name": "release-0.7.28", + "target": { + "committedDate": "2008-12-22T13:06:23Z" + } + }, + { + "name": "release-0.7.29", + "target": { + "committedDate": "2008-12-24T12:50:21Z" + } + }, + { + "name": "release-0.7.30", + "target": { + "committedDate": "2008-12-24T16:21:40Z" + } + }, + { + "name": "release-0.7.31", + "target": { + "committedDate": "2009-01-19T13:57:01Z" + } + }, + { + "name": "release-0.7.32", + "target": { + "committedDate": "2009-01-26T14:41:26Z" + } + }, + { + "name": "release-0.7.33", + "target": { + "committedDate": "2009-02-02T11:00:11Z" + } + }, + { + "name": "release-0.7.34", + "target": { + "committedDate": "2009-02-10T16:50:28Z" + } + }, + { + "name": "release-0.7.35", + "target": { + "committedDate": "2009-02-16T13:58:43Z" + } + }, + { + "name": "release-0.7.36", + "target": { + "committedDate": "2009-02-21T07:26:17Z" + } + }, + { + "name": "release-0.7.37", + "target": { + "committedDate": "2009-02-21T14:42:38Z" + } + }, + { + "name": "release-0.7.38", + "target": { + "committedDate": "2009-02-23T16:01:23Z" + } + }, + { + "name": "release-0.7.39", + "target": { + "committedDate": "2009-03-02T12:43:09Z" + } + }, + { + "name": "release-0.7.40", + "target": { + "committedDate": "2009-03-09T08:54:23Z" + } + }, + { + "name": "release-0.7.41", + "target": { + "committedDate": "2009-03-11T13:16:09Z" + } + }, + { + "name": "release-0.7.42", + "target": { + "committedDate": "2009-03-16T07:23:09Z" + } + }, + { + "name": "release-0.7.43", + "target": { + "committedDate": "2009-03-18T12:46:23Z" + } + }, + { + "name": "release-0.7.44", + "target": { + "committedDate": "2009-03-23T13:27:39Z" + } + }, + { + "name": "release-0.7.45", + "target": { + "committedDate": "2009-03-30T08:32:56Z" + } + }, + { + "name": "release-0.7.46", + "target": { + "committedDate": "2009-03-30T11:02:56Z" + } + }, + { + "name": "release-0.7.47", + "target": { + "committedDate": "2009-04-01T13:20:34Z" + } + }, + { + "name": "release-0.7.48", + "target": { + "committedDate": "2009-04-06T10:15:22Z" + } + }, + { + "name": "release-0.7.49", + "target": { + "committedDate": "2009-04-06T10:42:53Z" + } + }, + { + "name": "release-0.7.50", + "target": { + "committedDate": "2009-04-06T11:44:34Z" + } + }, + { + "name": "release-0.7.51", + "target": { + "committedDate": "2009-04-12T09:35:25Z" + } + }, + { + "name": "release-0.7.52", + "target": { + "committedDate": "2009-04-20T06:16:19Z" + } + }, + { + "name": "release-0.7.53", + "target": { + "committedDate": "2009-04-27T12:02:01Z" + } + }, + { + "name": "release-0.7.54", + "target": { + "committedDate": "2009-05-01T18:52:58Z" + } + }, + { + "name": "release-0.7.55", + "target": { + "committedDate": "2009-05-06T09:28:57Z" + } + }, + { + "name": "release-0.7.56", + "target": { + "committedDate": "2009-05-11T13:42:26Z" + } + }, + { + "name": "release-0.7.57", + "target": { + "committedDate": "2009-05-12T12:11:50Z" + } + }, + { + "name": "release-0.7.58", + "target": { + "committedDate": "2009-05-18T13:14:17Z" + } + }, + { + "name": "release-0.7.59", + "target": { + "committedDate": "2009-05-25T10:00:08Z" + } + }, + { + "name": "release-0.7.60", + "target": { + "committedDate": "2009-06-15T09:55:51Z" + } + }, + { + "name": "release-0.7.61", + "target": { + "committedDate": "2009-06-22T09:37:07Z" + } + }, + { + "name": "release-0.7.62", + "target": { + "committedDate": "2009-09-14T13:09:54Z" + } + }, + { + "name": "release-0.7.63", + "target": { + "committedDate": "2009-10-26T17:57:36Z" + } + }, + { + "name": "release-0.7.64", + "target": { + "committedDate": "2009-11-16T15:29:46Z" + } + }, + { + "name": "release-0.7.65", + "target": { + "committedDate": "2010-02-01T16:09:15Z" + } + }, + { + "name": "release-0.7.66", + "target": { + "committedDate": "2010-06-07T12:41:31Z" + } + }, + { + "name": "release-0.7.67", + "target": { + "committedDate": "2010-06-15T09:55:00Z" + } + }, + { + "name": "release-0.7.68", + "target": { + "committedDate": "2010-12-14T19:48:03Z" + } + }, + { + "name": "release-0.7.69", + "target": { + "committedDate": "2011-07-19T14:20:25Z" + } + }, + { + "name": "release-0.8.0", + "target": { + "committedDate": "2009-06-02T16:22:26Z" + } + }, + { + "name": "release-0.8.1", + "target": { + "committedDate": "2009-06-08T12:55:49Z" + } + }, + { + "name": "release-0.8.2", + "target": { + "committedDate": "2009-06-15T08:15:11Z" + } + }, + { + "name": "release-0.8.3", + "target": { + "committedDate": "2009-06-19T10:56:35Z" + } + }, + { + "name": "release-0.8.4", + "target": { + "committedDate": "2009-06-22T09:17:24Z" + } + }, + { + "name": "release-0.8.5", + "target": { + "committedDate": "2009-07-13T11:47:59Z" + } + }, + { + "name": "release-0.8.6", + "target": { + "committedDate": "2009-07-20T08:24:31Z" + } + }, + { + "name": "release-0.8.7", + "target": { + "committedDate": "2009-07-27T15:24:01Z" + } + }, + { + "name": "release-0.8.8", + "target": { + "committedDate": "2009-08-10T08:26:27Z" + } + }, + { + "name": "release-0.8.9", + "target": { + "committedDate": "2009-08-17T17:59:56Z" + } + }, + { + "name": "release-0.8.10", + "target": { + "committedDate": "2009-08-24T11:10:36Z" + } + }, + { + "name": "release-0.8.11", + "target": { + "committedDate": "2009-08-28T13:21:06Z" + } + }, + { + "name": "release-0.8.12", + "target": { + "committedDate": "2009-08-31T11:32:16Z" + } + }, + { + "name": "release-0.8.13", + "target": { + "committedDate": "2009-08-31T15:02:36Z" + } + }, + { + "name": "release-0.8.14", + "target": { + "committedDate": "2009-09-07T08:25:45Z" + } + }, + { + "name": "release-0.8.15", + "target": { + "committedDate": "2009-09-14T13:07:17Z" + } + }, + { + "name": "release-0.8.16", + "target": { + "committedDate": "2009-09-22T14:35:21Z" + } + }, + { + "name": "release-0.8.17", + "target": { + "committedDate": "2009-09-28T13:08:09Z" + } + }, + { + "name": "release-0.8.18", + "target": { + "committedDate": "2009-10-06T12:44:50Z" + } + }, + { + "name": "release-0.8.19", + "target": { + "committedDate": "2009-10-06T16:19:42Z" + } + }, + { + "name": "release-0.8.20", + "target": { + "committedDate": "2009-10-14T12:57:25Z" + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-3.json b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-3.json new file mode 100644 index 000000000..611ea9d5a --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-3.json @@ -0,0 +1,615 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 547, + "pageInfo": { + "endCursor": "NDAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "release-0.8.21", + "target": { + "committedDate": "2009-10-26T14:09:25Z" + } + }, + { + "name": "release-0.8.22", + "target": { + "committedDate": "2009-11-03T18:52:37Z" + } + }, + { + "name": "release-0.8.23", + "target": { + "committedDate": "2009-11-11T11:05:22Z" + } + }, + { + "name": "release-0.8.24", + "target": { + "committedDate": "2009-11-11T14:53:17Z" + } + }, + { + "name": "release-0.8.25", + "target": { + "committedDate": "2009-11-16T13:47:10Z" + } + }, + { + "name": "release-0.8.26", + "target": { + "committedDate": "2009-11-16T19:25:37Z" + } + }, + { + "name": "release-0.8.27", + "target": { + "committedDate": "2009-11-17T16:53:17Z" + } + }, + { + "name": "release-0.8.28", + "target": { + "committedDate": "2009-11-23T15:53:12Z" + } + }, + { + "name": "release-0.8.29", + "target": { + "committedDate": "2009-11-30T13:28:12Z" + } + }, + { + "name": "release-0.8.30", + "target": { + "committedDate": "2009-12-15T14:34:09Z" + } + }, + { + "name": "release-0.8.31", + "target": { + "committedDate": "2009-12-23T15:44:31Z" + } + }, + { + "name": "release-0.8.32", + "target": { + "committedDate": "2010-01-11T15:35:44Z" + } + }, + { + "name": "release-0.8.33", + "target": { + "committedDate": "2010-02-01T13:36:31Z" + } + }, + { + "name": "release-0.8.34", + "target": { + "committedDate": "2010-03-03T17:00:09Z" + } + }, + { + "name": "release-0.8.35", + "target": { + "committedDate": "2010-04-01T15:44:11Z" + } + }, + { + "name": "release-0.8.36", + "target": { + "committedDate": "2010-04-22T17:37:21Z" + } + }, + { + "name": "release-0.8.37", + "target": { + "committedDate": "2010-05-17T06:08:52Z" + } + }, + { + "name": "release-0.8.38", + "target": { + "committedDate": "2010-05-24T12:47:49Z" + } + }, + { + "name": "release-0.8.39", + "target": { + "committedDate": "2010-05-31T15:10:04Z" + } + }, + { + "name": "release-0.8.40", + "target": { + "committedDate": "2010-06-07T12:38:32Z" + } + }, + { + "name": "release-0.8.41", + "target": { + "committedDate": "2010-06-15T09:45:06Z" + } + }, + { + "name": "release-0.8.42", + "target": { + "committedDate": "2010-06-21T10:16:24Z" + } + }, + { + "name": "release-0.8.43", + "target": { + "committedDate": "2010-06-30T15:11:43Z" + } + }, + { + "name": "release-0.8.44", + "target": { + "committedDate": "2010-07-05T15:23:55Z" + } + }, + { + "name": "release-0.8.45", + "target": { + "committedDate": "2010-07-13T11:59:36Z" + } + }, + { + "name": "release-0.8.46", + "target": { + "committedDate": "2010-07-19T11:31:30Z" + } + }, + { + "name": "release-0.8.47", + "target": { + "committedDate": "2010-07-28T16:16:48Z" + } + }, + { + "name": "release-0.8.48", + "target": { + "committedDate": "2010-08-03T15:10:56Z" + } + }, + { + "name": "release-0.8.49", + "target": { + "committedDate": "2010-08-09T08:24:13Z" + } + }, + { + "name": "release-0.8.50", + "target": { + "committedDate": "2010-09-02T14:59:18Z" + } + }, + { + "name": "release-0.8.51", + "target": { + "committedDate": "2010-09-27T13:08:40Z" + } + }, + { + "name": "release-0.8.52", + "target": { + "committedDate": "2010-09-28T06:59:58Z" + } + }, + { + "name": "release-0.8.53", + "target": { + "committedDate": "2010-10-18T12:03:26Z" + } + }, + { + "name": "release-0.8.54", + "target": { + "committedDate": "2010-12-14T10:55:48Z" + } + }, + { + "name": "release-0.8.55", + "target": { + "committedDate": "2011-07-19T13:59:47Z" + } + }, + { + "name": "release-0.9.0", + "target": { + "committedDate": "2010-11-29T15:29:31Z" + } + }, + { + "name": "release-0.9.1", + "target": { + "committedDate": "2010-11-30T13:10:32Z" + } + }, + { + "name": "release-0.9.2", + "target": { + "committedDate": "2010-12-06T11:36:30Z" + } + }, + { + "name": "release-0.9.3", + "target": { + "committedDate": "2010-12-13T11:05:52Z" + } + }, + { + "name": "release-0.9.4", + "target": { + "committedDate": "2011-01-21T11:04:39Z" + } + }, + { + "name": "release-0.9.5", + "target": { + "committedDate": "2011-02-21T09:43:57Z" + } + }, + { + "name": "release-0.9.6", + "target": { + "committedDate": "2011-03-21T15:33:26Z" + } + }, + { + "name": "release-0.9.7", + "target": { + "committedDate": "2011-04-04T12:50:22Z" + } + }, + { + "name": "release-1.0.0", + "target": { + "committedDate": "2011-04-12T09:04:32Z" + } + }, + { + "name": "release-1.0.1", + "target": { + "committedDate": "2011-05-03T12:12:04Z" + } + }, + { + "name": "release-1.0.2", + "target": { + "committedDate": "2011-05-10T12:27:52Z" + } + }, + { + "name": "release-1.0.3", + "target": { + "committedDate": "2011-05-25T14:50:50Z" + } + }, + { + "name": "release-1.0.4", + "target": { + "committedDate": "2011-06-01T09:29:58Z" + } + }, + { + "name": "release-1.0.5", + "target": { + "committedDate": "2011-07-19T13:38:37Z" + } + }, + { + "name": "release-1.0.6", + "target": { + "committedDate": "2011-08-29T14:28:23Z" + } + }, + { + "name": "release-1.0.7", + "target": { + "committedDate": "2011-09-30T15:35:23Z" + } + }, + { + "name": "release-1.0.8", + "target": { + "committedDate": "2011-10-01T06:00:42Z" + } + }, + { + "name": "release-1.0.9", + "target": { + "committedDate": "2011-11-01T14:51:19Z" + } + }, + { + "name": "release-1.0.10", + "target": { + "committedDate": "2011-11-15T08:24:03Z" + } + }, + { + "name": "release-1.0.11", + "target": { + "committedDate": "2011-12-15T14:04:39Z" + } + }, + { + "name": "release-1.0.12", + "target": { + "committedDate": "2012-02-06T14:08:59Z" + } + }, + { + "name": "release-1.0.13", + "target": { + "committedDate": "2012-03-05T15:19:49Z" + } + }, + { + "name": "release-1.0.14", + "target": { + "committedDate": "2012-03-15T11:50:53Z" + } + }, + { + "name": "release-1.0.15", + "target": { + "committedDate": "2012-04-12T13:00:53Z" + } + }, + { + "name": "release-1.1.0", + "target": { + "committedDate": "2011-08-01T14:47:40Z" + } + }, + { + "name": "release-1.1.1", + "target": { + "committedDate": "2011-08-22T13:56:08Z" + } + }, + { + "name": "release-1.1.2", + "target": { + "committedDate": "2011-09-05T13:14:27Z" + } + }, + { + "name": "release-1.1.3", + "target": { + "committedDate": "2011-09-14T15:00:43Z" + } + }, + { + "name": "release-1.1.4", + "target": { + "committedDate": "2011-09-20T11:18:24Z" + } + }, + { + "name": "release-1.1.5", + "target": { + "committedDate": "2011-10-05T14:44:11Z" + } + }, + { + "name": "release-1.1.6", + "target": { + "committedDate": "2011-10-17T15:10:23Z" + } + }, + { + "name": "release-1.1.7", + "target": { + "committedDate": "2011-10-31T14:52:46Z" + } + }, + { + "name": "release-1.1.8", + "target": { + "committedDate": "2011-11-14T15:37:54Z" + } + }, + { + "name": "release-1.1.9", + "target": { + "committedDate": "2011-11-28T15:02:38Z" + } + }, + { + "name": "release-1.1.10", + "target": { + "committedDate": "2011-11-30T10:00:50Z" + } + }, + { + "name": "release-1.1.11", + "target": { + "committedDate": "2011-12-12T14:17:49Z" + } + }, + { + "name": "release-1.1.12", + "target": { + "committedDate": "2011-12-26T15:05:17Z" + } + }, + { + "name": "release-1.1.13", + "target": { + "committedDate": "2012-01-16T15:14:37Z" + } + }, + { + "name": "release-1.1.14", + "target": { + "committedDate": "2012-01-30T13:52:10Z" + } + }, + { + "name": "release-1.1.15", + "target": { + "committedDate": "2012-02-15T13:26:06Z" + } + }, + { + "name": "release-1.1.16", + "target": { + "committedDate": "2012-02-29T13:45:18Z" + } + }, + { + "name": "release-1.1.17", + "target": { + "committedDate": "2012-03-15T11:32:18Z" + } + }, + { + "name": "release-1.1.18", + "target": { + "committedDate": "2012-03-28T13:29:29Z" + } + }, + { + "name": "release-1.1.19", + "target": { + "committedDate": "2012-04-12T12:42:46Z" + } + }, + { + "name": "release-1.2.0", + "target": { + "committedDate": "2012-04-23T13:06:47Z" + } + }, + { + "name": "release-1.2.2", + "target": { + "committedDate": "2012-07-03T10:48:31Z" + } + }, + { + "name": "release-1.2.3", + "target": { + "committedDate": "2012-08-07T12:35:56Z" + } + }, + { + "name": "release-1.2.4", + "target": { + "committedDate": "2012-09-25T13:42:43Z" + } + }, + { + "name": "release-1.2.5", + "target": { + "committedDate": "2012-11-13T13:34:59Z" + } + }, + { + "name": "release-1.2.6", + "target": { + "committedDate": "2012-12-11T14:24:23Z" + } + }, + { + "name": "release-1.2.7", + "target": { + "committedDate": "2013-02-12T13:40:16Z" + } + }, + { + "name": "release-1.2.8", + "target": { + "committedDate": "2013-04-02T12:34:21Z" + } + }, + { + "name": "release-1.2.9", + "target": { + "committedDate": "2013-05-13T10:41:51Z" + } + }, + { + "name": "release-1.3.0", + "target": { + "committedDate": "2012-05-15T14:23:49Z" + } + }, + { + "name": "release-1.3.1", + "target": { + "committedDate": "2012-06-05T13:47:29Z" + } + }, + { + "name": "release-1.3.2", + "target": { + "committedDate": "2012-06-26T13:46:23Z" + } + }, + { + "name": "release-1.3.3", + "target": { + "committedDate": "2012-07-10T12:20:10Z" + } + }, + { + "name": "release-1.3.4", + "target": { + "committedDate": "2012-07-31T12:38:37Z" + } + }, + { + "name": "release-1.3.5", + "target": { + "committedDate": "2012-08-21T13:05:02Z" + } + }, + { + "name": "release-1.3.6", + "target": { + "committedDate": "2012-09-12T10:41:36Z" + } + }, + { + "name": "release-1.3.7", + "target": { + "committedDate": "2012-10-02T13:33:37Z" + } + }, + { + "name": "release-1.3.8", + "target": { + "committedDate": "2012-10-30T13:34:23Z" + } + }, + { + "name": "release-1.3.9", + "target": { + "committedDate": "2012-11-27T13:55:34Z" + } + }, + { + "name": "release-1.3.10", + "target": { + "committedDate": "2012-12-25T14:23:45Z" + } + }, + { + "name": "release-1.3.11", + "target": { + "committedDate": "2013-01-10T13:17:04Z" + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-4.json b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-4.json new file mode 100644 index 000000000..881c83a01 --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-4.json @@ -0,0 +1,615 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 547, + "pageInfo": { + "endCursor": "NTAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "release-1.3.12", + "target": { + "committedDate": "2013-02-05T14:06:41Z" + } + }, + { + "name": "release-1.3.13", + "target": { + "committedDate": "2013-02-19T15:14:48Z" + } + }, + { + "name": "release-1.3.14", + "target": { + "committedDate": "2013-03-05T14:35:58Z" + } + }, + { + "name": "release-1.3.15", + "target": { + "committedDate": "2013-03-26T13:03:02Z" + } + }, + { + "name": "release-1.3.16", + "target": { + "committedDate": "2013-04-16T14:05:11Z" + } + }, + { + "name": "release-1.4.0", + "target": { + "committedDate": "2013-04-24T13:59:34Z" + } + }, + { + "name": "release-1.4.1", + "target": { + "committedDate": "2013-05-06T10:20:27Z" + } + }, + { + "name": "release-1.4.2", + "target": { + "committedDate": "2013-07-17T12:51:21Z" + } + }, + { + "name": "release-1.4.3", + "target": { + "committedDate": "2013-10-08T12:07:13Z" + } + }, + { + "name": "release-1.4.4", + "target": { + "committedDate": "2013-11-19T11:25:24Z" + } + }, + { + "name": "release-1.4.5", + "target": { + "committedDate": "2014-02-11T13:24:43Z" + } + }, + { + "name": "release-1.4.6", + "target": { + "committedDate": "2014-03-04T11:46:44Z" + } + }, + { + "name": "release-1.4.7", + "target": { + "committedDate": "2014-03-18T13:17:09Z" + } + }, + { + "name": "release-1.5.0", + "target": { + "committedDate": "2013-05-06T09:52:36Z" + } + }, + { + "name": "release-1.5.1", + "target": { + "committedDate": "2013-06-04T13:21:52Z" + } + }, + { + "name": "release-1.5.2", + "target": { + "committedDate": "2013-07-02T12:28:50Z" + } + }, + { + "name": "release-1.5.3", + "target": { + "committedDate": "2013-07-30T13:27:55Z" + } + }, + { + "name": "release-1.5.4", + "target": { + "committedDate": "2013-08-27T13:37:15Z" + } + }, + { + "name": "release-1.5.5", + "target": { + "committedDate": "2013-09-17T13:31:00Z" + } + }, + { + "name": "release-1.5.6", + "target": { + "committedDate": "2013-10-01T13:44:51Z" + } + }, + { + "name": "release-1.5.7", + "target": { + "committedDate": "2013-11-19T10:03:47Z" + } + }, + { + "name": "release-1.5.8", + "target": { + "committedDate": "2013-12-17T13:46:26Z" + } + }, + { + "name": "release-1.5.9", + "target": { + "committedDate": "2014-01-22T13:42:59Z" + } + }, + { + "name": "release-1.5.10", + "target": { + "committedDate": "2014-02-04T12:26:46Z" + } + }, + { + "name": "release-1.5.11", + "target": { + "committedDate": "2014-03-04T11:39:23Z" + } + }, + { + "name": "release-1.5.12", + "target": { + "committedDate": "2014-03-18T13:08:35Z" + } + }, + { + "name": "release-1.5.13", + "target": { + "committedDate": "2014-04-08T14:15:21Z" + } + }, + { + "name": "release-1.6.0", + "target": { + "committedDate": "2014-04-24T12:52:24Z" + } + }, + { + "name": "release-1.6.1", + "target": { + "committedDate": "2014-08-05T11:18:34Z" + } + }, + { + "name": "release-1.6.2", + "target": { + "committedDate": "2014-09-16T12:23:18Z" + } + }, + { + "name": "release-1.6.3", + "target": { + "committedDate": "2015-04-07T15:51:37Z" + } + }, + { + "name": "release-1.7.0", + "target": { + "committedDate": "2014-04-24T12:54:22Z" + } + }, + { + "name": "release-1.7.1", + "target": { + "committedDate": "2014-05-27T13:58:08Z" + } + }, + { + "name": "release-1.7.2", + "target": { + "committedDate": "2014-06-17T12:51:25Z" + } + }, + { + "name": "release-1.7.3", + "target": { + "committedDate": "2014-07-08T13:22:38Z" + } + }, + { + "name": "release-1.7.4", + "target": { + "committedDate": "2014-08-05T11:13:04Z" + } + }, + { + "name": "release-1.7.5", + "target": { + "committedDate": "2014-09-16T12:19:03Z" + } + }, + { + "name": "release-1.7.6", + "target": { + "committedDate": "2014-09-30T13:20:32Z" + } + }, + { + "name": "release-1.7.7", + "target": { + "committedDate": "2014-10-28T15:04:46Z" + } + }, + { + "name": "release-1.7.8", + "target": { + "committedDate": "2014-12-02T13:02:14Z" + } + }, + { + "name": "release-1.7.9", + "target": { + "committedDate": "2014-12-23T15:28:37Z" + } + }, + { + "name": "release-1.7.10", + "target": { + "committedDate": "2015-02-10T14:33:32Z" + } + }, + { + "name": "release-1.7.11", + "target": { + "committedDate": "2015-03-24T15:45:34Z" + } + }, + { + "name": "release-1.7.12", + "target": { + "committedDate": "2015-04-07T15:35:33Z" + } + }, + { + "name": "release-1.8.0", + "target": { + "committedDate": "2015-04-21T14:11:58Z" + } + }, + { + "name": "release-1.8.1", + "target": { + "committedDate": "2016-01-26T14:39:30Z" + } + }, + { + "name": "release-1.9.0", + "target": { + "committedDate": "2015-04-28T15:31:17Z" + } + }, + { + "name": "release-1.9.1", + "target": { + "committedDate": "2015-05-26T13:49:50Z" + } + }, + { + "name": "release-1.9.2", + "target": { + "committedDate": "2015-06-16T14:49:39Z" + } + }, + { + "name": "release-1.9.3", + "target": { + "committedDate": "2015-07-14T16:46:05Z" + } + }, + { + "name": "release-1.9.4", + "target": { + "committedDate": "2015-08-18T15:16:17Z" + } + }, + { + "name": "release-1.9.5", + "target": { + "committedDate": "2015-09-22T14:36:21Z" + } + }, + { + "name": "release-1.9.6", + "target": { + "committedDate": "2015-10-27T13:47:29Z" + } + }, + { + "name": "release-1.9.7", + "target": { + "committedDate": "2015-11-17T14:50:56Z" + } + }, + { + "name": "release-1.9.8", + "target": { + "committedDate": "2015-12-08T15:16:51Z" + } + }, + { + "name": "release-1.9.9", + "target": { + "committedDate": "2015-12-09T14:47:20Z" + } + }, + { + "name": "release-1.9.10", + "target": { + "committedDate": "2016-01-26T14:27:40Z" + } + }, + { + "name": "release-1.9.11", + "target": { + "committedDate": "2016-02-09T14:11:56Z" + } + }, + { + "name": "release-1.9.12", + "target": { + "committedDate": "2016-02-24T14:53:22Z" + } + }, + { + "name": "release-1.9.13", + "target": { + "committedDate": "2016-03-29T15:09:30Z" + } + }, + { + "name": "release-1.9.14", + "target": { + "committedDate": "2016-04-05T14:57:08Z" + } + }, + { + "name": "release-1.9.15", + "target": { + "committedDate": "2016-04-19T16:02:37Z" + } + }, + { + "name": "release-1.10.0", + "target": { + "committedDate": "2016-04-26T13:31:18Z" + } + }, + { + "name": "release-1.10.1", + "target": { + "committedDate": "2016-05-31T13:47:01Z" + } + }, + { + "name": "release-1.10.2", + "target": { + "committedDate": "2016-10-18T15:03:12Z" + } + }, + { + "name": "release-1.10.3", + "target": { + "committedDate": "2017-01-31T15:01:10Z" + } + }, + { + "name": "release-1.11.0", + "target": { + "committedDate": "2016-05-24T15:54:41Z" + } + }, + { + "name": "release-1.11.1", + "target": { + "committedDate": "2016-05-31T13:43:49Z" + } + }, + { + "name": "release-1.11.2", + "target": { + "committedDate": "2016-07-05T15:56:14Z" + } + }, + { + "name": "release-1.11.3", + "target": { + "committedDate": "2016-07-26T13:58:58Z" + } + }, + { + "name": "release-1.11.4", + "target": { + "committedDate": "2016-09-13T15:39:23Z" + } + }, + { + "name": "release-1.11.5", + "target": { + "committedDate": "2016-10-11T15:03:00Z" + } + }, + { + "name": "release-1.11.6", + "target": { + "committedDate": "2016-11-15T15:11:46Z" + } + }, + { + "name": "release-1.11.7", + "target": { + "committedDate": "2016-12-13T15:21:23Z" + } + }, + { + "name": "release-1.11.8", + "target": { + "committedDate": "2016-12-27T14:23:07Z" + } + }, + { + "name": "release-1.11.9", + "target": { + "committedDate": "2017-01-24T14:02:18Z" + } + }, + { + "name": "release-1.11.10", + "target": { + "committedDate": "2017-02-14T15:36:04Z" + } + }, + { + "name": "release-1.11.11", + "target": { + "committedDate": "2017-03-21T15:04:22Z" + } + }, + { + "name": "release-1.11.12", + "target": { + "committedDate": "2017-03-24T15:05:05Z" + } + }, + { + "name": "release-1.11.13", + "target": { + "committedDate": "2017-04-04T15:01:57Z" + } + }, + { + "name": "release-1.12.0", + "target": { + "committedDate": "2017-04-12T14:46:00Z" + } + }, + { + "name": "release-1.12.1", + "target": { + "committedDate": "2017-07-11T13:24:04Z" + } + }, + { + "name": "release-1.12.2", + "target": { + "committedDate": "2017-10-17T13:16:37Z" + } + }, + { + "name": "release-1.13.0", + "target": { + "committedDate": "2017-04-25T14:18:21Z" + } + }, + { + "name": "release-1.13.1", + "target": { + "committedDate": "2017-05-30T14:55:22Z" + } + }, + { + "name": "release-1.13.2", + "target": { + "committedDate": "2017-06-27T14:44:17Z" + } + }, + { + "name": "release-1.13.3", + "target": { + "committedDate": "2017-07-11T13:18:30Z" + } + }, + { + "name": "release-1.13.4", + "target": { + "committedDate": "2017-08-08T15:00:11Z" + } + }, + { + "name": "release-1.13.5", + "target": { + "committedDate": "2017-09-05T14:59:31Z" + } + }, + { + "name": "release-1.13.6", + "target": { + "committedDate": "2017-10-10T15:22:50Z" + } + }, + { + "name": "release-1.13.7", + "target": { + "committedDate": "2017-11-21T15:09:43Z" + } + }, + { + "name": "release-1.13.8", + "target": { + "committedDate": "2017-12-26T16:01:11Z" + } + }, + { + "name": "release-1.13.9", + "target": { + "committedDate": "2018-02-20T14:08:48Z" + } + }, + { + "name": "release-1.13.10", + "target": { + "committedDate": "2018-03-20T15:58:30Z" + } + }, + { + "name": "release-1.13.11", + "target": { + "committedDate": "2018-04-03T14:38:09Z" + } + }, + { + "name": "release-1.13.12", + "target": { + "committedDate": "2018-04-10T14:11:09Z" + } + }, + { + "name": "release-1.14.0", + "target": { + "committedDate": "2018-04-17T15:22:35Z" + } + }, + { + "name": "release-1.14.1", + "target": { + "committedDate": "2018-11-06T13:52:46Z" + } + }, + { + "name": "release-1.14.2", + "target": { + "committedDate": "2018-12-04T14:52:24Z" + } + }, + { + "name": "release-1.15.0", + "target": { + "committedDate": "2018-06-05T13:47:25Z" + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-5.json b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-5.json new file mode 100644 index 000000000..04b994479 --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/improver/github-nginx-nginx-5.json @@ -0,0 +1,297 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 547, + "pageInfo": { + "endCursor": "NTQ3", + "hasNextPage": false + }, + "nodes": [ + { + "name": "release-1.15.1", + "target": { + "committedDate": "2018-07-03T15:07:43Z" + } + }, + { + "name": "release-1.15.2", + "target": { + "committedDate": "2018-07-24T13:10:59Z" + } + }, + { + "name": "release-1.15.3", + "target": { + "committedDate": "2018-08-28T15:36:00Z" + } + }, + { + "name": "release-1.15.4", + "target": { + "committedDate": "2018-09-25T15:11:39Z" + } + }, + { + "name": "release-1.15.5", + "target": { + "committedDate": "2018-10-02T15:13:51Z" + } + }, + { + "name": "release-1.15.6", + "target": { + "committedDate": "2018-11-06T13:32:08Z" + } + }, + { + "name": "release-1.15.7", + "target": { + "committedDate": "2018-11-27T14:40:20Z" + } + }, + { + "name": "release-1.15.8", + "target": { + "committedDate": "2018-12-25T14:53:03Z" + } + }, + { + "name": "release-1.15.9", + "target": { + "committedDate": "2019-02-26T15:29:22Z" + } + }, + { + "name": "release-1.15.10", + "target": { + "committedDate": "2019-03-26T14:06:54Z" + } + }, + { + "name": "release-1.15.11", + "target": { + "committedDate": "2019-04-09T13:00:30Z" + } + }, + { + "name": "release-1.15.12", + "target": { + "committedDate": "2019-04-16T14:54:58Z" + } + }, + { + "name": "release-1.16.0", + "target": { + "committedDate": "2019-04-23T13:12:57Z" + } + }, + { + "name": "release-1.16.1", + "target": { + "committedDate": "2019-08-13T12:51:42Z" + } + }, + { + "name": "release-1.17.0", + "target": { + "committedDate": "2019-05-21T14:23:57Z" + } + }, + { + "name": "release-1.17.1", + "target": { + "committedDate": "2019-06-25T12:19:45Z" + } + }, + { + "name": "release-1.17.2", + "target": { + "committedDate": "2019-07-23T12:01:47Z" + } + }, + { + "name": "release-1.17.3", + "target": { + "committedDate": "2019-08-13T12:45:56Z" + } + }, + { + "name": "release-1.17.4", + "target": { + "committedDate": "2019-09-24T15:08:48Z" + } + }, + { + "name": "release-1.17.5", + "target": { + "committedDate": "2019-10-22T15:16:08Z" + } + }, + { + "name": "release-1.17.6", + "target": { + "committedDate": "2019-11-19T14:18:58Z" + } + }, + { + "name": "release-1.17.7", + "target": { + "committedDate": "2019-12-24T15:00:09Z" + } + }, + { + "name": "release-1.17.8", + "target": { + "committedDate": "2020-01-21T13:39:41Z" + } + }, + { + "name": "release-1.17.9", + "target": { + "committedDate": "2020-03-03T15:04:21Z" + } + }, + { + "name": "release-1.17.10", + "target": { + "committedDate": "2020-04-14T14:19:26Z" + } + }, + { + "name": "release-1.18.0", + "target": { + "committedDate": "2020-04-21T14:09:01Z" + } + }, + { + "name": "release-1.19.0", + "target": { + "committedDate": "2020-05-26T15:00:20Z" + } + }, + { + "name": "release-1.19.1", + "target": { + "committedDate": "2020-07-07T15:56:05Z" + } + }, + { + "name": "release-1.19.2", + "target": { + "committedDate": "2020-08-11T14:52:30Z" + } + }, + { + "name": "release-1.19.3", + "target": { + "committedDate": "2020-09-29T14:32:10Z" + } + }, + { + "name": "release-1.19.4", + "target": { + "committedDate": "2020-10-27T15:09:20Z" + } + }, + { + "name": "release-1.19.5", + "target": { + "committedDate": "2020-11-24T15:06:34Z" + } + }, + { + "name": "release-1.19.6", + "target": { + "committedDate": "2020-12-15T14:41:39Z" + } + }, + { + "name": "release-1.19.7", + "target": { + "committedDate": "2021-02-16T15:57:18Z" + } + }, + { + "name": "release-1.19.8", + "target": { + "committedDate": "2021-03-09T15:27:50Z" + } + }, + { + "name": "release-1.19.9", + "target": { + "committedDate": "2021-03-30T14:47:11Z" + } + }, + { + "name": "release-1.19.10", + "target": { + "committedDate": "2021-04-13T15:13:58Z" + } + }, + { + "name": "release-1.20.0", + "target": { + "committedDate": "2021-04-20T13:35:46Z" + } + }, + { + "name": "release-1.20.1", + "target": { + "committedDate": "2021-05-25T12:35:38Z" + } + }, + { + "name": "release-1.20.2", + "target": { + "committedDate": "2021-11-16T14:44:02Z" + } + }, + { + "name": "release-1.21.0", + "target": { + "committedDate": "2021-05-25T12:28:55Z" + } + }, + { + "name": "release-1.21.1", + "target": { + "committedDate": "2021-07-06T14:59:16Z" + } + }, + { + "name": "release-1.21.2", + "target": { + "committedDate": "2021-08-31T15:13:46Z" + } + }, + { + "name": "release-1.21.3", + "target": { + "committedDate": "2021-09-07T15:21:02Z" + } + }, + { + "name": "release-1.21.4", + "target": { + "committedDate": "2021-11-02T14:49:22Z" + } + }, + { + "name": "release-1.21.5", + "target": { + "committedDate": "2021-12-28T15:28:37Z" + } + }, + { + "name": "release-1.21.6", + "target": { + "committedDate": "2022-01-25T15:03:51Z" + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/improver/improver-advisories.json b/vulnerabilities/tests/test_data/nginx/improver/improver-advisories.json new file mode 100644 index 000000000..3c94288ed --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/improver/improver-advisories.json @@ -0,0 +1,112 @@ +[ + { + "aliases": [ + "CVE-2021-23017" + ], + "summary": "1-byte memory overwrite in resolver", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.20.0", + "fixed_version": "1.21.0" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.20.0", + "fixed_version": "1.20.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2021/000300.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2021-23017", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-23017", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2021.resolver.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2021.resolver.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2019-9511" + ], + "summary": "Excessive CPU usage in HTTP/2 with small window updates", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2", + "fixed_version": "1.17.3" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2", + "fixed_version": "1.16.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2019/000249.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2019-9511", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9511", + "severities": [] + } + ], + "date_published": null + } +] \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/improver/improver-inferences-expected.json b/vulnerabilities/tests/test_data/nginx/improver/improver-inferences-expected.json new file mode 100644 index 000000000..4c9c74f30 --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/improver/improver-inferences-expected.json @@ -0,0 +1,4002 @@ +[ + { + "vulnerability_id": "PLAIN-ID-FOR-TESTING", + "aliases": [ + "CVE-2021-23017" + ], + "confidence": 90, + "summary": "1-byte memory overwrite in resolver", + "affected_purls": [ + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.14", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.15", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.16", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.17", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.18", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.19", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.14", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.15", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.16", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.6.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.6.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.6.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.6.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.8.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.8.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.14", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.15", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.16.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.16.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.18.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.20.0", + "qualifiers": null, + "subpath": null + } + ], + "fixed_purl": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.20.1", + "qualifiers": null, + "subpath": null + }, + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2021/000300.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2021-23017", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-23017", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2021.resolver.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2021.resolver.txt.asc", + "severities": [] + } + ] + }, + { + "vulnerability_id": "PLAIN-ID-FOR-TESTING", + "aliases": [ + "CVE-2021-23017" + ], + "confidence": 90, + "summary": "1-byte memory overwrite in resolver", + "affected_purls": [ + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.14", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.15", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.16", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.17", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.18", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.1.19", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.2.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.14", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.15", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.3.16", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.4.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.5.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.6.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.6.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.6.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.6.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.7.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.8.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.8.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.14", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.15", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.16.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.16.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.18.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.19.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.20.0", + "qualifiers": null, + "subpath": null + } + ], + "fixed_purl": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.21.0", + "qualifiers": null, + "subpath": null + }, + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2021/000300.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2021-23017", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-23017", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2021.resolver.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2021.resolver.txt.asc", + "severities": [] + } + ] + }, + { + "vulnerability_id": "PLAIN-ID-FOR-TESTING", + "aliases": [ + "CVE-2019-9511" + ], + "confidence": 90, + "summary": "Excessive CPU usage in HTTP/2 with small window updates", + "affected_purls": [ + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.14", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.15", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.16.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.2", + "qualifiers": null, + "subpath": null + } + ], + "fixed_purl": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.16.1", + "qualifiers": null, + "subpath": null + }, + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2019/000249.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2019-9511", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9511", + "severities": [] + } + ] + }, + { + "vulnerability_id": "PLAIN-ID-FOR-TESTING", + "aliases": [ + "CVE-2019-9511" + ], + "confidence": 90, + "summary": "Excessive CPU usage in HTTP/2 with small window updates", + "affected_purls": [ + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.14", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.9.15", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.10.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.11.13", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.12.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.13.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.14.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.2", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.3", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.4", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.5", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.6", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.7", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.8", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.9", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.10", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.11", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.15.12", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.16.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.0", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.1", + "qualifiers": null, + "subpath": null + }, + { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.2", + "qualifiers": null, + "subpath": null + } + ], + "fixed_purl": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": "1.17.3", + "qualifiers": null, + "subpath": null + }, + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2019/000249.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2019-9511", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9511", + "severities": [] + } + ] + } +] \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/improver/improver-versions.json b/vulnerabilities/tests/test_data/nginx/improver/improver-versions.json new file mode 100644 index 000000000..67b086fa9 --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/improver/improver-versions.json @@ -0,0 +1,738 @@ +[ + { + "value": "1.1.4", + "release_date": "2011-09-20T11:18:24+00:00" + }, + { + "value": "1.1.5", + "release_date": "2011-10-05T14:44:11+00:00" + }, + { + "value": "1.1.6", + "release_date": "2011-10-17T15:10:23+00:00" + }, + { + "value": "1.1.7", + "release_date": "2011-10-31T14:52:46+00:00" + }, + { + "value": "1.1.8", + "release_date": "2011-11-14T15:37:54+00:00" + }, + { + "value": "1.1.9", + "release_date": "2011-11-28T15:02:38+00:00" + }, + { + "value": "1.1.10", + "release_date": "2011-11-30T10:00:50+00:00" + }, + { + "value": "1.1.11", + "release_date": "2011-12-12T14:17:49+00:00" + }, + { + "value": "1.1.12", + "release_date": "2011-12-26T15:05:17+00:00" + }, + { + "value": "1.1.13", + "release_date": "2012-01-16T15:14:37+00:00" + }, + { + "value": "1.1.14", + "release_date": "2012-01-30T13:52:10+00:00" + }, + { + "value": "1.1.15", + "release_date": "2012-02-15T13:26:06+00:00" + }, + { + "value": "1.1.16", + "release_date": "2012-02-29T13:45:18+00:00" + }, + { + "value": "1.1.17", + "release_date": "2012-03-15T11:32:18+00:00" + }, + { + "value": "1.1.18", + "release_date": "2012-03-28T13:29:29+00:00" + }, + { + "value": "1.1.19", + "release_date": "2012-04-12T12:42:46+00:00" + }, + { + "value": "1.2.0", + "release_date": "2012-04-23T13:06:47+00:00" + }, + { + "value": "1.2.2", + "release_date": "2012-07-03T10:48:31+00:00" + }, + { + "value": "1.2.3", + "release_date": "2012-08-07T12:35:56+00:00" + }, + { + "value": "1.2.4", + "release_date": "2012-09-25T13:42:43+00:00" + }, + { + "value": "1.2.5", + "release_date": "2012-11-13T13:34:59+00:00" + }, + { + "value": "1.2.6", + "release_date": "2012-12-11T14:24:23+00:00" + }, + { + "value": "1.2.7", + "release_date": "2013-02-12T13:40:16+00:00" + }, + { + "value": "1.2.8", + "release_date": "2013-04-02T12:34:21+00:00" + }, + { + "value": "1.2.9", + "release_date": "2013-05-13T10:41:51+00:00" + }, + { + "value": "1.3.0", + "release_date": "2012-05-15T14:23:49+00:00" + }, + { + "value": "1.3.1", + "release_date": "2012-06-05T13:47:29+00:00" + }, + { + "value": "1.3.2", + "release_date": "2012-06-26T13:46:23+00:00" + }, + { + "value": "1.3.3", + "release_date": "2012-07-10T12:20:10+00:00" + }, + { + "value": "1.3.4", + "release_date": "2012-07-31T12:38:37+00:00" + }, + { + "value": "1.3.5", + "release_date": "2012-08-21T13:05:02+00:00" + }, + { + "value": "1.3.6", + "release_date": "2012-09-12T10:41:36+00:00" + }, + { + "value": "1.3.7", + "release_date": "2012-10-02T13:33:37+00:00" + }, + { + "value": "1.3.8", + "release_date": "2012-10-30T13:34:23+00:00" + }, + { + "value": "1.3.9", + "release_date": "2012-11-27T13:55:34+00:00" + }, + { + "value": "1.3.10", + "release_date": "2012-12-25T14:23:45+00:00" + }, + { + "value": "1.3.11", + "release_date": "2013-01-10T13:17:04+00:00" + }, + { + "value": "1.3.12", + "release_date": "2013-02-05T14:06:41+00:00" + }, + { + "value": "1.3.13", + "release_date": "2013-02-19T15:14:48+00:00" + }, + { + "value": "1.3.14", + "release_date": "2013-03-05T14:35:58+00:00" + }, + { + "value": "1.3.15", + "release_date": "2013-03-26T13:03:02+00:00" + }, + { + "value": "1.3.16", + "release_date": "2013-04-16T14:05:11+00:00" + }, + { + "value": "1.4.0", + "release_date": "2013-04-24T13:59:34+00:00" + }, + { + "value": "1.4.1", + "release_date": "2013-05-06T10:20:27+00:00" + }, + { + "value": "1.4.2", + "release_date": "2013-07-17T12:51:21+00:00" + }, + { + "value": "1.4.3", + "release_date": "2013-10-08T12:07:13+00:00" + }, + { + "value": "1.4.4", + "release_date": "2013-11-19T11:25:24+00:00" + }, + { + "value": "1.4.5", + "release_date": "2014-02-11T13:24:43+00:00" + }, + { + "value": "1.4.6", + "release_date": "2014-03-04T11:46:44+00:00" + }, + { + "value": "1.4.7", + "release_date": "2014-03-18T13:17:09+00:00" + }, + { + "value": "1.5.0", + "release_date": "2013-05-06T09:52:36+00:00" + }, + { + "value": "1.5.1", + "release_date": "2013-06-04T13:21:52+00:00" + }, + { + "value": "1.5.2", + "release_date": "2013-07-02T12:28:50+00:00" + }, + { + "value": "1.5.3", + "release_date": "2013-07-30T13:27:55+00:00" + }, + { + "value": "1.5.4", + "release_date": "2013-08-27T13:37:15+00:00" + }, + { + "value": "1.5.5", + "release_date": "2013-09-17T13:31:00+00:00" + }, + { + "value": "1.5.6", + "release_date": "2013-10-01T13:44:51+00:00" + }, + { + "value": "1.5.7", + "release_date": "2013-11-19T10:03:47+00:00" + }, + { + "value": "1.5.8", + "release_date": "2013-12-17T13:46:26+00:00" + }, + { + "value": "1.5.9", + "release_date": "2014-01-22T13:42:59+00:00" + }, + { + "value": "1.5.10", + "release_date": "2014-02-04T12:26:46+00:00" + }, + { + "value": "1.5.11", + "release_date": "2014-03-04T11:39:23+00:00" + }, + { + "value": "1.5.12", + "release_date": "2014-03-18T13:08:35+00:00" + }, + { + "value": "1.5.13", + "release_date": "2014-04-08T14:15:21+00:00" + }, + { + "value": "1.6.0", + "release_date": "2014-04-24T12:52:24+00:00" + }, + { + "value": "1.6.1", + "release_date": "2014-08-05T11:18:34+00:00" + }, + { + "value": "1.6.2", + "release_date": "2014-09-16T12:23:18+00:00" + }, + { + "value": "1.6.3", + "release_date": "2015-04-07T15:51:37+00:00" + }, + { + "value": "1.7.0", + "release_date": "2014-04-24T12:54:22+00:00" + }, + { + "value": "1.7.1", + "release_date": "2014-05-27T13:58:08+00:00" + }, + { + "value": "1.7.2", + "release_date": "2014-06-17T12:51:25+00:00" + }, + { + "value": "1.7.3", + "release_date": "2014-07-08T13:22:38+00:00" + }, + { + "value": "1.7.4", + "release_date": "2014-08-05T11:13:04+00:00" + }, + { + "value": "1.7.5", + "release_date": "2014-09-16T12:19:03+00:00" + }, + { + "value": "1.7.6", + "release_date": "2014-09-30T13:20:32+00:00" + }, + { + "value": "1.7.7", + "release_date": "2014-10-28T15:04:46+00:00" + }, + { + "value": "1.7.8", + "release_date": "2014-12-02T13:02:14+00:00" + }, + { + "value": "1.7.9", + "release_date": "2014-12-23T15:28:37+00:00" + }, + { + "value": "1.7.10", + "release_date": "2015-02-10T14:33:32+00:00" + }, + { + "value": "1.7.11", + "release_date": "2015-03-24T15:45:34+00:00" + }, + { + "value": "1.7.12", + "release_date": "2015-04-07T15:35:33+00:00" + }, + { + "value": "1.8.0", + "release_date": "2015-04-21T14:11:58+00:00" + }, + { + "value": "1.8.1", + "release_date": "2016-01-26T14:39:30+00:00" + }, + { + "value": "1.9.0", + "release_date": "2015-04-28T15:31:17+00:00" + }, + { + "value": "1.9.1", + "release_date": "2015-05-26T13:49:50+00:00" + }, + { + "value": "1.9.2", + "release_date": "2015-06-16T14:49:39+00:00" + }, + { + "value": "1.9.3", + "release_date": "2015-07-14T16:46:05+00:00" + }, + { + "value": "1.9.4", + "release_date": "2015-08-18T15:16:17+00:00" + }, + { + "value": "1.9.5", + "release_date": "2015-09-22T14:36:21+00:00" + }, + { + "value": "1.9.6", + "release_date": "2015-10-27T13:47:29+00:00" + }, + { + "value": "1.9.7", + "release_date": "2015-11-17T14:50:56+00:00" + }, + { + "value": "1.9.8", + "release_date": "2015-12-08T15:16:51+00:00" + }, + { + "value": "1.9.9", + "release_date": "2015-12-09T14:47:20+00:00" + }, + { + "value": "1.9.10", + "release_date": "2016-01-26T14:27:40+00:00" + }, + { + "value": "1.9.11", + "release_date": "2016-02-09T14:11:56+00:00" + }, + { + "value": "1.9.12", + "release_date": "2016-02-24T14:53:22+00:00" + }, + { + "value": "1.9.13", + "release_date": "2016-03-29T15:09:30+00:00" + }, + { + "value": "1.9.14", + "release_date": "2016-04-05T14:57:08+00:00" + }, + { + "value": "1.9.15", + "release_date": "2016-04-19T16:02:37+00:00" + }, + { + "value": "1.10.0", + "release_date": "2016-04-26T13:31:18+00:00" + }, + { + "value": "1.10.1", + "release_date": "2016-05-31T13:47:01+00:00" + }, + { + "value": "1.10.2", + "release_date": "2016-10-18T15:03:12+00:00" + }, + { + "value": "1.10.3", + "release_date": "2017-01-31T15:01:10+00:00" + }, + { + "value": "1.11.0", + "release_date": "2016-05-24T15:54:41+00:00" + }, + { + "value": "1.11.1", + "release_date": "2016-05-31T13:43:49+00:00" + }, + { + "value": "1.11.2", + "release_date": "2016-07-05T15:56:14+00:00" + }, + { + "value": "1.11.3", + "release_date": "2016-07-26T13:58:58+00:00" + }, + { + "value": "1.11.4", + "release_date": "2016-09-13T15:39:23+00:00" + }, + { + "value": "1.11.5", + "release_date": "2016-10-11T15:03:00+00:00" + }, + { + "value": "1.11.6", + "release_date": "2016-11-15T15:11:46+00:00" + }, + { + "value": "1.11.7", + "release_date": "2016-12-13T15:21:23+00:00" + }, + { + "value": "1.11.8", + "release_date": "2016-12-27T14:23:07+00:00" + }, + { + "value": "1.11.9", + "release_date": "2017-01-24T14:02:18+00:00" + }, + { + "value": "1.11.10", + "release_date": "2017-02-14T15:36:04+00:00" + }, + { + "value": "1.11.11", + "release_date": "2017-03-21T15:04:22+00:00" + }, + { + "value": "1.11.12", + "release_date": "2017-03-24T15:05:05+00:00" + }, + { + "value": "1.11.13", + "release_date": "2017-04-04T15:01:57+00:00" + }, + { + "value": "1.12.0", + "release_date": "2017-04-12T14:46:00+00:00" + }, + { + "value": "1.12.1", + "release_date": "2017-07-11T13:24:04+00:00" + }, + { + "value": "1.12.2", + "release_date": "2017-10-17T13:16:37+00:00" + }, + { + "value": "1.13.0", + "release_date": "2017-04-25T14:18:21+00:00" + }, + { + "value": "1.13.1", + "release_date": "2017-05-30T14:55:22+00:00" + }, + { + "value": "1.13.2", + "release_date": "2017-06-27T14:44:17+00:00" + }, + { + "value": "1.13.3", + "release_date": "2017-07-11T13:18:30+00:00" + }, + { + "value": "1.13.4", + "release_date": "2017-08-08T15:00:11+00:00" + }, + { + "value": "1.13.5", + "release_date": "2017-09-05T14:59:31+00:00" + }, + { + "value": "1.13.6", + "release_date": "2017-10-10T15:22:50+00:00" + }, + { + "value": "1.13.7", + "release_date": "2017-11-21T15:09:43+00:00" + }, + { + "value": "1.13.8", + "release_date": "2017-12-26T16:01:11+00:00" + }, + { + "value": "1.13.9", + "release_date": "2018-02-20T14:08:48+00:00" + }, + { + "value": "1.13.10", + "release_date": "2018-03-20T15:58:30+00:00" + }, + { + "value": "1.13.11", + "release_date": "2018-04-03T14:38:09+00:00" + }, + { + "value": "1.13.12", + "release_date": "2018-04-10T14:11:09+00:00" + }, + { + "value": "1.14.0", + "release_date": "2018-04-17T15:22:35+00:00" + }, + { + "value": "1.14.1", + "release_date": "2018-11-06T13:52:46+00:00" + }, + { + "value": "1.14.2", + "release_date": "2018-12-04T14:52:24+00:00" + }, + { + "value": "1.15.0", + "release_date": "2018-06-05T13:47:25+00:00" + }, + { + "value": "1.15.1", + "release_date": "2018-07-03T15:07:43+00:00" + }, + { + "value": "1.15.2", + "release_date": "2018-07-24T13:10:59+00:00" + }, + { + "value": "1.15.3", + "release_date": "2018-08-28T15:36:00+00:00" + }, + { + "value": "1.15.4", + "release_date": "2018-09-25T15:11:39+00:00" + }, + { + "value": "1.15.5", + "release_date": "2018-10-02T15:13:51+00:00" + }, + { + "value": "1.15.6", + "release_date": "2018-11-06T13:32:08+00:00" + }, + { + "value": "1.15.7", + "release_date": "2018-11-27T14:40:20+00:00" + }, + { + "value": "1.15.8", + "release_date": "2018-12-25T14:53:03+00:00" + }, + { + "value": "1.15.9", + "release_date": "2019-02-26T15:29:22+00:00" + }, + { + "value": "1.15.10", + "release_date": "2019-03-26T14:06:54+00:00" + }, + { + "value": "1.15.11", + "release_date": "2019-04-09T13:00:30+00:00" + }, + { + "value": "1.15.12", + "release_date": "2019-04-16T14:54:58+00:00" + }, + { + "value": "1.16.0", + "release_date": "2019-04-23T13:12:57+00:00" + }, + { + "value": "1.16.1", + "release_date": "2019-08-13T12:51:42+00:00" + }, + { + "value": "1.17.0", + "release_date": "2019-05-21T14:23:57+00:00" + }, + { + "value": "1.17.1", + "release_date": "2019-06-25T12:19:45+00:00" + }, + { + "value": "1.17.2", + "release_date": "2019-07-23T12:01:47+00:00" + }, + { + "value": "1.17.3", + "release_date": "2019-08-13T12:45:56+00:00" + }, + { + "value": "1.17.4", + "release_date": "2019-09-24T15:08:48+00:00" + }, + { + "value": "1.17.5", + "release_date": "2019-10-22T15:16:08+00:00" + }, + { + "value": "1.17.6", + "release_date": "2019-11-19T14:18:58+00:00" + }, + { + "value": "1.17.7", + "release_date": "2019-12-24T15:00:09+00:00" + }, + { + "value": "1.17.8", + "release_date": "2020-01-21T13:39:41+00:00" + }, + { + "value": "1.17.9", + "release_date": "2020-03-03T15:04:21+00:00" + }, + { + "value": "1.17.10", + "release_date": "2020-04-14T14:19:26+00:00" + }, + { + "value": "1.18.0", + "release_date": "2020-04-21T14:09:01+00:00" + }, + { + "value": "1.19.0", + "release_date": "2020-05-26T15:00:20+00:00" + }, + { + "value": "1.19.1", + "release_date": "2020-07-07T15:56:05+00:00" + }, + { + "value": "1.19.2", + "release_date": "2020-08-11T14:52:30+00:00" + }, + { + "value": "1.19.3", + "release_date": "2020-09-29T14:32:10+00:00" + }, + { + "value": "1.19.4", + "release_date": "2020-10-27T15:09:20+00:00" + }, + { + "value": "1.19.5", + "release_date": "2020-11-24T15:06:34+00:00" + }, + { + "value": "1.19.6", + "release_date": "2020-12-15T14:41:39+00:00" + }, + { + "value": "1.19.7", + "release_date": "2021-02-16T15:57:18+00:00" + }, + { + "value": "1.19.8", + "release_date": "2021-03-09T15:27:50+00:00" + }, + { + "value": "1.19.9", + "release_date": "2021-03-30T14:47:11+00:00" + }, + { + "value": "1.19.10", + "release_date": "2021-04-13T15:13:58+00:00" + }, + { + "value": "1.20.0", + "release_date": "2021-04-20T13:35:46+00:00" + }, + { + "value": "1.20.1", + "release_date": "2021-05-25T12:35:38+00:00" + }, + { + "value": "1.20.2", + "release_date": "2021-11-16T14:44:02+00:00" + }, + { + "value": "1.21.0", + "release_date": "2021-05-25T12:28:55+00:00" + }, + { + "value": "1.21.1", + "release_date": "2021-07-06T14:59:16+00:00" + }, + { + "value": "1.21.2", + "release_date": "2021-08-31T15:13:46+00:00" + }, + { + "value": "1.21.3", + "release_date": "2021-09-07T15:21:02+00:00" + }, + { + "value": "1.21.4", + "release_date": "2021-11-02T14:49:22+00:00" + }, + { + "value": "1.21.5", + "release_date": "2021-12-28T15:28:37+00:00" + }, + { + "value": "1.21.6", + "release_date": "2022-01-25T15:03:51+00:00" + } +] \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/improver/nginx-versions-expected.json b/vulnerabilities/tests/test_data/nginx/improver/nginx-versions-expected.json new file mode 100644 index 000000000..d5cdddd32 --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/improver/nginx-versions-expected.json @@ -0,0 +1,2190 @@ +[ + { + "value": "0.1.0", + "release_date": "2004-10-04T15:04:06+00:00" + }, + { + "value": "0.1.1", + "release_date": "2004-10-11T15:07:03+00:00" + }, + { + "value": "0.1.2", + "release_date": "2004-10-21T15:34:38+00:00" + }, + { + "value": "0.1.3", + "release_date": "2004-10-25T15:29:23+00:00" + }, + { + "value": "0.1.4", + "release_date": "2004-10-26T06:27:24+00:00" + }, + { + "value": "0.1.5", + "release_date": "2004-11-11T14:07:14+00:00" + }, + { + "value": "0.1.6", + "release_date": "2004-11-11T20:58:09+00:00" + }, + { + "value": "0.1.7", + "release_date": "2004-11-12T14:35:09+00:00" + }, + { + "value": "0.1.8", + "release_date": "2004-11-20T19:52:20+00:00" + }, + { + "value": "0.1.9", + "release_date": "2004-11-25T16:17:31+00:00" + }, + { + "value": "0.1.10", + "release_date": "2004-11-26T09:33:59+00:00" + }, + { + "value": "0.1.11", + "release_date": "2004-12-02T18:40:46+00:00" + }, + { + "value": "0.1.12", + "release_date": "2004-12-06T14:45:08+00:00" + }, + { + "value": "0.1.13", + "release_date": "2004-12-21T12:30:30+00:00" + }, + { + "value": "0.1.14", + "release_date": "2005-01-18T13:03:58+00:00" + }, + { + "value": "0.1.15", + "release_date": "2005-01-19T13:10:56+00:00" + }, + { + "value": "0.1.16", + "release_date": "2005-01-25T12:27:35+00:00" + }, + { + "value": "0.1.17", + "release_date": "2005-02-03T19:33:37+00:00" + }, + { + "value": "0.1.18", + "release_date": "2005-02-09T14:31:07+00:00" + }, + { + "value": "0.1.19", + "release_date": "2005-02-16T13:40:36+00:00" + }, + { + "value": "0.1.20", + "release_date": "2005-02-17T11:59:36+00:00" + }, + { + "value": "0.1.21", + "release_date": "2005-02-22T14:40:13+00:00" + }, + { + "value": "0.1.22", + "release_date": "2005-02-24T12:29:09+00:00" + }, + { + "value": "0.1.23", + "release_date": "2005-03-01T15:20:36+00:00" + }, + { + "value": "0.1.24", + "release_date": "2005-03-04T14:06:57+00:00" + }, + { + "value": "0.1.25", + "release_date": "2005-03-19T12:38:37+00:00" + }, + { + "value": "0.1.26", + "release_date": "2005-03-22T16:02:46+00:00" + }, + { + "value": "0.1.27", + "release_date": "2005-03-28T14:43:02+00:00" + }, + { + "value": "0.1.28", + "release_date": "2005-04-08T15:18:55+00:00" + }, + { + "value": "0.1.29", + "release_date": "2005-05-12T14:58:06+00:00" + }, + { + "value": "0.1.30", + "release_date": "2005-05-14T18:42:03+00:00" + }, + { + "value": "0.1.31", + "release_date": "2005-05-16T13:53:20+00:00" + }, + { + "value": "0.1.32", + "release_date": "2005-05-19T13:25:22+00:00" + }, + { + "value": "0.1.33", + "release_date": "2005-05-23T12:07:45+00:00" + }, + { + "value": "0.1.34", + "release_date": "2005-05-26T18:12:40+00:00" + }, + { + "value": "0.1.35", + "release_date": "2005-06-07T15:56:31+00:00" + }, + { + "value": "0.1.36", + "release_date": "2005-06-15T18:33:41+00:00" + }, + { + "value": "0.1.37", + "release_date": "2005-06-23T13:41:06+00:00" + }, + { + "value": "0.1.38", + "release_date": "2005-07-08T14:34:20+00:00" + }, + { + "value": "0.1.39", + "release_date": "2005-07-14T12:51:53+00:00" + }, + { + "value": "0.1.40", + "release_date": "2005-07-25T09:41:38+00:00" + }, + { + "value": "0.1.41", + "release_date": "2005-08-19T08:54:17+00:00" + }, + { + "value": "0.1.42", + "release_date": "2005-08-23T15:36:54+00:00" + }, + { + "value": "0.1.43", + "release_date": "2005-08-30T10:55:07+00:00" + }, + { + "value": "0.1.44", + "release_date": "2005-09-06T16:09:32+00:00" + }, + { + "value": "0.1.45", + "release_date": "2005-09-08T14:36:09+00:00" + }, + { + "value": "0.2.0", + "release_date": "2005-09-23T11:02:22+00:00" + }, + { + "value": "0.2.1", + "release_date": "2005-09-23T14:43:49+00:00" + }, + { + "value": "0.2.2", + "release_date": "2005-09-30T14:41:25+00:00" + }, + { + "value": "0.2.3", + "release_date": "2005-09-30T16:02:34+00:00" + }, + { + "value": "0.2.4", + "release_date": "2005-10-03T12:53:14+00:00" + }, + { + "value": "0.2.5", + "release_date": "2005-10-04T10:38:53+00:00" + }, + { + "value": "0.2.6", + "release_date": "2005-10-05T14:46:21+00:00" + }, + { + "value": "0.3.0", + "release_date": "2005-10-07T13:30:52+00:00" + }, + { + "value": "0.3.1", + "release_date": "2005-10-10T12:59:41+00:00" + }, + { + "value": "0.3.2", + "release_date": "2005-10-12T13:50:36+00:00" + }, + { + "value": "0.3.3", + "release_date": "2005-10-19T12:33:58+00:00" + }, + { + "value": "0.3.4", + "release_date": "2005-10-19T13:34:28+00:00" + }, + { + "value": "0.3.5", + "release_date": "2005-10-21T19:12:18+00:00" + }, + { + "value": "0.3.6", + "release_date": "2005-10-24T15:09:41+00:00" + }, + { + "value": "0.3.7", + "release_date": "2005-10-27T15:46:13+00:00" + }, + { + "value": "0.3.8", + "release_date": "2005-11-09T17:25:55+00:00" + }, + { + "value": "0.3.9", + "release_date": "2005-11-10T07:44:53+00:00" + }, + { + "value": "0.3.10", + "release_date": "2005-11-15T13:30:52+00:00" + }, + { + "value": "0.3.11", + "release_date": "2005-11-15T14:49:57+00:00" + }, + { + "value": "0.3.12", + "release_date": "2005-11-26T10:11:11+00:00" + }, + { + "value": "0.3.13", + "release_date": "2005-12-05T13:18:09+00:00" + }, + { + "value": "0.3.14", + "release_date": "2005-12-05T16:59:05+00:00" + }, + { + "value": "0.3.15", + "release_date": "2005-12-07T14:51:31+00:00" + }, + { + "value": "0.3.16", + "release_date": "2005-12-16T15:07:08+00:00" + }, + { + "value": "0.3.17", + "release_date": "2005-12-18T16:02:44+00:00" + }, + { + "value": "0.3.18", + "release_date": "2005-12-26T17:07:48+00:00" + }, + { + "value": "0.3.19", + "release_date": "2005-12-28T14:23:52+00:00" + }, + { + "value": "0.3.20", + "release_date": "2006-01-11T15:26:57+00:00" + }, + { + "value": "0.3.21", + "release_date": "2006-01-16T14:56:53+00:00" + }, + { + "value": "0.3.22", + "release_date": "2006-01-17T20:04:32+00:00" + }, + { + "value": "0.3.23", + "release_date": "2006-01-24T16:08:27+00:00" + }, + { + "value": "0.3.24", + "release_date": "2006-02-01T18:22:15+00:00" + }, + { + "value": "0.3.25", + "release_date": "2006-02-01T20:01:51+00:00" + }, + { + "value": "0.3.26", + "release_date": "2006-02-03T12:58:48+00:00" + }, + { + "value": "0.3.27", + "release_date": "2006-02-08T15:33:12+00:00" + }, + { + "value": "0.3.28", + "release_date": "2006-02-16T15:26:46+00:00" + }, + { + "value": "0.3.29", + "release_date": "2006-02-20T16:48:17+00:00" + }, + { + "value": "0.3.30", + "release_date": "2006-02-22T19:41:39+00:00" + }, + { + "value": "0.3.31", + "release_date": "2006-03-10T12:51:52+00:00" + }, + { + "value": "0.3.32", + "release_date": "2006-03-11T06:40:30+00:00" + }, + { + "value": "0.3.33", + "release_date": "2006-03-15T09:53:04+00:00" + }, + { + "value": "0.3.34", + "release_date": "2006-03-21T08:20:41+00:00" + }, + { + "value": "0.3.35", + "release_date": "2006-03-28T12:24:47+00:00" + }, + { + "value": "0.3.36", + "release_date": "2006-04-05T13:40:54+00:00" + }, + { + "value": "0.3.37", + "release_date": "2006-04-07T14:08:04+00:00" + }, + { + "value": "0.3.38", + "release_date": "2006-04-14T09:53:38+00:00" + }, + { + "value": "0.3.39", + "release_date": "2006-04-17T19:55:41+00:00" + }, + { + "value": "0.3.40", + "release_date": "2006-04-19T15:30:56+00:00" + }, + { + "value": "0.3.41", + "release_date": "2006-04-21T12:06:44+00:00" + }, + { + "value": "0.3.42", + "release_date": "2006-04-26T09:52:47+00:00" + }, + { + "value": "0.3.43", + "release_date": "2006-04-26T15:21:08+00:00" + }, + { + "value": "0.3.44", + "release_date": "2006-05-04T15:32:46+00:00" + }, + { + "value": "0.3.45", + "release_date": "2006-05-06T16:28:56+00:00" + }, + { + "value": "0.3.46", + "release_date": "2006-05-11T14:43:47+00:00" + }, + { + "value": "0.3.47", + "release_date": "2006-05-23T14:54:58+00:00" + }, + { + "value": "0.3.48", + "release_date": "2006-05-29T17:28:12+00:00" + }, + { + "value": "0.3.49", + "release_date": "2006-05-31T14:11:45+00:00" + }, + { + "value": "0.3.50", + "release_date": "2006-06-28T16:00:26+00:00" + }, + { + "value": "0.3.51", + "release_date": "2006-06-30T12:19:32+00:00" + }, + { + "value": "0.3.52", + "release_date": "2006-07-03T16:49:20+00:00" + }, + { + "value": "0.3.53", + "release_date": "2006-07-07T16:33:19+00:00" + }, + { + "value": "0.3.54", + "release_date": "2006-07-11T13:20:19+00:00" + }, + { + "value": "0.3.55", + "release_date": "2006-07-28T15:16:17+00:00" + }, + { + "value": "0.3.56", + "release_date": "2006-08-04T16:04:04+00:00" + }, + { + "value": "0.3.57", + "release_date": "2006-08-09T19:59:45+00:00" + }, + { + "value": "0.3.58", + "release_date": "2006-08-14T15:09:38+00:00" + }, + { + "value": "0.3.59", + "release_date": "2006-08-16T13:09:33+00:00" + }, + { + "value": "0.3.60", + "release_date": "2006-08-18T14:17:54+00:00" + }, + { + "value": "0.3.61", + "release_date": "2006-08-28T16:57:48+00:00" + }, + { + "value": "0.4.0", + "release_date": "2006-08-30T10:39:17+00:00" + }, + { + "value": "0.4.1", + "release_date": "2006-09-14T13:28:04+00:00" + }, + { + "value": "0.4.2", + "release_date": "2006-09-14T15:29:09+00:00" + }, + { + "value": "0.4.3", + "release_date": "2006-09-26T12:23:14+00:00" + }, + { + "value": "0.4.4", + "release_date": "2006-10-02T11:44:21+00:00" + }, + { + "value": "0.4.5", + "release_date": "2006-10-02T15:07:23+00:00" + }, + { + "value": "0.4.6", + "release_date": "2006-10-06T14:23:44+00:00" + }, + { + "value": "0.4.7", + "release_date": "2006-10-10T16:10:29+00:00" + }, + { + "value": "0.4.8", + "release_date": "2006-10-11T15:11:22+00:00" + }, + { + "value": "0.4.9", + "release_date": "2006-10-13T15:43:19+00:00" + }, + { + "value": "0.4.10", + "release_date": "2006-10-23T13:25:27+00:00" + }, + { + "value": "0.4.11", + "release_date": "2006-10-25T16:29:25+00:00" + }, + { + "value": "0.4.12", + "release_date": "2006-10-31T15:28:43+00:00" + }, + { + "value": "0.4.13", + "release_date": "2006-11-15T20:02:11+00:00" + }, + { + "value": "0.4.14", + "release_date": "2006-11-27T14:28:44+00:00" + }, + { + "value": "0.5.0", + "release_date": "2006-12-04T16:56:53+00:00" + }, + { + "value": "0.5.1", + "release_date": "2006-12-11T10:00:05+00:00" + }, + { + "value": "0.5.2", + "release_date": "2006-12-11T15:23:27+00:00" + }, + { + "value": "0.5.3", + "release_date": "2006-12-13T15:06:55+00:00" + }, + { + "value": "0.5.4", + "release_date": "2006-12-14T23:14:11+00:00" + }, + { + "value": "0.5.5", + "release_date": "2006-12-24T18:32:58+00:00" + }, + { + "value": "0.5.6", + "release_date": "2007-01-09T17:08:42+00:00" + }, + { + "value": "0.5.7", + "release_date": "2007-01-15T17:49:11+00:00" + }, + { + "value": "0.5.8", + "release_date": "2007-01-19T16:13:59+00:00" + }, + { + "value": "0.5.9", + "release_date": "2007-01-25T16:34:51+00:00" + }, + { + "value": "0.5.10", + "release_date": "2007-01-25T22:09:28+00:00" + }, + { + "value": "0.5.11", + "release_date": "2007-02-05T14:02:51+00:00" + }, + { + "value": "0.5.12", + "release_date": "2007-02-12T14:59:20+00:00" + }, + { + "value": "0.5.13", + "release_date": "2007-02-19T13:25:54+00:00" + }, + { + "value": "0.5.14", + "release_date": "2007-02-23T12:37:06+00:00" + }, + { + "value": "0.5.15", + "release_date": "2007-03-19T13:44:24+00:00" + }, + { + "value": "0.5.16", + "release_date": "2007-03-26T14:32:00+00:00" + }, + { + "value": "0.5.17", + "release_date": "2007-04-02T10:44:44+00:00" + }, + { + "value": "0.5.18", + "release_date": "2007-04-19T18:16:53+00:00" + }, + { + "value": "0.5.19", + "release_date": "2007-04-24T06:20:59+00:00" + }, + { + "value": "0.5.20", + "release_date": "2007-05-07T14:24:25+00:00" + }, + { + "value": "0.5.21", + "release_date": "2007-05-28T14:32:02+00:00" + }, + { + "value": "0.5.22", + "release_date": "2007-05-29T12:07:48+00:00" + }, + { + "value": "0.5.23", + "release_date": "2007-06-04T13:57:56+00:00" + }, + { + "value": "0.5.24", + "release_date": "2007-06-06T06:05:05+00:00" + }, + { + "value": "0.5.25", + "release_date": "2007-06-11T18:42:55+00:00" + }, + { + "value": "0.5.26", + "release_date": "2007-06-17T19:07:55+00:00" + }, + { + "value": "0.5.27", + "release_date": "2007-07-09T06:53:54+00:00" + }, + { + "value": "0.5.28", + "release_date": "2007-07-17T10:01:17+00:00" + }, + { + "value": "0.5.29", + "release_date": "2007-07-23T07:58:59+00:00" + }, + { + "value": "0.5.30", + "release_date": "2007-07-30T09:14:34+00:00" + }, + { + "value": "0.5.31", + "release_date": "2007-08-15T12:47:26+00:00" + }, + { + "value": "0.5.32", + "release_date": "2007-09-24T04:11:20+00:00" + }, + { + "value": "0.5.33", + "release_date": "2007-11-07T14:31:56+00:00" + }, + { + "value": "0.5.34", + "release_date": "2007-12-13T10:49:26+00:00" + }, + { + "value": "0.5.35", + "release_date": "2008-01-08T17:42:10+00:00" + }, + { + "value": "0.5.36", + "release_date": "2008-05-04T11:17:13+00:00" + }, + { + "value": "0.5.37", + "release_date": "2008-07-07T12:09:02+00:00" + }, + { + "value": "0.5.38", + "release_date": "2009-09-14T13:17:16+00:00" + }, + { + "value": "0.6.0", + "release_date": "2007-06-14T05:41:42+00:00" + }, + { + "value": "0.6.1", + "release_date": "2007-06-17T19:13:33+00:00" + }, + { + "value": "0.6.2", + "release_date": "2007-07-09T06:54:47+00:00" + }, + { + "value": "0.6.3", + "release_date": "2007-07-12T11:21:56+00:00" + }, + { + "value": "0.6.4", + "release_date": "2007-07-17T09:57:37+00:00" + }, + { + "value": "0.6.5", + "release_date": "2007-07-23T07:57:08+00:00" + }, + { + "value": "0.6.6", + "release_date": "2007-07-30T09:13:17+00:00" + }, + { + "value": "0.6.7", + "release_date": "2007-08-15T12:44:26+00:00" + }, + { + "value": "0.6.8", + "release_date": "2007-08-20T13:05:32+00:00" + }, + { + "value": "0.6.9", + "release_date": "2007-08-28T16:22:48+00:00" + }, + { + "value": "0.6.10", + "release_date": "2007-09-03T10:29:59+00:00" + }, + { + "value": "0.6.11", + "release_date": "2007-09-11T13:15:48+00:00" + }, + { + "value": "0.6.12", + "release_date": "2007-09-21T14:36:10+00:00" + }, + { + "value": "0.6.13", + "release_date": "2007-09-24T04:10:01+00:00" + }, + { + "value": "0.6.14", + "release_date": "2007-10-15T11:24:11+00:00" + }, + { + "value": "0.6.15", + "release_date": "2007-10-22T11:16:55+00:00" + }, + { + "value": "0.6.16", + "release_date": "2007-10-29T13:41:41+00:00" + }, + { + "value": "0.6.17", + "release_date": "2007-11-15T15:04:22+00:00" + }, + { + "value": "0.6.18", + "release_date": "2007-11-27T16:20:11+00:00" + }, + { + "value": "0.6.19", + "release_date": "2007-11-27T16:53:14+00:00" + }, + { + "value": "0.6.20", + "release_date": "2007-11-28T19:13:23+00:00" + }, + { + "value": "0.6.21", + "release_date": "2007-12-03T17:18:48+00:00" + }, + { + "value": "0.6.22", + "release_date": "2007-12-19T16:44:38+00:00" + }, + { + "value": "0.6.23", + "release_date": "2007-12-27T14:59:57+00:00" + }, + { + "value": "0.6.24", + "release_date": "2007-12-27T18:43:53+00:00" + }, + { + "value": "0.6.25", + "release_date": "2008-01-08T12:31:35+00:00" + }, + { + "value": "0.6.26", + "release_date": "2008-02-11T15:22:25+00:00" + }, + { + "value": "0.6.27", + "release_date": "2008-03-12T13:27:10+00:00" + }, + { + "value": "0.6.28", + "release_date": "2008-03-13T06:10:32+00:00" + }, + { + "value": "0.6.29", + "release_date": "2008-03-18T14:11:55+00:00" + }, + { + "value": "0.6.30", + "release_date": "2008-04-29T12:36:39+00:00" + }, + { + "value": "0.6.31", + "release_date": "2008-05-12T09:48:43+00:00" + }, + { + "value": "0.6.32", + "release_date": "2008-07-07T11:44:11+00:00" + }, + { + "value": "0.6.33", + "release_date": "2008-11-20T17:26:44+00:00" + }, + { + "value": "0.6.34", + "release_date": "2008-11-27T15:32:51+00:00" + }, + { + "value": "0.6.35", + "release_date": "2009-01-26T15:31:47+00:00" + }, + { + "value": "0.6.36", + "release_date": "2009-04-02T06:48:50+00:00" + }, + { + "value": "0.6.37", + "release_date": "2009-05-18T16:29:57+00:00" + }, + { + "value": "0.6.38", + "release_date": "2009-06-22T10:11:55+00:00" + }, + { + "value": "0.6.39", + "release_date": "2009-09-14T13:13:21+00:00" + }, + { + "value": "0.7.0", + "release_date": "2008-05-19T10:34:41+00:00" + }, + { + "value": "0.7.1", + "release_date": "2008-05-26T09:32:30+00:00" + }, + { + "value": "0.7.2", + "release_date": "2008-06-16T09:04:22+00:00" + }, + { + "value": "0.7.3", + "release_date": "2008-06-23T10:34:57+00:00" + }, + { + "value": "0.7.4", + "release_date": "2008-06-30T12:38:49+00:00" + }, + { + "value": "0.7.5", + "release_date": "2008-07-01T07:22:00+00:00" + }, + { + "value": "0.7.6", + "release_date": "2008-07-07T09:43:21+00:00" + }, + { + "value": "0.7.7", + "release_date": "2008-07-30T12:55:03+00:00" + }, + { + "value": "0.7.8", + "release_date": "2008-08-04T15:46:34+00:00" + }, + { + "value": "0.7.9", + "release_date": "2008-08-12T15:34:08+00:00" + }, + { + "value": "0.7.10", + "release_date": "2008-08-13T16:53:31+00:00" + }, + { + "value": "0.7.11", + "release_date": "2008-08-18T14:22:50+00:00" + }, + { + "value": "0.7.12", + "release_date": "2008-08-26T16:13:43+00:00" + }, + { + "value": "0.7.13", + "release_date": "2008-08-26T17:19:07+00:00" + }, + { + "value": "0.7.14", + "release_date": "2008-09-01T15:31:56+00:00" + }, + { + "value": "0.7.15", + "release_date": "2008-09-08T08:36:22+00:00" + }, + { + "value": "0.7.16", + "release_date": "2008-09-08T09:42:41+00:00" + }, + { + "value": "0.7.17", + "release_date": "2008-09-15T16:59:30+00:00" + }, + { + "value": "0.7.18", + "release_date": "2008-10-13T13:18:28+00:00" + }, + { + "value": "0.7.19", + "release_date": "2008-10-13T15:16:11+00:00" + }, + { + "value": "0.7.20", + "release_date": "2008-11-10T16:30:45+00:00" + }, + { + "value": "0.7.21", + "release_date": "2008-11-11T20:04:58+00:00" + }, + { + "value": "0.7.22", + "release_date": "2008-11-20T16:47:36+00:00" + }, + { + "value": "0.7.23", + "release_date": "2008-11-27T13:05:34+00:00" + }, + { + "value": "0.7.24", + "release_date": "2008-12-01T14:54:42+00:00" + }, + { + "value": "0.7.25", + "release_date": "2008-12-08T14:43:16+00:00" + }, + { + "value": "0.7.26", + "release_date": "2008-12-08T18:32:42+00:00" + }, + { + "value": "0.7.27", + "release_date": "2008-12-15T11:30:08+00:00" + }, + { + "value": "0.7.28", + "release_date": "2008-12-22T13:06:23+00:00" + }, + { + "value": "0.7.29", + "release_date": "2008-12-24T12:50:21+00:00" + }, + { + "value": "0.7.30", + "release_date": "2008-12-24T16:21:40+00:00" + }, + { + "value": "0.7.31", + "release_date": "2009-01-19T13:57:01+00:00" + }, + { + "value": "0.7.32", + "release_date": "2009-01-26T14:41:26+00:00" + }, + { + "value": "0.7.33", + "release_date": "2009-02-02T11:00:11+00:00" + }, + { + "value": "0.7.34", + "release_date": "2009-02-10T16:50:28+00:00" + }, + { + "value": "0.7.35", + "release_date": "2009-02-16T13:58:43+00:00" + }, + { + "value": "0.7.36", + "release_date": "2009-02-21T07:26:17+00:00" + }, + { + "value": "0.7.37", + "release_date": "2009-02-21T14:42:38+00:00" + }, + { + "value": "0.7.38", + "release_date": "2009-02-23T16:01:23+00:00" + }, + { + "value": "0.7.39", + "release_date": "2009-03-02T12:43:09+00:00" + }, + { + "value": "0.7.40", + "release_date": "2009-03-09T08:54:23+00:00" + }, + { + "value": "0.7.41", + "release_date": "2009-03-11T13:16:09+00:00" + }, + { + "value": "0.7.42", + "release_date": "2009-03-16T07:23:09+00:00" + }, + { + "value": "0.7.43", + "release_date": "2009-03-18T12:46:23+00:00" + }, + { + "value": "0.7.44", + "release_date": "2009-03-23T13:27:39+00:00" + }, + { + "value": "0.7.45", + "release_date": "2009-03-30T08:32:56+00:00" + }, + { + "value": "0.7.46", + "release_date": "2009-03-30T11:02:56+00:00" + }, + { + "value": "0.7.47", + "release_date": "2009-04-01T13:20:34+00:00" + }, + { + "value": "0.7.48", + "release_date": "2009-04-06T10:15:22+00:00" + }, + { + "value": "0.7.49", + "release_date": "2009-04-06T10:42:53+00:00" + }, + { + "value": "0.7.50", + "release_date": "2009-04-06T11:44:34+00:00" + }, + { + "value": "0.7.51", + "release_date": "2009-04-12T09:35:25+00:00" + }, + { + "value": "0.7.52", + "release_date": "2009-04-20T06:16:19+00:00" + }, + { + "value": "0.7.53", + "release_date": "2009-04-27T12:02:01+00:00" + }, + { + "value": "0.7.54", + "release_date": "2009-05-01T18:52:58+00:00" + }, + { + "value": "0.7.55", + "release_date": "2009-05-06T09:28:57+00:00" + }, + { + "value": "0.7.56", + "release_date": "2009-05-11T13:42:26+00:00" + }, + { + "value": "0.7.57", + "release_date": "2009-05-12T12:11:50+00:00" + }, + { + "value": "0.7.58", + "release_date": "2009-05-18T13:14:17+00:00" + }, + { + "value": "0.7.59", + "release_date": "2009-05-25T10:00:08+00:00" + }, + { + "value": "0.7.60", + "release_date": "2009-06-15T09:55:51+00:00" + }, + { + "value": "0.7.61", + "release_date": "2009-06-22T09:37:07+00:00" + }, + { + "value": "0.7.62", + "release_date": "2009-09-14T13:09:54+00:00" + }, + { + "value": "0.7.63", + "release_date": "2009-10-26T17:57:36+00:00" + }, + { + "value": "0.7.64", + "release_date": "2009-11-16T15:29:46+00:00" + }, + { + "value": "0.7.65", + "release_date": "2010-02-01T16:09:15+00:00" + }, + { + "value": "0.7.66", + "release_date": "2010-06-07T12:41:31+00:00" + }, + { + "value": "0.7.67", + "release_date": "2010-06-15T09:55:00+00:00" + }, + { + "value": "0.7.68", + "release_date": "2010-12-14T19:48:03+00:00" + }, + { + "value": "0.7.69", + "release_date": "2011-07-19T14:20:25+00:00" + }, + { + "value": "0.8.0", + "release_date": "2009-06-02T16:22:26+00:00" + }, + { + "value": "0.8.1", + "release_date": "2009-06-08T12:55:49+00:00" + }, + { + "value": "0.8.2", + "release_date": "2009-06-15T08:15:11+00:00" + }, + { + "value": "0.8.3", + "release_date": "2009-06-19T10:56:35+00:00" + }, + { + "value": "0.8.4", + "release_date": "2009-06-22T09:17:24+00:00" + }, + { + "value": "0.8.5", + "release_date": "2009-07-13T11:47:59+00:00" + }, + { + "value": "0.8.6", + "release_date": "2009-07-20T08:24:31+00:00" + }, + { + "value": "0.8.7", + "release_date": "2009-07-27T15:24:01+00:00" + }, + { + "value": "0.8.8", + "release_date": "2009-08-10T08:26:27+00:00" + }, + { + "value": "0.8.9", + "release_date": "2009-08-17T17:59:56+00:00" + }, + { + "value": "0.8.10", + "release_date": "2009-08-24T11:10:36+00:00" + }, + { + "value": "0.8.11", + "release_date": "2009-08-28T13:21:06+00:00" + }, + { + "value": "0.8.12", + "release_date": "2009-08-31T11:32:16+00:00" + }, + { + "value": "0.8.13", + "release_date": "2009-08-31T15:02:36+00:00" + }, + { + "value": "0.8.14", + "release_date": "2009-09-07T08:25:45+00:00" + }, + { + "value": "0.8.15", + "release_date": "2009-09-14T13:07:17+00:00" + }, + { + "value": "0.8.16", + "release_date": "2009-09-22T14:35:21+00:00" + }, + { + "value": "0.8.17", + "release_date": "2009-09-28T13:08:09+00:00" + }, + { + "value": "0.8.18", + "release_date": "2009-10-06T12:44:50+00:00" + }, + { + "value": "0.8.19", + "release_date": "2009-10-06T16:19:42+00:00" + }, + { + "value": "0.8.20", + "release_date": "2009-10-14T12:57:25+00:00" + }, + { + "value": "0.8.21", + "release_date": "2009-10-26T14:09:25+00:00" + }, + { + "value": "0.8.22", + "release_date": "2009-11-03T18:52:37+00:00" + }, + { + "value": "0.8.23", + "release_date": "2009-11-11T11:05:22+00:00" + }, + { + "value": "0.8.24", + "release_date": "2009-11-11T14:53:17+00:00" + }, + { + "value": "0.8.25", + "release_date": "2009-11-16T13:47:10+00:00" + }, + { + "value": "0.8.26", + "release_date": "2009-11-16T19:25:37+00:00" + }, + { + "value": "0.8.27", + "release_date": "2009-11-17T16:53:17+00:00" + }, + { + "value": "0.8.28", + "release_date": "2009-11-23T15:53:12+00:00" + }, + { + "value": "0.8.29", + "release_date": "2009-11-30T13:28:12+00:00" + }, + { + "value": "0.8.30", + "release_date": "2009-12-15T14:34:09+00:00" + }, + { + "value": "0.8.31", + "release_date": "2009-12-23T15:44:31+00:00" + }, + { + "value": "0.8.32", + "release_date": "2010-01-11T15:35:44+00:00" + }, + { + "value": "0.8.33", + "release_date": "2010-02-01T13:36:31+00:00" + }, + { + "value": "0.8.34", + "release_date": "2010-03-03T17:00:09+00:00" + }, + { + "value": "0.8.35", + "release_date": "2010-04-01T15:44:11+00:00" + }, + { + "value": "0.8.36", + "release_date": "2010-04-22T17:37:21+00:00" + }, + { + "value": "0.8.37", + "release_date": "2010-05-17T06:08:52+00:00" + }, + { + "value": "0.8.38", + "release_date": "2010-05-24T12:47:49+00:00" + }, + { + "value": "0.8.39", + "release_date": "2010-05-31T15:10:04+00:00" + }, + { + "value": "0.8.40", + "release_date": "2010-06-07T12:38:32+00:00" + }, + { + "value": "0.8.41", + "release_date": "2010-06-15T09:45:06+00:00" + }, + { + "value": "0.8.42", + "release_date": "2010-06-21T10:16:24+00:00" + }, + { + "value": "0.8.43", + "release_date": "2010-06-30T15:11:43+00:00" + }, + { + "value": "0.8.44", + "release_date": "2010-07-05T15:23:55+00:00" + }, + { + "value": "0.8.45", + "release_date": "2010-07-13T11:59:36+00:00" + }, + { + "value": "0.8.46", + "release_date": "2010-07-19T11:31:30+00:00" + }, + { + "value": "0.8.47", + "release_date": "2010-07-28T16:16:48+00:00" + }, + { + "value": "0.8.48", + "release_date": "2010-08-03T15:10:56+00:00" + }, + { + "value": "0.8.49", + "release_date": "2010-08-09T08:24:13+00:00" + }, + { + "value": "0.8.50", + "release_date": "2010-09-02T14:59:18+00:00" + }, + { + "value": "0.8.51", + "release_date": "2010-09-27T13:08:40+00:00" + }, + { + "value": "0.8.52", + "release_date": "2010-09-28T06:59:58+00:00" + }, + { + "value": "0.8.53", + "release_date": "2010-10-18T12:03:26+00:00" + }, + { + "value": "0.8.54", + "release_date": "2010-12-14T10:55:48+00:00" + }, + { + "value": "0.8.55", + "release_date": "2011-07-19T13:59:47+00:00" + }, + { + "value": "0.9.0", + "release_date": "2010-11-29T15:29:31+00:00" + }, + { + "value": "0.9.1", + "release_date": "2010-11-30T13:10:32+00:00" + }, + { + "value": "0.9.2", + "release_date": "2010-12-06T11:36:30+00:00" + }, + { + "value": "0.9.3", + "release_date": "2010-12-13T11:05:52+00:00" + }, + { + "value": "0.9.4", + "release_date": "2011-01-21T11:04:39+00:00" + }, + { + "value": "0.9.5", + "release_date": "2011-02-21T09:43:57+00:00" + }, + { + "value": "0.9.6", + "release_date": "2011-03-21T15:33:26+00:00" + }, + { + "value": "0.9.7", + "release_date": "2011-04-04T12:50:22+00:00" + }, + { + "value": "1.0.0", + "release_date": "2011-04-12T09:04:32+00:00" + }, + { + "value": "1.0.1", + "release_date": "2011-05-03T12:12:04+00:00" + }, + { + "value": "1.0.2", + "release_date": "2011-05-10T12:27:52+00:00" + }, + { + "value": "1.0.3", + "release_date": "2011-05-25T14:50:50+00:00" + }, + { + "value": "1.0.4", + "release_date": "2011-06-01T09:29:58+00:00" + }, + { + "value": "1.0.5", + "release_date": "2011-07-19T13:38:37+00:00" + }, + { + "value": "1.0.6", + "release_date": "2011-08-29T14:28:23+00:00" + }, + { + "value": "1.0.7", + "release_date": "2011-09-30T15:35:23+00:00" + }, + { + "value": "1.0.8", + "release_date": "2011-10-01T06:00:42+00:00" + }, + { + "value": "1.0.9", + "release_date": "2011-11-01T14:51:19+00:00" + }, + { + "value": "1.0.10", + "release_date": "2011-11-15T08:24:03+00:00" + }, + { + "value": "1.0.11", + "release_date": "2011-12-15T14:04:39+00:00" + }, + { + "value": "1.0.12", + "release_date": "2012-02-06T14:08:59+00:00" + }, + { + "value": "1.0.13", + "release_date": "2012-03-05T15:19:49+00:00" + }, + { + "value": "1.0.14", + "release_date": "2012-03-15T11:50:53+00:00" + }, + { + "value": "1.0.15", + "release_date": "2012-04-12T13:00:53+00:00" + }, + { + "value": "1.1.0", + "release_date": "2011-08-01T14:47:40+00:00" + }, + { + "value": "1.1.1", + "release_date": "2011-08-22T13:56:08+00:00" + }, + { + "value": "1.1.2", + "release_date": "2011-09-05T13:14:27+00:00" + }, + { + "value": "1.1.3", + "release_date": "2011-09-14T15:00:43+00:00" + }, + { + "value": "1.1.4", + "release_date": "2011-09-20T11:18:24+00:00" + }, + { + "value": "1.1.5", + "release_date": "2011-10-05T14:44:11+00:00" + }, + { + "value": "1.1.6", + "release_date": "2011-10-17T15:10:23+00:00" + }, + { + "value": "1.1.7", + "release_date": "2011-10-31T14:52:46+00:00" + }, + { + "value": "1.1.8", + "release_date": "2011-11-14T15:37:54+00:00" + }, + { + "value": "1.1.9", + "release_date": "2011-11-28T15:02:38+00:00" + }, + { + "value": "1.1.10", + "release_date": "2011-11-30T10:00:50+00:00" + }, + { + "value": "1.1.11", + "release_date": "2011-12-12T14:17:49+00:00" + }, + { + "value": "1.1.12", + "release_date": "2011-12-26T15:05:17+00:00" + }, + { + "value": "1.1.13", + "release_date": "2012-01-16T15:14:37+00:00" + }, + { + "value": "1.1.14", + "release_date": "2012-01-30T13:52:10+00:00" + }, + { + "value": "1.1.15", + "release_date": "2012-02-15T13:26:06+00:00" + }, + { + "value": "1.1.16", + "release_date": "2012-02-29T13:45:18+00:00" + }, + { + "value": "1.1.17", + "release_date": "2012-03-15T11:32:18+00:00" + }, + { + "value": "1.1.18", + "release_date": "2012-03-28T13:29:29+00:00" + }, + { + "value": "1.1.19", + "release_date": "2012-04-12T12:42:46+00:00" + }, + { + "value": "1.2.0", + "release_date": "2012-04-23T13:06:47+00:00" + }, + { + "value": "1.2.2", + "release_date": "2012-07-03T10:48:31+00:00" + }, + { + "value": "1.2.3", + "release_date": "2012-08-07T12:35:56+00:00" + }, + { + "value": "1.2.4", + "release_date": "2012-09-25T13:42:43+00:00" + }, + { + "value": "1.2.5", + "release_date": "2012-11-13T13:34:59+00:00" + }, + { + "value": "1.2.6", + "release_date": "2012-12-11T14:24:23+00:00" + }, + { + "value": "1.2.7", + "release_date": "2013-02-12T13:40:16+00:00" + }, + { + "value": "1.2.8", + "release_date": "2013-04-02T12:34:21+00:00" + }, + { + "value": "1.2.9", + "release_date": "2013-05-13T10:41:51+00:00" + }, + { + "value": "1.3.0", + "release_date": "2012-05-15T14:23:49+00:00" + }, + { + "value": "1.3.1", + "release_date": "2012-06-05T13:47:29+00:00" + }, + { + "value": "1.3.2", + "release_date": "2012-06-26T13:46:23+00:00" + }, + { + "value": "1.3.3", + "release_date": "2012-07-10T12:20:10+00:00" + }, + { + "value": "1.3.4", + "release_date": "2012-07-31T12:38:37+00:00" + }, + { + "value": "1.3.5", + "release_date": "2012-08-21T13:05:02+00:00" + }, + { + "value": "1.3.6", + "release_date": "2012-09-12T10:41:36+00:00" + }, + { + "value": "1.3.7", + "release_date": "2012-10-02T13:33:37+00:00" + }, + { + "value": "1.3.8", + "release_date": "2012-10-30T13:34:23+00:00" + }, + { + "value": "1.3.9", + "release_date": "2012-11-27T13:55:34+00:00" + }, + { + "value": "1.3.10", + "release_date": "2012-12-25T14:23:45+00:00" + }, + { + "value": "1.3.11", + "release_date": "2013-01-10T13:17:04+00:00" + }, + { + "value": "1.3.12", + "release_date": "2013-02-05T14:06:41+00:00" + }, + { + "value": "1.3.13", + "release_date": "2013-02-19T15:14:48+00:00" + }, + { + "value": "1.3.14", + "release_date": "2013-03-05T14:35:58+00:00" + }, + { + "value": "1.3.15", + "release_date": "2013-03-26T13:03:02+00:00" + }, + { + "value": "1.3.16", + "release_date": "2013-04-16T14:05:11+00:00" + }, + { + "value": "1.4.0", + "release_date": "2013-04-24T13:59:34+00:00" + }, + { + "value": "1.4.1", + "release_date": "2013-05-06T10:20:27+00:00" + }, + { + "value": "1.4.2", + "release_date": "2013-07-17T12:51:21+00:00" + }, + { + "value": "1.4.3", + "release_date": "2013-10-08T12:07:13+00:00" + }, + { + "value": "1.4.4", + "release_date": "2013-11-19T11:25:24+00:00" + }, + { + "value": "1.4.5", + "release_date": "2014-02-11T13:24:43+00:00" + }, + { + "value": "1.4.6", + "release_date": "2014-03-04T11:46:44+00:00" + }, + { + "value": "1.4.7", + "release_date": "2014-03-18T13:17:09+00:00" + }, + { + "value": "1.5.0", + "release_date": "2013-05-06T09:52:36+00:00" + }, + { + "value": "1.5.1", + "release_date": "2013-06-04T13:21:52+00:00" + }, + { + "value": "1.5.2", + "release_date": "2013-07-02T12:28:50+00:00" + }, + { + "value": "1.5.3", + "release_date": "2013-07-30T13:27:55+00:00" + }, + { + "value": "1.5.4", + "release_date": "2013-08-27T13:37:15+00:00" + }, + { + "value": "1.5.5", + "release_date": "2013-09-17T13:31:00+00:00" + }, + { + "value": "1.5.6", + "release_date": "2013-10-01T13:44:51+00:00" + }, + { + "value": "1.5.7", + "release_date": "2013-11-19T10:03:47+00:00" + }, + { + "value": "1.5.8", + "release_date": "2013-12-17T13:46:26+00:00" + }, + { + "value": "1.5.9", + "release_date": "2014-01-22T13:42:59+00:00" + }, + { + "value": "1.5.10", + "release_date": "2014-02-04T12:26:46+00:00" + }, + { + "value": "1.5.11", + "release_date": "2014-03-04T11:39:23+00:00" + }, + { + "value": "1.5.12", + "release_date": "2014-03-18T13:08:35+00:00" + }, + { + "value": "1.5.13", + "release_date": "2014-04-08T14:15:21+00:00" + }, + { + "value": "1.6.0", + "release_date": "2014-04-24T12:52:24+00:00" + }, + { + "value": "1.6.1", + "release_date": "2014-08-05T11:18:34+00:00" + }, + { + "value": "1.6.2", + "release_date": "2014-09-16T12:23:18+00:00" + }, + { + "value": "1.6.3", + "release_date": "2015-04-07T15:51:37+00:00" + }, + { + "value": "1.7.0", + "release_date": "2014-04-24T12:54:22+00:00" + }, + { + "value": "1.7.1", + "release_date": "2014-05-27T13:58:08+00:00" + }, + { + "value": "1.7.2", + "release_date": "2014-06-17T12:51:25+00:00" + }, + { + "value": "1.7.3", + "release_date": "2014-07-08T13:22:38+00:00" + }, + { + "value": "1.7.4", + "release_date": "2014-08-05T11:13:04+00:00" + }, + { + "value": "1.7.5", + "release_date": "2014-09-16T12:19:03+00:00" + }, + { + "value": "1.7.6", + "release_date": "2014-09-30T13:20:32+00:00" + }, + { + "value": "1.7.7", + "release_date": "2014-10-28T15:04:46+00:00" + }, + { + "value": "1.7.8", + "release_date": "2014-12-02T13:02:14+00:00" + }, + { + "value": "1.7.9", + "release_date": "2014-12-23T15:28:37+00:00" + }, + { + "value": "1.7.10", + "release_date": "2015-02-10T14:33:32+00:00" + }, + { + "value": "1.7.11", + "release_date": "2015-03-24T15:45:34+00:00" + }, + { + "value": "1.7.12", + "release_date": "2015-04-07T15:35:33+00:00" + }, + { + "value": "1.8.0", + "release_date": "2015-04-21T14:11:58+00:00" + }, + { + "value": "1.8.1", + "release_date": "2016-01-26T14:39:30+00:00" + }, + { + "value": "1.9.0", + "release_date": "2015-04-28T15:31:17+00:00" + }, + { + "value": "1.9.1", + "release_date": "2015-05-26T13:49:50+00:00" + }, + { + "value": "1.9.2", + "release_date": "2015-06-16T14:49:39+00:00" + }, + { + "value": "1.9.3", + "release_date": "2015-07-14T16:46:05+00:00" + }, + { + "value": "1.9.4", + "release_date": "2015-08-18T15:16:17+00:00" + }, + { + "value": "1.9.5", + "release_date": "2015-09-22T14:36:21+00:00" + }, + { + "value": "1.9.6", + "release_date": "2015-10-27T13:47:29+00:00" + }, + { + "value": "1.9.7", + "release_date": "2015-11-17T14:50:56+00:00" + }, + { + "value": "1.9.8", + "release_date": "2015-12-08T15:16:51+00:00" + }, + { + "value": "1.9.9", + "release_date": "2015-12-09T14:47:20+00:00" + }, + { + "value": "1.9.10", + "release_date": "2016-01-26T14:27:40+00:00" + }, + { + "value": "1.9.11", + "release_date": "2016-02-09T14:11:56+00:00" + }, + { + "value": "1.9.12", + "release_date": "2016-02-24T14:53:22+00:00" + }, + { + "value": "1.9.13", + "release_date": "2016-03-29T15:09:30+00:00" + }, + { + "value": "1.9.14", + "release_date": "2016-04-05T14:57:08+00:00" + }, + { + "value": "1.9.15", + "release_date": "2016-04-19T16:02:37+00:00" + }, + { + "value": "1.10.0", + "release_date": "2016-04-26T13:31:18+00:00" + }, + { + "value": "1.10.1", + "release_date": "2016-05-31T13:47:01+00:00" + }, + { + "value": "1.10.2", + "release_date": "2016-10-18T15:03:12+00:00" + }, + { + "value": "1.10.3", + "release_date": "2017-01-31T15:01:10+00:00" + }, + { + "value": "1.11.0", + "release_date": "2016-05-24T15:54:41+00:00" + }, + { + "value": "1.11.1", + "release_date": "2016-05-31T13:43:49+00:00" + }, + { + "value": "1.11.2", + "release_date": "2016-07-05T15:56:14+00:00" + }, + { + "value": "1.11.3", + "release_date": "2016-07-26T13:58:58+00:00" + }, + { + "value": "1.11.4", + "release_date": "2016-09-13T15:39:23+00:00" + }, + { + "value": "1.11.5", + "release_date": "2016-10-11T15:03:00+00:00" + }, + { + "value": "1.11.6", + "release_date": "2016-11-15T15:11:46+00:00" + }, + { + "value": "1.11.7", + "release_date": "2016-12-13T15:21:23+00:00" + }, + { + "value": "1.11.8", + "release_date": "2016-12-27T14:23:07+00:00" + }, + { + "value": "1.11.9", + "release_date": "2017-01-24T14:02:18+00:00" + }, + { + "value": "1.11.10", + "release_date": "2017-02-14T15:36:04+00:00" + }, + { + "value": "1.11.11", + "release_date": "2017-03-21T15:04:22+00:00" + }, + { + "value": "1.11.12", + "release_date": "2017-03-24T15:05:05+00:00" + }, + { + "value": "1.11.13", + "release_date": "2017-04-04T15:01:57+00:00" + }, + { + "value": "1.12.0", + "release_date": "2017-04-12T14:46:00+00:00" + }, + { + "value": "1.12.1", + "release_date": "2017-07-11T13:24:04+00:00" + }, + { + "value": "1.12.2", + "release_date": "2017-10-17T13:16:37+00:00" + }, + { + "value": "1.13.0", + "release_date": "2017-04-25T14:18:21+00:00" + }, + { + "value": "1.13.1", + "release_date": "2017-05-30T14:55:22+00:00" + }, + { + "value": "1.13.2", + "release_date": "2017-06-27T14:44:17+00:00" + }, + { + "value": "1.13.3", + "release_date": "2017-07-11T13:18:30+00:00" + }, + { + "value": "1.13.4", + "release_date": "2017-08-08T15:00:11+00:00" + }, + { + "value": "1.13.5", + "release_date": "2017-09-05T14:59:31+00:00" + }, + { + "value": "1.13.6", + "release_date": "2017-10-10T15:22:50+00:00" + }, + { + "value": "1.13.7", + "release_date": "2017-11-21T15:09:43+00:00" + }, + { + "value": "1.13.8", + "release_date": "2017-12-26T16:01:11+00:00" + }, + { + "value": "1.13.9", + "release_date": "2018-02-20T14:08:48+00:00" + }, + { + "value": "1.13.10", + "release_date": "2018-03-20T15:58:30+00:00" + }, + { + "value": "1.13.11", + "release_date": "2018-04-03T14:38:09+00:00" + }, + { + "value": "1.13.12", + "release_date": "2018-04-10T14:11:09+00:00" + }, + { + "value": "1.14.0", + "release_date": "2018-04-17T15:22:35+00:00" + }, + { + "value": "1.14.1", + "release_date": "2018-11-06T13:52:46+00:00" + }, + { + "value": "1.14.2", + "release_date": "2018-12-04T14:52:24+00:00" + }, + { + "value": "1.15.0", + "release_date": "2018-06-05T13:47:25+00:00" + }, + { + "value": "1.15.1", + "release_date": "2018-07-03T15:07:43+00:00" + }, + { + "value": "1.15.2", + "release_date": "2018-07-24T13:10:59+00:00" + }, + { + "value": "1.15.3", + "release_date": "2018-08-28T15:36:00+00:00" + }, + { + "value": "1.15.4", + "release_date": "2018-09-25T15:11:39+00:00" + }, + { + "value": "1.15.5", + "release_date": "2018-10-02T15:13:51+00:00" + }, + { + "value": "1.15.6", + "release_date": "2018-11-06T13:32:08+00:00" + }, + { + "value": "1.15.7", + "release_date": "2018-11-27T14:40:20+00:00" + }, + { + "value": "1.15.8", + "release_date": "2018-12-25T14:53:03+00:00" + }, + { + "value": "1.15.9", + "release_date": "2019-02-26T15:29:22+00:00" + }, + { + "value": "1.15.10", + "release_date": "2019-03-26T14:06:54+00:00" + }, + { + "value": "1.15.11", + "release_date": "2019-04-09T13:00:30+00:00" + }, + { + "value": "1.15.12", + "release_date": "2019-04-16T14:54:58+00:00" + }, + { + "value": "1.16.0", + "release_date": "2019-04-23T13:12:57+00:00" + }, + { + "value": "1.16.1", + "release_date": "2019-08-13T12:51:42+00:00" + }, + { + "value": "1.17.0", + "release_date": "2019-05-21T14:23:57+00:00" + }, + { + "value": "1.17.1", + "release_date": "2019-06-25T12:19:45+00:00" + }, + { + "value": "1.17.2", + "release_date": "2019-07-23T12:01:47+00:00" + }, + { + "value": "1.17.3", + "release_date": "2019-08-13T12:45:56+00:00" + }, + { + "value": "1.17.4", + "release_date": "2019-09-24T15:08:48+00:00" + }, + { + "value": "1.17.5", + "release_date": "2019-10-22T15:16:08+00:00" + }, + { + "value": "1.17.6", + "release_date": "2019-11-19T14:18:58+00:00" + }, + { + "value": "1.17.7", + "release_date": "2019-12-24T15:00:09+00:00" + }, + { + "value": "1.17.8", + "release_date": "2020-01-21T13:39:41+00:00" + }, + { + "value": "1.17.9", + "release_date": "2020-03-03T15:04:21+00:00" + }, + { + "value": "1.17.10", + "release_date": "2020-04-14T14:19:26+00:00" + }, + { + "value": "1.18.0", + "release_date": "2020-04-21T14:09:01+00:00" + }, + { + "value": "1.19.0", + "release_date": "2020-05-26T15:00:20+00:00" + }, + { + "value": "1.19.1", + "release_date": "2020-07-07T15:56:05+00:00" + }, + { + "value": "1.19.2", + "release_date": "2020-08-11T14:52:30+00:00" + }, + { + "value": "1.19.3", + "release_date": "2020-09-29T14:32:10+00:00" + }, + { + "value": "1.19.4", + "release_date": "2020-10-27T15:09:20+00:00" + }, + { + "value": "1.19.5", + "release_date": "2020-11-24T15:06:34+00:00" + }, + { + "value": "1.19.6", + "release_date": "2020-12-15T14:41:39+00:00" + }, + { + "value": "1.19.7", + "release_date": "2021-02-16T15:57:18+00:00" + }, + { + "value": "1.19.8", + "release_date": "2021-03-09T15:27:50+00:00" + }, + { + "value": "1.19.9", + "release_date": "2021-03-30T14:47:11+00:00" + }, + { + "value": "1.19.10", + "release_date": "2021-04-13T15:13:58+00:00" + }, + { + "value": "1.20.0", + "release_date": "2021-04-20T13:35:46+00:00" + }, + { + "value": "1.20.1", + "release_date": "2021-05-25T12:35:38+00:00" + }, + { + "value": "1.20.2", + "release_date": "2021-11-16T14:44:02+00:00" + }, + { + "value": "1.21.0", + "release_date": "2021-05-25T12:28:55+00:00" + }, + { + "value": "1.21.1", + "release_date": "2021-07-06T14:59:16+00:00" + }, + { + "value": "1.21.2", + "release_date": "2021-08-31T15:13:46+00:00" + }, + { + "value": "1.21.3", + "release_date": "2021-09-07T15:21:02+00:00" + }, + { + "value": "1.21.4", + "release_date": "2021-11-02T14:49:22+00:00" + }, + { + "value": "1.21.5", + "release_date": "2021-12-28T15:28:37+00:00" + }, + { + "value": "1.21.6", + "release_date": "2022-01-25T15:03:51+00:00" + } +] \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/security_advisories-advisory_data-expected.json b/vulnerabilities/tests/test_data/nginx/security_advisories-advisory_data-expected.json new file mode 100644 index 000000000..3734a5529 --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/security_advisories-advisory_data-expected.json @@ -0,0 +1,1655 @@ +[ + { + "aliases": [ + "CVE-2021-23017" + ], + "summary": "1-byte memory overwrite in resolver", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.20.0", + "fixed_version": "1.21.0" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.20.0", + "fixed_version": "1.20.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2021/000300.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2021-23017", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-23017", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2021.resolver.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2021.resolver.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2019-9511" + ], + "summary": "Excessive CPU usage in HTTP/2 with small window updates", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2", + "fixed_version": "1.17.3" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2", + "fixed_version": "1.16.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2019/000249.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2019-9511", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9511", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2019-9513" + ], + "summary": "Excessive CPU usage in HTTP/2 with priority changes", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2", + "fixed_version": "1.17.3" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2", + "fixed_version": "1.16.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2019/000249.html", + "severities": [ + { + "system": "generic_textual", + "value": "low" + } + ] + }, + { + "reference_id": "CVE-2019-9513", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9513", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2019-9516" + ], + "summary": "Excessive memory usage in HTTP/2 with zero length headers", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2", + "fixed_version": "1.17.3" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2", + "fixed_version": "1.16.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2019/000249.html", + "severities": [ + { + "system": "generic_textual", + "value": "low" + } + ] + }, + { + "reference_id": "CVE-2019-9516", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9516", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2018-16843" + ], + "summary": "Excessive memory usage in HTTP/2", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.15.5", + "fixed_version": "1.15.6" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.15.5", + "fixed_version": "1.14.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2018/000220.html", + "severities": [ + { + "system": "generic_textual", + "value": "low" + } + ] + }, + { + "reference_id": "CVE-2018-16843", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-16843", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2018-16844" + ], + "summary": "Excessive CPU usage in HTTP/2", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.15.5", + "fixed_version": "1.15.6" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.9.5|<=1.15.5", + "fixed_version": "1.14.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2018/000220.html", + "severities": [ + { + "system": "generic_textual", + "value": "low" + } + ] + }, + { + "reference_id": "CVE-2018-16844", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-16844", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2018-16845" + ], + "summary": "Memory disclosure in the ngx_http_mp4_module", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.0.7|<=1.0.15|>=1.1.3|<=1.15.5", + "fixed_version": "1.15.6" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.0.7|<=1.0.15|>=1.1.3|<=1.15.5", + "fixed_version": "1.14.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2018/000221.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2018-16845", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-16845", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2018.mp4.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2018.mp4.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2017-7529" + ], + "summary": "Integer overflow in the range filter", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.5.6|<=1.13.2", + "fixed_version": "1.13.3" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.5.6|<=1.13.2", + "fixed_version": "1.12.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2017/000200.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2017-7529", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2017-7529", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2017.ranges.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2017.ranges.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2016-4450" + ], + "summary": "NULL pointer dereference while writing client request body", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.3.9|<=1.11.0", + "fixed_version": "1.11.1" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.3.9|<=1.11.0", + "fixed_version": "1.10.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2016/000179.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2016-4450", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2016-4450", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2016.write.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2016.write.txt.asc", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2016.write2.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2016.write2.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2016-0742" + ], + "summary": "Invalid pointer dereference in resolver", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9", + "fixed_version": "1.9.10" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9", + "fixed_version": "1.8.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2016/000169.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2016-0742", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2016-0742", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2016-0746" + ], + "summary": "Use-after-free during CNAME response processing in resolver", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9", + "fixed_version": "1.9.10" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9", + "fixed_version": "1.8.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2016/000169.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2016-0746", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2016-0746", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2016-0747" + ], + "summary": "Insufficient limits of CNAME resolution in resolver", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9", + "fixed_version": "1.9.10" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9", + "fixed_version": "1.8.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2016/000169.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2016-0747", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2016-0747", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2014-3616" + ], + "summary": "SSL session reuse vulnerability", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.5.6|<=1.7.4", + "fixed_version": "1.7.5" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.5.6|<=1.7.4", + "fixed_version": "1.6.2" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2014/000147.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2014-3616", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2014-3616", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2014-3556" + ], + "summary": "STARTTLS command injection", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.5.6|<=1.7.3", + "fixed_version": "1.7.4" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.5.6|<=1.7.3", + "fixed_version": "1.6.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2014/000144.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2014-3556", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2014-3556", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2014.starttls.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2014.starttls.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2014-0133" + ], + "summary": "SPDY heap buffer overflow", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.3.15|<=1.5.11", + "fixed_version": "1.5.12" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.3.15|<=1.5.11", + "fixed_version": "1.4.7" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2014/000135.html", + "severities": [] + }, + { + "reference_id": "CVE-2014-0133", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2014-0133", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2014.spdy2.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2014.spdy2.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2014-0088" + ], + "summary": "SPDY memory corruption", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/1.5.10", + "fixed_version": "1.5.11" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2014/000132.html", + "severities": [] + }, + { + "reference_id": "CVE-2014-0088", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2014-0088", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2014.spdy.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2014.spdy.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2013-4547" + ], + "summary": "Request line parsing vulnerability", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.8.41|<=1.5.6", + "fixed_version": "1.5.7" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.8.41|<=1.5.6", + "fixed_version": "1.4.4" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2013/000125.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2013-4547", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2013-4547", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2013.space.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2013.space.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2013-2070" + ], + "summary": "Memory disclosure with specially crafted HTTP backend responses", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.1.4|<=1.2.8|>=1.3.9|<=1.4.0", + "fixed_version": "1.5.0" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.1.4|<=1.2.8|>=1.3.9|<=1.4.0", + "fixed_version": "1.4.1" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.1.4|<=1.2.8|>=1.3.9|<=1.4.0", + "fixed_version": "1.2.9" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2013/000114.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2013-2070", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2013-2070", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2013.chunked.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2013.chunked.txt.asc", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2013.proxy.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2013.proxy.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2013-2028" + ], + "summary": "Stack-based buffer overflow with specially crafted request", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.3.9|<=1.4.0", + "fixed_version": "1.5.0" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.3.9|<=1.4.0", + "fixed_version": "1.4.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2013/000112.html", + "severities": [] + }, + { + "reference_id": "CVE-2013-2028", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2013-2028", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2013.chunked.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2013.chunked.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2011-4963" + ], + "summary": "Vulnerabilities with Windows directory aliases", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": { + "os": "windows" + }, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.7.52|<=1.3.0", + "fixed_version": "1.3.1" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": { + "os": "windows" + }, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.7.52|<=1.3.0", + "fixed_version": "1.2.1" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2012/000086.html", + "severities": [ + { + "system": "generic_textual", + "value": "medium" + } + ] + }, + { + "reference_id": "CVE-2011-4963", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2011-4963", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2012-2089" + ], + "summary": "Buffer overflow in the ngx_http_mp4_module", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.0.7|<=1.0.14|>=1.1.3|<=1.1.18", + "fixed_version": "1.1.19" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=1.0.7|<=1.0.14|>=1.1.3|<=1.1.18", + "fixed_version": "1.0.15" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2012/000080.html", + "severities": [] + }, + { + "reference_id": "CVE-2012-2089", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2012-2089", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2012.mp4.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2012.mp4.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2012-1180" + ], + "summary": "Memory disclosure with specially crafted backend responses", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=1.1.16", + "fixed_version": "1.1.17" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=1.1.16", + "fixed_version": "1.0.14" + } + ], + "references": [ + { + "reference_id": "", + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2012/000076.html", + "severities": [] + }, + { + "reference_id": "CVE-2012-1180", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2012-1180", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2012.memory.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.2012.memory.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2011-4315" + ], + "summary": "Buffer overflow in resolver", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.1.7", + "fixed_version": "1.1.8" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.6.18|<=1.1.7", + "fixed_version": "1.0.10" + } + ], + "references": [ + { + "reference_id": "CVE-2011-4315", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2011-4315", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2010-2266" + ], + "summary": "Vulnerabilities with invalid UTF-8 sequence on Windows", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": { + "os": "windows" + }, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.40", + "fixed_version": "0.8.41" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": { + "os": "windows" + }, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.40", + "fixed_version": "0.7.67" + } + ], + "references": [ + { + "reference_id": "CVE-2010-2266", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2010-2266", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2010-2263" + ], + "summary": "Vulnerabilities with Windows file default stream", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": { + "os": "windows" + }, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.39", + "fixed_version": "0.8.40" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": { + "os": "windows" + }, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.39", + "fixed_version": "0.7.66" + } + ], + "references": [ + { + "reference_id": "CVE-2010-2263", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2010-2263", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CORE-2010-0121" + ], + "summary": "Vulnerabilities with Windows 8.3 filename pseudonyms", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": { + "os": "windows" + }, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.32", + "fixed_version": "0.8.33" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": { + "os": "windows" + }, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.32", + "fixed_version": "0.7.65" + } + ], + "references": [], + "date_published": null + }, + { + "aliases": [ + "CVE-2009-4487" + ], + "summary": "An error log data are not sanitized", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/*", + "fixed_version": null + } + ], + "references": [ + { + "reference_id": "CVE-2009-4487", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2009-4487", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "VU#120541", + "CVE-2009-3555" + ], + "summary": "The renegotiation vulnerability in SSL protocol", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.22", + "fixed_version": "0.8.23" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.22", + "fixed_version": "0.7.64" + } + ], + "references": [ + { + "reference_id": "CVE-2009-3555", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2009-3555", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.cve-2009-3555.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.cve-2009-3555.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2009-3898" + ], + "summary": "Directory traversal vulnerability", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.16", + "fixed_version": "0.8.17" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.16", + "fixed_version": "0.7.63" + } + ], + "references": [ + { + "reference_id": "CVE-2009-3898", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2009-3898", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "VU#180065", + "CVE-2009-2629" + ], + "summary": "Buffer underflow vulnerability", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.14", + "fixed_version": "0.8.15" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.14", + "fixed_version": "0.7.62" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.14", + "fixed_version": "0.6.39" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.14", + "fixed_version": "0.5.38" + } + ], + "references": [ + { + "reference_id": "CVE-2009-2629", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2009-2629", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.180065.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.180065.txt.asc", + "severities": [] + } + ], + "date_published": null + }, + { + "aliases": [ + "CVE-2009-3896" + ], + "summary": "Null pointer dereference vulnerability", + "affected_packages": [ + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.13", + "fixed_version": "0.8.14" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.13", + "fixed_version": "0.7.62" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.13", + "fixed_version": "0.6.39" + }, + { + "package": { + "type": "nginx", + "namespace": null, + "name": "nginx", + "version": null, + "qualifiers": null, + "subpath": null + }, + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.13", + "fixed_version": "0.5.38" + } + ], + "references": [ + { + "reference_id": "CVE-2009-3896", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2009-3896", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.null.pointer.txt", + "severities": [] + }, + { + "reference_id": "", + "url": "https://nginx.org/download/patch.null.pointer.txt.asc", + "severities": [] + } + ], + "date_published": null + } +] \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/security_advisories-importer-expected.json b/vulnerabilities/tests/test_data/nginx/security_advisories-importer-expected.json new file mode 100644 index 000000000..6b4f490f4 --- /dev/null +++ b/vulnerabilities/tests/test_data/nginx/security_advisories-importer-expected.json @@ -0,0 +1,1686 @@ +[ + { + "unique_content_id": "dd9de89fd19c456d6452c1fe591238f8", + "aliases": [ + "CVE-2021-23017" + ], + "summary": "1-byte memory overwrite in resolver", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.21.0", + "affected_version_range": "vers:nginx/>=0.6.18|<=1.20.0" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.20.1", + "affected_version_range": "vers:nginx/>=0.6.18|<=1.20.0" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2021/000300.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2021-23017", + "severities": [], + "reference_id": "CVE-2021-23017" + }, + { + "url": "https://nginx.org/download/patch.2021.resolver.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2021.resolver.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "836975e8910970e6adbef6643c714424", + "aliases": [ + "CVE-2019-9511" + ], + "summary": "Excessive CPU usage in HTTP/2 with small window updates", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.17.3", + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.16.1", + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2019/000249.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9511", + "severities": [], + "reference_id": "CVE-2019-9511" + } + ], + "date_published": null + }, + { + "unique_content_id": "0ac8c5b8bbd51df34fcb6e027d5ea044", + "aliases": [ + "CVE-2019-9513" + ], + "summary": "Excessive CPU usage in HTTP/2 with priority changes", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.17.3", + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.16.1", + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2019/000249.html", + "severities": [ + { + "value": "low", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9513", + "severities": [], + "reference_id": "CVE-2019-9513" + } + ], + "date_published": null + }, + { + "unique_content_id": "7d85553ab2c402dc0f68469d0789ec2c", + "aliases": [ + "CVE-2019-9516" + ], + "summary": "Excessive memory usage in HTTP/2 with zero length headers", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.17.3", + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.16.1", + "affected_version_range": "vers:nginx/>=1.9.5|<=1.17.2" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2019/000249.html", + "severities": [ + { + "value": "low", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2019-9516", + "severities": [], + "reference_id": "CVE-2019-9516" + } + ], + "date_published": null + }, + { + "unique_content_id": "7dd33f5c92c595292d689401ae2e2e5e", + "aliases": [ + "CVE-2018-16843" + ], + "summary": "Excessive memory usage in HTTP/2", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.15.6", + "affected_version_range": "vers:nginx/>=1.9.5|<=1.15.5" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.14.1", + "affected_version_range": "vers:nginx/>=1.9.5|<=1.15.5" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2018/000220.html", + "severities": [ + { + "value": "low", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-16843", + "severities": [], + "reference_id": "CVE-2018-16843" + } + ], + "date_published": null + }, + { + "unique_content_id": "3f512172cf08fbf37eed94073722c0d1", + "aliases": [ + "CVE-2018-16844" + ], + "summary": "Excessive CPU usage in HTTP/2", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.15.6", + "affected_version_range": "vers:nginx/>=1.9.5|<=1.15.5" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.14.1", + "affected_version_range": "vers:nginx/>=1.9.5|<=1.15.5" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2018/000220.html", + "severities": [ + { + "value": "low", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-16844", + "severities": [], + "reference_id": "CVE-2018-16844" + } + ], + "date_published": null + }, + { + "unique_content_id": "65afa9db838c6440788e944c0c841e14", + "aliases": [ + "CVE-2018-16845" + ], + "summary": "Memory disclosure in the ngx_http_mp4_module", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.15.6", + "affected_version_range": "vers:nginx/>=1.0.7|<=1.0.15|>=1.1.3|<=1.15.5" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.14.1", + "affected_version_range": "vers:nginx/>=1.0.7|<=1.0.15|>=1.1.3|<=1.15.5" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2018/000221.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-16845", + "severities": [], + "reference_id": "CVE-2018-16845" + }, + { + "url": "https://nginx.org/download/patch.2018.mp4.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2018.mp4.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "b228b252bfacba385255fa39b0ab8a24", + "aliases": [ + "CVE-2017-7529" + ], + "summary": "Integer overflow in the range filter", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.13.3", + "affected_version_range": "vers:nginx/>=0.5.6|<=1.13.2" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.12.1", + "affected_version_range": "vers:nginx/>=0.5.6|<=1.13.2" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2017/000200.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2017-7529", + "severities": [], + "reference_id": "CVE-2017-7529" + }, + { + "url": "https://nginx.org/download/patch.2017.ranges.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2017.ranges.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "55c06fb39c2060ebd4286f059a2de757", + "aliases": [ + "CVE-2016-4450" + ], + "summary": "NULL pointer dereference while writing client request body", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.11.1", + "affected_version_range": "vers:nginx/>=1.3.9|<=1.11.0" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.10.1", + "affected_version_range": "vers:nginx/>=1.3.9|<=1.11.0" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2016/000179.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2016-4450", + "severities": [], + "reference_id": "CVE-2016-4450" + }, + { + "url": "https://nginx.org/download/patch.2016.write.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2016.write.txt.asc", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2016.write2.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2016.write2.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "cc7df0e8e72511288d97344b777f34ba", + "aliases": [ + "CVE-2016-0742" + ], + "summary": "Invalid pointer dereference in resolver", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.9.10", + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.8.1", + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2016/000169.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2016-0742", + "severities": [], + "reference_id": "CVE-2016-0742" + } + ], + "date_published": null + }, + { + "unique_content_id": "3dd9fdd76b336623770856c554207c25", + "aliases": [ + "CVE-2016-0746" + ], + "summary": "Use-after-free during CNAME response processing in resolver", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.9.10", + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.8.1", + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2016/000169.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2016-0746", + "severities": [], + "reference_id": "CVE-2016-0746" + } + ], + "date_published": null + }, + { + "unique_content_id": "efde3660cac695e0cf1a2641d85fc960", + "aliases": [ + "CVE-2016-0747" + ], + "summary": "Insufficient limits of CNAME resolution in resolver", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.9.10", + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.8.1", + "affected_version_range": "vers:nginx/>=0.6.18|<=1.9.9" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2016/000169.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2016-0747", + "severities": [], + "reference_id": "CVE-2016-0747" + } + ], + "date_published": null + }, + { + "unique_content_id": "de51a68688d1254c7b923c4d553673d7", + "aliases": [ + "CVE-2014-3616" + ], + "summary": "SSL session reuse vulnerability", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.7.5", + "affected_version_range": "vers:nginx/>=0.5.6|<=1.7.4" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.6.2", + "affected_version_range": "vers:nginx/>=0.5.6|<=1.7.4" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2014/000147.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2014-3616", + "severities": [], + "reference_id": "CVE-2014-3616" + } + ], + "date_published": null + }, + { + "unique_content_id": "be04a26546034f1bf6dc81fe3f196d21", + "aliases": [ + "CVE-2014-3556" + ], + "summary": "STARTTLS command injection", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.7.4", + "affected_version_range": "vers:nginx/>=1.5.6|<=1.7.3" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.6.1", + "affected_version_range": "vers:nginx/>=1.5.6|<=1.7.3" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2014/000144.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2014-3556", + "severities": [], + "reference_id": "CVE-2014-3556" + }, + { + "url": "https://nginx.org/download/patch.2014.starttls.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2014.starttls.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "0c5952c29a54fdbc5526988c898e639d", + "aliases": [ + "CVE-2014-0133" + ], + "summary": "SPDY heap buffer overflow", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.5.12", + "affected_version_range": "vers:nginx/>=1.3.15|<=1.5.11" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.4.7", + "affected_version_range": "vers:nginx/>=1.3.15|<=1.5.11" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2014/000135.html", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2014-0133", + "severities": [], + "reference_id": "CVE-2014-0133" + }, + { + "url": "https://nginx.org/download/patch.2014.spdy2.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2014.spdy2.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "55dccce79c4247faa1ed8db0f8fbd44f", + "aliases": [ + "CVE-2014-0088" + ], + "summary": "SPDY memory corruption", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.5.11", + "affected_version_range": "vers:nginx/1.5.10" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2014/000132.html", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2014-0088", + "severities": [], + "reference_id": "CVE-2014-0088" + }, + { + "url": "https://nginx.org/download/patch.2014.spdy.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2014.spdy.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "233d69f66b16829cd2563a8d4544c4fc", + "aliases": [ + "CVE-2013-4547" + ], + "summary": "Request line parsing vulnerability", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.5.7", + "affected_version_range": "vers:nginx/>=0.8.41|<=1.5.6" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.4.4", + "affected_version_range": "vers:nginx/>=0.8.41|<=1.5.6" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2013/000125.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2013-4547", + "severities": [], + "reference_id": "CVE-2013-4547" + }, + { + "url": "https://nginx.org/download/patch.2013.space.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2013.space.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "bf07c722836da87901a6a99186aa1451", + "aliases": [ + "CVE-2013-2070" + ], + "summary": "Memory disclosure with specially crafted HTTP backend responses", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.5.0", + "affected_version_range": "vers:nginx/>=1.1.4|<=1.2.8|>=1.3.9|<=1.4.0" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.4.1", + "affected_version_range": "vers:nginx/>=1.1.4|<=1.2.8|>=1.3.9|<=1.4.0" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.2.9", + "affected_version_range": "vers:nginx/>=1.1.4|<=1.2.8|>=1.3.9|<=1.4.0" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2013/000114.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2013-2070", + "severities": [], + "reference_id": "CVE-2013-2070" + }, + { + "url": "https://nginx.org/download/patch.2013.chunked.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2013.chunked.txt.asc", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2013.proxy.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2013.proxy.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "e35afe5b1aadcb66c5ad82c8894dff17", + "aliases": [ + "CVE-2013-2028" + ], + "summary": "Stack-based buffer overflow with specially crafted request", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.5.0", + "affected_version_range": "vers:nginx/>=1.3.9|<=1.4.0" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.4.1", + "affected_version_range": "vers:nginx/>=1.3.9|<=1.4.0" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2013/000112.html", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2013-2028", + "severities": [], + "reference_id": "CVE-2013-2028" + }, + { + "url": "https://nginx.org/download/patch.2013.chunked.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2013.chunked.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "899ece25ddf860b11ce3408d7e1e8eed", + "aliases": [ + "CVE-2011-4963" + ], + "summary": "Vulnerabilities with Windows directory aliases", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": { + "os": "windows" + } + }, + "fixed_version": "1.3.1", + "affected_version_range": "vers:nginx/>=0.7.52|<=1.3.0" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": { + "os": "windows" + } + }, + "fixed_version": "1.2.1", + "affected_version_range": "vers:nginx/>=0.7.52|<=1.3.0" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2012/000086.html", + "severities": [ + { + "value": "medium", + "system": "generic_textual" + } + ], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2011-4963", + "severities": [], + "reference_id": "CVE-2011-4963" + } + ], + "date_published": null + }, + { + "unique_content_id": "b0a336b612b378d72e93193756b3e376", + "aliases": [ + "CVE-2012-2089" + ], + "summary": "Buffer overflow in the ngx_http_mp4_module", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.1.19", + "affected_version_range": "vers:nginx/>=1.0.7|<=1.0.14|>=1.1.3|<=1.1.18" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.0.15", + "affected_version_range": "vers:nginx/>=1.0.7|<=1.0.14|>=1.1.3|<=1.1.18" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2012/000080.html", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2012-2089", + "severities": [], + "reference_id": "CVE-2012-2089" + }, + { + "url": "https://nginx.org/download/patch.2012.mp4.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2012.mp4.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "aff5af1bcc53f6fa1a49917e044acf79", + "aliases": [ + "CVE-2012-1180" + ], + "summary": "Memory disclosure with specially crafted backend responses", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.1.17", + "affected_version_range": "vers:nginx/>=0.1.0|<=1.1.16" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.0.14", + "affected_version_range": "vers:nginx/>=0.1.0|<=1.1.16" + } + ], + "references": [ + { + "url": "http://mailman.nginx.org/pipermail/nginx-announce/2012/000076.html", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2012-1180", + "severities": [], + "reference_id": "CVE-2012-1180" + }, + { + "url": "https://nginx.org/download/patch.2012.memory.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.2012.memory.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "56a7ea32d809aa1a3181ab87eea4fe43", + "aliases": [ + "CVE-2011-4315" + ], + "summary": "Buffer overflow in resolver", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.1.8", + "affected_version_range": "vers:nginx/>=0.6.18|<=1.1.7" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "1.0.10", + "affected_version_range": "vers:nginx/>=0.6.18|<=1.1.7" + } + ], + "references": [ + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2011-4315", + "severities": [], + "reference_id": "CVE-2011-4315" + } + ], + "date_published": null + }, + { + "unique_content_id": "646911f1d2f21611b0a3720f3523b3b2", + "aliases": [ + "CVE-2010-2266" + ], + "summary": "Vulnerabilities with invalid UTF-8 sequence on Windows", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": { + "os": "windows" + } + }, + "fixed_version": "0.8.41", + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.40" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": { + "os": "windows" + } + }, + "fixed_version": "0.7.67", + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.40" + } + ], + "references": [ + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2010-2266", + "severities": [], + "reference_id": "CVE-2010-2266" + } + ], + "date_published": null + }, + { + "unique_content_id": "20cecfba57d0a66b04e1b4b6fb4efb26", + "aliases": [ + "CVE-2010-2263" + ], + "summary": "Vulnerabilities with Windows file default stream", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": { + "os": "windows" + } + }, + "fixed_version": "0.8.40", + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.39" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": { + "os": "windows" + } + }, + "fixed_version": "0.7.66", + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.39" + } + ], + "references": [ + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2010-2263", + "severities": [], + "reference_id": "CVE-2010-2263" + } + ], + "date_published": null + }, + { + "unique_content_id": "9c968129f10b424807b830f0219b8d4c", + "aliases": [ + "CORE-2010-0121" + ], + "summary": "Vulnerabilities with Windows 8.3 filename pseudonyms", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": { + "os": "windows" + } + }, + "fixed_version": "0.8.33", + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.32" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": { + "os": "windows" + } + }, + "fixed_version": "0.7.65", + "affected_version_range": "vers:nginx/>=0.7.52|<=0.8.32" + } + ], + "references": [], + "date_published": null + }, + { + "unique_content_id": "480c77ca27341a47f11299017c7660b7", + "aliases": [ + "CVE-2009-4487" + ], + "summary": "An error log data are not sanitized", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": null, + "affected_version_range": "vers:nginx/*" + } + ], + "references": [ + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2009-4487", + "severities": [], + "reference_id": "CVE-2009-4487" + } + ], + "date_published": null + }, + { + "unique_content_id": "34b7ff4154010452c4dd186b7cbbcc5d", + "aliases": [ + "VU#120541", + "CVE-2009-3555" + ], + "summary": "The renegotiation vulnerability in SSL protocol", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.8.23", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.22" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.7.64", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.22" + } + ], + "references": [ + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2009-3555", + "severities": [], + "reference_id": "CVE-2009-3555" + }, + { + "url": "https://nginx.org/download/patch.cve-2009-3555.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.cve-2009-3555.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "5df3f01df0d85143bc51ddbb453c1581", + "aliases": [ + "CVE-2009-3898" + ], + "summary": "Directory traversal vulnerability", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.8.17", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.16" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.7.63", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.16" + } + ], + "references": [ + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2009-3898", + "severities": [], + "reference_id": "CVE-2009-3898" + } + ], + "date_published": null + }, + { + "unique_content_id": "cef6afb87317112ea248571bd6991994", + "aliases": [ + "VU#180065", + "CVE-2009-2629" + ], + "summary": "Buffer underflow vulnerability", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.8.15", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.14" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.7.62", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.14" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.6.39", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.14" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.5.38", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.14" + } + ], + "references": [ + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2009-2629", + "severities": [], + "reference_id": "CVE-2009-2629" + }, + { + "url": "https://nginx.org/download/patch.180065.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.180065.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + }, + { + "unique_content_id": "b55c336a480792ece857368101645c0c", + "aliases": [ + "CVE-2009-3896" + ], + "summary": "Null pointer dereference vulnerability", + "affected_packages": [ + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.8.14", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.13" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.7.62", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.13" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.6.39", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.13" + }, + { + "package": { + "name": "nginx", + "type": "nginx", + "subpath": null, + "version": null, + "namespace": null, + "qualifiers": null + }, + "fixed_version": "0.5.38", + "affected_version_range": "vers:nginx/>=0.1.0|<=0.8.13" + } + ], + "references": [ + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2009-3896", + "severities": [], + "reference_id": "CVE-2009-3896" + }, + { + "url": "https://nginx.org/download/patch.null.pointer.txt", + "severities": [], + "reference_id": "" + }, + { + "url": "https://nginx.org/download/patch.null.pointer.txt.asc", + "severities": [], + "reference_id": "" + } + ], + "date_published": null + } +] \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/nginx/security_advisories.html b/vulnerabilities/tests/test_data/nginx/security_advisories.html index 58f76f064..db3556eba 100644 --- a/vulnerabilities/tests/test_data/nginx/security_advisories.html +++ b/vulnerabilities/tests/test_data/nginx/security_advisories.html @@ -1,28 +1,88 @@ - +nginx security advisories

nginx security advisories

+All nginx security issues should be reported to +security-alert@nginx.org.

Patches are signed using one of the PGP public keys.

diff --git a/vulnerabilities/tests/test_data/nuget_api/index.json b/vulnerabilities/tests/test_data/nuget_api/index.json deleted file mode 100644 index 33440b1f6..000000000 --- a/vulnerabilities/tests/test_data/nuget_api/index.json +++ /dev/null @@ -1 +0,0 @@ -{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json","@type":["catalog:CatalogRoot","PackageRegistration","catalog:Permalink"],"commitId":"4b2bebc9-f63a-432a-8bcc-f9a277093541","commitTimeStamp":"2020-04-21T12:30:33.5740394+00:00","count":1,"items":[{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json#page/0.23.0/2.7.0","@type":"catalog:CatalogPage","commitId":"4b2bebc9-f63a-432a-8bcc-f9a277093541","commitTimeStamp":"2020-04-21T12:30:33.5740394+00:00","count":14,"items":[{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/0.23.0.json","@type":"Package","commitId":"98ea3ac2-146d-4d38-bdf9-532dbef29db5","commitTimeStamp":"2020-02-08T00:52:47.1835669+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.32/sustainsys.saml2.0.23.0.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.32/sustainsys.saml2.0.23.0.json#dependencygroup","@type":"PackageDependencyGroup"}],"description":"SAML2 Protocol library for ASP.NET. Don't reference this directly, use one of the API modules: Sustainsys.Saml2.HttpModule/Mvc/Owin/AspNetCore2.","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.23.0/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"","licenseUrl":"https://github.com/Sustainsys/Saml2/blob/master/LICENSE","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.23.0/sustainsys.saml2.0.23.0.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2018-01-17T09:32:59.283+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"Sustainsys.Saml2","version":"0.23.0"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.23.0/sustainsys.saml2.0.23.0.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/0.24.0.json","@type":"Package","commitId":"98ea3ac2-146d-4d38-bdf9-532dbef29db5","commitTimeStamp":"2020-02-08T00:52:47.1835669+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.32/sustainsys.saml2.0.24.0.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.32/sustainsys.saml2.0.24.0.json#dependencygroup","@type":"PackageDependencyGroup"}],"description":"SAML2 Protocol library for ASP.NET. Don't reference this directly, use one of the API modules: Sustainsys.Saml2.HttpModule/Mvc/Owin/AspNetCore2.","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.24.0/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"","licenseUrl":"https://github.com/Sustainsys/Saml2/blob/master/LICENSE","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.24.0/sustainsys.saml2.0.24.0.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2018-03-30T07:25:18.393+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"Sustainsys.Saml2","version":"0.24.0"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.24.0/sustainsys.saml2.0.24.0.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/1.0.0.json","@type":"Package","commitId":"98ea3ac2-146d-4d38-bdf9-532dbef29db5","commitTimeStamp":"2020-02-08T00:52:47.1835669+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.13.08.20.19/sustainsys.saml2.1.0.0.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.13.08.20.19/sustainsys.saml2.1.0.0.json#dependencygroup","@type":"PackageDependencyGroup"}],"description":"SAML2 Protocol library for ASP.NET. Don't reference this directly, use one of the API modules: Sustainsys.Saml2.HttpModule/Mvc/Owin/AspNetCore2.","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.0/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"","licenseUrl":"https://github.com/Sustainsys/Saml2/blob/master/LICENSE","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.0/sustainsys.saml2.1.0.0.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2018-09-13T08:16:00.42+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"Sustainsys.Saml2","version":"1.0.0"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.0/sustainsys.saml2.1.0.0.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/1.0.1.json","@type":"Package","commitId":"98ea3ac2-146d-4d38-bdf9-532dbef29db5","commitTimeStamp":"2020-02-08T00:52:47.1835669+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.33.40/sustainsys.saml2.1.0.1.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.33.40/sustainsys.saml2.1.0.1.json#dependencygroup","@type":"PackageDependencyGroup"}],"description":"SAML2 Protocol library for ASP.NET. Don't reference this directly, use one of the API modules: Sustainsys.Saml2.HttpModule/Mvc/Owin/AspNetCore2.","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.1/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"","licenseUrl":"https://github.com/Sustainsys/Saml2/blob/master/LICENSE","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.1/sustainsys.saml2.1.0.1.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2020-01-17T15:31:41.857+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"Sustainsys.Saml2","version":"1.0.1"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.1/sustainsys.saml2.1.0.1.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/1.0.2.json","@type":"Package","commitId":"65b0f343-125e-4509-a679-d42e82c15314","commitTimeStamp":"2020-04-21T12:27:30.5473966+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.27.06/sustainsys.saml2.1.0.2.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.27.06/sustainsys.saml2.1.0.2.json#dependencygroup","@type":"PackageDependencyGroup"}],"description":"SAML2 Protocol library for ASP.NET. Don't reference this directly, use one of the API modules: Sustainsys.Saml2.HttpModule/Mvc/Owin/AspNetCore2.","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.2/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"","licenseUrl":"https://github.com/Sustainsys/Saml2/blob/master/LICENSE","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.2/sustainsys.saml2.1.0.2.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2020-04-21T12:24:53.877+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"Sustainsys.Saml2","version":"1.0.2"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.2/sustainsys.saml2.1.0.2.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.0.0-preview01.json","@type":"Package","commitId":"98ea3ac2-146d-4d38-bdf9-532dbef29db5","commitTimeStamp":"2020-02-08T00:52:47.1835669+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json#dependencygroup/.netframework4.5","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json#dependencygroup/.netframework4.5/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.0-preview2-41113220915, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"}],"targetFramework":".NETFramework4.5"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json#dependencygroup/.netcoreapp2.0","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json#dependencygroup/.netcoreapp2.0/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.0-preview2-41113220915, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json#dependencygroup/.netcoreapp2.0/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.4.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETCoreApp2.0"}],"description":"Protocol support for SAML2 for .NET Core and full framework","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0-preview01/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"","licenseUrl":"https://github.com/Sustainsys/Saml2/blob/master/LICENSE","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0-preview01/sustainsys.saml2.2.0.0-preview01.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2018-01-09T17:12:20.44+00:00","requireLicenseAcceptance":false,"summary":"","tags":[""],"title":"","version":"2.0.0-preview01"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0-preview01/sustainsys.saml2.2.0.0-preview01.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.0.0.json","@type":"Package","commitId":"98ea3ac2-146d-4d38-bdf9-532dbef29db5","commitTimeStamp":"2020-02-08T00:52:47.1835669+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json","@type":"PackageDetails","authors":"Sustainsys.Saml2","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.0.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETFramework4.7"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.0.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETStandard2.0"}],"description":"Package Description","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"","licenseUrl":"https://github.com/Sustainsys/Saml2/blob/master/LICENSE","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0/sustainsys.saml2.2.0.0.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2018-09-27T13:33:15.37+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"","version":"2.0.0"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0/sustainsys.saml2.2.0.0.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.1.0.json","@type":"Package","commitId":"98ea3ac2-146d-4d38-bdf9-532dbef29db5","commitTimeStamp":"2020-02-08T00:52:47.1835669+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json","@type":"PackageDetails","authors":"Sustainsys.Saml2","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.0.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETFramework4.6.1"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.0.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETFramework4.7"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.0.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETStandard2.0"}],"description":"Package Description","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.1.0/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"","licenseUrl":"https://github.com/Sustainsys/Saml2/blob/master/LICENSE","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.1.0/sustainsys.saml2.2.1.0.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2018-10-16T06:59:44.68+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"","version":"2.1.0"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.1.0/sustainsys.saml2.2.1.0.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.2.0.json","@type":"Package","commitId":"98ea3ac2-146d-4d38-bdf9-532dbef29db5","commitTimeStamp":"2020-02-08T00:52:47.1835669+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.0.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.4.2, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETFramework4.6.1"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.0.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.4.2, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETFramework4.7"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.0.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.4.2, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETStandard2.0"}],"description":"Package Description","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.2.0/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"","licenseUrl":"https://github.com/Sustainsys/Saml2/blob/master/LICENSE","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.2.0/sustainsys.saml2.2.2.0.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2018-11-23T08:13:08.003+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"","version":"2.2.0"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.2.0/sustainsys.saml2.2.2.0.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.3.0.json","@type":"Package","commitId":"98ea3ac2-146d-4d38-bdf9-532dbef29db5","commitTimeStamp":"2020-02-08T00:52:47.1835669+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/system.valuetuple","@type":"PackageDependency","id":"System.ValueTuple","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.valuetuple/index.json"}],"targetFramework":".NETFramework4.6.1"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETFramework4.7"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.1.2, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETStandard2.0"}],"description":"SAML2 protocol support. Do not use directly, use the high level package for your platform.","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.3.0/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"","licenseUrl":"https://github.com/Sustainsys/Saml2/blob/master/LICENSE","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.3.0/sustainsys.saml2.2.3.0.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2019-06-27T14:27:31.613+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"","version":"2.3.0"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.3.0/sustainsys.saml2.2.3.0.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.4.0.json","@type":"Package","commitId":"98ea3ac2-146d-4d38-bdf9-532dbef29db5","commitTimeStamp":"2020-02-08T00:52:47.1835669+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/system.valuetuple","@type":"PackageDependency","id":"System.ValueTuple","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.valuetuple/index.json"}],"targetFramework":".NETFramework4.6.1"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETFramework4.7"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.1.2, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETStandard2.0"}],"description":"SAML2 protocol support. Do not use directly, use the high level package for your platform.","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.4.0/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"","licenseUrl":"https://github.com/Sustainsys/Saml2/blob/master/LICENSE","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.4.0/sustainsys.saml2.2.4.0.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2020-01-17T15:11:05.81+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"","version":"2.4.0"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.4.0/sustainsys.saml2.2.4.0.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.5.0.json","@type":"Package","commitId":"9559ccd8-4589-495d-8e6d-58cd8f93e893","commitTimeStamp":"2020-03-24T14:25:33.9377403+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/system.valuetuple","@type":"PackageDependency","id":"System.ValueTuple","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.valuetuple/index.json"}],"targetFramework":".NETFramework4.6.1"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETFramework4.7"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.1.2, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETStandard2.0"}],"description":"SAML2 protocol support. Do not use directly, use the high level package for your platform.","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.5.0/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"MIT","licenseUrl":"https://www.nuget.org/packages/Sustainsys.Saml2/2.5.0/license","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.5.0/sustainsys.saml2.2.5.0.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2020-03-24T14:22:39.96+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"","version":"2.5.0"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.5.0/sustainsys.saml2.2.5.0.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.6.0.json","@type":"Package","commitId":"26d895e3-cb4d-4607-af2a-783522ba1840","commitTimeStamp":"2020-03-27T11:09:03.672231+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/system.valuetuple","@type":"PackageDependency","id":"System.ValueTuple","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.valuetuple/index.json"}],"targetFramework":".NETFramework4.6.1"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETFramework4.7"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.1.2, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETStandard2.0"}],"description":"SAML2 protocol support. Do not use directly, use the high level package for your platform.","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.6.0/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"MIT","licenseUrl":"https://www.nuget.org/packages/Sustainsys.Saml2/2.6.0/license","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.6.0/sustainsys.saml2.2.6.0.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2020-03-27T11:06:27.5+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"","version":"2.6.0"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.6.0/sustainsys.saml2.2.6.0.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"},{"@id":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.7.0.json","@type":"Package","commitId":"4b2bebc9-f63a-432a-8bcc-f9a277093541","commitTimeStamp":"2020-04-21T12:30:33.5740394+00:00","catalogEntry":{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json","@type":"PackageDetails","authors":"Sustainsys","dependencyGroups":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/system.valuetuple","@type":"PackageDependency","id":"System.ValueTuple","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.valuetuple/index.json"}],"targetFramework":".NETFramework4.6.1"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETFramework4.7"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0","@type":"PackageDependencyGroup","dependencies":[{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory","@type":"PackageDependency","id":"Microsoft.Extensions.Caching.Memory","range":"[2.1.2, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols","@type":"PackageDependency","id":"Microsoft.IdentityModel.Protocols","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml","@type":"PackageDependency","id":"Microsoft.IdentityModel.Tokens.Saml","range":"[5.2.4, )","registration":"https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager","@type":"PackageDependency","id":"System.Configuration.ConfigurationManager","range":"[4.4.1, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json"},{"@id":"https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml","@type":"PackageDependency","id":"System.Security.Cryptography.Xml","range":"[4.5.0, )","registration":"https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json"}],"targetFramework":".NETStandard2.0"}],"description":"SAML2 protocol support. Do not use directly, use the high level package for your platform.","iconUrl":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.7.0/icon","id":"Sustainsys.Saml2","language":"","licenseExpression":"MIT","licenseUrl":"https://www.nuget.org/packages/Sustainsys.Saml2/2.7.0/license","listed":true,"minClientVersion":"","packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.7.0/sustainsys.saml2.2.7.0.nupkg","projectUrl":"https://github.com/Sustainsys/Saml2","published":"2020-04-21T12:27:36.427+00:00","requireLicenseAcceptance":false,"summary":"","tags":["SAML2","authentication","AspNet","SAML","SSO"],"title":"","version":"2.7.0"},"packageContent":"https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.7.0/sustainsys.saml2.2.7.0.nupkg","registration":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json"}],"parent":"https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json","lower":"0.23.0","upper":"2.7.0"}],"@context":{"@vocab":"http://schema.nuget.org/schema#","catalog":"http://schema.nuget.org/catalog#","xsd":"http://www.w3.org/2001/XMLSchema#","items":{"@id":"catalog:item","@container":"@set"},"commitTimeStamp":{"@id":"catalog:commitTimeStamp","@type":"xsd:dateTime"},"commitId":{"@id":"catalog:commitId"},"count":{"@id":"catalog:count"},"parent":{"@id":"catalog:parent","@type":"@id"},"tags":{"@id":"tag","@container":"@set"},"reasons":{"@container":"@set"},"packageTargetFrameworks":{"@id":"packageTargetFramework","@container":"@set"},"dependencyGroups":{"@id":"dependencyGroup","@container":"@set"},"dependencies":{"@id":"dependency","@container":"@set"},"packageContent":{"@type":"@id"},"published":{"@type":"xsd:dateTime"},"registration":{"@type":"@id"}}} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/composer_api/cms-core.json b/vulnerabilities/tests/test_data/package_manager_data/composer.json similarity index 100% rename from vulnerabilities/tests/test_data/composer_api/cms-core.json rename to vulnerabilities/tests/test_data/package_manager_data/composer.json diff --git a/vulnerabilities/tests/test_data/package_manager_data/github/github-nexb-scancode-toolkit-0.json b/vulnerabilities/tests/test_data/package_manager_data/github/github-nexb-scancode-toolkit-0.json new file mode 100644 index 000000000..7cc0a44f9 --- /dev/null +++ b/vulnerabilities/tests/test_data/package_manager_data/github/github-nexb-scancode-toolkit-0.json @@ -0,0 +1,455 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 55, + "pageInfo": { + "endCursor": "NTU", + "hasNextPage": false + }, + "nodes": [ + { + "name": "v1.0.0", + "target": { + "target": { + "committedDate": "2015-07-01T15:14:15Z" + } + } + }, + { + "name": "v1.1.0", + "target": { + "target": { + "committedDate": "2015-07-06T10:09:51Z" + } + } + }, + { + "name": "v1.2.0", + "target": { + "target": { + "committedDate": "2015-07-13T14:56:45Z" + } + } + }, + { + "name": "v1.2.1", + "target": { + "target": { + "committedDate": "2015-07-13T16:36:42Z" + } + } + }, + { + "name": "v1.2.2", + "target": { + "target": { + "committedDate": "2015-07-14T14:10:20Z" + } + } + }, + { + "name": "v1.2.3", + "target": { + "target": { + "committedDate": "2015-07-16T06:53:40Z" + } + } + }, + { + "name": "v1.2.4", + "target": { + "target": { + "committedDate": "2015-07-22T14:06:14Z" + } + } + }, + { + "name": "v1.3.0", + "target": { + "target": { + "committedDate": "2015-07-24T12:20:54Z" + } + } + }, + { + "name": "v1.3.1", + "target": { + "target": { + "committedDate": "2015-07-27T18:46:11Z" + } + } + }, + { + "name": "v1.4.0", + "target": { + "target": { + "committedDate": "2015-11-24T18:15:21Z" + } + } + }, + { + "name": "v1.4.1", + "target": { + "target": { + "committedDate": "2015-12-03T11:22:26Z" + } + } + }, + { + "name": "v1.4.2", + "target": { + "target": { + "committedDate": "2015-12-03T11:39:30Z" + } + } + }, + { + "name": "v1.4.3", + "target": { + "target": { + "committedDate": "2015-12-10T17:07:19Z" + } + } + }, + { + "name": "v1.5.0", + "target": { + "target": { + "committedDate": "2015-12-15T14:57:37Z" + } + } + }, + { + "name": "v1.6.0", + "target": { + "target": { + "committedDate": "2016-01-29T21:50:30Z" + } + } + }, + { + "name": "v1.6.1", + "target": { + "target": { + "committedDate": "2016-03-01T19:49:06Z" + } + } + }, + { + "name": "v1.6.2", + "target": { + "target": { + "committedDate": "2016-06-24T14:35:01Z" + } + } + }, + { + "name": "v1.6.3", + "target": { + "target": { + "committedDate": "2016-06-24T16:04:25Z" + } + } + }, + { + "name": "v2.0.0.rc1", + "target": { + "target": { + "committedDate": "2016-10-07T20:49:42Z" + } + } + }, + { + "name": "v2.0.0.rc2", + "target": { + "target": { + "committedDate": "2017-01-16T14:34:49Z" + } + } + }, + { + "name": "v2.0.0.rc3", + "target": { + "target": { + "committedDate": "2017-06-16T15:56:50Z" + } + } + }, + { + "name": "v2.0.0", + "target": { + "target": { + "committedDate": "2017-06-23T08:07:03Z" + } + } + }, + { + "name": "v2.0.1", + "target": { + "target": { + "committedDate": "2017-07-03T16:00:36Z" + } + } + }, + { + "name": "v2.1.0", + "target": { + "target": { + "committedDate": "2017-09-22T19:34:57Z" + } + } + }, + { + "name": "v2.2.0", + "target": { + "target": { + "committedDate": "2017-10-05T22:41:56Z" + } + } + }, + { + "name": "v2.2.1", + "target": { + "target": { + "committedDate": "2017-10-05T22:53:25Z" + } + } + }, + { + "name": "v2.9.0b1", + "target": { + "target": { + "committedDate": "2018-03-02T21:18:40Z" + } + } + }, + { + "name": "v2.9.1", + "target": { + "target": { + "committedDate": "2018-03-22T15:44:33Z" + } + } + }, + { + "name": "v2.9.2", + "target": { + "target": { + "committedDate": "2018-05-08T13:54:52Z" + } + } + }, + { + "name": "v2.9.3", + "target": { + "target": { + "committedDate": "2018-09-27T21:11:57Z" + } + } + }, + { + "name": "v2.9.4", + "target": { + "target": { + "committedDate": "2018-10-19T14:31:36Z" + } + } + }, + { + "name": "v2.9.5", + "target": { + "target": { + "committedDate": "2018-10-22T20:33:50Z" + } + } + }, + { + "name": "v2.9.6", + "target": { + "target": { + "committedDate": "2018-10-25T20:26:28Z" + } + } + }, + { + "name": "v2.9.7", + "target": { + "target": { + "committedDate": "2018-10-26T01:55:40Z" + } + } + }, + { + "name": "v2.9.8", + "target": { + "target": { + "committedDate": "2018-12-12T10:13:24Z" + } + } + }, + { + "name": "v2.9.9", + "target": { + "target": { + "committedDate": "2019-01-07T11:20:18Z" + } + } + }, + { + "name": "v3.0.0", + "target": { + "target": { + "committedDate": "2019-02-14T19:15:06Z" + } + } + }, + { + "name": "v3.0.1", + "target": { + "target": { + "committedDate": "2019-02-15T14:17:54Z" + } + } + }, + { + "name": "v3.0.2", + "target": { + "target": { + "committedDate": "2019-02-15T14:34:52Z" + } + } + }, + { + "name": "v3.1.0", + "target": { + "target": { + "committedDate": "2019-08-12T18:31:48Z" + } + } + }, + { + "name": "v3.1.1", + "target": { + "target": { + "committedDate": "2019-09-03T20:27:57Z" + } + } + }, + { + "name": "v3.2.0rc1", + "target": { + "target": { + "committedDate": "2020-09-08T18:12:16Z" + } + } + }, + { + "name": "v3.2.1rc2", + "target": { + "target": { + "committedDate": "2020-09-11T15:28:54Z" + } + } + }, + { + "name": "v3.2.2rc3", + "target": { + "target": { + "committedDate": "2020-10-14T22:18:00Z" + } + } + }, + { + "name": "v3.2.3", + "target": { + "target": { + "committedDate": "2020-10-27T18:44:17Z" + } + } + }, + { + "name": "v21.2.9", + "target": { + "target": { + "committedDate": "2021-02-09T18:00:14Z" + } + } + }, + { + "name": "v21.2.25", + "target": { + "target": { + "committedDate": "2021-02-25T21:06:09Z" + } + } + }, + { + "name": "v21.3.30", + "target": { + "target": { + "committedDate": "2021-03-31T17:36:32Z" + } + } + }, + { + "name": "v21.3.31", + "target": { + "target": { + "committedDate": "2021-04-01T07:21:52Z" + } + } + }, + { + "name": "v21.6.7", + "target": { + "target": { + "committedDate": "2021-06-08T08:27:29Z" + } + } + }, + { + "name": "v21.7.30", + "target": { + "target": { + "committedDate": "2021-07-30T20:12:30Z" + } + } + }, + { + "name": "v21.8.4", + "target": { + "target": { + "committedDate": "2021-08-04T17:42:25Z" + } + } + }, + { + "name": "v30.0.0", + "target": { + "target": { + "committedDate": "2021-09-23T10:41:40Z" + } + } + }, + { + "name": "v30.0.1", + "target": { + "target": { + "committedDate": "2021-09-24T10:01:28Z" + } + } + }, + { + "name": "v30.1.0", + "target": { + "target": { + "committedDate": "2021-09-26T14:31:56Z" + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/package_manager_data/github/github-nexb-vulnerablecode-0.json b/vulnerabilities/tests/test_data/package_manager_data/github/github-nexb-vulnerablecode-0.json new file mode 100644 index 000000000..3a8684c3a --- /dev/null +++ b/vulnerabilities/tests/test_data/package_manager_data/github/github-nexb-vulnerablecode-0.json @@ -0,0 +1,35 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 3, + "pageInfo": { + "endCursor": "Mw", + "hasNextPage": false + }, + "nodes": [ + { + "name": "v0.1", + "target": { + "committedDate": "2019-12-03T13:48:53Z" + } + }, + { + "name": "v20.10", + "target": { + "committedDate": "2020-09-28T12:31:16Z" + } + }, + { + "name": "v22.01", + "target": { + "target": { + "committedDate": "2022-01-24T23:48:04Z" + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-0.json b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-0.json new file mode 100644 index 000000000..e2b020442 --- /dev/null +++ b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-0.json @@ -0,0 +1,811 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 739, + "pageInfo": { + "endCursor": "MTAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "v2.6.11-tree", + "target": { + "target": {} + } + }, + { + "name": "v2.6.11", + "target": { + "target": {} + } + }, + { + "name": "v2.6.12-rc2", + "target": { + "target": { + "committedDate": "2005-04-16T22:20:36Z" + } + } + }, + { + "name": "v2.6.12-rc3", + "target": { + "target": { + "committedDate": "2005-04-20T23:24:21Z" + } + } + }, + { + "name": "v2.6.12-rc4", + "target": { + "target": { + "committedDate": "2005-05-07T05:20:31Z" + } + } + }, + { + "name": "v2.6.12-rc5", + "target": { + "target": { + "committedDate": "2005-05-25T03:31:20Z" + } + } + }, + { + "name": "v2.6.12-rc6", + "target": { + "target": { + "committedDate": "2005-06-06T15:22:29Z" + } + } + }, + { + "name": "v2.6.12", + "target": { + "target": { + "committedDate": "2005-06-17T19:48:29Z" + } + } + }, + { + "name": "v2.6.13-rc1", + "target": { + "target": { + "committedDate": "2005-06-29T05:57:29Z" + } + } + }, + { + "name": "v2.6.13-rc2", + "target": { + "target": { + "committedDate": "2005-07-06T03:46:33Z" + } + } + }, + { + "name": "v2.6.13-rc3", + "target": { + "target": { + "committedDate": "2005-07-13T04:46:46Z" + } + } + }, + { + "name": "v2.6.13-rc4", + "target": { + "target": { + "committedDate": "2005-07-28T22:44:44Z" + } + } + }, + { + "name": "v2.6.13-rc5", + "target": { + "target": { + "committedDate": "2005-08-02T04:45:48Z" + } + } + }, + { + "name": "v2.6.13-rc6", + "target": { + "target": { + "committedDate": "2005-08-07T18:18:56Z" + } + } + }, + { + "name": "v2.6.13-rc7", + "target": { + "target": { + "committedDate": "2005-08-24T03:39:14Z" + } + } + }, + { + "name": "v2.6.13", + "target": { + "target": { + "committedDate": "2005-08-28T23:41:01Z" + } + } + }, + { + "name": "v2.6.14-rc1", + "target": { + "target": { + "committedDate": "2005-09-13T03:12:09Z" + } + } + }, + { + "name": "v2.6.14-rc2", + "target": { + "target": { + "committedDate": "2005-09-20T03:00:41Z" + } + } + }, + { + "name": "v2.6.14-rc3", + "target": { + "target": { + "committedDate": "2005-09-30T21:17:35Z" + } + } + }, + { + "name": "v2.6.14-rc4", + "target": { + "target": { + "committedDate": "2005-10-11T01:19:19Z" + } + } + }, + { + "name": "v2.6.14-rc5", + "target": { + "target": { + "committedDate": "2005-10-20T06:23:05Z" + } + } + }, + { + "name": "v2.6.14", + "target": { + "target": { + "committedDate": "2005-10-28T00:02:08Z" + } + } + }, + { + "name": "v2.6.15-rc1", + "target": { + "target": { + "committedDate": "2005-11-12T01:43:36Z" + } + } + }, + { + "name": "v2.6.15-rc2", + "target": { + "target": { + "committedDate": "2005-11-20T03:25:03Z" + } + } + }, + { + "name": "v2.6.15-rc3", + "target": { + "target": { + "committedDate": "2005-11-29T03:51:27Z" + } + } + }, + { + "name": "v2.6.15-rc4", + "target": { + "target": { + "committedDate": "2005-12-01T06:25:15Z" + } + } + }, + { + "name": "v2.6.15-rc5", + "target": { + "target": { + "committedDate": "2005-12-04T05:10:42Z" + } + } + }, + { + "name": "v2.6.15-rc6", + "target": { + "target": { + "committedDate": "2005-12-19T00:36:54Z" + } + } + }, + { + "name": "v2.6.15-rc7", + "target": { + "target": { + "committedDate": "2005-12-24T23:47:48Z" + } + } + }, + { + "name": "v2.6.15", + "target": { + "target": { + "committedDate": "2006-01-03T03:21:10Z" + } + } + }, + { + "name": "v2.6.16-rc1", + "target": { + "target": { + "committedDate": "2006-01-17T07:44:47Z" + } + } + }, + { + "name": "v2.6.16-rc2", + "target": { + "target": { + "committedDate": "2006-02-03T06:03:08Z" + } + } + }, + { + "name": "v2.6.16-rc3", + "target": { + "target": { + "committedDate": "2006-02-13T00:27:25Z" + } + } + }, + { + "name": "v2.6.16-rc4", + "target": { + "target": { + "committedDate": "2006-02-17T22:23:45Z" + } + } + }, + { + "name": "v2.6.16-rc5", + "target": { + "target": { + "committedDate": "2006-02-27T05:09:35Z" + } + } + }, + { + "name": "v2.6.16-rc6", + "target": { + "target": { + "committedDate": "2006-03-11T22:12:55Z" + } + } + }, + { + "name": "v2.6.16", + "target": { + "target": { + "committedDate": "2006-03-20T05:53:29Z" + } + } + }, + { + "name": "v2.6.17-rc1", + "target": { + "target": { + "committedDate": "2006-04-03T03:22:10Z" + } + } + }, + { + "name": "v2.6.17-rc2", + "target": { + "target": { + "committedDate": "2006-04-19T03:00:49Z" + } + } + }, + { + "name": "v2.6.17-rc3", + "target": { + "target": { + "committedDate": "2006-04-27T02:19:25Z" + } + } + }, + { + "name": "v2.6.17-rc4", + "target": { + "target": { + "committedDate": "2006-05-11T23:31:53Z" + } + } + }, + { + "name": "v2.6.17-rc5", + "target": { + "target": { + "committedDate": "2006-05-25T01:50:17Z" + } + } + }, + { + "name": "v2.6.17-rc6", + "target": { + "target": { + "committedDate": "2006-06-06T00:57:02Z" + } + } + }, + { + "name": "v2.6.17", + "target": { + "target": { + "committedDate": "2006-06-18T01:49:35Z" + } + } + }, + { + "name": "v2.6.18-rc1", + "target": { + "target": { + "committedDate": "2006-07-06T04:09:49Z" + } + } + }, + { + "name": "v2.6.18-rc2", + "target": { + "target": { + "committedDate": "2006-07-15T21:53:08Z" + } + } + }, + { + "name": "v2.6.18-rc3", + "target": { + "target": { + "committedDate": "2006-07-30T06:15:36Z" + } + } + }, + { + "name": "v2.6.18-rc4", + "target": { + "target": { + "committedDate": "2006-08-06T18:20:11Z" + } + } + }, + { + "name": "v2.6.18-rc5", + "target": { + "target": { + "committedDate": "2006-08-28T03:41:48Z" + } + } + }, + { + "name": "v2.6.18-rc6", + "target": { + "target": { + "committedDate": "2006-09-04T02:19:48Z" + } + } + }, + { + "name": "v2.6.18-rc7", + "target": { + "target": { + "committedDate": "2006-09-13T01:41:36Z" + } + } + }, + { + "name": "v2.6.18", + "target": { + "target": { + "committedDate": "2006-09-20T03:42:06Z" + } + } + }, + { + "name": "v2.6.19-rc1", + "target": { + "target": { + "committedDate": "2006-10-05T02:57:05Z" + } + } + }, + { + "name": "v2.6.19-rc2", + "target": { + "target": { + "committedDate": "2006-10-13T16:25:04Z" + } + } + }, + { + "name": "v2.6.19-rc3", + "target": { + "target": { + "committedDate": "2006-10-23T23:02:02Z" + } + } + }, + { + "name": "v2.6.19-rc4", + "target": { + "target": { + "committedDate": "2006-10-31T03:37:36Z" + } + } + }, + { + "name": "v2.6.19-rc5", + "target": { + "target": { + "committedDate": "2006-11-08T02:24:20Z" + } + } + }, + { + "name": "v2.6.19-rc6", + "target": { + "target": { + "committedDate": "2006-11-16T04:03:40Z" + } + } + }, + { + "name": "v2.6.19", + "target": { + "target": { + "committedDate": "2006-11-29T21:57:37Z" + } + } + }, + { + "name": "v2.6.20-rc1", + "target": { + "target": { + "committedDate": "2006-12-14T01:14:23Z" + } + } + }, + { + "name": "v2.6.20-rc2", + "target": { + "target": { + "committedDate": "2006-12-24T04:00:32Z" + } + } + }, + { + "name": "v2.6.20-rc3", + "target": { + "target": { + "committedDate": "2007-01-01T00:53:20Z" + } + } + }, + { + "name": "v2.6.20-rc4", + "target": { + "target": { + "committedDate": "2007-01-07T05:45:51Z" + } + } + }, + { + "name": "v2.6.20-rc5", + "target": { + "target": { + "committedDate": "2007-01-12T18:54:26Z" + } + } + }, + { + "name": "v2.6.20-rc6", + "target": { + "target": { + "committedDate": "2007-01-25T02:19:28Z" + } + } + }, + { + "name": "v2.6.20-rc7", + "target": { + "target": { + "committedDate": "2007-01-31T03:42:57Z" + } + } + }, + { + "name": "v2.6.20", + "target": { + "target": { + "committedDate": "2007-02-04T18:44:54Z" + } + } + }, + { + "name": "v2.6.21-rc1", + "target": { + "target": { + "committedDate": "2007-02-21T04:32:30Z" + } + } + }, + { + "name": "v2.6.21-rc2", + "target": { + "target": { + "committedDate": "2007-02-28T04:59:12Z" + } + } + }, + { + "name": "v2.6.21-rc3", + "target": { + "target": { + "committedDate": "2007-03-07T04:41:20Z" + } + } + }, + { + "name": "v2.6.21-rc4", + "target": { + "target": { + "committedDate": "2007-03-16T00:20:01Z" + } + } + }, + { + "name": "v2.6.21-rc5", + "target": { + "target": { + "committedDate": "2007-03-25T22:56:23Z" + } + } + }, + { + "name": "v2.6.21-rc6", + "target": { + "target": { + "committedDate": "2007-04-06T02:36:56Z" + } + } + }, + { + "name": "v2.6.21-rc7", + "target": { + "target": { + "committedDate": "2007-04-15T23:50:57Z" + } + } + }, + { + "name": "v2.6.21", + "target": { + "target": { + "committedDate": "2007-04-26T03:08:32Z" + } + } + }, + { + "name": "v2.6.22-rc1", + "target": { + "target": { + "committedDate": "2007-05-13T01:45:56Z" + } + } + }, + { + "name": "v2.6.22-rc2", + "target": { + "target": { + "committedDate": "2007-05-19T04:06:17Z" + } + } + }, + { + "name": "v2.6.22-rc3", + "target": { + "target": { + "committedDate": "2007-05-26T02:55:14Z" + } + } + }, + { + "name": "v2.6.22-rc4", + "target": { + "target": { + "committedDate": "2007-06-05T00:57:25Z" + } + } + }, + { + "name": "v2.6.22-rc5", + "target": { + "target": { + "committedDate": "2007-06-17T02:09:12Z" + } + } + }, + { + "name": "v2.6.22-rc6", + "target": { + "target": { + "committedDate": "2007-06-24T23:21:48Z" + } + } + }, + { + "name": "v2.6.22-rc7", + "target": { + "target": { + "committedDate": "2007-07-01T19:54:24Z" + } + } + }, + { + "name": "v2.6.22", + "target": { + "target": { + "committedDate": "2007-07-08T23:32:17Z" + } + } + }, + { + "name": "v2.6.23-rc1", + "target": { + "target": { + "committedDate": "2007-07-22T20:41:00Z" + } + } + }, + { + "name": "v2.6.23-rc2", + "target": { + "target": { + "committedDate": "2007-08-04T02:49:55Z" + } + } + }, + { + "name": "v2.6.23-rc3", + "target": { + "target": { + "committedDate": "2007-08-13T04:25:24Z" + } + } + }, + { + "name": "v2.6.23-rc4", + "target": { + "target": { + "committedDate": "2007-08-28T01:32:35Z" + } + } + }, + { + "name": "v2.6.23-rc5", + "target": { + "target": { + "committedDate": "2007-09-01T06:08:24Z" + } + } + }, + { + "name": "v2.6.23-rc6", + "target": { + "target": { + "committedDate": "2007-09-11T02:50:29Z" + } + } + }, + { + "name": "v2.6.23-rc7", + "target": { + "target": { + "committedDate": "2007-09-19T23:01:13Z" + } + } + }, + { + "name": "v2.6.23-rc8", + "target": { + "target": { + "committedDate": "2007-09-25T00:33:10Z" + } + } + }, + { + "name": "v2.6.23-rc9", + "target": { + "target": { + "committedDate": "2007-10-02T03:24:52Z" + } + } + }, + { + "name": "v2.6.23", + "target": { + "target": { + "committedDate": "2007-10-09T20:31:38Z" + } + } + }, + { + "name": "v2.6.24-rc1", + "target": { + "target": { + "committedDate": "2007-10-24T03:50:57Z" + } + } + }, + { + "name": "v2.6.24-rc2", + "target": { + "target": { + "committedDate": "2007-11-06T21:57:46Z" + } + } + }, + { + "name": "v2.6.24-rc3", + "target": { + "target": { + "committedDate": "2007-11-17T05:16:36Z" + } + } + }, + { + "name": "v2.6.24-rc4", + "target": { + "target": { + "committedDate": "2007-12-04T04:26:10Z" + } + } + }, + { + "name": "v2.6.24-rc5", + "target": { + "target": { + "committedDate": "2007-12-11T03:48:43Z" + } + } + }, + { + "name": "v2.6.24-rc6", + "target": { + "target": { + "committedDate": "2007-12-21T01:25:48Z" + } + } + }, + { + "name": "v2.6.24-rc7", + "target": { + "target": { + "committedDate": "2008-01-06T21:45:38Z" + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-1.json b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-1.json new file mode 100644 index 000000000..6274739cf --- /dev/null +++ b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-1.json @@ -0,0 +1,815 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 739, + "pageInfo": { + "endCursor": "MjAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "v2.6.24-rc8", + "target": { + "target": { + "committedDate": "2008-01-16T04:22:48Z" + } + } + }, + { + "name": "v2.6.24", + "target": { + "target": { + "committedDate": "2008-01-24T22:58:37Z" + } + } + }, + { + "name": "v2.6.25-rc1", + "target": { + "target": { + "committedDate": "2008-02-10T22:18:14Z" + } + } + }, + { + "name": "v2.6.25-rc2", + "target": { + "target": { + "committedDate": "2008-02-15T20:57:20Z" + } + } + }, + { + "name": "v2.6.25-rc3", + "target": { + "target": { + "committedDate": "2008-02-24T21:25:54Z" + } + } + }, + { + "name": "v2.6.25-rc4", + "target": { + "target": { + "committedDate": "2008-03-05T04:33:54Z" + } + } + }, + { + "name": "v2.6.25-rc5", + "target": { + "target": { + "committedDate": "2008-03-10T05:22:27Z" + } + } + }, + { + "name": "v2.6.25-rc6", + "target": { + "target": { + "committedDate": "2008-03-16T23:32:14Z" + } + } + }, + { + "name": "v2.6.25-rc7", + "target": { + "target": { + "committedDate": "2008-03-26T01:38:14Z" + } + } + }, + { + "name": "v2.6.25-rc8", + "target": { + "target": { + "committedDate": "2008-04-01T19:44:26Z" + } + } + }, + { + "name": "v2.6.25-rc9", + "target": { + "target": { + "committedDate": "2008-04-11T20:32:29Z" + } + } + }, + { + "name": "v2.6.25", + "target": { + "target": { + "committedDate": "2008-04-17T02:49:44Z" + } + } + }, + { + "name": "v2.6.26-rc1", + "target": { + "target": { + "committedDate": "2008-05-03T18:59:44Z" + } + } + }, + { + "name": "v2.6.26-rc2", + "target": { + "target": { + "committedDate": "2008-05-12T00:09:41Z" + } + } + }, + { + "name": "v2.6.26-rc3", + "target": { + "target": { + "committedDate": "2008-05-18T21:36:41Z" + } + } + }, + { + "name": "v2.6.26-rc4", + "target": { + "target": { + "committedDate": "2008-05-26T18:08:11Z" + } + } + }, + { + "name": "v2.6.26-rc5", + "target": { + "target": { + "committedDate": "2008-06-05T03:10:44Z" + } + } + }, + { + "name": "v2.6.26-rc6", + "target": { + "target": { + "committedDate": "2008-06-12T21:22:24Z" + } + } + }, + { + "name": "v2.6.26-rc7", + "target": { + "target": { + "committedDate": "2008-06-20T23:19:44Z" + } + } + }, + { + "name": "v2.6.26-rc8", + "target": { + "target": { + "committedDate": "2008-06-25T01:58:20Z" + } + } + }, + { + "name": "v2.6.26-rc9", + "target": { + "target": { + "committedDate": "2008-07-05T22:53:22Z" + } + } + }, + { + "name": "v2.6.26", + "target": { + "target": { + "committedDate": "2008-07-13T21:51:29Z" + } + } + }, + { + "name": "v2.6.27-rc1", + "target": { + "target": { + "committedDate": "2008-07-29T02:40:31Z" + } + } + }, + { + "name": "v2.6.27-rc2", + "target": { + "target": { + "committedDate": "2008-08-06T04:49:54Z" + } + } + }, + { + "name": "v2.6.27-rc3", + "target": { + "target": { + "committedDate": "2008-08-13T01:55:39Z" + } + } + }, + { + "name": "v2.6.27-rc4", + "target": { + "target": { + "committedDate": "2008-08-21T02:35:56Z" + } + } + }, + { + "name": "v2.6.27-rc5", + "target": { + "target": { + "committedDate": "2008-08-28T22:52:02Z" + } + } + }, + { + "name": "v2.6.27-rc6", + "target": { + "target": { + "committedDate": "2008-09-09T23:27:49Z" + } + } + }, + { + "name": "v2.6.27-rc7", + "target": { + "target": { + "committedDate": "2008-09-21T22:29:55Z" + } + } + }, + { + "name": "v2.6.27-rc8", + "target": { + "target": { + "committedDate": "2008-09-29T22:24:02Z" + } + } + }, + { + "name": "v2.6.27-rc9", + "target": { + "target": { + "committedDate": "2008-10-06T23:39:58Z" + } + } + }, + { + "name": "v2.6.27", + "target": { + "target": { + "committedDate": "2008-10-09T22:13:53Z" + } + } + }, + { + "name": "v2.6.28-rc1", + "target": { + "target": { + "committedDate": "2008-10-24T03:06:52Z" + } + } + }, + { + "name": "v2.6.28-rc2", + "target": { + "target": { + "committedDate": "2008-10-26T19:13:29Z" + } + } + }, + { + "name": "v2.6.28-rc3", + "target": { + "target": { + "committedDate": "2008-11-02T22:17:19Z" + } + } + }, + { + "name": "v2.6.28-rc4", + "target": { + "target": { + "committedDate": "2008-11-10T00:36:15Z" + } + } + }, + { + "name": "v2.6.28-rc5", + "target": { + "target": { + "committedDate": "2008-11-15T21:42:56Z" + } + } + }, + { + "name": "v2.6.28-rc6", + "target": { + "target": { + "committedDate": "2008-11-20T23:19:22Z" + } + } + }, + { + "name": "v2.6.28-rc7", + "target": { + "target": { + "committedDate": "2008-12-02T03:59:23Z" + } + } + }, + { + "name": "v2.6.28-rc8", + "target": { + "target": { + "committedDate": "2008-12-10T23:11:51Z" + } + } + }, + { + "name": "v2.6.28-rc9", + "target": { + "target": { + "committedDate": "2008-12-19T01:20:13Z" + } + } + }, + { + "name": "v2.6.28", + "target": { + "target": { + "committedDate": "2008-12-24T23:26:37Z" + } + } + }, + { + "name": "v2.6.29-rc1", + "target": { + "target": { + "committedDate": "2009-01-10T23:43:05Z" + } + } + }, + { + "name": "v2.6.29-rc2", + "target": { + "target": { + "committedDate": "2009-01-16T20:43:00Z" + } + } + }, + { + "name": "v2.6.29-rc3", + "target": { + "target": { + "committedDate": "2009-01-28T18:49:30Z" + } + } + }, + { + "name": "v2.6.29-rc4", + "target": { + "target": { + "committedDate": "2009-02-08T20:37:27Z" + } + } + }, + { + "name": "v2.6.29-rc5", + "target": { + "target": { + "committedDate": "2009-02-13T23:31:30Z" + } + } + }, + { + "name": "v2.6.29-rc6", + "target": { + "target": { + "committedDate": "2009-02-23T04:19:40Z" + } + } + }, + { + "name": "v2.6.29-rc7", + "target": { + "target": { + "committedDate": "2009-03-04T01:05:22Z" + } + } + }, + { + "name": "v2.6.29-rc8", + "target": { + "target": { + "committedDate": "2009-03-13T02:39:28Z" + } + } + }, + { + "name": "v2.6.29", + "target": { + "target": { + "committedDate": "2009-03-23T23:12:14Z" + } + } + }, + { + "name": "v2.6.30-rc1", + "target": { + "target": { + "committedDate": "2009-04-07T21:25:01Z" + } + } + }, + { + "name": "v2.6.30-rc2", + "target": { + "target": { + "committedDate": "2009-04-14T20:51:48Z" + } + } + }, + { + "name": "v2.6.30-rc3", + "target": { + "target": { + "committedDate": "2009-04-22T03:07:00Z" + } + } + }, + { + "name": "v2.6.30-rc4", + "target": { + "target": { + "committedDate": "2009-04-30T04:48:16Z" + } + } + }, + { + "name": "v2.6.30-rc5", + "target": { + "target": { + "committedDate": "2009-05-09T00:14:14Z" + } + } + }, + { + "name": "v2.6.30-rc6", + "target": { + "target": { + "committedDate": "2009-05-16T04:12:57Z" + } + } + }, + { + "name": "v2.6.30-rc7", + "target": { + "target": { + "committedDate": "2009-05-23T21:47:00Z" + } + } + }, + { + "name": "v2.6.30-rc8", + "target": { + "target": { + "committedDate": "2009-06-03T03:07:25Z" + } + } + }, + { + "name": "v2.6.30", + "target": { + "target": { + "committedDate": "2009-06-10T03:05:27Z" + } + } + }, + { + "name": "v2.6.31-rc1", + "target": { + "target": { + "committedDate": "2009-06-24T23:25:37Z" + } + } + }, + { + "name": "v2.6.31-rc2", + "target": { + "target": { + "committedDate": "2009-07-04T17:58:48Z" + } + } + }, + { + "name": "v2.6.31-rc3", + "target": { + "target": { + "committedDate": "2009-07-14T01:18:52Z" + } + } + }, + { + "name": "v2.6.31-rc4", + "target": { + "target": { + "committedDate": "2009-07-23T02:32:59Z" + } + } + }, + { + "name": "v2.6.31-rc5", + "target": { + "target": { + "committedDate": "2009-08-01T00:40:45Z" + } + } + }, + { + "name": "v2.6.31-rc6", + "target": { + "target": { + "committedDate": "2009-08-13T22:43:34Z" + } + } + }, + { + "name": "v2.6.31-rc7", + "target": { + "target": { + "committedDate": "2009-08-22T01:00:46Z" + } + } + }, + { + "name": "v2.6.31-rc8", + "target": { + "target": { + "committedDate": "2009-08-28T00:59:04Z" + } + } + }, + { + "name": "v2.6.31-rc9", + "target": { + "target": { + "committedDate": "2009-09-05T23:38:12Z" + } + } + }, + { + "name": "v2.6.31", + "target": { + "target": { + "committedDate": "2009-09-09T22:13:59Z" + } + } + }, + { + "name": "v2.6.32-rc1", + "target": { + "target": { + "committedDate": "2009-09-27T21:57:48Z" + } + } + }, + { + "name": "v2.6.32-rc2", + "target": { + "target": { + "committedDate": "2009-09-27T21:57:48Z" + } + } + }, + { + "name": "v2.6.32-rc3", + "target": { + "target": { + "committedDate": "2009-10-05T00:12:30Z" + } + } + }, + { + "name": "v2.6.32-rc4", + "target": { + "target": { + "committedDate": "2009-10-11T21:43:56Z" + } + } + }, + { + "name": "v2.6.32-rc5", + "target": { + "target": { + "committedDate": "2009-10-16T00:41:50Z" + } + } + }, + { + "name": "v2.6.32-rc6", + "target": { + "target": { + "committedDate": "2009-11-03T19:37:49Z" + } + } + }, + { + "name": "v2.6.32-rc7", + "target": { + "target": { + "committedDate": "2009-11-13T00:46:07Z" + } + } + }, + { + "name": "v2.6.32-rc8", + "target": { + "target": { + "committedDate": "2009-11-19T22:32:38Z" + } + } + }, + { + "name": "v2.6.32", + "target": { + "target": { + "committedDate": "2009-12-03T03:51:21Z" + } + } + }, + { + "name": "v2.6.33-rc1", + "target": { + "target": { + "committedDate": "2009-12-18T01:14:40Z" + } + } + }, + { + "name": "v2.6.33-rc2", + "target": { + "target": { + "committedDate": "2009-12-24T21:09:41Z" + } + } + }, + { + "name": "v2.6.33-rc3", + "target": { + "target": { + "committedDate": "2010-01-06T00:02:46Z" + } + } + }, + { + "name": "v2.6.33-rc4", + "target": { + "target": { + "committedDate": "2010-01-13T05:15:00Z" + } + } + }, + { + "name": "v2.6.33-rc5", + "target": { + "target": { + "committedDate": "2010-01-21T23:31:35Z" + } + } + }, + { + "name": "v2.6.33-rc6", + "target": { + "target": { + "committedDate": "2010-01-29T21:57:50Z" + } + } + }, + { + "name": "v2.6.33-rc7", + "target": { + "target": { + "committedDate": "2010-02-06T22:17:12Z" + } + } + }, + { + "name": "v2.6.33-rc8", + "target": { + "target": { + "committedDate": "2010-02-12T19:07:45Z" + } + } + }, + { + "name": "v2.6.33", + "target": { + "target": { + "committedDate": "2010-02-24T18:52:17Z" + } + } + }, + { + "name": "v2.6.34-rc1", + "target": { + "target": { + "committedDate": "2010-03-08T18:45:44Z" + } + } + }, + { + "name": "v2.6.34-rc2", + "target": { + "target": { + "committedDate": "2010-03-20T01:17:57Z" + } + } + }, + { + "name": "v2.6.34-rc3", + "target": { + "target": { + "committedDate": "2010-03-30T16:24:39Z" + } + } + }, + { + "name": "v2.6.34-rc4", + "target": { + "target": { + "committedDate": "2010-04-13T01:41:35Z" + } + } + }, + { + "name": "v2.6.34-rc5", + "target": { + "target": { + "committedDate": "2010-04-19T23:29:56Z" + } + } + }, + { + "name": "v2.6.34-rc6", + "target": { + "target": { + "committedDate": "2010-04-30T03:02:05Z" + } + } + }, + { + "name": "v2.6.34-rc7", + "target": { + "target": { + "committedDate": "2010-05-10T01:36:28Z" + } + } + }, + { + "name": "v2.6.34", + "target": { + "target": { + "committedDate": "2010-05-16T21:17:36Z" + } + } + }, + { + "name": "v2.6.35-rc1", + "target": { + "target": { + "committedDate": "2010-05-30T20:21:02Z" + } + } + }, + { + "name": "v2.6.35-rc2", + "target": { + "target": { + "committedDate": "2010-06-06T03:43:24Z" + } + } + }, + { + "name": "v2.6.35-rc3", + "target": { + "target": { + "committedDate": "2010-06-12T02:14:04Z" + } + } + }, + { + "name": "v2.6.35-rc4", + "target": { + "target": { + "committedDate": "2010-07-05T03:22:50Z" + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-2.json b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-2.json new file mode 100644 index 000000000..299c33a01 --- /dev/null +++ b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-2.json @@ -0,0 +1,815 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 739, + "pageInfo": { + "endCursor": "MzAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "v2.6.35-rc5", + "target": { + "target": { + "committedDate": "2010-07-12T21:55:33Z" + } + } + }, + { + "name": "v2.6.35-rc6", + "target": { + "target": { + "committedDate": "2010-07-22T19:13:38Z" + } + } + }, + { + "name": "v2.6.35", + "target": { + "target": { + "committedDate": "2010-08-01T22:11:14Z" + } + } + }, + { + "name": "v2.6.36-rc1", + "target": { + "target": { + "committedDate": "2010-08-16T00:41:37Z" + } + } + }, + { + "name": "v2.6.36-rc2", + "target": { + "target": { + "committedDate": "2010-08-23T00:43:29Z" + } + } + }, + { + "name": "v2.6.36-rc3", + "target": { + "target": { + "committedDate": "2010-08-29T15:36:04Z" + } + } + }, + { + "name": "v2.6.36-rc4", + "target": { + "target": { + "committedDate": "2010-09-12T23:07:37Z" + } + } + }, + { + "name": "v2.6.36-rc5", + "target": { + "target": { + "committedDate": "2010-09-20T23:56:53Z" + } + } + }, + { + "name": "v2.6.36-rc6", + "target": { + "target": { + "committedDate": "2010-09-29T01:01:22Z" + } + } + }, + { + "name": "v2.6.36-rc7", + "target": { + "target": { + "committedDate": "2010-10-06T20:39:52Z" + } + } + }, + { + "name": "v2.6.36-rc8", + "target": { + "target": { + "committedDate": "2010-10-14T23:26:43Z" + } + } + }, + { + "name": "v2.6.36", + "target": { + "target": { + "committedDate": "2010-10-20T20:30:22Z" + } + } + }, + { + "name": "v2.6.37-rc1", + "target": { + "target": { + "committedDate": "2010-11-01T11:54:12Z" + } + } + }, + { + "name": "v2.6.37-rc2", + "target": { + "target": { + "committedDate": "2010-11-16T02:31:02Z" + } + } + }, + { + "name": "v2.6.37-rc3", + "target": { + "target": { + "committedDate": "2010-11-21T23:18:56Z" + } + } + }, + { + "name": "v2.6.37-rc4", + "target": { + "target": { + "committedDate": "2010-11-30T04:42:04Z" + } + } + }, + { + "name": "v2.6.37-rc5", + "target": { + "target": { + "committedDate": "2010-12-07T04:09:04Z" + } + } + }, + { + "name": "v2.6.37-rc6", + "target": { + "target": { + "committedDate": "2010-12-16T01:24:48Z" + } + } + }, + { + "name": "v2.6.37-rc7", + "target": { + "target": { + "committedDate": "2010-12-21T19:26:40Z" + } + } + }, + { + "name": "v2.6.37-rc8", + "target": { + "target": { + "committedDate": "2010-12-29T01:05:48Z" + } + } + }, + { + "name": "v2.6.37", + "target": { + "target": { + "committedDate": "2011-01-05T00:50:19Z" + } + } + }, + { + "name": "v2.6.38-rc1", + "target": { + "target": { + "committedDate": "2011-01-18T23:14:02Z" + } + } + }, + { + "name": "v2.6.38-rc2", + "target": { + "target": { + "committedDate": "2011-01-22T03:01:34Z" + } + } + }, + { + "name": "v2.6.38-rc3", + "target": { + "target": { + "committedDate": "2011-02-01T03:05:49Z" + } + } + }, + { + "name": "v2.6.38-rc4", + "target": { + "target": { + "committedDate": "2011-02-08T00:03:55Z" + } + } + }, + { + "name": "v2.6.38-rc5", + "target": { + "target": { + "committedDate": "2011-02-16T03:23:45Z" + } + } + }, + { + "name": "v2.6.38-rc6", + "target": { + "target": { + "committedDate": "2011-02-22T01:25:52Z" + } + } + }, + { + "name": "v2.6.38-rc7", + "target": { + "target": { + "committedDate": "2011-03-01T21:55:12Z" + } + } + }, + { + "name": "v2.6.38-rc8", + "target": { + "target": { + "committedDate": "2011-03-08T05:09:37Z" + } + } + }, + { + "name": "v2.6.38", + "target": { + "target": { + "committedDate": "2011-03-15T01:20:32Z" + } + } + }, + { + "name": "v2.6.39-rc1", + "target": { + "target": { + "committedDate": "2011-03-29T19:09:47Z" + } + } + }, + { + "name": "v2.6.39-rc2", + "target": { + "target": { + "committedDate": "2011-04-06T01:30:43Z" + } + } + }, + { + "name": "v2.6.39-rc3", + "target": { + "target": { + "committedDate": "2011-04-12T00:21:51Z" + } + } + }, + { + "name": "v2.6.39-rc4", + "target": { + "target": { + "committedDate": "2011-04-19T04:26:00Z" + } + } + }, + { + "name": "v2.6.39-rc5", + "target": { + "target": { + "committedDate": "2011-04-27T03:48:50Z" + } + } + }, + { + "name": "v2.6.39-rc6", + "target": { + "target": { + "committedDate": "2011-05-04T02:59:13Z" + } + } + }, + { + "name": "v2.6.39-rc7", + "target": { + "target": { + "committedDate": "2011-05-10T02:33:54Z" + } + } + }, + { + "name": "v2.6.39", + "target": { + "target": { + "committedDate": "2011-05-19T04:06:34Z" + } + } + }, + { + "name": "v3.0-rc1", + "target": { + "target": { + "committedDate": "2011-05-30T00:43:36Z" + } + } + }, + { + "name": "v3.0-rc2", + "target": { + "target": { + "committedDate": "2011-06-06T09:06:33Z" + } + } + }, + { + "name": "v3.0-rc3", + "target": { + "target": { + "committedDate": "2011-06-13T22:29:59Z" + } + } + }, + { + "name": "v3.0-rc4", + "target": { + "target": { + "committedDate": "2011-06-21T03:25:46Z" + } + } + }, + { + "name": "v3.0-rc5", + "target": { + "target": { + "committedDate": "2011-06-28T02:12:22Z" + } + } + }, + { + "name": "v3.0-rc6", + "target": { + "target": { + "committedDate": "2011-07-04T22:56:24Z" + } + } + }, + { + "name": "v3.0-rc7", + "target": { + "target": { + "committedDate": "2011-07-11T23:51:52Z" + } + } + }, + { + "name": "v3.0", + "target": { + "target": { + "committedDate": "2011-07-22T02:17:23Z" + } + } + }, + { + "name": "v3.1-rc1", + "target": { + "target": { + "committedDate": "2011-08-08T01:23:30Z" + } + } + }, + { + "name": "v3.1-rc2", + "target": { + "target": { + "committedDate": "2011-08-14T22:09:08Z" + } + } + }, + { + "name": "v3.1-rc3", + "target": { + "target": { + "committedDate": "2011-08-22T18:42:53Z" + } + } + }, + { + "name": "v3.1-rc4", + "target": { + "target": { + "committedDate": "2011-08-29T04:16:01Z" + } + } + }, + { + "name": "v3.1-rc5", + "target": { + "target": { + "committedDate": "2011-09-04T22:45:10Z" + } + } + }, + { + "name": "v3.1-rc6", + "target": { + "target": { + "committedDate": "2011-09-12T21:02:02Z" + } + } + }, + { + "name": "v3.1-rc7", + "target": { + "target": { + "committedDate": "2011-09-21T23:58:15Z" + } + } + }, + { + "name": "v3.1-rc8", + "target": { + "target": { + "committedDate": "2011-09-27T22:48:34Z" + } + } + }, + { + "name": "v3.1-rc9", + "target": { + "target": { + "committedDate": "2011-10-05T01:11:50Z" + } + } + }, + { + "name": "v3.1-rc10", + "target": { + "target": { + "committedDate": "2011-10-18T04:06:23Z" + } + } + }, + { + "name": "v3.1", + "target": { + "target": { + "committedDate": "2011-10-24T07:10:05Z" + } + } + }, + { + "name": "v3.2-rc1", + "target": { + "target": { + "committedDate": "2011-11-08T00:16:02Z" + } + } + }, + { + "name": "v3.2-rc2", + "target": { + "target": { + "committedDate": "2011-11-15T17:02:59Z" + } + } + }, + { + "name": "v3.2-rc3", + "target": { + "target": { + "committedDate": "2011-11-24T04:20:28Z" + } + } + }, + { + "name": "v3.2-rc4", + "target": { + "target": { + "committedDate": "2011-12-01T22:56:01Z" + } + } + }, + { + "name": "v3.2-rc5", + "target": { + "target": { + "committedDate": "2011-12-09T23:09:32Z" + } + } + }, + { + "name": "v3.2-rc6", + "target": { + "target": { + "committedDate": "2011-12-17T02:36:26Z" + } + } + }, + { + "name": "v3.2-rc7", + "target": { + "target": { + "committedDate": "2011-12-24T05:51:06Z" + } + } + }, + { + "name": "v3.2", + "target": { + "target": { + "committedDate": "2012-01-04T23:55:44Z" + } + } + }, + { + "name": "v3.3-rc1", + "target": { + "target": { + "committedDate": "2012-01-19T23:04:48Z" + } + } + }, + { + "name": "v3.3-rc2", + "target": { + "target": { + "committedDate": "2012-01-31T21:31:54Z" + } + } + }, + { + "name": "v3.3-rc3", + "target": { + "target": { + "committedDate": "2012-02-09T03:21:53Z" + } + } + }, + { + "name": "v3.3-rc4", + "target": { + "target": { + "committedDate": "2012-02-18T23:53:33Z" + } + } + }, + { + "name": "v3.3-rc5", + "target": { + "target": { + "committedDate": "2012-02-25T20:18:16Z" + } + } + }, + { + "name": "v3.3-rc6", + "target": { + "target": { + "committedDate": "2012-03-04T01:08:09Z" + } + } + }, + { + "name": "v3.3-rc7", + "target": { + "target": { + "committedDate": "2012-03-10T21:49:52Z" + } + } + }, + { + "name": "v3.3", + "target": { + "target": { + "committedDate": "2012-03-18T23:15:34Z" + } + } + }, + { + "name": "v3.4-rc1", + "target": { + "target": { + "committedDate": "2012-03-31T23:24:09Z" + } + } + }, + { + "name": "v3.4-rc2", + "target": { + "target": { + "committedDate": "2012-04-08T01:30:41Z" + } + } + }, + { + "name": "v3.4-rc3", + "target": { + "target": { + "committedDate": "2012-04-16T01:28:29Z" + } + } + }, + { + "name": "v3.4-rc4", + "target": { + "target": { + "committedDate": "2012-04-21T21:47:52Z" + } + } + }, + { + "name": "v3.4-rc5", + "target": { + "target": { + "committedDate": "2012-04-29T22:19:10Z" + } + } + }, + { + "name": "v3.4-rc6", + "target": { + "target": { + "committedDate": "2012-05-06T22:07:32Z" + } + } + }, + { + "name": "v3.4-rc7", + "target": { + "target": { + "committedDate": "2012-05-13T01:37:47Z" + } + } + }, + { + "name": "v3.4", + "target": { + "target": { + "committedDate": "2012-05-20T22:29:13Z" + } + } + }, + { + "name": "v3.5-rc1", + "target": { + "target": { + "committedDate": "2012-06-03T01:29:26Z" + } + } + }, + { + "name": "v3.5-rc2", + "target": { + "target": { + "committedDate": "2012-06-09T01:40:09Z" + } + } + }, + { + "name": "v3.5-rc3", + "target": { + "target": { + "committedDate": "2012-06-17T00:25:17Z" + } + } + }, + { + "name": "v3.5-rc4", + "target": { + "target": { + "committedDate": "2012-06-24T19:53:04Z" + } + } + }, + { + "name": "v3.5-rc5", + "target": { + "target": { + "committedDate": "2012-06-30T23:08:57Z" + } + } + }, + { + "name": "v3.5-rc6", + "target": { + "target": { + "committedDate": "2012-07-08T00:23:56Z" + } + } + }, + { + "name": "v3.5-rc7", + "target": { + "target": { + "committedDate": "2012-07-14T22:40:28Z" + } + } + }, + { + "name": "v3.5", + "target": { + "target": { + "committedDate": "2012-07-21T20:58:29Z" + } + } + }, + { + "name": "v3.6-rc1", + "target": { + "target": { + "committedDate": "2012-08-02T23:38:10Z" + } + } + }, + { + "name": "v3.6-rc2", + "target": { + "target": { + "committedDate": "2012-08-16T21:51:24Z" + } + } + }, + { + "name": "v3.6-rc3", + "target": { + "target": { + "committedDate": "2012-08-22T20:29:06Z" + } + } + }, + { + "name": "v3.6-rc4", + "target": { + "target": { + "committedDate": "2012-09-01T17:39:58Z" + } + } + }, + { + "name": "v3.6-rc5", + "target": { + "target": { + "committedDate": "2012-09-08T23:43:45Z" + } + } + }, + { + "name": "v3.6-rc6", + "target": { + "target": { + "committedDate": "2012-09-16T21:58:51Z" + } + } + }, + { + "name": "v3.6-rc7", + "target": { + "target": { + "committedDate": "2012-09-24T01:10:57Z" + } + } + }, + { + "name": "v3.6", + "target": { + "target": { + "committedDate": "2012-09-30T23:47:46Z" + } + } + }, + { + "name": "v3.7-rc1", + "target": { + "target": { + "committedDate": "2012-10-14T21:41:04Z" + } + } + }, + { + "name": "v3.7-rc2", + "target": { + "target": { + "committedDate": "2012-10-20T19:11:32Z" + } + } + }, + { + "name": "v3.7-rc3", + "target": { + "target": { + "committedDate": "2012-10-28T19:24:48Z" + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-3.json b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-3.json new file mode 100644 index 000000000..a67738fd5 --- /dev/null +++ b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-3.json @@ -0,0 +1,815 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 739, + "pageInfo": { + "endCursor": "NDAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "v3.7-rc4", + "target": { + "target": { + "committedDate": "2012-11-04T19:07:39Z" + } + } + }, + { + "name": "v3.7-rc5", + "target": { + "target": { + "committedDate": "2012-11-11T12:44:33Z" + } + } + }, + { + "name": "v3.7-rc6", + "target": { + "target": { + "committedDate": "2012-11-17T01:42:40Z" + } + } + }, + { + "name": "v3.7-rc7", + "target": { + "target": { + "committedDate": "2012-11-26T01:59:19Z" + } + } + }, + { + "name": "v3.7-rc8", + "target": { + "target": { + "committedDate": "2012-12-03T19:22:37Z" + } + } + }, + { + "name": "v3.7", + "target": { + "target": { + "committedDate": "2012-12-11T03:30:57Z" + } + } + }, + { + "name": "v3.8-rc1", + "target": { + "target": { + "committedDate": "2012-12-22T01:19:00Z" + } + } + }, + { + "name": "v3.8-rc2", + "target": { + "target": { + "committedDate": "2013-01-03T02:13:21Z" + } + } + }, + { + "name": "v3.8-rc3", + "target": { + "target": { + "committedDate": "2013-01-10T02:59:55Z" + } + } + }, + { + "name": "v3.8-rc4", + "target": { + "target": { + "committedDate": "2013-01-18T03:25:45Z" + } + } + }, + { + "name": "v3.8-rc5", + "target": { + "target": { + "committedDate": "2013-01-25T19:57:28Z" + } + } + }, + { + "name": "v3.8-rc6", + "target": { + "target": { + "committedDate": "2013-02-01T01:08:14Z" + } + } + }, + { + "name": "v3.8-rc7", + "target": { + "target": { + "committedDate": "2013-02-08T21:20:39Z" + } + } + }, + { + "name": "v3.8", + "target": { + "target": { + "committedDate": "2013-02-18T23:58:34Z" + } + } + }, + { + "name": "v3.9-rc1", + "target": { + "target": { + "committedDate": "2013-03-03T23:11:05Z" + } + } + }, + { + "name": "v3.9-rc2", + "target": { + "target": { + "committedDate": "2013-03-10T23:54:19Z" + } + } + }, + { + "name": "v3.9-rc3", + "target": { + "target": { + "committedDate": "2013-03-17T22:59:32Z" + } + } + }, + { + "name": "v3.9-rc4", + "target": { + "target": { + "committedDate": "2013-03-23T23:52:44Z" + } + } + }, + { + "name": "v3.9-rc5", + "target": { + "target": { + "committedDate": "2013-03-31T22:12:43Z" + } + } + }, + { + "name": "v3.9-rc6", + "target": { + "target": { + "committedDate": "2013-04-08T03:49:54Z" + } + } + }, + { + "name": "v3.9-rc7", + "target": { + "target": { + "committedDate": "2013-04-15T00:45:16Z" + } + } + }, + { + "name": "v3.9-rc8", + "target": { + "target": { + "committedDate": "2013-04-21T21:38:45Z" + } + } + }, + { + "name": "v3.9", + "target": { + "target": { + "committedDate": "2013-04-29T00:36:01Z" + } + } + }, + { + "name": "v3.10-rc1", + "target": { + "target": { + "committedDate": "2013-05-12T00:14:08Z" + } + } + }, + { + "name": "v3.10-rc2", + "target": { + "target": { + "committedDate": "2013-05-20T21:37:38Z" + } + } + }, + { + "name": "v3.10-rc3", + "target": { + "target": { + "committedDate": "2013-05-26T23:00:47Z" + } + } + }, + { + "name": "v3.10-rc4", + "target": { + "target": { + "committedDate": "2013-06-02T08:11:17Z" + } + } + }, + { + "name": "v3.10-rc5", + "target": { + "target": { + "committedDate": "2013-06-09T00:41:04Z" + } + } + }, + { + "name": "v3.10-rc6", + "target": { + "target": { + "committedDate": "2013-06-15T21:51:07Z" + } + } + }, + { + "name": "v3.10-rc7", + "target": { + "target": { + "committedDate": "2013-06-22T19:47:31Z" + } + } + }, + { + "name": "v3.10", + "target": { + "target": { + "committedDate": "2013-06-30T22:13:29Z" + } + } + }, + { + "name": "v3.11-rc1", + "target": { + "target": { + "committedDate": "2013-07-14T22:18:27Z" + } + } + }, + { + "name": "v3.11-rc2", + "target": { + "target": { + "committedDate": "2013-07-21T19:05:29Z" + } + } + }, + { + "name": "v3.11-rc3", + "target": { + "target": { + "committedDate": "2013-07-29T03:53:33Z" + } + } + }, + { + "name": "v3.11-rc4", + "target": { + "target": { + "committedDate": "2013-08-04T20:46:46Z" + } + } + }, + { + "name": "v3.11-rc5", + "target": { + "target": { + "committedDate": "2013-08-12T01:04:20Z" + } + } + }, + { + "name": "v3.11-rc6", + "target": { + "target": { + "committedDate": "2013-08-18T21:36:53Z" + } + } + }, + { + "name": "v3.11-rc7", + "target": { + "target": { + "committedDate": "2013-08-26T00:43:22Z" + } + } + }, + { + "name": "v3.11", + "target": { + "target": { + "committedDate": "2013-09-02T20:46:10Z" + } + } + }, + { + "name": "v3.12-rc1", + "target": { + "target": { + "committedDate": "2013-09-16T20:17:51Z" + } + } + }, + { + "name": "v3.12-rc2", + "target": { + "target": { + "committedDate": "2013-09-23T22:41:09Z" + } + } + }, + { + "name": "v3.12-rc3", + "target": { + "target": { + "committedDate": "2013-09-29T22:02:38Z" + } + } + }, + { + "name": "v3.12-rc4", + "target": { + "target": { + "committedDate": "2013-10-06T21:00:20Z" + } + } + }, + { + "name": "v3.12-rc5", + "target": { + "target": { + "committedDate": "2013-10-13T22:41:28Z" + } + } + }, + { + "name": "v3.12-rc6", + "target": { + "target": { + "committedDate": "2013-10-19T19:28:15Z" + } + } + }, + { + "name": "v3.12-rc7", + "target": { + "target": { + "committedDate": "2013-10-27T23:12:03Z" + } + } + }, + { + "name": "v3.12", + "target": { + "target": { + "committedDate": "2013-11-03T23:41:51Z" + } + } + }, + { + "name": "v3.13-rc1", + "target": { + "target": { + "committedDate": "2013-11-22T19:30:55Z" + } + } + }, + { + "name": "v3.13-rc2", + "target": { + "target": { + "committedDate": "2013-11-29T20:57:14Z" + } + } + }, + { + "name": "v3.13-rc3", + "target": { + "target": { + "committedDate": "2013-12-06T17:34:04Z" + } + } + }, + { + "name": "v3.13-rc4", + "target": { + "target": { + "committedDate": "2013-12-15T20:31:33Z" + } + } + }, + { + "name": "v3.13-rc5", + "target": { + "target": { + "committedDate": "2013-12-22T21:08:32Z" + } + } + }, + { + "name": "v3.13-rc6", + "target": { + "target": { + "committedDate": "2013-12-30T00:01:33Z" + } + } + }, + { + "name": "v3.13-rc7", + "target": { + "target": { + "committedDate": "2014-01-04T23:12:14Z" + } + } + }, + { + "name": "v3.13-rc8", + "target": { + "target": { + "committedDate": "2014-01-12T10:04:18Z" + } + } + }, + { + "name": "v3.13", + "target": { + "target": { + "committedDate": "2014-01-20T02:40:07Z" + } + } + }, + { + "name": "v3.14-rc1", + "target": { + "target": { + "committedDate": "2014-02-03T00:42:13Z" + } + } + }, + { + "name": "v3.14-rc2", + "target": { + "target": { + "committedDate": "2014-02-10T02:15:47Z" + } + } + }, + { + "name": "v3.14-rc3", + "target": { + "target": { + "committedDate": "2014-02-16T21:30:25Z" + } + } + }, + { + "name": "v3.14-rc4", + "target": { + "target": { + "committedDate": "2014-02-24T01:40:03Z" + } + } + }, + { + "name": "v3.14-rc5", + "target": { + "target": { + "committedDate": "2014-03-03T02:56:16Z" + } + } + }, + { + "name": "v3.14-rc6", + "target": { + "target": { + "committedDate": "2014-03-10T02:41:57Z" + } + } + }, + { + "name": "v3.14-rc7", + "target": { + "target": { + "committedDate": "2014-03-17T01:51:24Z" + } + } + }, + { + "name": "v3.14-rc8", + "target": { + "target": { + "committedDate": "2014-03-25T02:31:17Z" + } + } + }, + { + "name": "v3.14", + "target": { + "target": { + "committedDate": "2014-03-31T03:40:15Z" + } + } + }, + { + "name": "v3.15-rc1", + "target": { + "target": { + "committedDate": "2014-04-13T21:18:35Z" + } + } + }, + { + "name": "v3.15-rc2", + "target": { + "target": { + "committedDate": "2014-04-20T18:08:50Z" + } + } + }, + { + "name": "v3.15-rc3", + "target": { + "target": { + "committedDate": "2014-04-28T02:29:27Z" + } + } + }, + { + "name": "v3.15-rc4", + "target": { + "target": { + "committedDate": "2014-05-05T01:14:42Z" + } + } + }, + { + "name": "v3.15-rc5", + "target": { + "target": { + "committedDate": "2014-05-09T20:10:52Z" + } + } + }, + { + "name": "v3.15-rc6", + "target": { + "target": { + "committedDate": "2014-05-21T21:42:02Z" + } + } + }, + { + "name": "v3.15-rc7", + "target": { + "target": { + "committedDate": "2014-05-25T23:06:00Z" + } + } + }, + { + "name": "v3.15-rc8", + "target": { + "target": { + "committedDate": "2014-06-02T02:12:24Z" + } + } + }, + { + "name": "v3.15", + "target": { + "target": { + "committedDate": "2014-06-08T18:19:54Z" + } + } + }, + { + "name": "v3.16-rc1", + "target": { + "target": { + "committedDate": "2014-06-16T03:45:28Z" + } + } + }, + { + "name": "v3.16-rc2", + "target": { + "target": { + "committedDate": "2014-06-22T05:02:54Z" + } + } + }, + { + "name": "v3.16-rc3", + "target": { + "target": { + "committedDate": "2014-06-29T21:11:36Z" + } + } + }, + { + "name": "v3.16-rc4", + "target": { + "target": { + "committedDate": "2014-07-06T19:37:51Z" + } + } + }, + { + "name": "v3.16-rc5", + "target": { + "target": { + "committedDate": "2014-07-13T21:04:33Z" + } + } + }, + { + "name": "v3.16-rc6", + "target": { + "target": { + "committedDate": "2014-07-21T04:04:16Z" + } + } + }, + { + "name": "v3.16-rc7", + "target": { + "target": { + "committedDate": "2014-07-27T19:41:55Z" + } + } + }, + { + "name": "v3.16", + "target": { + "target": { + "committedDate": "2014-08-03T22:25:02Z" + } + } + }, + { + "name": "v3.17-rc1", + "target": { + "target": { + "committedDate": "2014-08-16T16:40:26Z" + } + } + }, + { + "name": "v3.17-rc2", + "target": { + "target": { + "committedDate": "2014-08-25T22:36:20Z" + } + } + }, + { + "name": "v3.17-rc3", + "target": { + "target": { + "committedDate": "2014-09-01T01:23:04Z" + } + } + }, + { + "name": "v3.17-rc4", + "target": { + "target": { + "committedDate": "2014-09-07T23:09:43Z" + } + } + }, + { + "name": "v3.17-rc5", + "target": { + "target": { + "committedDate": "2014-09-15T00:50:12Z" + } + } + }, + { + "name": "v3.17-rc6", + "target": { + "target": { + "committedDate": "2014-09-21T22:43:02Z" + } + } + }, + { + "name": "v3.17-rc7", + "target": { + "target": { + "committedDate": "2014-09-28T21:29:07Z" + } + } + }, + { + "name": "v3.17", + "target": { + "target": { + "committedDate": "2014-10-05T19:23:04Z" + } + } + }, + { + "name": "v3.18-rc1", + "target": { + "target": { + "committedDate": "2014-10-20T01:08:38Z" + } + } + }, + { + "name": "v3.18-rc2", + "target": { + "target": { + "committedDate": "2014-10-26T23:48:41Z" + } + } + }, + { + "name": "v3.18-rc3", + "target": { + "target": { + "committedDate": "2014-11-02T23:01:51Z" + } + } + }, + { + "name": "v3.18-rc4", + "target": { + "target": { + "committedDate": "2014-11-09T22:55:29Z" + } + } + }, + { + "name": "v3.18-rc5", + "target": { + "target": { + "committedDate": "2014-11-17T00:36:20Z" + } + } + }, + { + "name": "v3.18-rc6", + "target": { + "target": { + "committedDate": "2014-11-23T23:25:20Z" + } + } + }, + { + "name": "v3.18-rc7", + "target": { + "target": { + "committedDate": "2014-12-01T00:42:27Z" + } + } + }, + { + "name": "v3.18", + "target": { + "target": { + "committedDate": "2014-12-07T22:21:05Z" + } + } + }, + { + "name": "v3.19-rc1", + "target": { + "target": { + "committedDate": "2014-12-21T01:08:50Z" + } + } + }, + { + "name": "v3.19-rc2", + "target": { + "target": { + "committedDate": "2014-12-29T00:49:37Z" + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-4.json b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-4.json new file mode 100644 index 000000000..31634bd0b --- /dev/null +++ b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-4.json @@ -0,0 +1,815 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 739, + "pageInfo": { + "endCursor": "NTAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "v3.19-rc3", + "target": { + "target": { + "committedDate": "2015-01-06T01:05:20Z" + } + } + }, + { + "name": "v3.19-rc4", + "target": { + "target": { + "committedDate": "2015-01-11T20:44:53Z" + } + } + }, + { + "name": "v3.19-rc5", + "target": { + "target": { + "committedDate": "2015-01-18T06:02:20Z" + } + } + }, + { + "name": "v3.19-rc6", + "target": { + "target": { + "committedDate": "2015-01-26T04:04:41Z" + } + } + }, + { + "name": "v3.19-rc7", + "target": { + "target": { + "committedDate": "2015-02-02T04:07:21Z" + } + } + }, + { + "name": "v3.19", + "target": { + "target": { + "committedDate": "2015-02-09T02:54:22Z" + } + } + }, + { + "name": "v4.0-rc1", + "target": { + "target": { + "committedDate": "2015-02-23T02:21:14Z" + } + } + }, + { + "name": "v4.0-rc2", + "target": { + "target": { + "committedDate": "2015-03-03T17:04:59Z" + } + } + }, + { + "name": "v4.0-rc3", + "target": { + "target": { + "committedDate": "2015-03-08T23:09:09Z" + } + } + }, + { + "name": "v4.0-rc4", + "target": { + "target": { + "committedDate": "2015-03-16T00:38:20Z" + } + } + }, + { + "name": "v4.0-rc5", + "target": { + "target": { + "committedDate": "2015-03-22T23:50:21Z" + } + } + }, + { + "name": "v4.0-rc6", + "target": { + "target": { + "committedDate": "2015-03-29T22:26:31Z" + } + } + }, + { + "name": "v4.0-rc7", + "target": { + "target": { + "committedDate": "2015-04-06T22:39:45Z" + } + } + }, + { + "name": "v4.0", + "target": { + "target": { + "committedDate": "2015-04-12T22:12:50Z" + } + } + }, + { + "name": "v4.1-rc1", + "target": { + "target": { + "committedDate": "2015-04-27T00:59:10Z" + } + } + }, + { + "name": "v4.1-rc2", + "target": { + "target": { + "committedDate": "2015-05-04T02:22:23Z" + } + } + }, + { + "name": "v4.1-rc3", + "target": { + "target": { + "committedDate": "2015-05-10T22:12:29Z" + } + } + }, + { + "name": "v4.1-rc4", + "target": { + "target": { + "committedDate": "2015-05-18T17:13:47Z" + } + } + }, + { + "name": "v4.1-rc5", + "target": { + "target": { + "committedDate": "2015-05-25T01:22:35Z" + } + } + }, + { + "name": "v4.1-rc6", + "target": { + "target": { + "committedDate": "2015-06-01T02:01:07Z" + } + } + }, + { + "name": "v4.1-rc7", + "target": { + "target": { + "committedDate": "2015-06-08T03:23:50Z" + } + } + }, + { + "name": "v4.1-rc8", + "target": { + "target": { + "committedDate": "2015-06-15T01:51:10Z" + } + } + }, + { + "name": "v4.1", + "target": { + "target": { + "committedDate": "2015-06-22T05:05:43Z" + } + } + }, + { + "name": "v4.2-rc1", + "target": { + "target": { + "committedDate": "2015-07-05T18:01:52Z" + } + } + }, + { + "name": "v4.2-rc2", + "target": { + "target": { + "committedDate": "2015-07-12T22:10:30Z" + } + } + }, + { + "name": "v4.2-rc3", + "target": { + "target": { + "committedDate": "2015-07-19T21:45:02Z" + } + } + }, + { + "name": "v4.2-rc4", + "target": { + "target": { + "committedDate": "2015-07-26T19:26:21Z" + } + } + }, + { + "name": "v4.2-rc5", + "target": { + "target": { + "committedDate": "2015-08-03T01:34:55Z" + } + } + }, + { + "name": "v4.2-rc6", + "target": { + "target": { + "committedDate": "2015-08-09T19:54:30Z" + } + } + }, + { + "name": "v4.2-rc7", + "target": { + "target": { + "committedDate": "2015-08-16T23:34:13Z" + } + } + }, + { + "name": "v4.2-rc8", + "target": { + "target": { + "committedDate": "2015-08-24T03:52:59Z" + } + } + }, + { + "name": "v4.2", + "target": { + "target": { + "committedDate": "2015-08-30T18:34:09Z" + } + } + }, + { + "name": "v4.3-rc1", + "target": { + "target": { + "committedDate": "2015-09-12T23:35:56Z" + } + } + }, + { + "name": "v4.3-rc2", + "target": { + "target": { + "committedDate": "2015-09-20T21:32:34Z" + } + } + }, + { + "name": "v4.3-rc3", + "target": { + "target": { + "committedDate": "2015-09-27T11:50:08Z" + } + } + }, + { + "name": "v4.3-rc4", + "target": { + "target": { + "committedDate": "2015-10-04T15:57:17Z" + } + } + }, + { + "name": "v4.3-rc5", + "target": { + "target": { + "committedDate": "2015-10-11T18:09:45Z" + } + } + }, + { + "name": "v4.3-rc6", + "target": { + "target": { + "committedDate": "2015-10-18T23:08:42Z" + } + } + }, + { + "name": "v4.3-rc7", + "target": { + "target": { + "committedDate": "2015-10-25T01:39:47Z" + } + } + }, + { + "name": "v4.3", + "target": { + "target": { + "committedDate": "2015-11-02T00:05:25Z" + } + } + }, + { + "name": "v4.4-rc1", + "target": { + "target": { + "committedDate": "2015-11-16T01:00:27Z" + } + } + }, + { + "name": "v4.4-rc2", + "target": { + "target": { + "committedDate": "2015-11-23T00:45:59Z" + } + } + }, + { + "name": "v4.4-rc3", + "target": { + "target": { + "committedDate": "2015-11-30T02:58:26Z" + } + } + }, + { + "name": "v4.4-rc4", + "target": { + "target": { + "committedDate": "2015-12-06T23:43:12Z" + } + } + }, + { + "name": "v4.4-rc5", + "target": { + "target": { + "committedDate": "2015-12-14T01:42:58Z" + } + } + }, + { + "name": "v4.4-rc6", + "target": { + "target": { + "committedDate": "2015-12-21T00:06:09Z" + } + } + }, + { + "name": "v4.4-rc7", + "target": { + "target": { + "committedDate": "2015-12-28T02:17:37Z" + } + } + }, + { + "name": "v4.4-rc8", + "target": { + "target": { + "committedDate": "2016-01-03T23:15:37Z" + } + } + }, + { + "name": "v4.4", + "target": { + "target": { + "committedDate": "2016-01-10T23:01:32Z" + } + } + }, + { + "name": "v4.5-rc1", + "target": { + "target": { + "committedDate": "2016-01-24T21:06:47Z" + } + } + }, + { + "name": "v4.5-rc2", + "target": { + "target": { + "committedDate": "2016-02-01T02:12:16Z" + } + } + }, + { + "name": "v4.5-rc3", + "target": { + "target": { + "committedDate": "2016-02-07T23:38:30Z" + } + } + }, + { + "name": "v4.5-rc4", + "target": { + "target": { + "committedDate": "2016-02-14T21:05:20Z" + } + } + }, + { + "name": "v4.5-rc5", + "target": { + "target": { + "committedDate": "2016-02-20T21:39:35Z" + } + } + }, + { + "name": "v4.5-rc6", + "target": { + "target": { + "committedDate": "2016-02-28T16:41:20Z" + } + } + }, + { + "name": "v4.5-rc7", + "target": { + "target": { + "committedDate": "2016-03-06T22:48:03Z" + } + } + }, + { + "name": "v4.5", + "target": { + "target": { + "committedDate": "2016-03-14T04:28:54Z" + } + } + }, + { + "name": "v4.6-rc1", + "target": { + "target": { + "committedDate": "2016-03-26T23:03:24Z" + } + } + }, + { + "name": "v4.6-rc2", + "target": { + "target": { + "committedDate": "2016-04-03T14:09:40Z" + } + } + }, + { + "name": "v4.6-rc3", + "target": { + "target": { + "committedDate": "2016-04-11T00:58:30Z" + } + } + }, + { + "name": "v4.6-rc4", + "target": { + "target": { + "committedDate": "2016-04-18T02:13:32Z" + } + } + }, + { + "name": "v4.6-rc5", + "target": { + "target": { + "committedDate": "2016-04-24T23:17:05Z" + } + } + }, + { + "name": "v4.6-rc6", + "target": { + "target": { + "committedDate": "2016-05-01T22:52:31Z" + } + } + }, + { + "name": "v4.6-rc7", + "target": { + "target": { + "committedDate": "2016-05-08T21:38:32Z" + } + } + }, + { + "name": "v4.6", + "target": { + "target": { + "committedDate": "2016-05-15T22:43:13Z" + } + } + }, + { + "name": "v4.7-rc1", + "target": { + "target": { + "committedDate": "2016-05-29T16:29:24Z" + } + } + }, + { + "name": "v4.7-rc2", + "target": { + "target": { + "committedDate": "2016-06-05T21:31:26Z" + } + } + }, + { + "name": "v4.7-rc3", + "target": { + "target": { + "committedDate": "2016-06-12T14:20:35Z" + } + } + }, + { + "name": "v4.7-rc4", + "target": { + "target": { + "committedDate": "2016-06-20T04:30:02Z" + } + } + }, + { + "name": "v4.7-rc5", + "target": { + "target": { + "committedDate": "2016-06-27T00:52:03Z" + } + } + }, + { + "name": "v4.7-rc6", + "target": { + "target": { + "committedDate": "2016-07-04T06:01:00Z" + } + } + }, + { + "name": "v4.7-rc7", + "target": { + "target": { + "committedDate": "2016-07-11T03:24:59Z" + } + } + }, + { + "name": "v4.7", + "target": { + "target": { + "committedDate": "2016-07-24T19:23:50Z" + } + } + }, + { + "name": "v4.8-rc1", + "target": { + "target": { + "committedDate": "2016-08-08T01:18:00Z" + } + } + }, + { + "name": "v4.8-rc2", + "target": { + "target": { + "committedDate": "2016-08-15T02:11:36Z" + } + } + }, + { + "name": "v4.8-rc3", + "target": { + "target": { + "committedDate": "2016-08-21T23:14:10Z" + } + } + }, + { + "name": "v4.8-rc4", + "target": { + "target": { + "committedDate": "2016-08-28T22:04:33Z" + } + } + }, + { + "name": "v4.8-rc5", + "target": { + "target": { + "committedDate": "2016-09-04T21:31:46Z" + } + } + }, + { + "name": "v4.8-rc6", + "target": { + "target": { + "committedDate": "2016-09-12T03:02:25Z" + } + } + }, + { + "name": "v4.8-rc7", + "target": { + "target": { + "committedDate": "2016-09-19T00:27:41Z" + } + } + }, + { + "name": "v4.8-rc8", + "target": { + "target": { + "committedDate": "2016-09-26T01:47:13Z" + } + } + }, + { + "name": "v4.8", + "target": { + "target": { + "committedDate": "2016-10-02T23:24:33Z" + } + } + }, + { + "name": "v4.9-rc1", + "target": { + "target": { + "committedDate": "2016-10-15T19:17:50Z" + } + } + }, + { + "name": "v4.9-rc2", + "target": { + "target": { + "committedDate": "2016-10-24T00:10:14Z" + } + } + }, + { + "name": "v4.9-rc3", + "target": { + "target": { + "committedDate": "2016-10-29T20:52:02Z" + } + } + }, + { + "name": "v4.9-rc4", + "target": { + "target": { + "committedDate": "2016-11-05T23:23:36Z" + } + } + }, + { + "name": "v4.9-rc5", + "target": { + "target": { + "committedDate": "2016-11-13T18:32:32Z" + } + } + }, + { + "name": "v4.9-rc6", + "target": { + "target": { + "committedDate": "2016-11-20T21:52:19Z" + } + } + }, + { + "name": "v4.9-rc7", + "target": { + "target": { + "committedDate": "2016-11-27T21:08:04Z" + } + } + }, + { + "name": "v4.9-rc8", + "target": { + "target": { + "committedDate": "2016-12-04T20:50:51Z" + } + } + }, + { + "name": "v4.9", + "target": { + "target": { + "committedDate": "2016-12-11T19:17:54Z" + } + } + }, + { + "name": "v4.10-rc1", + "target": { + "target": { + "committedDate": "2016-12-26T00:13:08Z" + } + } + }, + { + "name": "v4.10-rc2", + "target": { + "target": { + "committedDate": "2017-01-01T22:31:53Z" + } + } + }, + { + "name": "v4.10-rc3", + "target": { + "target": { + "committedDate": "2017-01-08T22:18:17Z" + } + } + }, + { + "name": "v4.10-rc4", + "target": { + "target": { + "committedDate": "2017-01-16T00:21:59Z" + } + } + }, + { + "name": "v4.10-rc5", + "target": { + "target": { + "committedDate": "2017-01-22T20:54:15Z" + } + } + }, + { + "name": "v4.10-rc6", + "target": { + "target": { + "committedDate": "2017-01-29T22:25:17Z" + } + } + }, + { + "name": "v4.10-rc7", + "target": { + "target": { + "committedDate": "2017-02-05T23:10:58Z" + } + } + }, + { + "name": "v4.10-rc8", + "target": { + "target": { + "committedDate": "2017-02-12T21:03:20Z" + } + } + }, + { + "name": "v4.10", + "target": { + "target": { + "committedDate": "2017-02-19T22:34:00Z" + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-5.json b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-5.json new file mode 100644 index 000000000..111b951e7 --- /dev/null +++ b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-5.json @@ -0,0 +1,815 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 739, + "pageInfo": { + "endCursor": "NjAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "v4.11-rc1", + "target": { + "target": { + "committedDate": "2017-03-05T20:59:56Z" + } + } + }, + { + "name": "v4.11-rc2", + "target": { + "target": { + "committedDate": "2017-03-12T21:47:08Z" + } + } + }, + { + "name": "v4.11-rc3", + "target": { + "target": { + "committedDate": "2017-03-20T02:09:39Z" + } + } + }, + { + "name": "v4.11-rc4", + "target": { + "target": { + "committedDate": "2017-03-26T21:15:16Z" + } + } + }, + { + "name": "v4.11-rc5", + "target": { + "target": { + "committedDate": "2017-04-03T00:23:54Z" + } + } + }, + { + "name": "v4.11-rc6", + "target": { + "target": { + "committedDate": "2017-04-09T16:49:44Z" + } + } + }, + { + "name": "v4.11-rc7", + "target": { + "target": { + "committedDate": "2017-04-16T20:00:18Z" + } + } + }, + { + "name": "v4.11-rc8", + "target": { + "target": { + "committedDate": "2017-04-23T23:53:00Z" + } + } + }, + { + "name": "v4.11", + "target": { + "target": { + "committedDate": "2017-05-01T02:47:48Z" + } + } + }, + { + "name": "v4.12-rc1", + "target": { + "target": { + "committedDate": "2017-05-13T20:19:49Z" + } + } + }, + { + "name": "v4.12-rc2", + "target": { + "target": { + "committedDate": "2017-05-22T02:30:23Z" + } + } + }, + { + "name": "v4.12-rc3", + "target": { + "target": { + "committedDate": "2017-05-29T00:20:53Z" + } + } + }, + { + "name": "v4.12-rc4", + "target": { + "target": { + "committedDate": "2017-06-04T23:47:43Z" + } + } + }, + { + "name": "v4.12-rc5", + "target": { + "target": { + "committedDate": "2017-06-11T23:48:20Z" + } + } + }, + { + "name": "v4.12-rc6", + "target": { + "target": { + "committedDate": "2017-06-19T14:19:37Z" + } + } + }, + { + "name": "v4.12-rc7", + "target": { + "target": { + "committedDate": "2017-06-26T01:30:05Z" + } + } + }, + { + "name": "v4.12", + "target": { + "target": { + "committedDate": "2017-07-02T23:07:02Z" + } + } + }, + { + "name": "v4.13-rc1", + "target": { + "target": { + "committedDate": "2017-07-15T22:22:10Z" + } + } + }, + { + "name": "v4.13-rc2", + "target": { + "target": { + "committedDate": "2017-07-23T23:15:17Z" + } + } + }, + { + "name": "v4.13-rc3", + "target": { + "target": { + "committedDate": "2017-07-30T19:40:36Z" + } + } + }, + { + "name": "v4.13-rc4", + "target": { + "target": { + "committedDate": "2017-08-07T01:44:49Z" + } + } + }, + { + "name": "v4.13-rc5", + "target": { + "target": { + "committedDate": "2017-08-13T23:01:32Z" + } + } + }, + { + "name": "v4.13-rc6", + "target": { + "target": { + "committedDate": "2017-08-20T21:13:52Z" + } + } + }, + { + "name": "v4.13-rc7", + "target": { + "target": { + "committedDate": "2017-08-28T00:20:40Z" + } + } + }, + { + "name": "v4.13", + "target": { + "target": { + "committedDate": "2017-09-03T20:56:17Z" + } + } + }, + { + "name": "v4.14-rc1", + "target": { + "target": { + "committedDate": "2017-09-16T22:47:51Z" + } + } + }, + { + "name": "v4.14-rc2", + "target": { + "target": { + "committedDate": "2017-09-24T23:38:56Z" + } + } + }, + { + "name": "v4.14-rc3", + "target": { + "target": { + "committedDate": "2017-10-01T21:54:54Z" + } + } + }, + { + "name": "v4.14-rc4", + "target": { + "target": { + "committedDate": "2017-10-09T03:53:29Z" + } + } + }, + { + "name": "v4.14-rc5", + "target": { + "target": { + "committedDate": "2017-10-16T01:01:12Z" + } + } + }, + { + "name": "v4.14-rc6", + "target": { + "target": { + "committedDate": "2017-10-23T10:49:47Z" + } + } + }, + { + "name": "v4.14-rc7", + "target": { + "target": { + "committedDate": "2017-10-29T20:58:38Z" + } + } + }, + { + "name": "v4.14-rc8", + "target": { + "target": { + "committedDate": "2017-11-05T21:05:14Z" + } + } + }, + { + "name": "v4.14", + "target": { + "target": { + "committedDate": "2017-11-12T18:46:13Z" + } + } + }, + { + "name": "v4.15-rc1", + "target": { + "target": { + "committedDate": "2017-11-27T00:01:47Z" + } + } + }, + { + "name": "v4.15-rc2", + "target": { + "target": { + "committedDate": "2017-12-03T16:01:47Z" + } + } + }, + { + "name": "v4.15-rc3", + "target": { + "target": { + "committedDate": "2017-12-11T01:56:26Z" + } + } + }, + { + "name": "v4.15-rc4", + "target": { + "target": { + "committedDate": "2017-12-18T02:59:59Z" + } + } + }, + { + "name": "v4.15-rc5", + "target": { + "target": { + "committedDate": "2017-12-24T04:47:16Z" + } + } + }, + { + "name": "v4.15-rc6", + "target": { + "target": { + "committedDate": "2017-12-31T22:47:43Z" + } + } + }, + { + "name": "v4.15-rc7", + "target": { + "target": { + "committedDate": "2018-01-07T22:22:41Z" + } + } + }, + { + "name": "v4.15-rc8", + "target": { + "target": { + "committedDate": "2018-01-14T23:32:30Z" + } + } + }, + { + "name": "v4.15-rc9", + "target": { + "target": { + "committedDate": "2018-01-21T21:51:26Z" + } + } + }, + { + "name": "v4.15", + "target": { + "target": { + "committedDate": "2018-01-28T21:20:33Z" + } + } + }, + { + "name": "v4.16-rc1", + "target": { + "target": { + "committedDate": "2018-02-11T23:04:29Z" + } + } + }, + { + "name": "v4.16-rc2", + "target": { + "target": { + "committedDate": "2018-02-19T01:29:42Z" + } + } + }, + { + "name": "v4.16-rc3", + "target": { + "target": { + "committedDate": "2018-02-26T02:50:41Z" + } + } + }, + { + "name": "v4.16-rc4", + "target": { + "target": { + "committedDate": "2018-03-04T22:54:11Z" + } + } + }, + { + "name": "v4.16-rc5", + "target": { + "target": { + "committedDate": "2018-03-12T00:25:09Z" + } + } + }, + { + "name": "v4.16-rc6", + "target": { + "target": { + "committedDate": "2018-03-19T00:48:42Z" + } + } + }, + { + "name": "v4.16-rc7", + "target": { + "target": { + "committedDate": "2018-03-25T22:44:30Z" + } + } + }, + { + "name": "v4.16", + "target": { + "target": { + "committedDate": "2018-04-01T21:20:27Z" + } + } + }, + { + "name": "v4.17-rc1", + "target": { + "target": { + "committedDate": "2018-04-16T01:24:20Z" + } + } + }, + { + "name": "v4.17-rc2", + "target": { + "target": { + "committedDate": "2018-04-23T02:20:09Z" + } + } + }, + { + "name": "v4.17-rc3", + "target": { + "target": { + "committedDate": "2018-04-29T21:17:42Z" + } + } + }, + { + "name": "v4.17-rc4", + "target": { + "target": { + "committedDate": "2018-05-07T02:57:38Z" + } + } + }, + { + "name": "v4.17-rc5", + "target": { + "target": { + "committedDate": "2018-05-13T23:15:17Z" + } + } + }, + { + "name": "v4.17-rc6", + "target": { + "target": { + "committedDate": "2018-05-20T22:31:38Z" + } + } + }, + { + "name": "v4.17-rc7", + "target": { + "target": { + "committedDate": "2018-05-27T20:01:47Z" + } + } + }, + { + "name": "v4.17", + "target": { + "target": { + "committedDate": "2018-06-03T21:15:21Z" + } + } + }, + { + "name": "v4.18-rc1", + "target": { + "target": { + "committedDate": "2018-06-16T23:04:49Z" + } + } + }, + { + "name": "v4.18-rc2", + "target": { + "target": { + "committedDate": "2018-06-24T12:54:29Z" + } + } + }, + { + "name": "v4.18-rc3", + "target": { + "target": { + "committedDate": "2018-07-01T23:04:53Z" + } + } + }, + { + "name": "v4.18-rc4", + "target": { + "target": { + "committedDate": "2018-07-08T23:34:02Z" + } + } + }, + { + "name": "v4.18-rc5", + "target": { + "target": { + "committedDate": "2018-07-15T19:49:31Z" + } + } + }, + { + "name": "v4.18-rc6", + "target": { + "target": { + "committedDate": "2018-07-22T21:12:20Z" + } + } + }, + { + "name": "v4.18-rc7", + "target": { + "target": { + "committedDate": "2018-07-29T21:44:52Z" + } + } + }, + { + "name": "v4.18-rc8", + "target": { + "target": { + "committedDate": "2018-08-05T19:37:41Z" + } + } + }, + { + "name": "v4.18", + "target": { + "target": { + "committedDate": "2018-08-12T20:41:04Z" + } + } + }, + { + "name": "v4.19-rc1", + "target": { + "target": { + "committedDate": "2018-08-26T21:11:59Z" + } + } + }, + { + "name": "v4.19-rc2", + "target": { + "target": { + "committedDate": "2018-09-02T21:37:30Z" + } + } + }, + { + "name": "v4.19-rc3", + "target": { + "target": { + "committedDate": "2018-09-10T00:26:43Z" + } + } + }, + { + "name": "v4.19-rc4", + "target": { + "target": { + "committedDate": "2018-09-16T18:52:37Z" + } + } + }, + { + "name": "v4.19-rc5", + "target": { + "target": { + "committedDate": "2018-09-23T17:15:18Z" + } + } + }, + { + "name": "v4.19-rc6", + "target": { + "target": { + "committedDate": "2018-09-30T14:15:35Z" + } + } + }, + { + "name": "v4.19-rc7", + "target": { + "target": { + "committedDate": "2018-10-07T15:26:02Z" + } + } + }, + { + "name": "v4.19-rc8", + "target": { + "target": { + "committedDate": "2018-10-15T05:20:24Z" + } + } + }, + { + "name": "v4.19", + "target": { + "target": { + "committedDate": "2018-10-22T06:37:37Z" + } + } + }, + { + "name": "v4.20-rc1", + "target": { + "target": { + "committedDate": "2018-11-04T23:37:52Z" + } + } + }, + { + "name": "v4.20-rc2", + "target": { + "target": { + "committedDate": "2018-11-11T23:12:31Z" + } + } + }, + { + "name": "v4.20-rc3", + "target": { + "target": { + "committedDate": "2018-11-18T21:33:44Z" + } + } + }, + { + "name": "v4.20-rc4", + "target": { + "target": { + "committedDate": "2018-11-25T22:19:31Z" + } + } + }, + { + "name": "v4.20-rc5", + "target": { + "target": { + "committedDate": "2018-12-02T23:07:55Z" + } + } + }, + { + "name": "v4.20-rc6", + "target": { + "target": { + "committedDate": "2018-12-09T23:31:00Z" + } + } + }, + { + "name": "v4.20-rc7", + "target": { + "target": { + "committedDate": "2018-12-16T23:46:55Z" + } + } + }, + { + "name": "v4.20", + "target": { + "target": { + "committedDate": "2018-12-23T23:55:59Z" + } + } + }, + { + "name": "v5.0-rc1", + "target": { + "target": { + "committedDate": "2019-01-07T01:08:20Z" + } + } + }, + { + "name": "v5.0-rc2", + "target": { + "target": { + "committedDate": "2019-01-13T22:41:12Z" + } + } + }, + { + "name": "v5.0-rc3", + "target": { + "target": { + "committedDate": "2019-01-21T00:14:44Z" + } + } + }, + { + "name": "v5.0-rc4", + "target": { + "target": { + "committedDate": "2019-01-27T23:18:05Z" + } + } + }, + { + "name": "v5.0-rc5", + "target": { + "target": { + "committedDate": "2019-02-03T21:48:04Z" + } + } + }, + { + "name": "v5.0-rc6", + "target": { + "target": { + "committedDate": "2019-02-10T22:42:20Z" + } + } + }, + { + "name": "v5.0-rc7", + "target": { + "target": { + "committedDate": "2019-02-18T02:46:40Z" + } + } + }, + { + "name": "v5.0-rc8", + "target": { + "target": { + "committedDate": "2019-02-25T00:46:45Z" + } + } + }, + { + "name": "v5.0", + "target": { + "target": { + "committedDate": "2019-03-03T23:21:29Z" + } + } + }, + { + "name": "v5.1-rc1", + "target": { + "target": { + "committedDate": "2019-03-17T21:22:26Z" + } + } + }, + { + "name": "v5.1-rc2", + "target": { + "target": { + "committedDate": "2019-03-24T21:02:26Z" + } + } + }, + { + "name": "v5.1-rc3", + "target": { + "target": { + "committedDate": "2019-03-31T21:39:29Z" + } + } + }, + { + "name": "v5.1-rc4", + "target": { + "target": { + "committedDate": "2019-04-08T00:09:59Z" + } + } + }, + { + "name": "v5.1-rc5", + "target": { + "target": { + "committedDate": "2019-04-14T22:17:41Z" + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-6.json b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-6.json new file mode 100644 index 000000000..d039e226d --- /dev/null +++ b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-6.json @@ -0,0 +1,815 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 739, + "pageInfo": { + "endCursor": "NzAw", + "hasNextPage": true + }, + "nodes": [ + { + "name": "v5.1-rc6", + "target": { + "target": { + "committedDate": "2019-04-21T17:45:57Z" + } + } + }, + { + "name": "v5.1-rc7", + "target": { + "target": { + "committedDate": "2019-04-29T00:04:13Z" + } + } + }, + { + "name": "v5.1", + "target": { + "target": { + "committedDate": "2019-05-06T00:42:58Z" + } + } + }, + { + "name": "v5.2-rc1", + "target": { + "target": { + "committedDate": "2019-05-19T22:47:09Z" + } + } + }, + { + "name": "v5.2-rc2", + "target": { + "target": { + "committedDate": "2019-05-26T23:49:19Z" + } + } + }, + { + "name": "v5.2-rc3", + "target": { + "target": { + "committedDate": "2019-06-02T20:55:33Z" + } + } + }, + { + "name": "v5.2-rc4", + "target": { + "target": { + "committedDate": "2019-06-09T03:24:46Z" + } + } + }, + { + "name": "v5.2-rc5", + "target": { + "target": { + "committedDate": "2019-06-16T18:49:45Z" + } + } + }, + { + "name": "v5.2-rc6", + "target": { + "target": { + "committedDate": "2019-06-22T23:01:36Z" + } + } + }, + { + "name": "v5.2-rc7", + "target": { + "target": { + "committedDate": "2019-06-30T03:25:36Z" + } + } + }, + { + "name": "v5.2", + "target": { + "target": { + "committedDate": "2019-07-07T22:41:56Z" + } + } + }, + { + "name": "v5.3-rc1", + "target": { + "target": { + "committedDate": "2019-07-21T21:05:38Z" + } + } + }, + { + "name": "v5.3-rc2", + "target": { + "target": { + "committedDate": "2019-07-28T19:47:02Z" + } + } + }, + { + "name": "v5.3-rc3", + "target": { + "target": { + "committedDate": "2019-08-05T01:40:12Z" + } + } + }, + { + "name": "v5.3-rc4", + "target": { + "target": { + "committedDate": "2019-08-11T20:26:41Z" + } + } + }, + { + "name": "v5.3-rc5", + "target": { + "target": { + "committedDate": "2019-08-18T21:31:08Z" + } + } + }, + { + "name": "v5.3-rc6", + "target": { + "target": { + "committedDate": "2019-08-25T19:01:23Z" + } + } + }, + { + "name": "v5.3-rc7", + "target": { + "target": { + "committedDate": "2019-09-02T16:57:40Z" + } + } + }, + { + "name": "v5.3-rc8", + "target": { + "target": { + "committedDate": "2019-09-08T20:33:15Z" + } + } + }, + { + "name": "v5.3", + "target": { + "target": { + "committedDate": "2019-09-15T21:19:32Z" + } + } + }, + { + "name": "v5.4-rc1", + "target": { + "target": { + "committedDate": "2019-09-30T17:35:40Z" + } + } + }, + { + "name": "v5.4-rc2", + "target": { + "target": { + "committedDate": "2019-10-06T21:27:30Z" + } + } + }, + { + "name": "v5.4-rc3", + "target": { + "target": { + "committedDate": "2019-10-13T23:37:36Z" + } + } + }, + { + "name": "v5.4-rc4", + "target": { + "target": { + "committedDate": "2019-10-20T19:56:22Z" + } + } + }, + { + "name": "v5.4-rc5", + "target": { + "target": { + "committedDate": "2019-10-27T17:19:19Z" + } + } + }, + { + "name": "v5.4-rc6", + "target": { + "target": { + "committedDate": "2019-11-03T22:07:26Z" + } + } + }, + { + "name": "v5.4-rc7", + "target": { + "target": { + "committedDate": "2019-11-11T00:17:15Z" + } + } + }, + { + "name": "v5.4-rc8", + "target": { + "target": { + "committedDate": "2019-11-17T22:47:30Z" + } + } + }, + { + "name": "v5.4", + "target": { + "target": { + "committedDate": "2019-11-25T00:32:01Z" + } + } + }, + { + "name": "v5.5-rc1", + "target": { + "target": { + "committedDate": "2019-12-08T22:57:55Z" + } + } + }, + { + "name": "v5.5-rc2", + "target": { + "target": { + "committedDate": "2019-12-15T23:16:08Z" + } + } + }, + { + "name": "v5.5-rc3", + "target": { + "target": { + "committedDate": "2019-12-23T01:02:23Z" + } + } + }, + { + "name": "v5.5-rc4", + "target": { + "target": { + "committedDate": "2019-12-29T23:29:16Z" + } + } + }, + { + "name": "v5.5-rc5", + "target": { + "target": { + "committedDate": "2020-01-05T22:23:27Z" + } + } + }, + { + "name": "v5.5-rc6", + "target": { + "target": { + "committedDate": "2020-01-13T00:55:08Z" + } + } + }, + { + "name": "v5.5-rc7", + "target": { + "target": { + "committedDate": "2020-01-20T00:02:49Z" + } + } + }, + { + "name": "v5.5", + "target": { + "target": { + "committedDate": "2020-01-27T00:23:03Z" + } + } + }, + { + "name": "v5.6-rc1", + "target": { + "target": { + "committedDate": "2020-02-10T00:08:48Z" + } + } + }, + { + "name": "v5.6-rc2", + "target": { + "target": { + "committedDate": "2020-02-16T21:16:59Z" + } + } + }, + { + "name": "v5.6-rc3", + "target": { + "target": { + "committedDate": "2020-02-24T00:17:42Z" + } + } + }, + { + "name": "v5.6-rc4", + "target": { + "target": { + "committedDate": "2020-03-01T22:38:46Z" + } + } + }, + { + "name": "v5.6-rc5", + "target": { + "target": { + "committedDate": "2020-03-09T00:44:44Z" + } + } + }, + { + "name": "v5.6-rc6", + "target": { + "target": { + "committedDate": "2020-03-15T22:01:23Z" + } + } + }, + { + "name": "v5.6-rc7", + "target": { + "target": { + "committedDate": "2020-03-23T01:31:56Z" + } + } + }, + { + "name": "v5.6", + "target": { + "target": { + "committedDate": "2020-03-29T22:25:41Z" + } + } + }, + { + "name": "v5.7-rc1", + "target": { + "target": { + "committedDate": "2020-04-12T19:35:55Z" + } + } + }, + { + "name": "v5.7-rc2", + "target": { + "target": { + "committedDate": "2020-04-19T21:35:30Z" + } + } + }, + { + "name": "v5.7-rc3", + "target": { + "target": { + "committedDate": "2020-04-26T20:51:02Z" + } + } + }, + { + "name": "v5.7-rc4", + "target": { + "target": { + "committedDate": "2020-05-03T21:56:04Z" + } + } + }, + { + "name": "v5.7-rc5", + "target": { + "target": { + "committedDate": "2020-05-10T22:16:58Z" + } + } + }, + { + "name": "v5.7-rc6", + "target": { + "target": { + "committedDate": "2020-05-17T23:48:37Z" + } + } + }, + { + "name": "v5.7-rc7", + "target": { + "target": { + "committedDate": "2020-05-24T22:32:54Z" + } + } + }, + { + "name": "v5.7", + "target": { + "target": { + "committedDate": "2020-05-31T23:49:15Z" + } + } + }, + { + "name": "v5.8-rc1", + "target": { + "target": { + "committedDate": "2020-06-14T19:45:04Z" + } + } + }, + { + "name": "v5.8-rc2", + "target": { + "target": { + "committedDate": "2020-06-21T22:45:29Z" + } + } + }, + { + "name": "v5.8-rc3", + "target": { + "target": { + "committedDate": "2020-06-28T22:00:24Z" + } + } + }, + { + "name": "v5.8-rc4", + "target": { + "target": { + "committedDate": "2020-07-05T23:20:22Z" + } + } + }, + { + "name": "v5.8-rc5", + "target": { + "target": { + "committedDate": "2020-07-12T23:34:50Z" + } + } + }, + { + "name": "v5.8-rc6", + "target": { + "target": { + "committedDate": "2020-07-19T22:41:18Z" + } + } + }, + { + "name": "v5.8-rc7", + "target": { + "target": { + "committedDate": "2020-07-26T21:14:06Z" + } + } + }, + { + "name": "v5.8", + "target": { + "target": { + "committedDate": "2020-08-02T21:21:45Z" + } + } + }, + { + "name": "v5.9-rc1", + "target": { + "target": { + "committedDate": "2020-08-16T20:04:57Z" + } + } + }, + { + "name": "v5.9-rc2", + "target": { + "target": { + "committedDate": "2020-08-23T21:08:43Z" + } + } + }, + { + "name": "v5.9-rc3", + "target": { + "target": { + "committedDate": "2020-08-30T23:01:54Z" + } + } + }, + { + "name": "v5.9-rc4", + "target": { + "target": { + "committedDate": "2020-09-07T00:11:40Z" + } + } + }, + { + "name": "v5.9-rc5", + "target": { + "target": { + "committedDate": "2020-09-13T23:06:00Z" + } + } + }, + { + "name": "v5.9-rc6", + "target": { + "target": { + "committedDate": "2020-09-20T23:33:55Z" + } + } + }, + { + "name": "v5.9-rc7", + "target": { + "target": { + "committedDate": "2020-09-27T21:38:10Z" + } + } + }, + { + "name": "v5.9-rc8", + "target": { + "target": { + "committedDate": "2020-10-04T23:04:34Z" + } + } + }, + { + "name": "v5.9", + "target": { + "target": { + "committedDate": "2020-10-11T21:15:50Z" + } + } + }, + { + "name": "v5.10-rc1", + "target": { + "target": { + "committedDate": "2020-10-25T22:14:11Z" + } + } + }, + { + "name": "v5.10-rc2", + "target": { + "target": { + "committedDate": "2020-11-01T22:43:51Z" + } + } + }, + { + "name": "v5.10-rc3", + "target": { + "target": { + "committedDate": "2020-11-09T00:10:16Z" + } + } + }, + { + "name": "v5.10-rc4", + "target": { + "target": { + "committedDate": "2020-11-16T00:44:31Z" + } + } + }, + { + "name": "v5.10-rc5", + "target": { + "target": { + "committedDate": "2020-11-22T23:36:08Z" + } + } + }, + { + "name": "v5.10-rc6", + "target": { + "target": { + "committedDate": "2020-11-29T23:50:50Z" + } + } + }, + { + "name": "v5.10-rc7", + "target": { + "target": { + "committedDate": "2020-12-06T22:25:12Z" + } + } + }, + { + "name": "v5.10", + "target": { + "target": { + "committedDate": "2020-12-13T22:41:30Z" + } + } + }, + { + "name": "v5.11-rc1", + "target": { + "target": { + "committedDate": "2020-12-27T23:30:22Z" + } + } + }, + { + "name": "v5.11-rc2", + "target": { + "target": { + "committedDate": "2021-01-03T23:55:30Z" + } + } + }, + { + "name": "v5.11-rc3", + "target": { + "target": { + "committedDate": "2021-01-10T22:34:50Z" + } + } + }, + { + "name": "v5.11-rc4", + "target": { + "target": { + "committedDate": "2021-01-18T00:37:05Z" + } + } + }, + { + "name": "v5.11-rc5", + "target": { + "target": { + "committedDate": "2021-01-25T00:47:14Z" + } + } + }, + { + "name": "v5.11-rc6", + "target": { + "target": { + "committedDate": "2021-01-31T21:50:09Z" + } + } + }, + { + "name": "v5.11-rc7", + "target": { + "target": { + "committedDate": "2021-02-07T21:57:38Z" + } + } + }, + { + "name": "v5.11", + "target": { + "target": { + "committedDate": "2021-02-14T22:32:24Z" + } + } + }, + { + "name": "v5.12-rc1-dontuse", + "target": { + "target": { + "committedDate": "2021-03-01T00:05:19Z" + } + } + }, + { + "name": "v5.12-rc2", + "target": { + "target": { + "committedDate": "2021-03-06T01:33:41Z" + } + } + }, + { + "name": "v5.12-rc3", + "target": { + "target": { + "committedDate": "2021-03-14T21:41:02Z" + } + } + }, + { + "name": "v5.12-rc4", + "target": { + "target": { + "committedDate": "2021-03-21T21:56:43Z" + } + } + }, + { + "name": "v5.12-rc5", + "target": { + "target": { + "committedDate": "2021-03-28T22:48:16Z" + } + } + }, + { + "name": "v5.12-rc6", + "target": { + "target": { + "committedDate": "2021-04-04T21:15:36Z" + } + } + }, + { + "name": "v5.12-rc7", + "target": { + "target": { + "committedDate": "2021-04-11T22:16:13Z" + } + } + }, + { + "name": "v5.12-rc8", + "target": { + "target": { + "committedDate": "2021-04-18T21:45:32Z" + } + } + }, + { + "name": "v5.12", + "target": { + "target": { + "committedDate": "2021-04-25T20:49:08Z" + } + } + }, + { + "name": "v5.13-rc1", + "target": { + "target": { + "committedDate": "2021-05-09T21:17:44Z" + } + } + }, + { + "name": "v5.13-rc2", + "target": { + "target": { + "committedDate": "2021-05-16T22:27:44Z" + } + } + }, + { + "name": "v5.13-rc3", + "target": { + "target": { + "committedDate": "2021-05-23T21:42:48Z" + } + } + }, + { + "name": "v5.13-rc4", + "target": { + "target": { + "committedDate": "2021-05-30T21:58:25Z" + } + } + }, + { + "name": "v5.13-rc5", + "target": { + "target": { + "committedDate": "2021-06-06T22:47:27Z" + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-7.json b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-7.json new file mode 100644 index 000000000..f48282ef0 --- /dev/null +++ b/vulnerabilities/tests/test_data/package_manager_data/github/github-torvalds-linux-7.json @@ -0,0 +1,327 @@ +{ + "data": { + "repository": { + "refs": { + "totalCount": 739, + "pageInfo": { + "endCursor": "NzM5", + "hasNextPage": false + }, + "nodes": [ + { + "name": "v5.13-rc6", + "target": { + "target": { + "committedDate": "2021-06-13T21:43:10Z" + } + } + }, + { + "name": "v5.13-rc7", + "target": { + "target": { + "committedDate": "2021-06-20T22:03:15Z" + } + } + }, + { + "name": "v5.13", + "target": { + "target": { + "committedDate": "2021-06-27T22:21:11Z" + } + } + }, + { + "name": "v5.14-rc1", + "target": { + "target": { + "committedDate": "2021-07-11T22:07:40Z" + } + } + }, + { + "name": "v5.14-rc2", + "target": { + "target": { + "committedDate": "2021-07-18T21:13:49Z" + } + } + }, + { + "name": "v5.14-rc3", + "target": { + "target": { + "committedDate": "2021-07-25T22:35:14Z" + } + } + }, + { + "name": "v5.14-rc4", + "target": { + "target": { + "committedDate": "2021-08-02T00:04:17Z" + } + } + }, + { + "name": "v5.14-rc5", + "target": { + "target": { + "committedDate": "2021-08-08T20:49:31Z" + } + } + }, + { + "name": "v5.14-rc6", + "target": { + "target": { + "committedDate": "2021-08-15T23:40:53Z" + } + } + }, + { + "name": "v5.14-rc7", + "target": { + "target": { + "committedDate": "2021-08-22T21:24:56Z" + } + } + }, + { + "name": "v5.14", + "target": { + "target": { + "committedDate": "2021-08-29T22:04:50Z" + } + } + }, + { + "name": "v5.15-rc1", + "target": { + "target": { + "committedDate": "2021-09-12T23:28:37Z" + } + } + }, + { + "name": "v5.15-rc2", + "target": { + "target": { + "committedDate": "2021-09-20T00:28:22Z" + } + } + }, + { + "name": "v5.15-rc3", + "target": { + "target": { + "committedDate": "2021-09-26T21:08:19Z" + } + } + }, + { + "name": "v5.15-rc4", + "target": { + "target": { + "committedDate": "2021-10-03T21:08:47Z" + } + } + }, + { + "name": "v5.15-rc5", + "target": { + "target": { + "committedDate": "2021-10-11T00:01:59Z" + } + } + }, + { + "name": "v5.15-rc6", + "target": { + "target": { + "committedDate": "2021-10-18T06:00:13Z" + } + } + }, + { + "name": "v5.15-rc7", + "target": { + "target": { + "committedDate": "2021-10-25T18:30:31Z" + } + } + }, + { + "name": "v5.15", + "target": { + "target": { + "committedDate": "2021-10-31T20:53:10Z" + } + } + }, + { + "name": "v5.16-rc1", + "target": { + "target": { + "committedDate": "2021-11-14T21:56:52Z" + } + } + }, + { + "name": "v5.16-rc2", + "target": { + "target": { + "committedDate": "2021-11-21T21:47:39Z" + } + } + }, + { + "name": "v5.16-rc3", + "target": { + "target": { + "committedDate": "2021-11-28T22:09:19Z" + } + } + }, + { + "name": "v5.16-rc4", + "target": { + "target": { + "committedDate": "2021-12-05T22:08:22Z" + } + } + }, + { + "name": "v5.16-rc5", + "target": { + "target": { + "committedDate": "2021-12-12T22:53:01Z" + } + } + }, + { + "name": "v5.16-rc6", + "target": { + "target": { + "committedDate": "2021-12-19T22:14:33Z" + } + } + }, + { + "name": "v5.16-rc7", + "target": { + "target": { + "committedDate": "2021-12-26T21:17:17Z" + } + } + }, + { + "name": "v5.16-rc8", + "target": { + "target": { + "committedDate": "2022-01-02T22:23:25Z" + } + } + }, + { + "name": "v5.16", + "target": { + "target": { + "committedDate": "2022-01-09T22:55:34Z" + } + } + }, + { + "name": "v5.17-rc1", + "target": { + "target": { + "committedDate": "2022-01-23T08:12:53Z" + } + } + }, + { + "name": "v5.17-rc2", + "target": { + "target": { + "committedDate": "2022-01-30T13:37:07Z" + } + } + }, + { + "name": "v5.17-rc3", + "target": { + "target": { + "committedDate": "2022-02-06T20:20:50Z" + } + } + }, + { + "name": "v5.17-rc4", + "target": { + "target": { + "committedDate": "2022-02-13T20:13:30Z" + } + } + }, + { + "name": "v5.17-rc5", + "target": { + "target": { + "committedDate": "2022-02-20T21:07:20Z" + } + } + }, + { + "name": "v5.17-rc6", + "target": { + "target": { + "committedDate": "2022-02-27T22:36:33Z" + } + } + }, + { + "name": "v5.17-rc7", + "target": { + "target": { + "committedDate": "2022-03-06T22:28:31Z" + } + } + }, + { + "name": "v5.17-rc8", + "target": { + "target": { + "committedDate": "2022-03-13T20:23:37Z" + } + } + }, + { + "name": "v5.17", + "target": { + "target": { + "committedDate": "2022-03-20T20:14:17Z" + } + } + }, + { + "name": "v5.18-rc1", + "target": { + "target": { + "committedDate": "2022-04-03T21:08:21Z" + } + } + }, + { + "name": "v5.18-rc2", + "target": { + "target": { + "committedDate": "2022-04-11T00:21:36Z" + } + } + } + ] + } + } + } +} \ No newline at end of file diff --git a/vulnerabilities/tests/test_data/maven_api/maven-metadata.xml b/vulnerabilities/tests/test_data/package_manager_data/maven-metadata.xml similarity index 100% rename from vulnerabilities/tests/test_data/maven_api/maven-metadata.xml rename to vulnerabilities/tests/test_data/package_manager_data/maven-metadata.xml diff --git a/vulnerabilities/tests/test_data/package_manager_data/nuget_index.json b/vulnerabilities/tests/test_data/package_manager_data/nuget_index.json new file mode 100644 index 000000000..28e56c8b9 --- /dev/null +++ b/vulnerabilities/tests/test_data/package_manager_data/nuget_index.json @@ -0,0 +1,1737 @@ +{ + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json", + "@type": [ + "catalog:CatalogRoot", + "PackageRegistration", + "catalog:Permalink" + ], + "commitId": "4b2bebc9-f63a-432a-8bcc-f9a277093541", + "commitTimeStamp": "2020-04-21T12:30:33.5740394+00:00", + "count": 1, + "items": [ + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json#page/0.23.0/2.7.0", + "@type": "catalog:CatalogPage", + "commitId": "4b2bebc9-f63a-432a-8bcc-f9a277093541", + "commitTimeStamp": "2020-04-21T12:30:33.5740394+00:00", + "count": 14, + "items": [ + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/0.23.0.json", + "@type": "Package", + "commitId": "98ea3ac2-146d-4d38-bdf9-532dbef29db5", + "commitTimeStamp": "2020-02-08T00:52:47.1835669+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.32/sustainsys.saml2.0.23.0.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.32/sustainsys.saml2.0.23.0.json#dependencygroup", + "@type": "PackageDependencyGroup" + } + ], + "description": "SAML2 Protocol library for ASP.NET. Don't reference this directly, use one of the API modules: Sustainsys.Saml2.HttpModule/Mvc/Owin/AspNetCore2.", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.23.0/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "", + "licenseUrl": "https://github.com/Sustainsys/Saml2/blob/master/LICENSE", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.23.0/sustainsys.saml2.0.23.0.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2018-01-17T09:32:59.283+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "Sustainsys.Saml2", + "version": "0.23.0" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.23.0/sustainsys.saml2.0.23.0.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/0.24.0.json", + "@type": "Package", + "commitId": "98ea3ac2-146d-4d38-bdf9-532dbef29db5", + "commitTimeStamp": "2020-02-08T00:52:47.1835669+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.32/sustainsys.saml2.0.24.0.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.32/sustainsys.saml2.0.24.0.json#dependencygroup", + "@type": "PackageDependencyGroup" + } + ], + "description": "SAML2 Protocol library for ASP.NET. Don't reference this directly, use one of the API modules: Sustainsys.Saml2.HttpModule/Mvc/Owin/AspNetCore2.", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.24.0/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "", + "licenseUrl": "https://github.com/Sustainsys/Saml2/blob/master/LICENSE", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.24.0/sustainsys.saml2.0.24.0.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2018-03-30T07:25:18.393+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "Sustainsys.Saml2", + "version": "0.24.0" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/0.24.0/sustainsys.saml2.0.24.0.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/1.0.0.json", + "@type": "Package", + "commitId": "98ea3ac2-146d-4d38-bdf9-532dbef29db5", + "commitTimeStamp": "2020-02-08T00:52:47.1835669+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.13.08.20.19/sustainsys.saml2.1.0.0.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.13.08.20.19/sustainsys.saml2.1.0.0.json#dependencygroup", + "@type": "PackageDependencyGroup" + } + ], + "description": "SAML2 Protocol library for ASP.NET. Don't reference this directly, use one of the API modules: Sustainsys.Saml2.HttpModule/Mvc/Owin/AspNetCore2.", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.0/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "", + "licenseUrl": "https://github.com/Sustainsys/Saml2/blob/master/LICENSE", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.0/sustainsys.saml2.1.0.0.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2018-09-13T08:16:00.42+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "Sustainsys.Saml2", + "version": "1.0.0" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.0/sustainsys.saml2.1.0.0.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/1.0.1.json", + "@type": "Package", + "commitId": "98ea3ac2-146d-4d38-bdf9-532dbef29db5", + "commitTimeStamp": "2020-02-08T00:52:47.1835669+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.33.40/sustainsys.saml2.1.0.1.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.33.40/sustainsys.saml2.1.0.1.json#dependencygroup", + "@type": "PackageDependencyGroup" + } + ], + "description": "SAML2 Protocol library for ASP.NET. Don't reference this directly, use one of the API modules: Sustainsys.Saml2.HttpModule/Mvc/Owin/AspNetCore2.", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.1/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "", + "licenseUrl": "https://github.com/Sustainsys/Saml2/blob/master/LICENSE", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.1/sustainsys.saml2.1.0.1.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2020-01-17T15:31:41.857+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "Sustainsys.Saml2", + "version": "1.0.1" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.1/sustainsys.saml2.1.0.1.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/1.0.2.json", + "@type": "Package", + "commitId": "65b0f343-125e-4509-a679-d42e82c15314", + "commitTimeStamp": "2020-04-21T12:27:30.5473966+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.27.06/sustainsys.saml2.1.0.2.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.27.06/sustainsys.saml2.1.0.2.json#dependencygroup", + "@type": "PackageDependencyGroup" + } + ], + "description": "SAML2 Protocol library for ASP.NET. Don't reference this directly, use one of the API modules: Sustainsys.Saml2.HttpModule/Mvc/Owin/AspNetCore2.", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.2/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "", + "licenseUrl": "https://github.com/Sustainsys/Saml2/blob/master/LICENSE", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.2/sustainsys.saml2.1.0.2.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2020-04-21T12:24:53.877+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "Sustainsys.Saml2", + "version": "1.0.2" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/1.0.2/sustainsys.saml2.1.0.2.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.0.0-preview01.json", + "@type": "Package", + "commitId": "98ea3ac2-146d-4d38-bdf9-532dbef29db5", + "commitTimeStamp": "2020-02-08T00:52:47.1835669+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json#dependencygroup/.netframework4.5", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json#dependencygroup/.netframework4.5/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.0-preview2-41113220915, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + } + ], + "targetFramework": ".NETFramework4.5" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json#dependencygroup/.netcoreapp2.0", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json#dependencygroup/.netcoreapp2.0/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.0-preview2-41113220915, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.20.18.48.24/sustainsys.saml2.2.0.0-preview01.json#dependencygroup/.netcoreapp2.0/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.4.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETCoreApp2.0" + } + ], + "description": "Protocol support for SAML2 for .NET Core and full framework", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0-preview01/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "", + "licenseUrl": "https://github.com/Sustainsys/Saml2/blob/master/LICENSE", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0-preview01/sustainsys.saml2.2.0.0-preview01.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2018-01-09T17:12:20.44+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "" + ], + "title": "", + "version": "2.0.0-preview01" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0-preview01/sustainsys.saml2.2.0.0-preview01.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.0.0.json", + "@type": "Package", + "commitId": "98ea3ac2-146d-4d38-bdf9-532dbef29db5", + "commitTimeStamp": "2020-02-08T00:52:47.1835669+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json", + "@type": "PackageDetails", + "authors": "Sustainsys.Saml2", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.0.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETFramework4.7" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.0.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.09.27.17.39.53/sustainsys.saml2.2.0.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETStandard2.0" + } + ], + "description": "Package Description", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "", + "licenseUrl": "https://github.com/Sustainsys/Saml2/blob/master/LICENSE", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0/sustainsys.saml2.2.0.0.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2018-09-27T13:33:15.37+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "", + "version": "2.0.0" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.0.0/sustainsys.saml2.2.0.0.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.1.0.json", + "@type": "Package", + "commitId": "98ea3ac2-146d-4d38-bdf9-532dbef29db5", + "commitTimeStamp": "2020-02-08T00:52:47.1835669+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json", + "@type": "PackageDetails", + "authors": "Sustainsys.Saml2", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.0.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETFramework4.6.1" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.0.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETFramework4.7" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.0.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.10.16.07.05.10/sustainsys.saml2.2.1.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETStandard2.0" + } + ], + "description": "Package Description", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.1.0/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "", + "licenseUrl": "https://github.com/Sustainsys/Saml2/blob/master/LICENSE", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.1.0/sustainsys.saml2.2.1.0.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2018-10-16T06:59:44.68+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "", + "version": "2.1.0" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.1.0/sustainsys.saml2.2.1.0.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.2.0.json", + "@type": "Package", + "commitId": "98ea3ac2-146d-4d38-bdf9-532dbef29db5", + "commitTimeStamp": "2020-02-08T00:52:47.1835669+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.0.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.4.2, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETFramework4.6.1" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.0.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.4.2, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETFramework4.7" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.0.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2018.11.23.08.17.25/sustainsys.saml2.2.2.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.4.2, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETStandard2.0" + } + ], + "description": "Package Description", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.2.0/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "", + "licenseUrl": "https://github.com/Sustainsys/Saml2/blob/master/LICENSE", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.2.0/sustainsys.saml2.2.2.0.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2018-11-23T08:13:08.003+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "", + "version": "2.2.0" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.2.0/sustainsys.saml2.2.2.0.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.3.0.json", + "@type": "Package", + "commitId": "98ea3ac2-146d-4d38-bdf9-532dbef29db5", + "commitTimeStamp": "2020-02-08T00:52:47.1835669+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.6.1/system.valuetuple", + "@type": "PackageDependency", + "id": "System.ValueTuple", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.valuetuple/index.json" + } + ], + "targetFramework": ".NETFramework4.6.1" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETFramework4.7" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.1.2, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2019.06.27.14.32.15/sustainsys.saml2.2.3.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETStandard2.0" + } + ], + "description": "SAML2 protocol support. Do not use directly, use the high level package for your platform.", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.3.0/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "", + "licenseUrl": "https://github.com/Sustainsys/Saml2/blob/master/LICENSE", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.3.0/sustainsys.saml2.2.3.0.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2019-06-27T14:27:31.613+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "", + "version": "2.3.0" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.3.0/sustainsys.saml2.2.3.0.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.4.0.json", + "@type": "Package", + "commitId": "98ea3ac2-146d-4d38-bdf9-532dbef29db5", + "commitTimeStamp": "2020-02-08T00:52:47.1835669+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.6.1/system.valuetuple", + "@type": "PackageDependency", + "id": "System.ValueTuple", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.valuetuple/index.json" + } + ], + "targetFramework": ".NETFramework4.6.1" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETFramework4.7" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.1.2, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.01.17.15.23.31/sustainsys.saml2.2.4.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETStandard2.0" + } + ], + "description": "SAML2 protocol support. Do not use directly, use the high level package for your platform.", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.4.0/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "", + "licenseUrl": "https://github.com/Sustainsys/Saml2/blob/master/LICENSE", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.4.0/sustainsys.saml2.2.4.0.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2020-01-17T15:11:05.81+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "", + "version": "2.4.0" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.4.0/sustainsys.saml2.2.4.0.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.5.0.json", + "@type": "Package", + "commitId": "9559ccd8-4589-495d-8e6d-58cd8f93e893", + "commitTimeStamp": "2020-03-24T14:25:33.9377403+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.6.1/system.valuetuple", + "@type": "PackageDependency", + "id": "System.ValueTuple", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.valuetuple/index.json" + } + ], + "targetFramework": ".NETFramework4.6.1" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETFramework4.7" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.1.2, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.24.14.25.15/sustainsys.saml2.2.5.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETStandard2.0" + } + ], + "description": "SAML2 protocol support. Do not use directly, use the high level package for your platform.", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.5.0/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "MIT", + "licenseUrl": "https://www.nuget.org/packages/Sustainsys.Saml2/2.5.0/license", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.5.0/sustainsys.saml2.2.5.0.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2020-03-24T14:22:39.96+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "", + "version": "2.5.0" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.5.0/sustainsys.saml2.2.5.0.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.6.0.json", + "@type": "Package", + "commitId": "26d895e3-cb4d-4607-af2a-783522ba1840", + "commitTimeStamp": "2020-03-27T11:09:03.672231+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.6.1/system.valuetuple", + "@type": "PackageDependency", + "id": "System.ValueTuple", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.valuetuple/index.json" + } + ], + "targetFramework": ".NETFramework4.6.1" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETFramework4.7" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.1.2, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.03.27.11.08.40/sustainsys.saml2.2.6.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETStandard2.0" + } + ], + "description": "SAML2 protocol support. Do not use directly, use the high level package for your platform.", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.6.0/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "MIT", + "licenseUrl": "https://www.nuget.org/packages/Sustainsys.Saml2/2.6.0/license", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.6.0/sustainsys.saml2.2.6.0.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2020-03-27T11:06:27.5+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "", + "version": "2.6.0" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.6.0/sustainsys.saml2.2.6.0.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + }, + { + "@id": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/2.7.0.json", + "@type": "Package", + "commitId": "4b2bebc9-f63a-432a-8bcc-f9a277093541", + "commitTimeStamp": "2020-04-21T12:30:33.5740394+00:00", + "catalogEntry": { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json", + "@type": "PackageDetails", + "authors": "Sustainsys", + "dependencyGroups": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.6.1/system.valuetuple", + "@type": "PackageDependency", + "id": "System.ValueTuple", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.valuetuple/index.json" + } + ], + "targetFramework": ".NETFramework4.6.1" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netframework4.7/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETFramework4.7" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0", + "@type": "PackageDependencyGroup", + "dependencies": [ + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/microsoft.extensions.caching.memory", + "@type": "PackageDependency", + "id": "Microsoft.Extensions.Caching.Memory", + "range": "[2.1.2, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.extensions.caching.memory/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.protocols", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Protocols", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.protocols/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/microsoft.identitymodel.tokens.saml", + "@type": "PackageDependency", + "id": "Microsoft.IdentityModel.Tokens.Saml", + "range": "[5.2.4, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/microsoft.identitymodel.tokens.saml/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/system.configuration.configurationmanager", + "@type": "PackageDependency", + "id": "System.Configuration.ConfigurationManager", + "range": "[4.4.1, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.configuration.configurationmanager/index.json" + }, + { + "@id": "https://api.nuget.org/v3/catalog0/data/2020.04.21.12.30.11/sustainsys.saml2.2.7.0.json#dependencygroup/.netstandard2.0/system.security.cryptography.xml", + "@type": "PackageDependency", + "id": "System.Security.Cryptography.Xml", + "range": "[4.5.0, )", + "registration": "https://api.nuget.org/v3/registration5-semver1/system.security.cryptography.xml/index.json" + } + ], + "targetFramework": ".NETStandard2.0" + } + ], + "description": "SAML2 protocol support. Do not use directly, use the high level package for your platform.", + "iconUrl": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.7.0/icon", + "id": "Sustainsys.Saml2", + "language": "", + "licenseExpression": "MIT", + "licenseUrl": "https://www.nuget.org/packages/Sustainsys.Saml2/2.7.0/license", + "listed": true, + "minClientVersion": "", + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.7.0/sustainsys.saml2.2.7.0.nupkg", + "projectUrl": "https://github.com/Sustainsys/Saml2", + "published": "2020-04-21T12:27:36.427+00:00", + "requireLicenseAcceptance": false, + "summary": "", + "tags": [ + "SAML2", + "authentication", + "AspNet", + "SAML", + "SSO" + ], + "title": "", + "version": "2.7.0" + }, + "packageContent": "https://api.nuget.org/v3-flatcontainer/sustainsys.saml2/2.7.0/sustainsys.saml2.2.7.0.nupkg", + "registration": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json" + } + ], + "parent": "https://api.nuget.org/v3/registration5-semver1/sustainsys.saml2/index.json", + "lower": "0.23.0", + "upper": "2.7.0" + } + ], + "@context": { + "@vocab": "http://schema.nuget.org/schema#", + "catalog": "http://schema.nuget.org/catalog#", + "xsd": "http://www.w3.org/2001/XMLSchema#", + "items": { + "@id": "catalog:item", + "@container": "@set" + }, + "commitTimeStamp": { + "@id": "catalog:commitTimeStamp", + "@type": "xsd:dateTime" + }, + "commitId": { + "@id": "catalog:commitId" + }, + "count": { + "@id": "catalog:count" + }, + "parent": { + "@id": "catalog:parent", + "@type": "@id" + }, + "tags": { + "@id": "tag", + "@container": "@set" + }, + "reasons": { + "@container": "@set" + }, + "packageTargetFrameworks": { + "@id": "packageTargetFramework", + "@container": "@set" + }, + "dependencyGroups": { + "@id": "dependencyGroup", + "@container": "@set" + }, + "dependencies": { + "@id": "dependency", + "@container": "@set" + }, + "packageContent": { + "@type": "@id" + }, + "published": { + "@type": "xsd:dateTime" + }, + "registration": { + "@type": "@id" + } + } +} diff --git a/vulnerabilities/tests/test_debian_oval.py b/vulnerabilities/tests/test_debian_oval.py index 068cf1f9b..5dea100e6 100644 --- a/vulnerabilities/tests/test_debian_oval.py +++ b/vulnerabilities/tests/test_debian_oval.py @@ -6,7 +6,7 @@ from packageurl import PackageURL from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importers.debian_oval import DebianOvalImporter from vulnerabilities.package_managers import VersionResponse diff --git a/vulnerabilities/tests/test_elixir_security.py b/vulnerabilities/tests/test_elixir_security.py index 003f894aa..7361e354a 100644 --- a/vulnerabilities/tests/test_elixir_security.py +++ b/vulnerabilities/tests/test_elixir_security.py @@ -27,7 +27,7 @@ from packageurl import PackageURL from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importers.elixir_security import ElixirSecurityImporter from vulnerabilities.package_managers import HexVersionAPI diff --git a/vulnerabilities/tests/test_example.py b/vulnerabilities/tests/test_example.py index 77e55506f..88b83adb1 100644 --- a/vulnerabilities/tests/test_example.py +++ b/vulnerabilities/tests/test_example.py @@ -1,22 +1,36 @@ -import datetime -import os +# Copyright (c) nexB Inc. and others. All rights reserved. +# http://nexb.com and https://github.com/nexB/vulnerablecode/ +# The VulnerableCode software is licensed under the Apache License version 2.0. +# Data generated with VulnerableCode require an acknowledgment. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. +# +# When you publish or redistribute any data created with VulnerableCode or any VulnerableCode +# derivative work, you must accompany this data with the following acknowledgment: +# +# Generated with VulnerableCode and provided on an "AS IS" BASIS, WITHOUT WARRANTIES +# OR CONDITIONS OF ANY KIND, either express or implied. No content created from +# VulnerableCode should be considered or used as legal advice. Consult an Attorney +# for any legal advice. +# VulnerableCode is a free software tool from nexB Inc. and others. +# Visit https://github.com/nexB/vulnerablecode/ for support and download. + +from pathlib import Path from unittest.mock import patch -from django.test import TestCase -from packageurl import PackageURL -from univers.version_constraint import VersionConstraint -from univers.version_range import NginxVersionRange -from univers.versions import SemverVersion +import pytest +from commoncode import testcase from vulnerabilities import models from vulnerabilities.import_runner import ImportRunner -from vulnerabilities.importer import AdvisoryData -from vulnerabilities.importer import AffectedPackage -from vulnerabilities.importer import Reference -from vulnerabilities.importer import ScoringSystem -from vulnerabilities.importer import VulnerabilitySeverity from vulnerabilities.improve_runner import ImproveRunner from vulnerabilities.improvers.default import DefaultImprover +from vulnerabilities.tests import util_tests from vulnerabilities.tests.example_importer_improver import ExampleAliasImprover from vulnerabilities.tests.example_importer_improver import ExampleImporter from vulnerabilities.tests.example_importer_improver import parse_advisory_data @@ -50,74 +64,42 @@ def mock_fetch_additional_aliases(alias): "vulnerabilities.tests.example_importer_improver.fetch_additional_aliases", mock_fetch_additional_aliases, ) -class TestExampleImporter(TestCase): +class TestExampleImporter(testcase.FileBasedTesting): + + test_data_dir = str(Path(__file__).resolve().parent / "test_data" / "example") + def test_parse_advisory_data(self): - raw_data = mock_fetch_advisory_data()[0] - expected = AdvisoryData( - aliases=["CVE-2021-12341337"], - summary="Dummy advisory", - affected_packages=[ - AffectedPackage( - package=PackageURL( - type="example", - namespace=None, - name="dummy_package", - version=None, - qualifiers={}, - subpath=None, - ), - affected_version_range=NginxVersionRange( - constraints=( - VersionConstraint( - comparator=">=", version=SemverVersion(string="0.6.18") - ), - VersionConstraint( - comparator="<=", version=SemverVersion(string="1.20.0") - ), - ) - ), - fixed_version=SemverVersion(string="1.20.1"), - ) - ], - references=[ - Reference( - reference_id="", - url="http://example.com/cve-2021-1234", - severities=[ - VulnerabilitySeverity( - system=ScoringSystem( - identifier="generic_textual", - name="Generic textual severity rating", - url="", - notes="Severity for unknown scoring systems. Contains generic textual values like High, Low etc", - ), - value="high", - ) - ], - ) - ], - date_published=datetime.datetime(2021, 10, 6, 0, 0, tzinfo=datetime.timezone.utc), - ) - actual = parse_advisory_data(raw_data) - assert actual == expected + raw_data = { + "id": "CVE-2021-12341337", + "summary": "Dummy advisory", + "advisory_severity": "high", + "vulnerable": "0.6.18-1.20.0", + "fixed": "1.20.1", + "reference": "http://example.com/cve-2021-1234", + "published_on": "06-10-2021 UTC", + } + expected_file = self.get_test_loc("parse_advisory_data-expected.json", must_exist=False) + result = parse_advisory_data(raw_data).to_dict() + util_tests.check_results_against_json(result, expected_file) + @pytest.mark.django_db(transaction=True) def test_import_framework_using_example_importer(self): - raw_datas = mock_fetch_advisory_data() ImportRunner(ExampleImporter).run() - for raw_data in raw_datas: - assert models.Advisory.objects.get(aliases__contains=raw_data["id"]) + for expected in mock_fetch_advisory_data(): + assert models.Advisory.objects.get(aliases__contains=expected["id"]) + @pytest.mark.django_db(transaction=True) def test_improve_framework_using_example_improver(self): ImportRunner(ExampleImporter).run() ImproveRunner(DefaultImprover).run() ImproveRunner(ExampleAliasImprover).run() - raw_datas = mock_fetch_advisory_data() assert models.Package.objects.count() == 3 assert models.PackageRelatedVulnerability.objects.filter(fix=True).count() == 1 assert models.PackageRelatedVulnerability.objects.filter(fix=False).count() == 2 assert models.VulnerabilitySeverity.objects.count() == 1 assert models.VulnerabilityReference.objects.count() == 1 - for raw_data in raw_datas: - assert models.Vulnerability.objects.get(summary=raw_data["summary"]) + + for expected in mock_fetch_advisory_data(): + assert models.Vulnerability.objects.get(summary=expected["summary"]) diff --git a/vulnerabilities/tests/test_gentoo.py b/vulnerabilities/tests/test_gentoo.py index 831dee600..4d5bc54a8 100644 --- a/vulnerabilities/tests/test_gentoo.py +++ b/vulnerabilities/tests/test_gentoo.py @@ -29,7 +29,7 @@ from packageurl import PackageURL from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importers.gentoo import GentooImporter diff --git a/vulnerabilities/tests/test_github.py b/vulnerabilities/tests/test_github.py index e82bd1a1f..b5e186b32 100644 --- a/vulnerabilities/tests/test_github.py +++ b/vulnerabilities/tests/test_github.py @@ -26,23 +26,22 @@ from unittest import mock import pytest -import pytz from packageurl import PackageURL from univers.version_constraint import VersionConstraint from univers.version_range import GemVersionRange from univers.versions import RubygemsVersion +from vulnerabilities import severity_systems +from vulnerabilities.helpers import GitHubTokenError from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import AffectedPackage from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity from vulnerabilities.importers.github import GitHubAPIImporter from vulnerabilities.importers.github import GitHubBasicImprover -from vulnerabilities.importers.github import GitHubTokenError from vulnerabilities.importers.github import process_response from vulnerabilities.importers.github import resolve_version_range -from vulnerabilities.package_managers import Version as PackageVersion -from vulnerabilities.severity_systems import ScoringSystem +from vulnerabilities.package_managers import PackageVersion BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TEST_DATA = os.path.join(BASE_DIR, "test_data", "github_api") @@ -100,7 +99,7 @@ def test_process_response_with_empty_vulnaribilities(caplog): assert "No vulnerabilities found for package_type: 'maven'" in caplog.text -def test_process_response_with_empty_vulnaribilities(caplog): +def test_process_response_with_empty_vulnaribilities_2(caplog): list( process_response( {"data": {"securityVulnerabilities": {"edges": [{"node": {}}, None]}}}, "maven" @@ -113,16 +112,16 @@ def test_github_importer_with_missing_credentials(): with pytest.raises(GitHubTokenError) as e: with mock.patch.dict(os.environ, {}, clear=True): importer = GitHubAPIImporter() - importer.advisory_data() + list(importer.advisory_data()) -@mock.patch("vulnerabilities.importers.github.get_response") -def test_github_importer_with_missing_credentials(mock_response): +@mock.patch("vulnerabilities.helpers._get_gh_response") +def test_github_importer_with_missing_credentials_2(mock_response): mock_response.return_value = {"message": "Bad credentials"} with pytest.raises(GitHubTokenError) as e: - with mock.patch.dict(os.environ, {"GH_TOKEN": "BAD"}, clear=True): + with mock.patch.dict(os.environ, {"GH_TOKEN": "FOOD"}, clear=True): importer = GitHubAPIImporter() - importer.advisory_data() + list(importer.advisory_data()) def valid_versions(): @@ -273,12 +272,7 @@ def test_github_improver(mock_response, regen=False): url="https://github.com/advisories/GHSA-w749-p3v6-hccq", severities=[ VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3.1_qr", - name="CVSSv3.1 Qualitative Severity Rating", - url="https://www.first.org/cvss/specification-document#Qualitative-Severity-Rating-Scale", - notes="A textual interpretation of severity. Has values like HIGH, MEDIUM etc", - ), + system=severity_systems.CVSS31_QUALITY, value="HIGH", ) ], @@ -288,7 +282,7 @@ def test_github_improver(mock_response, regen=False): ) mock_response.return_value = list(valid_versions()) improver = GitHubBasicImprover() - expected_file = os.path.join(TEST_DATA, f"inference-expected.json") + expected_file = os.path.join(TEST_DATA, "inference-expected.json") result = [data.to_dict() for data in improver.get_inferences(advisory_data=advisory_data)] @@ -303,10 +297,11 @@ def test_github_improver(mock_response, regen=False): assert result == expected -@mock.patch("vulnerabilities.package_managers_2.get_response") +@mock.patch("vulnerabilities.package_managers.get_response") def test_get_package_versions(mock_response): with open(os.path.join(BASE_DIR, "test_data", "package_manager_data", "pypi.json"), "r") as f: mock_response.return_value = json.load(f) + improver = GitHubBasicImprover() valid_versions = { "1.1.3", @@ -331,6 +326,7 @@ def test_get_package_versions(mock_response): mock_response.return_value = None assert not improver.get_package_versions(package_url=PackageURL(type="gem", name="foo")) assert not improver.get_package_versions(package_url=PackageURL(type="pypi", name="foo")) - assert "django" in improver.version_api_by_purl_type["pypi"].cache - assert "foo" in improver.version_api_by_purl_type["gem"].cache - assert "foo" in improver.version_api_by_purl_type["pypi"].cache + + assert PackageURL(type="gem", name="foo") in improver.versions_fetcher_by_purl + assert PackageURL(type="pypi", name="django") in improver.versions_fetcher_by_purl + assert PackageURL(type="pypi", name="foo") in improver.versions_fetcher_by_purl diff --git a/vulnerabilities/tests/test_helpers.py b/vulnerabilities/tests/test_helpers.py index 78972b25d..d110ea5e8 100644 --- a/vulnerabilities/tests/test_helpers.py +++ b/vulnerabilities/tests/test_helpers.py @@ -22,8 +22,9 @@ from packageurl import PackageURL -from vulnerabilities.helpers import AffectedPackage as LegacyAffectedPackage +from vulnerabilities.helpers import AffectedPackage from vulnerabilities.helpers import nearest_patched_package +from vulnerabilities.helpers import split_markdown_front_matter def test_nearest_patched_package(): @@ -42,7 +43,7 @@ def test_nearest_patched_package(): ) assert [ - LegacyAffectedPackage( + AffectedPackage( vulnerable_package=PackageURL( type="npm", namespace=None, name="foo", version="1.9.8", qualifiers={}, subpath=None ), @@ -50,7 +51,7 @@ def test_nearest_patched_package(): type="npm", namespace=None, name="foo", version="1.9.9", qualifiers={}, subpath=None ), ), - LegacyAffectedPackage( + AffectedPackage( vulnerable_package=PackageURL( type="npm", namespace=None, name="foo", version="2.0.0", qualifiers={}, subpath=None ), @@ -58,7 +59,7 @@ def test_nearest_patched_package(): type="npm", namespace=None, name="foo", version="2.0.2", qualifiers={}, subpath=None ), ), - LegacyAffectedPackage( + AffectedPackage( vulnerable_package=PackageURL( type="npm", namespace=None, name="foo", version="2.0.1", qualifiers={}, subpath=None ), @@ -66,10 +67,30 @@ def test_nearest_patched_package(): type="npm", namespace=None, name="foo", version="2.0.2", qualifiers={}, subpath=None ), ), - LegacyAffectedPackage( + AffectedPackage( vulnerable_package=PackageURL( type="npm", namespace=None, name="foo", version="2.0.4", qualifiers={}, subpath=None ), patched_package=None, ), ] == result + + +def test_split_markdown_front_matter(): + text = """--- +title: DUMMY-SECURITY-2019-001 +description: Incorrect access control. +cves: [CVE-2042-1337] +--- +# Markdown starts here +""" + + expected = ( + """title: DUMMY-SECURITY-2019-001 +description: Incorrect access control. +cves: [CVE-2042-1337]""", + "# Markdown starts here", + ) + + results = split_markdown_front_matter(text) + assert results == expected diff --git a/vulnerabilities/tests/test_istio.py b/vulnerabilities/tests/test_istio.py index 22979db46..1dcfc7903 100644 --- a/vulnerabilities/tests/test_istio.py +++ b/vulnerabilities/tests/test_istio.py @@ -27,7 +27,7 @@ from packageurl import PackageURL from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importers.istio import IstioImporter from vulnerabilities.package_managers import GitHubTagsAPI diff --git a/vulnerabilities/tests/test_mozilla.py b/vulnerabilities/tests/test_mozilla.py index 83e7435bc..2884a6432 100644 --- a/vulnerabilities/tests/test_mozilla.py +++ b/vulnerabilities/tests/test_mozilla.py @@ -8,7 +8,6 @@ from vulnerabilities import models from vulnerabilities.import_runner import ImportRunner -from vulnerabilities.importers.npm import categorize_versions BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TEST_DATA = os.path.join(BASE_DIR, "test_data/") @@ -76,7 +75,6 @@ def assert_for_package( vulnerability_id=None, impacted_version=None, ): - vuln = None pkg = models.Package.objects.get(name=package_name, version=resolved_version) vuln = pkg.vulnerabilities.first() diff --git a/vulnerabilities/tests/test_msr2019.py b/vulnerabilities/tests/test_msr2019.py index 4e3eb77fd..78bec13e9 100644 --- a/vulnerabilities/tests/test_msr2019.py +++ b/vulnerabilities/tests/test_msr2019.py @@ -27,7 +27,7 @@ from packageurl import PackageURL -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importers import ProjectKBMSRImporter diff --git a/vulnerabilities/tests/test_nginx.py b/vulnerabilities/tests/test_nginx.py index 6c313f036..d4de6eac0 100644 --- a/vulnerabilities/tests/test_nginx.py +++ b/vulnerabilities/tests/test_nginx.py @@ -20,172 +20,239 @@ # VulnerableCode is a free software tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. -import os -from unittest import TestCase -from unittest.mock import patch - -from packageurl import PackageURL - -from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory -from vulnerabilities.importers.nginx import NginxImporter -from vulnerabilities.package_managers import GitHubTagsAPI -from vulnerabilities.package_managers import Version - -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -TEST_DATA = os.path.join(BASE_DIR, "test_data/nginx", "security_advisories.html") - - -class TestNginxImporter(TestCase): - @classmethod - def setUpClass(cls): - with open(TEST_DATA) as f: - cls.data = f.read() - data_source_cfg = {"etags": {}} - cls.data_src = NginxImporter(1, config=data_source_cfg) - cls.data_src.version_api = GitHubTagsAPI( - cache={ - "nginx/nginx": { - Version("1.2.3"), - Version("1.7.0"), - Version("1.3.9"), - Version("0.7.52"), - } - } - ) +import json +from pathlib import Path +from unittest import mock - def test_to_advisories(self): - expected_advisories = [ - Advisory( - summary="An error log data are not sanitized", - vulnerability_id="CVE-2009-4487", - affected_packages=[], - references=[], - ), - Advisory( - summary="Directory traversal vulnerability", - vulnerability_id="CVE-2009-3898", - affected_packages=[ - AffectedPackage( - vulnerable_package=PackageURL( - type="generic", - namespace=None, - name="nginx", - version="0.7.52", - qualifiers={}, - subpath=None, - ), - patched_package=None, - ) - ], - references=[], - ), - Advisory( - summary="Stack-based buffer overflow with specially crafted request", - vulnerability_id="CVE-2013-2028", - affected_packages=[ - AffectedPackage( - vulnerable_package=PackageURL( - type="generic", - namespace=None, - name="nginx", - version="1.3.9", - qualifiers={}, - subpath=None, - ), - patched_package=PackageURL( - type="generic", - namespace=None, - name="nginx", - version="1.7.0", - qualifiers={}, - subpath=None, - ), - ) - ], - references=[], - ), - Advisory( - summary="The renegotiation vulnerability in SSL protocol", - vulnerability_id="CVE-2009-3555", - affected_packages=[ - AffectedPackage( - vulnerable_package=PackageURL( - type="generic", - namespace=None, - name="nginx", - version="0.7.52", - qualifiers={}, - subpath=None, - ), - patched_package=None, - ) - ], - references=[], - ), - Advisory( - summary="Vulnerabilities with Windows directory aliases", - vulnerability_id="CVE-2011-4963", - affected_packages=[ - AffectedPackage( - vulnerable_package=PackageURL( - type="generic", - namespace=None, - name="nginx", - version="0.7.52", - qualifiers={"os": "windows"}, - subpath=None, - ), - patched_package=PackageURL( - type="generic", - namespace=None, - name="nginx", - version="1.2.3", - qualifiers={}, - subpath=None, - ), - ), - AffectedPackage( - vulnerable_package=PackageURL( - type="generic", - namespace=None, - name="nginx", - version="1.2.3", - qualifiers={"os": "windows"}, - subpath=None, - ), - patched_package=PackageURL( - type="generic", - namespace=None, - name="nginx", - version="1.3.9", - qualifiers={}, - subpath=None, - ), - ), - ], - references=[], - ), - Advisory( - summary="Vulnerabilities with invalid UTF-8 sequence on Windows", - vulnerability_id="CVE-2010-2266", - affected_packages=[ - AffectedPackage( - vulnerable_package=PackageURL( - type="generic", - namespace=None, - name="nginx", - version="0.7.52", - qualifiers={"os": "windows"}, - subpath=None, - ), - patched_package=None, - ) - ], - references=[], +import pytest +from bs4 import BeautifulSoup +from commoncode import testcase +from django.db.models.query import QuerySet + +from vulnerabilities import models +from vulnerabilities import severity_systems +from vulnerabilities.import_runner import ImportRunner +from vulnerabilities.importer import AdvisoryData +from vulnerabilities.importer import Reference +from vulnerabilities.importer import VulnerabilitySeverity +from vulnerabilities.importers import nginx +from vulnerabilities.models import Advisory +from vulnerabilities.package_managers import PackageVersion +from vulnerabilities.tests import util_tests + +ADVISORY_FIELDS_TO_TEST = ( + "unique_content_id", + "aliases", + "summary", + "affected_packages", + "references", + "date_published", +) + + +class TestNginxImporterAndImprover(testcase.FileBasedTesting): + test_data_dir = str(Path(__file__).resolve().parent / "test_data" / "nginx") + + def test_is_vulnerable(self): + # Not vulnerable: 1.17.3+, 1.16.1+ + # Vulnerable: 1.9.5-1.17.2 + + vcls = nginx.NginxVersionRange.version_class + affected_version_range = nginx.NginxVersionRange.from_native("1.9.5-1.17.2") + fixed_versions = [vcls("1.17.3"), vcls("1.16.1")] + + version = vcls("1.9.4") + assert not nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.9.5") + assert nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.9.6") + assert nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.16.0") + assert nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.16.1") + assert not nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.16.2") + assert not nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.16.99") + assert not nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.17.0") + assert nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.17.1") + assert nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.17.2") + assert nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.17.3") + assert not nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.17.4") + assert not nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + version = vcls("1.18.0") + assert not nginx.is_vulnerable(version, affected_version_range, fixed_versions) + + def test_parse_advisory_data_from_paragraph(self): + paragraph = ( + "

1-byte memory overwrite in resolver" + "
Severity: medium
" + 'Advisory' + "
" + 'CVE-2021-23017' + "
Not vulnerable: 1.21.0+, 1.20.1+
" + "Vulnerable: 0.6.18-1.20.0
" + '' + 'The patch  pgp' + "

" + ) + vuln_info = BeautifulSoup(paragraph, features="lxml").p + expected = { + "aliases": ["CVE-2021-23017"], + "summary": "1-byte memory overwrite in resolver", + "advisory_severity": VulnerabilitySeverity( + system=severity_systems.GENERIC, value="medium" ), + "not_vulnerable": "Not vulnerable: 1.21.0+, 1.20.1+", + "vulnerable": "Vulnerable: 0.6.18-1.20.0", + "references": [ + Reference( + reference_id="", + url="http://mailman.nginx.org/pipermail/nginx-announce/2021/000300.html", + severities=[ + VulnerabilitySeverity(system=severity_systems.GENERIC, value="medium") + ], + ), + Reference( + reference_id="CVE-2021-23017", + url="https://nvd.nist.gov/vuln/detail/CVE-2021-23017", + ), + Reference( + reference_id="", + url="https://nginx.org/download/patch.2021.resolver.txt", + ), + Reference( + reference_id="", url="https://nginx.org/download/patch.2021.resolver.txt.asc" + ), + ], + } + + result = nginx.parse_advisory_data_from_paragraph(vuln_info) + assert result.to_dict() == expected + + def test_advisory_data_from_text(self): + test_file = self.get_test_loc("security_advisories.html") + with open(test_file) as tf: + test_text = tf.read() + + expected_file = self.get_test_loc( + "security_advisories-advisory_data-expected.json", must_exist=False + ) + + results = [na.to_dict() for na in nginx.advisory_data_from_text(test_text)] + util_tests.check_results_against_json(results, expected_file) + + @pytest.mark.django_db(transaction=True) + def test_NginxImporter(self): + + expected_file = self.get_test_loc( + "security_advisories-importer-expected.json", must_exist=False + ) + + results, _cls = self.run_import() + util_tests.check_results_against_json(results, expected_file) + + # run again as there should be no duplicates + results, _cls = self.run_import() + util_tests.check_results_against_json(results, expected_file) + + def run_import(self): + """ + Return a list of imported Advisory model objects and the MockImporter + used. + """ + + class MockImporter(nginx.NginxImporter): + """ + A mocked NginxImporter that loads content from a file rather than + making a network call. + """ + + def fetch(self): + with open(test_file) as tf: + return tf.read() + + test_file = self.get_test_loc("security_advisories.html") + + ImportRunner(MockImporter).run() + return list(models.Advisory.objects.all().values(*ADVISORY_FIELDS_TO_TEST)), MockImporter + + @pytest.mark.django_db(transaction=True) + def test_NginxBasicImprover__interesting_advisories(self): + advisories, importer_class = self.run_import() + + class MockNginxBasicImprover(nginx.NginxBasicImprover): + @property + def interesting_advisories(self) -> QuerySet: + return Advisory.objects.filter(created_by=importer_class.qualified_name) + + improver = MockNginxBasicImprover() + interesting_advisories = list( + improver.interesting_advisories.values(*ADVISORY_FIELDS_TO_TEST) + ) + assert interesting_advisories == advisories + + @mock.patch("vulnerabilities.helpers.fetch_github_graphql_query") + def test_NginxBasicImprover_fetch_nginx_version_from_git_tags(self, mock_fetcher): + reponse_files = [ + "github-nginx-nginx-0.json", + "github-nginx-nginx-1.json", + "github-nginx-nginx-2.json", + "github-nginx-nginx-3.json", + "github-nginx-nginx-4.json", + "github-nginx-nginx-5.json", + ] + side_effects = [] + for response_file in reponse_files: + with open(self.get_test_loc(f"improver/{response_file}")) as f: + side_effects.append(json.load(f)) + mock_fetcher.side_effect = side_effects + + results = [ + pv.to_dict() for pv in nginx.NginxBasicImprover().fetch_nginx_version_from_git_tags() ] - found_data = self.data_src.to_advisories(self.data) - expected_advisories = list(map(Advisory.normalized, expected_advisories)) - found_data = list(map(Advisory.normalized, found_data)) - assert sorted(found_data) == sorted(expected_advisories) + expected_file = self.get_test_loc("improver/nginx-versions-expected.json", must_exist=False) + util_tests.check_results_against_json(results, expected_file) + + @pytest.mark.django_db(transaction=True) + def test_NginxBasicImprover__get_inferences_from_versions_end_to_end(self): + + with open(self.get_test_loc("improver/improver-advisories.json")) as vf: + advisories_data = json.load(vf) + + with open(self.get_test_loc("improver/improver-versions.json")) as vf: + all_versions = [PackageVersion(**vd) for vd in json.load(vf)] + + results = [] + improver = nginx.NginxBasicImprover() + for advdata in advisories_data: + advisory_data = AdvisoryData.from_dict(advdata) + + inferences = improver.get_inferences_from_versions( + advisory_data=advisory_data, all_versions=all_versions + ) + for i in inferences: + i.vulnerability_id = "PLAIN-ID-FOR-TESTING" + results.append(i.to_dict()) + + expected_file = self.get_test_loc( + "improver/improver-inferences-expected.json", must_exist=False + ) + util_tests.check_results_against_json(results, expected_file) diff --git a/vulnerabilities/tests/test_openssl.py b/vulnerabilities/tests/test_openssl.py index 76e6df6bb..72e7bb691 100644 --- a/vulnerabilities/tests/test_openssl.py +++ b/vulnerabilities/tests/test_openssl.py @@ -20,14 +20,12 @@ # VulnerableCode is a free software code scanning tool from nexB Inc. and others. # Visit https://github.com/nexB/vulnerablecode/ for support and download. - import datetime -import json import os -import unittest -from typing import Iterable +from pathlib import Path import defusedxml.ElementTree as DET +from commoncode import testcase from packageurl import PackageURL from univers.version_constraint import VersionConstraint from univers.version_range import OpensslVersionRange @@ -36,32 +34,21 @@ from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import AffectedPackage from vulnerabilities.importer import Reference -from vulnerabilities.importer import VulnerabilitySeverity from vulnerabilities.importers.openssl import parse_vulnerabilities from vulnerabilities.importers.openssl import to_advisory_data -from vulnerabilities.severity_systems import SCORING_SYSTEMS +from vulnerabilities.tests import util_tests -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -TEST_DATA = os.path.join(BASE_DIR, "test_data", "openssl") +class TestOpenssl(testcase.FileBasedTesting): + test_data_dir = str(Path(__file__).resolve().parent / "test_data" / "openssl") -class TestOpenssl(unittest.TestCase): - # use regen flag to generates the expected_file - def test_parse_vulnerabilities(self, regen=False): - xml_page = os.path.join(TEST_DATA, "openssl_xml_data.xml") + def test_parse_vulnerabilities(self): + xml_page = self.get_test_loc("openssl_xml_data.xml") with open(xml_page) as f: xml_response = f.read() - result = [data.to_dict() for data in parse_vulnerabilities(xml_response)] - - expected_file = os.path.join(TEST_DATA, "openssl-expected.json") - if regen: - with open(expected_file, "w") as f: - json.dump(result, f, indent=2) - expected = result - else: - with open(expected_file) as f: - expected = json.load(f) - assert result == expected + results = [data.to_dict() for data in parse_vulnerabilities(xml_response)] + expected_file = self.get_test_loc("openssl-expected.json") + util_tests.check_results_against_json(results, expected_file) def test_to_advisory_data(self): issue_string = """ diff --git a/vulnerabilities/tests/test_package_managers.py b/vulnerabilities/tests/test_package_managers.py index 7487d4b06..db4e315ec 100644 --- a/vulnerabilities/tests/test_package_managers.py +++ b/vulnerabilities/tests/test_package_managers.py @@ -1,645 +1,434 @@ -# Copyright (c) nexB Inc. and others. All rights reserved. -# http://nexb.com and https://github.com/nexB/vulnerablecode/ -# The VulnerableCode software is licensed under the Apache License version 2.0. -# Data generated with VulnerableCode require an acknowledgment. -# -# You may not use this software except in compliance with the License. -# You may obtain a copy of the License at: http://apache.org/licenses/LICENSE-2.0 -# Unless required by applicable law or agreed to in writing, software distributed -# under the License is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES OR -# CONDITIONS OF ANY KIND, either express or implied. See the License for the -# specific language governing permissions and limitations under the License. -# -# When you publish or redistribute any data created with VulnerableCode or any VulnerableCode -# derivative work, you must accompany this data with the following acknowledgment: -# -# Generated with VulnerableCode and provided on an 'AS IS' BASIS, WITHOUT WARRANTIES -# OR CONDITIONS OF ANY KIND, either express or implied. No content created from -# VulnerableCode should be considered or used as legal advice. Consult an Attorney -# for any legal advice. -# VulnerableCode is a free software code scanning tool from nexB Inc. and others. -# Visit https://github.com/nexB/vulnerablecode/ for support and download. - -import asyncio -import distutils.spawn import json import os -import xml.etree.ElementTree as ET from datetime import datetime -from unittest import TestCase -from unittest.case import SkipTest -from unittest.mock import AsyncMock +from functools import partial +from unittest import mock -from aiohttp.client import ClientSession +import pytest from dateutil.tz import tzlocal -from dateutil.tz import tzutc -from pytz import UTC from vulnerabilities.package_managers import ComposerVersionAPI from vulnerabilities.package_managers import GitHubTagsAPI from vulnerabilities.package_managers import GoproxyVersionAPI from vulnerabilities.package_managers import MavenVersionAPI from vulnerabilities.package_managers import NugetVersionAPI -from vulnerabilities.package_managers import Version +from vulnerabilities.package_managers import PackageVersion +from vulnerabilities.package_managers import PypiVersionAPI +from vulnerabilities.package_managers import RubyVersionAPI from vulnerabilities.package_managers import VersionResponse -from vulnerabilities.package_managers import client_session BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -TEST_DATA = os.path.join(BASE_DIR, "test_data") - - -class MockClientSession: - def __init__(self, return_val): - self.return_val = return_val - - async def request(self, *args, **kwargs): - mock_response = AsyncMock() - mock_response.json = self.json - mock_response.read = self.read - mock_response.text = self.text - return mock_response - - def get(self, *args, **kwargs): - kwargs["method"] = "get" - return self.request(*args, **kwargs) - - def post(self, *args, **kwargs): - kwargs["method"] = "post" - return self.request(*args, **kwargs) - - async def json(self): - return self.return_val - - async def read(self): - return self.return_val - - async def text(self): - return self.return_val - - -class RecordedClientSession: - def __init__(self, test_id, regen=False): - self.test_id = test_id - self.req_num = 1 - self.headers = {} - self.regen = regen - if regen: - self.session = ClientSession() - - @property - def record_filename(self): - return os.path.join(TEST_DATA, "records", f"{self.test_id}_{self.req_num}.json") - - async def request(self, *args, **kwargs): - if self.regen: - self.session.headers.update(self.headers) - res = await self.session.request(*args, **kwargs) - data = await res.read() - with open(self.record_filename, "wb") as f: - f.write(data) - with open(self.record_filename, "rb") as f: - self.return_val = f.read() - - mock_response = AsyncMock() - mock_response.json = self.json - mock_response.read = self.read - self.req_num += 1 - return mock_response - - def get(self, *args, **kwargs): - return self.request("get", *args, **kwargs) - - def post(self, *args, **kwargs): - return self.request("post", *args, **kwargs) - - async def json(self): - return json.loads(self.return_val) - - async def read(self): - return self.return_val - - async def __aenter__(self): - if self.regen: - await self.session.__aenter__() - return self - - async def __aexit__(self, exc_type, exc, tb): - if self.regen: - return await self.session.__aexit__(exc_type, exc, tb) - - -class TestComposerVersionAPI(TestCase): - @classmethod - def setUpClass(cls): - cls.version_api = ComposerVersionAPI() - with open(os.path.join(TEST_DATA, "composer_api", "cms-core.json")) as f: - cls.response = json.load(f) - - cls.expected_versions = { - Version( - value="8.7.10", - release_date=datetime(2018, 2, 6, 10, 46, 2, tzinfo=tzlocal()), - ), - Version( - value="8.7.11", - release_date=datetime(2018, 3, 13, 12, 44, 45, tzinfo=tzlocal()), - ), - Version( - value="8.7.12", - release_date=datetime(2018, 3, 22, 11, 35, 42, tzinfo=tzlocal()), - ), - Version( - value="8.7.13", - release_date=datetime(2018, 4, 17, 8, 15, 46, tzinfo=tzlocal()), - ), - Version( - value="8.7.14", - release_date=datetime(2018, 5, 22, 13, 51, 9, tzinfo=tzlocal()), - ), - Version( - value="8.7.15", - release_date=datetime(2018, 5, 23, 11, 31, 21, tzinfo=tzlocal()), - ), - Version( - value="8.7.16", - release_date=datetime(2018, 6, 11, 17, 18, 14, tzinfo=tzlocal()), - ), - Version( - value="8.7.17", - release_date=datetime(2018, 7, 12, 11, 29, 19, tzinfo=tzlocal()), - ), - Version( - value="8.7.18", - release_date=datetime(2018, 7, 31, 8, 15, 29, tzinfo=tzlocal()), - ), - Version( - value="8.7.19", - release_date=datetime(2018, 8, 21, 7, 23, 21, tzinfo=tzlocal()), - ), - Version( - value="8.7.21", - release_date=datetime(2018, 12, 11, 12, 40, 12, tzinfo=tzlocal()), - ), - Version( - value="8.7.20", - release_date=datetime(2018, 10, 30, 10, 39, 51, tzinfo=tzlocal()), - ), - Version( - value="8.7.22", - release_date=datetime(2018, 12, 14, 7, 43, 50, tzinfo=tzlocal()), - ), - Version( - value="8.7.23", - release_date=datetime(2019, 1, 22, 10, 10, 2, tzinfo=tzlocal()), - ), - Version( - value="8.7.24", - release_date=datetime(2019, 1, 22, 15, 25, 55, tzinfo=tzlocal()), - ), - Version( - value="8.7.25", - release_date=datetime(2019, 5, 7, 10, 5, 55, tzinfo=tzlocal()), - ), - Version( - value="8.7.26", - release_date=datetime(2019, 5, 15, 11, 24, 12, tzinfo=tzlocal()), - ), - Version( - value="8.7.27", - release_date=datetime(2019, 6, 25, 8, 24, 21, tzinfo=tzlocal()), - ), - Version( - value="8.7.28", - release_date=datetime(2019, 10, 15, 7, 21, 52, tzinfo=tzlocal()), - ), - Version( - value="8.7.29", - release_date=datetime(2019, 10, 30, 21, 0, 45, tzinfo=tzlocal()), - ), - Version( - value="8.7.30", - release_date=datetime(2019, 12, 17, 10, 49, 17, tzinfo=tzlocal()), - ), - Version( - value="8.7.31", - release_date=datetime(2020, 2, 17, 23, 29, 16, tzinfo=tzlocal()), - ), - Version( - value="8.7.7", - release_date=datetime(2017, 9, 19, 14, 22, 53, tzinfo=tzlocal()), - ), - Version( - value="8.7.32", - release_date=datetime(2020, 3, 31, 8, 33, 3, tzinfo=tzlocal()), - ), - Version( - value="8.7.8", - release_date=datetime(2017, 10, 10, 16, 8, 44, tzinfo=tzlocal()), - ), - Version( - value="8.7.9", - release_date=datetime(2017, 12, 12, 16, 9, 50, tzinfo=tzlocal()), - ), - Version( - value="9.0.0", - release_date=datetime(2017, 12, 12, 16, 48, 22, tzinfo=tzlocal()), - ), - Version( - value="9.1.0", - release_date=datetime(2018, 1, 30, 15, 31, 12, tzinfo=tzlocal()), - ), - Version( - value="9.2.0", - release_date=datetime(2018, 4, 9, 20, 51, 35, tzinfo=tzlocal()), - ), - Version( - value="9.2.1", - release_date=datetime(2018, 5, 22, 13, 47, 11, tzinfo=tzlocal()), - ), - Version( - value="9.3.0", - release_date=datetime(2018, 6, 11, 17, 14, 33, tzinfo=tzlocal()), - ), - Version( - value="9.3.1", - release_date=datetime(2018, 7, 12, 11, 33, 12, tzinfo=tzlocal()), - ), - Version( - value="9.3.2", - release_date=datetime(2018, 7, 12, 15, 51, 49, tzinfo=tzlocal()), - ), - Version( - value="9.3.3", - release_date=datetime(2018, 7, 31, 8, 20, 17, tzinfo=tzlocal()), - ), - Version( - value="9.5.0", - release_date=datetime(2018, 10, 2, 8, 10, 33, tzinfo=tzlocal()), - ), - Version( - value="9.4.0", - release_date=datetime(2018, 9, 4, 12, 8, 20, tzinfo=tzlocal()), - ), - Version( - value="9.5.1", - release_date=datetime(2018, 10, 30, 10, 45, 30, tzinfo=tzlocal()), - ), - Version( - value="9.5.10", - release_date=datetime(2019, 10, 15, 7, 29, 55, tzinfo=tzlocal()), - ), - Version( - value="9.5.11", - release_date=datetime(2019, 10, 30, 20, 46, 49, tzinfo=tzlocal()), - ), - Version( - value="9.5.12", - release_date=datetime(2019, 12, 17, 10, 53, 45, tzinfo=tzlocal()), - ), - Version( - value="9.5.13", - release_date=datetime(2019, 12, 17, 14, 17, 37, tzinfo=tzlocal()), - ), - Version( - value="9.5.14", - release_date=datetime(2020, 2, 17, 23, 37, 2, tzinfo=tzlocal()), - ), - Version( - value="9.5.15", - release_date=datetime(2020, 3, 31, 8, 40, 25, tzinfo=tzlocal()), - ), - Version( - value="9.5.16", - release_date=datetime(2020, 4, 28, 9, 22, 14, tzinfo=tzlocal()), - ), - Version( - value="9.5.17", - release_date=datetime(2020, 5, 12, 10, 36, tzinfo=tzlocal()), - ), - Version( - value="9.5.18", - release_date=datetime(2020, 5, 19, 13, 10, 50, tzinfo=tzlocal()), - ), - Version( - value="9.5.2", - release_date=datetime(2018, 12, 11, 12, 42, 55, tzinfo=tzlocal()), - ), - Version( - value="9.5.19", - release_date=datetime(2020, 6, 9, 8, 44, 34, tzinfo=tzlocal()), - ), - Version( - value="9.5.3", - release_date=datetime(2018, 12, 14, 7, 28, 48, tzinfo=tzlocal()), - ), - Version( - value="9.5.4", - release_date=datetime(2019, 1, 22, 10, 12, 4, tzinfo=tzlocal()), - ), - Version( - value="9.5.5", - release_date=datetime(2019, 3, 4, 20, 25, 8, tzinfo=tzlocal()), - ), - Version( - value="9.5.6", - release_date=datetime(2019, 5, 7, 10, 16, 30, tzinfo=tzlocal()), - ), - Version( - value="9.5.7", - release_date=datetime(2019, 5, 15, 11, 41, 51, tzinfo=tzlocal()), - ), - Version( - value="9.5.8", - release_date=datetime(2019, 6, 25, 8, 28, 51, tzinfo=tzlocal()), - ), - Version( - value="9.5.9", - release_date=datetime(2019, 8, 20, 9, 33, 35, tzinfo=tzlocal()), - ), - Version( - value="10.0.0", - release_date=datetime(2019, 7, 23, 7, 6, 3, tzinfo=tzlocal()), - ), - Version( - value="10.1.0", - release_date=datetime(2019, 10, 1, 8, 18, 18, tzinfo=tzlocal()), - ), - Version( - value="10.2.0", - release_date=datetime(2019, 12, 3, 11, 16, 26, tzinfo=tzlocal()), - ), - Version( - value="10.2.1", - release_date=datetime(2019, 12, 17, 11, 0, tzinfo=tzlocal()), - ), - Version( - value="10.2.2", - release_date=datetime(2019, 12, 17, 11, 36, 14, tzinfo=tzlocal()), - ), - Version( - value="10.3.0", - release_date=datetime(2020, 2, 25, 12, 50, 9, tzinfo=tzlocal()), - ), - Version( - value="10.4.0", - release_date=datetime(2020, 4, 21, 8, 0, 15, tzinfo=tzlocal()), - ), - Version( - value="10.4.1", - release_date=datetime(2020, 4, 28, 9, 7, 54, tzinfo=tzlocal()), - ), - Version( - value="10.4.2", - release_date=datetime(2020, 5, 12, 10, 41, 40, tzinfo=tzlocal()), - ), - Version( - value="10.4.4", - release_date=datetime(2020, 6, 9, 8, 56, 30, tzinfo=tzlocal()), - ), - Version( - value="10.4.3", - release_date=datetime(2020, 5, 19, 13, 16, 31, tzinfo=tzlocal()), - ), - } - - def test_composer_url(self): - expected_url = "https://repo.packagist.org/p/typo3/cms-core.json" - found_url = self.version_api.composer_url("typo3/cms-core") - assert expected_url == found_url +TEST_DATA = os.path.join(BASE_DIR, "test_data", "package_manager_data") + +dt_local = partial(datetime, tzinfo=tzlocal()) + + +@pytest.mark.parametrize( + "url_path", ["https://pkg.go.dev/https://github.com/xx/a/b", "https://github.com/xx/a/b"] +) +def test_trim_go_url_path(url_path): + assert GoproxyVersionAPI.trim_go_url_path(url_path) == "github.com/xx/a" + + +def test_trim_go_url_path_failure(caplog): + url_path = "https://github.com" + assert GoproxyVersionAPI.trim_go_url_path(url_path) == None + assert "Not a valid Go URL path" in caplog.text + + +def test_nuget_extract_version(): + with open(os.path.join(TEST_DATA, "nuget-data.json"), "r") as f: + response = json.load(f) + results = list(NugetVersionAPI().extract_versions(response)) + expected = [ + PackageVersion(value="2.1.0", release_date=dt_local(2011, 1, 22, 13, 34, 8, 550000)), + PackageVersion(value="3.0.0", release_date=dt_local(2011, 11, 24, 0, 26, 2, 527000)), + PackageVersion(value="3.0.3", release_date=dt_local(2011, 11, 27, 13, 50, 2, 63000)), + PackageVersion(value="3.0.4", release_date=dt_local(2011, 12, 12, 10, 18, 33, 380000)), + PackageVersion(value="3.0.5", release_date=dt_local(2011, 12, 12, 12, 0, 25, 947000)), + PackageVersion(value="3.0.6", release_date=dt_local(2012, 1, 2, 21, 10, 43, 403000)), + PackageVersion(value="3.4.0", release_date=dt_local(2013, 10, 20, 13, 32, 30, 837000)), + PackageVersion(value="3.4.1", release_date=dt_local(2014, 1, 17, 9, 17, 43, 680000)), + PackageVersion(value="3.5.0-beta2", release_date=dt_local(2015, 1, 1, 14, 9, 28, 710000)), + PackageVersion(value="3.5.0-beta3", release_date=dt_local(2015, 1, 6, 17, 39, 25, 147000)), + PackageVersion(value="3.5.0", release_date=dt_local(2015, 1, 14, 2, 1, 58, 853000)), + PackageVersion(value="3.5.1", release_date=dt_local(2015, 1, 23, 1, 5, 44, 447000)), + ] + assert results == expected + + +def test_nuget_extract_version_with_illformed_data(): + test_data = {"items": [{"items": [{"catalogEntry": {}}]}]} + results = list(NugetVersionAPI.extract_versions(test_data)) + assert results == [] + + +@mock.patch("vulnerabilities.package_managers.get_response") +def test_pypi_fetch_data(mock_response): + pypi_api = PypiVersionAPI() + with open(os.path.join(TEST_DATA, "pypi.json"), "r") as f: + mock_response.return_value = json.load(f) + + results = list(pypi_api.fetch("django")) + expected = [ + PackageVersion(value="1.1.3", release_date=dt_local(2010, 12, 23, 5, 14, 23, 509436)), + PackageVersion(value="1.1.4", release_date=dt_local(2011, 2, 9, 4, 13, 7, 75)), + PackageVersion(value="1.10", release_date=dt_local(2016, 8, 1, 18, 32, 16, 280614)), + PackageVersion(value="1.10.1", release_date=dt_local(2016, 9, 1, 23, 18, 18, 672706)), + PackageVersion(value="1.10.2", release_date=dt_local(2016, 10, 1, 20, 5, 31, 330942)), + PackageVersion(value="1.10.3", release_date=dt_local(2016, 11, 1, 13, 57, 16, 55061)), + PackageVersion(value="1.10.4", release_date=dt_local(2016, 12, 1, 23, 46, 50, 215935)), + PackageVersion(value="1.10.5", release_date=dt_local(2017, 1, 4, 19, 23, 0, 596664)), + PackageVersion(value="1.10.6", release_date=dt_local(2017, 3, 1, 13, 37, 40, 243134)), + PackageVersion(value="1.10.7", release_date=dt_local(2017, 4, 4, 14, 27, 54, 235551)), + PackageVersion(value="1.10.8", release_date=dt_local(2017, 9, 5, 15, 31, 58, 221021)), + PackageVersion(value="1.10a1", release_date=dt_local(2016, 5, 20, 12, 24, 59, 952686)), + PackageVersion(value="1.10b1", release_date=dt_local(2016, 6, 22, 1, 15, 17, 267637)), + PackageVersion(value="1.10rc1", release_date=dt_local(2016, 7, 18, 18, 5, 5, 503584)), + ] + assert results == expected + + +@mock.patch("vulnerabilities.package_managers.get_response") +def test_pypi_fetch_with_no_release(mock_response): + mock_response.return_value = {"info": {}} + results = list(PypiVersionAPI().fetch("django")) + assert results == [] + + +@mock.patch("vulnerabilities.package_managers.get_response") +def test_ruby_fetch_with_no_release(mock_response): + + with open(os.path.join(TEST_DATA, "gem.json")) as f: + mock_response.return_value = json.load(f) + + results = list(RubyVersionAPI().fetch("rails")) + + expected = [ + PackageVersion(value="7.0.2.3", release_date=dt_local(2022, 3, 8, 17, 50, 52, 496000)), + PackageVersion(value="7.0.2.2", release_date=dt_local(2022, 2, 11, 19, 44, 19, 17000)), + ] + + assert results == expected + + +class TestComposerVersionAPI: + + expected_versions = [ + PackageVersion(value=("10.0.0",), release_date=dt_local(2019, 7, 23, 7, 6, 3)), + PackageVersion(value=("10.1.0",), release_date=dt_local(2019, 10, 1, 8, 18, 18)), + PackageVersion(value=("10.2.0",), release_date=dt_local(2019, 12, 3, 11, 16, 26)), + PackageVersion(value=("10.2.1",), release_date=dt_local(2019, 12, 17, 11, 0)), + PackageVersion(value=("10.2.2",), release_date=dt_local(2019, 12, 17, 11, 36, 14)), + PackageVersion(value=("10.3.0",), release_date=dt_local(2020, 2, 25, 12, 50, 9)), + PackageVersion(value=("10.4.0",), release_date=dt_local(2020, 4, 21, 8, 0, 15)), + PackageVersion(value=("10.4.1",), release_date=dt_local(2020, 4, 28, 9, 7, 54)), + PackageVersion(value=("10.4.2",), release_date=dt_local(2020, 5, 12, 10, 41, 40)), + PackageVersion(value=("10.4.3",), release_date=dt_local(2020, 5, 19, 13, 16, 31)), + PackageVersion(value=("10.4.4",), release_date=dt_local(2020, 6, 9, 8, 56, 30)), + PackageVersion(value=("8.7.10",), release_date=dt_local(2018, 2, 6, 10, 46, 2)), + PackageVersion(value=("8.7.11",), release_date=dt_local(2018, 3, 13, 12, 44, 45)), + PackageVersion(value=("8.7.12",), release_date=dt_local(2018, 3, 22, 11, 35, 42)), + PackageVersion(value=("8.7.13",), release_date=dt_local(2018, 4, 17, 8, 15, 46)), + PackageVersion(value=("8.7.14",), release_date=dt_local(2018, 5, 22, 13, 51, 9)), + PackageVersion(value=("8.7.15",), release_date=dt_local(2018, 5, 23, 11, 31, 21)), + PackageVersion(value=("8.7.16",), release_date=dt_local(2018, 6, 11, 17, 18, 14)), + PackageVersion(value=("8.7.17",), release_date=dt_local(2018, 7, 12, 11, 29, 19)), + PackageVersion(value=("8.7.18",), release_date=dt_local(2018, 7, 31, 8, 15, 29)), + PackageVersion(value=("8.7.19",), release_date=dt_local(2018, 8, 21, 7, 23, 21)), + PackageVersion(value=("8.7.20",), release_date=dt_local(2018, 10, 30, 10, 39, 51)), + PackageVersion(value=("8.7.21",), release_date=dt_local(2018, 12, 11, 12, 40, 12)), + PackageVersion(value=("8.7.22",), release_date=dt_local(2018, 12, 14, 7, 43, 50)), + PackageVersion(value=("8.7.23",), release_date=dt_local(2019, 1, 22, 10, 10, 2)), + PackageVersion(value=("8.7.24",), release_date=dt_local(2019, 1, 22, 15, 25, 55)), + PackageVersion(value=("8.7.25",), release_date=dt_local(2019, 5, 7, 10, 5, 55)), + PackageVersion(value=("8.7.26",), release_date=dt_local(2019, 5, 15, 11, 24, 12)), + PackageVersion(value=("8.7.27",), release_date=dt_local(2019, 6, 25, 8, 24, 21)), + PackageVersion(value=("8.7.28",), release_date=dt_local(2019, 10, 15, 7, 21, 52)), + PackageVersion(value=("8.7.29",), release_date=dt_local(2019, 10, 30, 21, 0, 45)), + PackageVersion(value=("8.7.30",), release_date=dt_local(2019, 12, 17, 10, 49, 17)), + PackageVersion(value=("8.7.31",), release_date=dt_local(2020, 2, 17, 23, 29, 16)), + PackageVersion(value=("8.7.32",), release_date=dt_local(2020, 3, 31, 8, 33, 3)), + PackageVersion(value=("8.7.7",), release_date=dt_local(2017, 9, 19, 14, 22, 53)), + PackageVersion(value=("8.7.8",), release_date=dt_local(2017, 10, 10, 16, 8, 44)), + PackageVersion(value=("8.7.9",), release_date=dt_local(2017, 12, 12, 16, 9, 50)), + PackageVersion(value=("9.0.0",), release_date=dt_local(2017, 12, 12, 16, 48, 22)), + PackageVersion(value=("9.1.0",), release_date=dt_local(2018, 1, 30, 15, 31, 12)), + PackageVersion(value=("9.2.0",), release_date=dt_local(2018, 4, 9, 20, 51, 35)), + PackageVersion(value=("9.2.1",), release_date=dt_local(2018, 5, 22, 13, 47, 11)), + PackageVersion(value=("9.3.0",), release_date=dt_local(2018, 6, 11, 17, 14, 33)), + PackageVersion(value=("9.3.1",), release_date=dt_local(2018, 7, 12, 11, 33, 12)), + PackageVersion(value=("9.3.2",), release_date=dt_local(2018, 7, 12, 15, 51, 49)), + PackageVersion(value=("9.3.3",), release_date=dt_local(2018, 7, 31, 8, 20, 17)), + PackageVersion(value=("9.4.0",), release_date=dt_local(2018, 9, 4, 12, 8, 20)), + PackageVersion(value=("9.5.0",), release_date=dt_local(2018, 10, 2, 8, 10, 33)), + PackageVersion(value=("9.5.1",), release_date=dt_local(2018, 10, 30, 10, 45, 30)), + PackageVersion(value=("9.5.10",), release_date=dt_local(2019, 10, 15, 7, 29, 55)), + PackageVersion(value=("9.5.11",), release_date=dt_local(2019, 10, 30, 20, 46, 49)), + PackageVersion(value=("9.5.12",), release_date=dt_local(2019, 12, 17, 10, 53, 45)), + PackageVersion(value=("9.5.13",), release_date=dt_local(2019, 12, 17, 14, 17, 37)), + PackageVersion(value=("9.5.14",), release_date=dt_local(2020, 2, 17, 23, 37, 2)), + PackageVersion(value=("9.5.15",), release_date=dt_local(2020, 3, 31, 8, 40, 25)), + PackageVersion(value=("9.5.16",), release_date=dt_local(2020, 4, 28, 9, 22, 14)), + PackageVersion(value=("9.5.17",), release_date=dt_local(2020, 5, 12, 10, 36)), + PackageVersion(value=("9.5.18",), release_date=dt_local(2020, 5, 19, 13, 10, 50)), + PackageVersion(value=("9.5.19",), release_date=dt_local(2020, 6, 9, 8, 44, 34)), + PackageVersion(value=("9.5.2",), release_date=dt_local(2018, 12, 11, 12, 42, 55)), + PackageVersion(value=("9.5.3",), release_date=dt_local(2018, 12, 14, 7, 28, 48)), + PackageVersion(value=("9.5.4",), release_date=dt_local(2019, 1, 22, 10, 12, 4)), + PackageVersion(value=("9.5.5",), release_date=dt_local(2019, 3, 4, 20, 25, 8)), + PackageVersion(value=("9.5.6",), release_date=dt_local(2019, 5, 7, 10, 16, 30)), + PackageVersion(value=("9.5.7",), release_date=dt_local(2019, 5, 15, 11, 41, 51)), + PackageVersion(value=("9.5.8",), release_date=dt_local(2019, 6, 25, 8, 28, 51)), + PackageVersion(value=("9.5.9",), release_date=dt_local(2019, 8, 20, 9, 33, 35)), + ] def test_extract_versions(self): + with open(os.path.join(TEST_DATA, "composer.json")) as f: + mock_response = json.load(f) - found_versions = self.version_api.extract_versions(self.response, "typo3/cms-core") - assert found_versions == self.expected_versions + results = list(ComposerVersionAPI().extract_versions(mock_response, "typo3/cms-core")) + assert results == self.expected_versions - def test_fetch(self): + @mock.patch("vulnerabilities.package_managers.get_response") + def test_fetch(self, mock_response): + with open(os.path.join(TEST_DATA, "composer.json")) as f: + mock_response.return_value = json.load(f) - assert self.version_api.get("typo3/cms-core") == VersionResponse() - client_session = MockClientSession(self.response) - asyncio.run(self.version_api.fetch("typo3/cms-core", client_session)) - assert self.version_api.cache["typo3/cms-core"] == self.expected_versions + results = list(ComposerVersionAPI().fetch("typo3/cms-core")) + assert results == self.expected_versions -class TestMavenVersionAPI(TestCase): - @classmethod - def setUpClass(cls): - cls.version_api = MavenVersionAPI() - with open(os.path.join(TEST_DATA, "maven_api", "maven-metadata.xml")) as f: - cls.response = ET.parse(f) +class TestMavenVersionAPI: + def test_extract_versions(self): + import xml.etree.ElementTree as ET + + with open(os.path.join(TEST_DATA, "maven-metadata.xml")) as f: + mock_response = ET.parse(f) - with open(os.path.join(TEST_DATA, "maven_api", "maven-metadata.xml"), "rb") as f: - cls.content = f.read() + results = list(MavenVersionAPI().extract_versions(mock_response)) + expected = [PackageVersion("1.2.2"), PackageVersion("1.2.3"), PackageVersion("1.3.0")] + assert results == expected def test_artifact_url(self): eg_comps1 = ["org.apache", "kafka"] eg_comps2 = ["apple.msft.windows.mac.oss", "exfat-ntfs"] - url1 = self.version_api.artifact_url(eg_comps1) - url2 = self.version_api.artifact_url(eg_comps2) + url1 = MavenVersionAPI.artifact_url(eg_comps1) + url2 = MavenVersionAPI.artifact_url(eg_comps2) - assert "https://repo1.maven.org/maven2/org/apache/kafka/maven-metadata.xml" == url1 + assert url1 == "https://repo1.maven.org/maven2/org/apache/kafka/maven-metadata.xml" assert ( - "https://repo1.maven.org/maven2" - "/apple/msft/windows/mac/oss/exfat-ntfs/maven-metadata.xml" == url2 + url2 + == "https://repo1.maven.org/maven2/apple/msft/windows/mac/oss/exfat-ntfs/maven-metadata.xml" ) - def test_extract_versions(self): - expected_versions = {Version("1.2.2"), Version("1.2.3"), Version("1.3.0")} - assert expected_versions == self.version_api.extract_versions(self.response) - - def test_fetch(self): - assert self.version_api.get("org.apache:kafka") == VersionResponse() - expected = {"1.2.2", "1.2.3", "1.3.0"} - client_session = MockClientSession(self.content) - asyncio.run(self.version_api.fetch("org.apache:kafka", client_session)) - assert self.version_api.get("org.apache:kafka") == VersionResponse(valid_versions=expected) - - -class TestGoproxyVersionAPI(TestCase): - def test_trim_url_path(self): - url1 = "https://pkg.go.dev/github.com/containous/traefik/v2" - url2 = "github.com/FerretDB/FerretDB/cmd/ferretdb" - url3 = GoproxyVersionAPI.trim_url_path(url2) - assert "github.com/containous/traefik" == GoproxyVersionAPI.trim_url_path(url1) - assert "github.com/FerretDB/FerretDB/cmd" == url3 - assert "github.com/FerretDB/FerretDB" == GoproxyVersionAPI.trim_url_path(url3) + @mock.patch("vulnerabilities.package_managers.get_response") + def test_get_until(self, mock_response): + with open(os.path.join(TEST_DATA, "maven-metadata.xml"), "rb") as f: + mock_response.return_value = f.read() - def test_escape_path(self): - path = "github.com/FerretDB/FerretDB" - assert "github.com/!ferret!d!b/!ferret!d!b" == GoproxyVersionAPI.escape_path(path) - - def test_parse_version_info(self): - with open(os.path.join(TEST_DATA, "goproxy_api", "version_info")) as f: - vinfo = json.load(f) - client_session = MockClientSession(vinfo) - assert asyncio.run( - GoproxyVersionAPI.parse_version_info( - "v0.0.5", "github.com/!ferret!d!b/!ferret!d!b", client_session - ) - ) == Version( - value="v0.0.5", - release_date=datetime(2022, 1, 4, 13, 54, 1, tzinfo=tzutc()), + assert MavenVersionAPI().get_until("org.apache:kafka") == VersionResponse( + valid_versions={"1.3.0", "1.2.2", "1.2.3"}, newer_versions=set() ) - def test_fetch(self): - version_api = GoproxyVersionAPI() - assert version_api.get("github.com/FerretDB/FerretDB") == VersionResponse() - with open(os.path.join(TEST_DATA, "goproxy_api", "ferretdb_versions")) as f: - vlist = f.read() - client_session = MockClientSession(vlist) - asyncio.run(version_api.fetch("github.com/FerretDB/FerretDB", client_session)) - assert version_api.cache["github.com/FerretDB/FerretDB"] == { - Version(value="v0.0.1"), - Version(value="v0.0.2"), - Version(value="v0.0.3"), - Version(value="v0.0.4"), - Version(value="v0.0.5"), - } - - -class TestNugetVersionAPI(TestCase): - @classmethod - def setUpClass(cls): - cls.version_api = NugetVersionAPI() - with open(os.path.join(TEST_DATA, "nuget_api", "index.json")) as f: - cls.response = json.load(f) - - cls.expected_versions = { - Version( - value="1.0.0", - release_date=datetime(2018, 9, 13, 8, 16, 0, 420000, tzinfo=tzlocal()), - ), - Version( - value="1.0.1", - release_date=datetime(2020, 1, 17, 15, 31, 41, 857000, tzinfo=tzlocal()), - ), - Version( - value="1.0.2", - release_date=datetime(2020, 4, 21, 12, 24, 53, 877000, tzinfo=tzlocal()), - ), - Version( - value="2.0.0-preview01", - release_date=datetime(2018, 1, 9, 17, 12, 20, 440000, tzinfo=tzlocal()), - ), - Version( - value="2.0.0", - release_date=datetime(2018, 9, 27, 13, 33, 15, 370000, tzinfo=tzlocal()), - ), - Version( - value="2.1.0", - release_date=datetime(2018, 10, 16, 6, 59, 44, 680000, tzinfo=tzlocal()), - ), - Version( - value="2.2.0", - release_date=datetime(2018, 11, 23, 8, 13, 8, 3000, tzinfo=tzlocal()), - ), - Version( - value="2.3.0", - release_date=datetime(2019, 6, 27, 14, 27, 31, 613000, tzinfo=tzlocal()), - ), - Version( - value="2.4.0", - release_date=datetime(2020, 1, 17, 15, 11, 5, 810000, tzinfo=tzlocal()), - ), - Version( - value="2.5.0", - release_date=datetime(2020, 3, 24, 14, 22, 39, 960000, tzinfo=tzlocal()), - ), - Version( - value="2.7.0", - release_date=datetime(2020, 4, 21, 12, 27, 36, 427000, tzinfo=tzlocal()), - ), - Version( - value="2.6.0", - release_date=datetime(2020, 3, 27, 11, 6, 27, 500000, tzinfo=tzlocal()), - ), - Version( - value="0.24.0", - release_date=datetime(2018, 3, 30, 7, 25, 18, 393000, tzinfo=tzlocal()), - ), - Version( - value="0.23.0", - release_date=datetime(2018, 1, 17, 9, 32, 59, 283000, tzinfo=tzlocal()), - ), - } - - def test_nuget_url(self): - expected_url = "https://api.nuget.org/v3/registration5-semver1/exfat.ntfs/index.json" - found_url = self.version_api.nuget_url("exfat.ntfs") - assert expected_url == found_url + @mock.patch("vulnerabilities.package_managers.get_response") + def test_fetch(self, mock_response): + with open(os.path.join(TEST_DATA, "maven-metadata.xml"), "rb") as f: + mock_response.return_value = f.read() - def test_extract_versions(self): - - found_versions = self.version_api.extract_versions(self.response) - assert self.expected_versions == found_versions - - def test_fetch(self): - - assert self.version_api.get("Exfat.Ntfs") == VersionResponse() - client_session = MockClientSession(self.response) - asyncio.run(self.version_api.fetch("Exfat.Ntfs", client_session)) - assert self.version_api.get("Exfat.Ntfs") == VersionResponse( - newer_versions=set(), - valid_versions={ - "2.0.0", - "2.1.0", - "2.0.0-preview01", - "0.24.0", - "0.23.0", - "1.0.1", - "2.2.0", - "2.4.0", - "1.0.0", - "1.0.2", - "2.3.0", - "2.7.0", - "2.5.0", - "2.6.0", - }, - ) + expected = [ + PackageVersion(value="1.2.2"), + PackageVersion(value="1.2.3"), + PackageVersion(value="1.3.0"), + ] + results = list(MavenVersionAPI().fetch("org.apache:kafka")) + assert results == expected - # def test_load_to_api(self): - # assert self.version_api.get("Exfat.Ntfs") == set() - # mock_response = MagicMock() - # mock_response.json = lambda: self.response +class TestGoproxyVersionAPI: + def test_trim_go_url_path(self): - # with patch("vulnerabilities.package_managers.requests.get", return_value=mock_response): - # self.version_api.load_to_api("Exfat.Ntfs") - - # assert self.version_api.get("Exfat.Ntfs") == self.expected_versions - - -class TestGitHubTagsAPI(TestCase): - regen = False - - def setUp(self) -> None: - if not os.getenv("GH_TOKEN"): - if not distutils.spawn.find_executable("svn"): - raise SkipTest("cannot find svn executable and GH_TOKEN variable is not set") - - return super().setUp() - - def do_test_fetch(self, ownername): - self.version_api = GitHubTagsAPI() - test_id = ownername.replace("/", "_") + url1 = "https://pkg.go.dev/github.com/containous/traefik/v2" + assert GoproxyVersionAPI.trim_go_url_path(url1) == "github.com/containous/traefik" - async def async_run(): - async with RecordedClientSession(test_id, regen=self.regen) as session: - await self.version_api.fetch(ownername, session) + url2 = "github.com/FerretDB/FerretDB/cmd/ferretdb" + assert GoproxyVersionAPI.trim_go_url_path(url2) == "github.com/FerretDB/FerretDB" - asyncio.run(async_run()) + url3 = GoproxyVersionAPI.trim_go_url_path(url2) + assert GoproxyVersionAPI.trim_go_url_path(url3) == "github.com/FerretDB/FerretDB" - def test_simple(self): - self.do_test_fetch("nexB/vulnerablecode") - assert self.version_api.get("nexB/vulnerablecode") == VersionResponse( - newer_versions=set(), - valid_versions={ - "v0.1", - "v20.10", - }, + def test_escape_path(self): + path = "github.com/FerretDB/FerretDB" + expected = "github.com/!ferret!d!b/!ferret!d!b" + assert GoproxyVersionAPI.escape_path(path) == expected + + @mock.patch("vulnerabilities.package_managers.get_response") + def test_fetch_version_info(self, mock_response): + mock_response.return_value = {"Version": "v0.0.5", "Time": "2022-01-04T13:54:01Z"} + result = GoproxyVersionAPI.fetch_version_info( + "v0.0.5", + "github.com/!ferret!d!b/!ferret!d!b", ) + expected = PackageVersion( + value="v0.0.5", + release_date=dt_local(2022, 1, 4, 13, 54, 1), + ) + assert result == expected + + @mock.patch("vulnerabilities.package_managers.get_response") + def test_fetch(self, mock_fetcher): + # we have many calls made to get_response + versions_list = "v0.0.1\nv0.0.5\nv0.0.3\nv0.0.4\nv0.0.2\n" + responses = [ + versions_list, + {"Version": "v0.0.1", "Time": "2021-11-02T06:56:38Z"}, + {"Version": "v0.0.2", "Time": "2021-11-13T21:36:37Z"}, + {"Version": "v0.0.3", "Time": "2021-11-19T20:31:22Z"}, + {"Version": "v0.0.4", "Time": "2021-12-01T19:02:44Z"}, + {"Version": "v0.0.5", "Time": "2022-01-04T13:54:01Z"}, + ] + mock_fetcher.side_effect = responses + + results = list(GoproxyVersionAPI().fetch("github.com/FerretDB/FerretDB")) + expected = [ + PackageVersion(value="v0.0.1", release_date=dt_local(2021, 11, 2, 6, 56, 38)), + PackageVersion(value="v0.0.5", release_date=dt_local(2021, 11, 13, 21, 36, 37)), + PackageVersion(value="v0.0.3", release_date=dt_local(2021, 11, 19, 20, 31, 22)), + PackageVersion(value="v0.0.4", release_date=dt_local(2021, 12, 1, 19, 2, 44)), + PackageVersion(value="v0.0.2", release_date=dt_local(2022, 1, 4, 13, 54, 1)), + ] + assert results == expected + + +class TestNugetVersionAPI: + expected_versions = [ + PackageVersion(value="0.23.0", release_date=dt_local(2018, 1, 17, 9, 32, 59, 283000)), + PackageVersion(value="0.24.0", release_date=dt_local(2018, 3, 30, 7, 25, 18, 393000)), + PackageVersion(value="1.0.0", release_date=dt_local(2018, 9, 13, 8, 16, 0, 420000)), + PackageVersion(value="1.0.1", release_date=dt_local(2020, 1, 17, 15, 31, 41, 857000)), + PackageVersion(value="1.0.2", release_date=dt_local(2020, 4, 21, 12, 24, 53, 877000)), + PackageVersion( + value="2.0.0-preview01", release_date=dt_local(2018, 1, 9, 17, 12, 20, 440000) + ), + PackageVersion(value="2.0.0", release_date=dt_local(2018, 9, 27, 13, 33, 15, 370000)), + PackageVersion(value="2.1.0", release_date=dt_local(2018, 10, 16, 6, 59, 44, 680000)), + PackageVersion(value="2.2.0", release_date=dt_local(2018, 11, 23, 8, 13, 8, 3000)), + PackageVersion(value="2.3.0", release_date=dt_local(2019, 6, 27, 14, 27, 31, 613000)), + PackageVersion(value="2.4.0", release_date=dt_local(2020, 1, 17, 15, 11, 5, 810000)), + PackageVersion(value="2.5.0", release_date=dt_local(2020, 3, 24, 14, 22, 39, 960000)), + PackageVersion(value="2.6.0", release_date=dt_local(2020, 3, 27, 11, 6, 27, 500000)), + PackageVersion(value="2.7.0", release_date=dt_local(2020, 4, 21, 12, 27, 36, 427000)), + ] - def test_huge_repo(self): - self.do_test_fetch("torvalds/linux") - assert len(self.version_api.get("torvalds/linux").valid_versions) > 700 + def test_extract_versions(self): + with open(os.path.join(TEST_DATA, "nuget_index.json")) as f: + mock_response = json.load(f) + results = list(NugetVersionAPI().extract_versions(mock_response)) + assert results == self.expected_versions + + @mock.patch("vulnerabilities.package_managers.get_response") + def test_fetch(self, mock_response): + with open(os.path.join(TEST_DATA, "nuget_index.json")) as f: + mock_response.return_value = json.load(f) + results = list(NugetVersionAPI().fetch("Exfat.Ntfs")) + assert results == self.expected_versions + + +class TestGitHubTagsAPI: + @mock.patch("vulnerabilities.helpers.fetch_github_graphql_query") + def test_fetch_large_repo(self, mock_fetcher): + reponse_files = [ + "github-torvalds-linux-0.json", + "github-torvalds-linux-1.json", + "github-torvalds-linux-2.json", + "github-torvalds-linux-3.json", + "github-torvalds-linux-4.json", + "github-torvalds-linux-5.json", + "github-torvalds-linux-6.json", + "github-torvalds-linux-7.json", + ] + side_effects = [] + for response_file in reponse_files: + with open(os.path.join(TEST_DATA, "github", response_file)) as f: + side_effects.append(json.load(f)) + mock_fetcher.side_effect = side_effects + + results = list(GitHubTagsAPI().fetch("torvalds/linux")) + assert len(results) == 739 + + @mock.patch("vulnerabilities.helpers.fetch_github_graphql_query") + def test_fetch_small_repo_1(self, mock_graphql_response): + with open(os.path.join(TEST_DATA, "github", "github-nexb-scancode-toolkit-0.json")) as f: + mock_graphql_response.return_value = json.load(f) + results = list(GitHubTagsAPI().fetch("nexB/scancode-toolkit")) + expected = [ + PackageVersion(value="v1.0.0", release_date=dt_local(2015, 7, 1, 15, 14, 15)), + PackageVersion(value="v1.1.0", release_date=dt_local(2015, 7, 6, 10, 9, 51)), + PackageVersion(value="v1.2.0", release_date=dt_local(2015, 7, 13, 14, 56, 45)), + PackageVersion(value="v1.2.1", release_date=dt_local(2015, 7, 13, 16, 36, 42)), + PackageVersion(value="v1.2.2", release_date=dt_local(2015, 7, 14, 14, 10, 20)), + PackageVersion(value="v1.2.3", release_date=dt_local(2015, 7, 16, 6, 53, 40)), + PackageVersion(value="v1.2.4", release_date=dt_local(2015, 7, 22, 14, 6, 14)), + PackageVersion(value="v1.3.0", release_date=dt_local(2015, 7, 24, 12, 20, 54)), + PackageVersion(value="v1.3.1", release_date=dt_local(2015, 7, 27, 18, 46, 11)), + PackageVersion(value="v1.4.0", release_date=dt_local(2015, 11, 24, 18, 15, 21)), + PackageVersion(value="v1.4.1", release_date=dt_local(2015, 12, 3, 11, 22, 26)), + PackageVersion(value="v1.4.2", release_date=dt_local(2015, 12, 3, 11, 39, 30)), + PackageVersion(value="v1.4.3", release_date=dt_local(2015, 12, 10, 17, 7, 19)), + PackageVersion(value="v1.5.0", release_date=dt_local(2015, 12, 15, 14, 57, 37)), + PackageVersion(value="v1.6.0", release_date=dt_local(2016, 1, 29, 21, 50, 30)), + PackageVersion(value="v1.6.1", release_date=dt_local(2016, 3, 1, 19, 49, 6)), + PackageVersion(value="v1.6.2", release_date=dt_local(2016, 6, 24, 14, 35, 1)), + PackageVersion(value="v1.6.3", release_date=dt_local(2016, 6, 24, 16, 4, 25)), + PackageVersion(value="v2.0.0.rc1", release_date=dt_local(2016, 10, 7, 20, 49, 42)), + PackageVersion(value="v2.0.0.rc2", release_date=dt_local(2017, 1, 16, 14, 34, 49)), + PackageVersion(value="v2.0.0.rc3", release_date=dt_local(2017, 6, 16, 15, 56, 50)), + PackageVersion(value="v2.0.0", release_date=dt_local(2017, 6, 23, 8, 7, 3)), + PackageVersion(value="v2.0.1", release_date=dt_local(2017, 7, 3, 16, 0, 36)), + PackageVersion(value="v2.1.0", release_date=dt_local(2017, 9, 22, 19, 34, 57)), + PackageVersion(value="v2.2.0", release_date=dt_local(2017, 10, 5, 22, 41, 56)), + PackageVersion(value="v2.2.1", release_date=dt_local(2017, 10, 5, 22, 53, 25)), + PackageVersion(value="v2.9.0b1", release_date=dt_local(2018, 3, 2, 21, 18, 40)), + PackageVersion(value="v2.9.1", release_date=dt_local(2018, 3, 22, 15, 44, 33)), + PackageVersion(value="v2.9.2", release_date=dt_local(2018, 5, 8, 13, 54, 52)), + PackageVersion(value="v2.9.3", release_date=dt_local(2018, 9, 27, 21, 11, 57)), + PackageVersion(value="v2.9.4", release_date=dt_local(2018, 10, 19, 14, 31, 36)), + PackageVersion(value="v2.9.5", release_date=dt_local(2018, 10, 22, 20, 33, 50)), + PackageVersion(value="v2.9.6", release_date=dt_local(2018, 10, 25, 20, 26, 28)), + PackageVersion(value="v2.9.7", release_date=dt_local(2018, 10, 26, 1, 55, 40)), + PackageVersion(value="v2.9.8", release_date=dt_local(2018, 12, 12, 10, 13, 24)), + PackageVersion(value="v2.9.9", release_date=dt_local(2019, 1, 7, 11, 20, 18)), + PackageVersion(value="v3.0.0", release_date=dt_local(2019, 2, 14, 19, 15, 6)), + PackageVersion(value="v3.0.1", release_date=dt_local(2019, 2, 15, 14, 17, 54)), + PackageVersion(value="v3.0.2", release_date=dt_local(2019, 2, 15, 14, 34, 52)), + PackageVersion(value="v3.1.0", release_date=dt_local(2019, 8, 12, 18, 31, 48)), + PackageVersion(value="v3.1.1", release_date=dt_local(2019, 9, 3, 20, 27, 57)), + PackageVersion(value="v3.2.0rc1", release_date=dt_local(2020, 9, 8, 18, 12, 16)), + PackageVersion(value="v3.2.1rc2", release_date=dt_local(2020, 9, 11, 15, 28, 54)), + PackageVersion(value="v3.2.2rc3", release_date=dt_local(2020, 10, 14, 22, 18)), + PackageVersion(value="v3.2.3", release_date=dt_local(2020, 10, 27, 18, 44, 17)), + PackageVersion(value="v21.2.9", release_date=dt_local(2021, 2, 9, 18, 0, 14)), + PackageVersion(value="v21.2.25", release_date=dt_local(2021, 2, 25, 21, 6, 9)), + PackageVersion(value="v21.3.30", release_date=dt_local(2021, 3, 31, 17, 36, 32)), + PackageVersion(value="v21.3.31", release_date=dt_local(2021, 4, 1, 7, 21, 52)), + PackageVersion(value="v21.6.7", release_date=dt_local(2021, 6, 8, 8, 27, 29)), + PackageVersion(value="v21.7.30", release_date=dt_local(2021, 7, 30, 20, 12, 30)), + PackageVersion(value="v21.8.4", release_date=dt_local(2021, 8, 4, 17, 42, 25)), + PackageVersion(value="v30.0.0", release_date=dt_local(2021, 9, 23, 10, 41, 40)), + PackageVersion(value="v30.0.1", release_date=dt_local(2021, 9, 24, 10, 1, 28)), + PackageVersion(value="v30.1.0", release_date=dt_local(2021, 9, 26, 14, 31, 56)), + ] + assert results == expected + + @mock.patch("vulnerabilities.helpers.fetch_github_graphql_query") + def test_fetch_small_repo_2(self, mock_graphql_response): + with open(os.path.join(TEST_DATA, "github", "github-nexb-vulnerablecode-0.json")) as f: + mock_graphql_response.return_value = json.load(f) + results = list(GitHubTagsAPI().fetch("nexB/vulnerablecode")) + expected = [ + PackageVersion(value="v0.1", release_date=dt_local(2019, 12, 3, 13, 48, 53)), + PackageVersion(value="v20.10", release_date=dt_local(2020, 9, 28, 12, 31, 16)), + PackageVersion(value="v22.01", release_date=dt_local(2022, 1, 24, 23, 48, 4)), + ] + assert results == expected diff --git a/vulnerabilities/tests/test_package_managers_2.py b/vulnerabilities/tests/test_package_managers_2.py deleted file mode 100644 index d0d569290..000000000 --- a/vulnerabilities/tests/test_package_managers_2.py +++ /dev/null @@ -1,174 +0,0 @@ -import json -import os -from datetime import datetime -from unittest import mock - -import pytest -import pytz - -from vulnerabilities.package_managers_2 import GoproxyVersionAPI -from vulnerabilities.package_managers_2 import LegacyVersion -from vulnerabilities.package_managers_2 import NugetVersionAPI -from vulnerabilities.package_managers_2 import PypiVersionAPI -from vulnerabilities.package_managers_2 import RubyVersionAPI - -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -TEST_DATA = os.path.join(BASE_DIR, "test_data", "package_manager_data") - - -@pytest.mark.parametrize( - "url_path", ["https://pkg.go.dev/https://github.com/xx/a/b", "https://github.com/xx/a/b"] -) -def test_trim_go_url_path(url_path): - assert GoproxyVersionAPI.trim_go_url_path(url_path) == "github.com/xx/a" - - -def test_trim_go_url_path_failure(caplog): - url_path = "https://github.com" - assert GoproxyVersionAPI.trim_go_url_path(url_path) == None - assert "Not a valid Go URL path" in caplog.text - - -def test_nuget_extract_version(): - with open(os.path.join(TEST_DATA, "nuget-data.json"), "r") as f: - resp = json.load(f) - assert NugetVersionAPI.extract_versions(resp) == { - LegacyVersion( - value="3.0.3", release_date=datetime(2011, 11, 27, 13, 50, 2, 63000, tzinfo=pytz.UTC) - ), - LegacyVersion( - value="3.0.5", release_date=datetime(2011, 12, 12, 12, 0, 25, 947000, tzinfo=pytz.UTC) - ), - LegacyVersion( - value="2.1.0", release_date=datetime(2011, 1, 22, 13, 34, 8, 550000, tzinfo=pytz.UTC) - ), - LegacyVersion( - value="3.0.0", release_date=datetime(2011, 11, 24, 0, 26, 2, 527000, tzinfo=pytz.UTC) - ), - LegacyVersion( - value="3.0.4", release_date=datetime(2011, 12, 12, 10, 18, 33, 380000, tzinfo=pytz.UTC) - ), - LegacyVersion( - value="3.0.6", release_date=datetime(2012, 1, 2, 21, 10, 43, 403000, tzinfo=pytz.UTC) - ), - LegacyVersion( - value="3.4.0", release_date=datetime(2013, 10, 20, 13, 32, 30, 837000, tzinfo=pytz.UTC) - ), - LegacyVersion( - value="3.4.1", release_date=datetime(2014, 1, 17, 9, 17, 43, 680000, tzinfo=pytz.UTC) - ), - LegacyVersion( - value="3.5.0-beta3", - release_date=datetime(2015, 1, 6, 17, 39, 25, 147000, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="3.5.0-beta2", - release_date=datetime(2015, 1, 1, 14, 9, 28, 710000, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="3.5.0", release_date=datetime(2015, 1, 14, 2, 1, 58, 853000, tzinfo=pytz.UTC) - ), - LegacyVersion( - value="3.5.1", release_date=datetime(2015, 1, 23, 1, 5, 44, 447000, tzinfo=pytz.UTC) - ), - } - - -def test_nuget_extract_version_with_illformed_data(): - assert NugetVersionAPI.extract_versions({"items": [{"items": [{"catalogEntry": {}}]}]}) == set() - - -@mock.patch("vulnerabilities.package_managers_2.get_response") -def test_pypi_fetch_data(mock_response): - pypi_api = PypiVersionAPI() - with open(os.path.join(TEST_DATA, "pypi.json"), "r") as f: - mock_response.return_value = json.load(f) - pypi_api.fetch("django") - assert pypi_api.cache == { - "django": { - LegacyVersion( - value="1.10.5", - release_date=datetime(2017, 1, 4, 19, 23, 0, 596664, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.10.8", - release_date=datetime(2017, 9, 5, 15, 31, 58, 221021, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.10rc1", - release_date=datetime(2016, 7, 18, 18, 5, 5, 503584, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.10.4", - release_date=datetime(2016, 12, 1, 23, 46, 50, 215935, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.10a1", - release_date=datetime(2016, 5, 20, 12, 24, 59, 952686, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.10.3", - release_date=datetime(2016, 11, 1, 13, 57, 16, 55061, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.10.1", - release_date=datetime(2016, 9, 1, 23, 18, 18, 672706, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.10.2", - release_date=datetime(2016, 10, 1, 20, 5, 31, 330942, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.10.7", - release_date=datetime(2017, 4, 4, 14, 27, 54, 235551, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.10.6", - release_date=datetime(2017, 3, 1, 13, 37, 40, 243134, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.1.4", - release_date=datetime(2011, 2, 9, 4, 13, 7, 75, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.10b1", - release_date=datetime(2016, 6, 22, 1, 15, 17, 267637, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.1.3", - release_date=datetime(2010, 12, 23, 5, 14, 23, 509436, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="1.10", - release_date=datetime(2016, 8, 1, 18, 32, 16, 280614, tzinfo=pytz.UTC), - ), - } - } - - -@mock.patch("vulnerabilities.package_managers_2.get_response") -def test_pypi_fetch_with_no_release(mock_response): - pypi_api = PypiVersionAPI() - mock_response.return_value = {"info": {}} - pypi_api.fetch("django") - assert pypi_api.cache == {"django": set()} - - -@mock.patch("vulnerabilities.package_managers_2.get_response") -def test_pypi_fetch_with_no_release(mock_response): - ruby_api = RubyVersionAPI() - with open(os.path.join(TEST_DATA, "gem.json"), "r") as f: - mock_response.return_value = json.load(f) - ruby_api.fetch("rails") - assert ruby_api.cache == { - "rails": { - LegacyVersion( - value="7.0.2.3", - release_date=datetime(2022, 3, 8, 17, 50, 52, 496000, tzinfo=pytz.UTC), - ), - LegacyVersion( - value="7.0.2.2", - release_date=datetime(2022, 2, 11, 19, 44, 19, 17000, tzinfo=pytz.UTC), - ), - } - } diff --git a/vulnerabilities/tests/test_postgres_workaround.py b/vulnerabilities/tests/test_postgres_workaround.py index ed2a746ce..3cd94149f 100644 --- a/vulnerabilities/tests/test_postgres_workaround.py +++ b/vulnerabilities/tests/test_postgres_workaround.py @@ -8,12 +8,12 @@ from univers.version_range import MavenVersionRange from univers.versions import MavenVersion +from vulnerabilities import severity_systems from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import AffectedPackage from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity from vulnerabilities.models import Advisory -from vulnerabilities.severity_systems import ScoringSystem data = AdvisoryData( aliases=["CVE-2020-8908", "GHSA-5mg8-w23w-74h3"], @@ -403,12 +403,7 @@ url="https://github.com/advisories/GHSA-5mg8-w23w-74h3", severities=[ VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3.1_qr", - name="CVSSv3.1 Qualitative Severity Rating", - url="https://www.first.org/cvss/specification-document#Qualitative-Severity-Rating-Scale", - notes="A textual interpretation of severity. Has values like HIGH, MEDIUM etc", - ), + system=severity_systems.CVSS31_QUALITY, value="LOW", ) ], diff --git a/vulnerabilities/tests/test_postgresql.py b/vulnerabilities/tests/test_postgresql.py index 924c65dd2..8121f36ea 100644 --- a/vulnerabilities/tests/test_postgresql.py +++ b/vulnerabilities/tests/test_postgresql.py @@ -25,12 +25,12 @@ from packageurl import PackageURL +from vulnerabilities import severity_systems from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity from vulnerabilities.importers.postgresql import to_advisories -from vulnerabilities.severity_systems import ScoringSystem BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TEST_DATA = os.path.join(BASE_DIR, "test_data/postgresql", "advisories.html") @@ -43,7 +43,7 @@ def test_to_advisories(self): raw_data = f.read() expected_advisories = [ - Advisory( + AdvisoryData( summary="ALTER ... DEPENDS ON EXTENSION is missing authorization checks.more details", vulnerability_id="CVE-2020-1720", affected_packages=[ @@ -106,28 +106,18 @@ def test_to_advisories(self): url="https://www.postgresql.org/support/security/CVE-2020-1720/", severities=[ VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3", - name="CVSSv3 Base Score", - url="https://www.first.org/cvss/v3-0/", - notes="cvssv3 base score", - ), + system=severity_systems.CVSSV3, value="3.1", ), VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3_vector", - name="CVSSv3 Vector", - url="https://www.first.org/cvss/v3-0/", - notes="cvssv3 vector, used to get additional info about nature and severity of vulnerability", - ), + system=severity_systems.CVSSV3_VECTOR, value=["AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N"], ), ], ), ], ), - Advisory( + AdvisoryData( summary="Windows installer runs executables from uncontrolled directoriesmore details", vulnerability_id="CVE-2020-10733", affected_packages=[ @@ -198,21 +188,11 @@ def test_to_advisories(self): url="https://www.postgresql.org/support/security/CVE-2020-10733/", severities=[ VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3", - name="CVSSv3 Base Score", - url="https://www.first.org/cvss/v3-0/", - notes="cvssv3 base score", - ), + system=severity_systems.CVSSV3, value="6.7", ), VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3_vector", - name="CVSSv3 Vector", - url="https://www.first.org/cvss/v3-0/", - notes="cvssv3 vector, used to get additional info about nature and severity of vulnerability", - ), + system=severity_systems.CVSSV3_VECTOR, value=["AV:L/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H"], ), ], @@ -223,6 +203,6 @@ def test_to_advisories(self): found_advisories = to_advisories(raw_data) - found_advisories = list(map(Advisory.normalized, found_advisories)) - expected_advisories = list(map(Advisory.normalized, expected_advisories)) + found_advisories = list(map(AdvisoryData.normalized, found_advisories)) + expected_advisories = list(map(AdvisoryData.normalized, expected_advisories)) assert sorted(found_advisories) == sorted(expected_advisories) diff --git a/vulnerabilities/tests/test_redhat_importer.py b/vulnerabilities/tests/test_redhat_importer.py index 97dda4877..caff9b3d6 100644 --- a/vulnerabilities/tests/test_redhat_importer.py +++ b/vulnerabilities/tests/test_redhat_importer.py @@ -23,17 +23,15 @@ import json import os import unittest -from collections import OrderedDict from packageurl import PackageURL import vulnerabilities.importers.redhat as redhat +from vulnerabilities import severity_systems from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity -from vulnerabilities.severity_systems import ScoringSystem -from vulnerabilities.severity_systems import scoring_systems BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TEST_DATA = os.path.join(BASE_DIR, "test_data/", "redhat.json") @@ -59,7 +57,7 @@ def test_rpm_to_purl(self): def test_to_advisory(self): data = load_test_data() expected_advisories = [ - Advisory( + AdvisoryData( summary="CVE-2016-9401 bash: popd controlled free", vulnerability_id="CVE-2016-9401", affected_packages=[ @@ -88,21 +86,11 @@ def test_to_advisory(self): url="https://access.redhat.com/hydra/rest/securitydata/cve/CVE-2016-9401.json", severities=[ VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3", - name="CVSSv3 Base Score", - url="https://www.first.org/cvss/v3-0/", - notes="cvssv3 base score", - ), + system=severity_systems.CVSSV3, value="3.3", ), VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3_vector", - name="CVSSv3 Vector", - url="https://www.first.org/cvss/v3-0/", - notes="cvssv3 vector, used to get additional info about nature and severity of vulnerability", - ), + system=severity_systems.CVSSV3_VECTOR, value="CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L", ), ], @@ -112,12 +100,7 @@ def test_to_advisory(self): url="https://bugzilla.redhat.com/show_bug.cgi?id=1396383", severities=[ VulnerabilitySeverity( - system=ScoringSystem( - identifier="rhbs", - name="RedHat Bugzilla severity", - url="https://bugzilla.redhat.com/page.cgi?id=fields.html#bug_severity", - notes="", - ), + system=severity_systems.REDHAT_BUGZILLA, value=2.0, ) ], @@ -127,12 +110,7 @@ def test_to_advisory(self): url="https://access.redhat.com/errata/RHSA-2017:0725", severities=[ VulnerabilitySeverity( - system=ScoringSystem( - identifier="rhas", - name="RedHat Aggregate severity", - url="https://access.redhat.com/security/updates/classification/", - notes="", - ), + system=severity_systems.REDHAT_AGGREGATE, value=2.2, ) ], @@ -142,12 +120,7 @@ def test_to_advisory(self): url="https://access.redhat.com/errata/RHSA-2017:1931", severities=[ VulnerabilitySeverity( - system=ScoringSystem( - identifier="rhas", - name="RedHat Aggregate severity", - url="https://access.redhat.com/security/updates/classification/", - notes="", - ), + system=severity_systems.REDHAT_AGGREGATE, value=2.2, ) ], @@ -168,6 +141,6 @@ def test_to_advisory(self): adv = redhat.to_advisory(adv) found_advisories.append(adv) - found_advisories = list(map(Advisory.normalized, found_advisories)) - expected_advisories = list(map(Advisory.normalized, expected_advisories)) + found_advisories = list(map(AdvisoryData.normalized, found_advisories)) + expected_advisories = list(map(AdvisoryData.normalized, expected_advisories)) assert sorted(found_advisories) == sorted(expected_advisories) diff --git a/vulnerabilities/tests/test_retiredotnet.py b/vulnerabilities/tests/test_retiredotnet.py index 230dc3249..863136928 100644 --- a/vulnerabilities/tests/test_retiredotnet.py +++ b/vulnerabilities/tests/test_retiredotnet.py @@ -27,7 +27,7 @@ from packageurl import PackageURL from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importers.retiredotnet import RetireDotnetImporter diff --git a/vulnerabilities/tests/test_ruby.py b/vulnerabilities/tests/test_ruby.py index fb4194fdd..f765a7667 100644 --- a/vulnerabilities/tests/test_ruby.py +++ b/vulnerabilities/tests/test_ruby.py @@ -28,7 +28,7 @@ from packageurl import PackageURL from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importers.ruby import RubyImporter from vulnerabilities.package_managers import RubyVersionAPI diff --git a/vulnerabilities/tests/test_rust.py b/vulnerabilities/tests/test_rust.py index bb825cb20..134cc9939 100644 --- a/vulnerabilities/tests/test_rust.py +++ b/vulnerabilities/tests/test_rust.py @@ -23,10 +23,10 @@ from unittest import TestCase from packageurl import PackageURL -from univers.version_specifier import VersionSpecifier +from univers.version_range import VersionRange from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importers.rust import RustImporter from vulnerabilities.importers.rust import categorize_versions @@ -52,12 +52,12 @@ def test_categorize_versions(): flatbuffers_versions = MOCKED_CRATES_API_VERSIONS.get("flatbuffers").valid_versions - unaffected_ranges = [VersionSpecifier.from_scheme_version_spec_string("semver", "< 0.4.0")] + unaffected_ranges = [VersionRange.from_scheme_version_spec_string("semver", "< 0.4.0")] affected_ranges = [ - VersionSpecifier.from_scheme_version_spec_string("semver", ">= 0.4.0"), - VersionSpecifier.from_scheme_version_spec_string("semver", "<= 0.6.0"), + VersionRange.from_scheme_version_spec_string("semver", ">= 0.4.0"), + VersionRange.from_scheme_version_spec_string("semver", "<= 0.6.0"), ] - resolved_ranges = [VersionSpecifier.from_scheme_version_spec_string("semver", ">= 0.6.1")] + resolved_ranges = [VersionRange.from_scheme_version_spec_string("semver", ">= 0.6.1")] unaffected_versions, affected_versions = categorize_versions( set(flatbuffers_versions), @@ -77,9 +77,9 @@ def test_categorize_versions(): def test_categorize_versions_without_affected_ranges(): all_versions = {"1.0", "1.1", "2.0", "2.1", "3.0", "3.1"} - unaffected_ranges = [VersionSpecifier.from_scheme_version_spec_string("semver", "< 1.2")] + unaffected_ranges = [VersionRange.from_scheme_version_spec_string("semver", "< 1.2")] affected_ranges = [] - resolved_ranges = [VersionSpecifier.from_scheme_version_spec_string("semver", ">= 3.0")] + resolved_ranges = [VersionRange.from_scheme_version_spec_string("semver", ">= 3.0")] unaffected_versions, affected_versions = categorize_versions( all_versions, @@ -104,8 +104,8 @@ def test_categorize_versions_with_only_affected_ranges(): unaffected_ranges = [] affected_ranges = [ - VersionSpecifier.from_scheme_version_spec_string("semver", "> 1.2"), - VersionSpecifier.from_scheme_version_spec_string("semver", "<= 2.1"), + VersionRange.from_scheme_version_spec_string("semver", "> 1.2"), + VersionRange.from_scheme_version_spec_string("semver", "<= 2.1"), ] resolved_ranges = [] diff --git a/vulnerabilities/tests/test_safety_db.py b/vulnerabilities/tests/test_safety_db.py index 4bb9faee3..7cdf5505c 100644 --- a/vulnerabilities/tests/test_safety_db.py +++ b/vulnerabilities/tests/test_safety_db.py @@ -27,17 +27,17 @@ from packageurl import PackageURL from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importers.safety_db import SafetyDbImporter from vulnerabilities.importers.safety_db import categorize_versions -from vulnerabilities.package_managers import PypiVersionAPI +from vulnerabilities.package_managers import LegacyPypiVersionAPI from vulnerabilities.package_managers import Version BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TEST_DATA = os.path.join(BASE_DIR, "test_data", "safety_db") -MOCK_VERSION_API = PypiVersionAPI( +MOCK_VERSION_API = LegacyPypiVersionAPI( cache={ "ampache": {Version("2.0"), Version("5.2.1")}, "django": { @@ -62,7 +62,7 @@ def test_import(self): data_src._versions = MOCK_VERSION_API expected_data = [ - Advisory( + AdvisoryData( summary="The utils.http.is_safe_url function in Django before 1.4.20, 1.5.x, 1.6.x before 1.6.11, 1.7.x before 1.7.7, and 1.8.x before 1.8c1 does not properly validate URLs, which allows remote attackers to conduct cross-site scripting (XSS) attacks via a control character in a URL, as demonstrated by a \\x08javascript: URL.", vulnerability_id="CVE-2015-2317", affected_packages=[ @@ -141,7 +141,7 @@ def test_import(self): ], references=[Reference(reference_id="pyup.io-25713", url="", severities=[])], ), - Advisory( + AdvisoryData( summary="Cross-site scripting (XSS) vulnerability in the dismissChangeRelatedObjectPopup function in contrib/admin/static/admin/js/admin/RelatedObjectLookups.js in Django before 1.8.14, 1.9.x before 1.9.8, and 1.10.x before 1.10rc1 allows remote attackers to inject arbitrary web script or HTML via vectors involving unsafe usage of Element.innerHTML.", vulnerability_id="CVE-2016-6186", affected_packages=[ @@ -167,8 +167,8 @@ def test_import(self): found_data.extend(adv_batch) # found_data = [list(adv) for adv in data_src.updated_advisories()] - print(expected_data) - print("\n", found_data) + # print(expected_data) + # print("\n", found_data) assert expected_data == found_data diff --git a/vulnerabilities/tests/test_suse_backports.py b/vulnerabilities/tests/test_suse_backports.py index fae5fb90d..998a3d9a2 100644 --- a/vulnerabilities/tests/test_suse_backports.py +++ b/vulnerabilities/tests/test_suse_backports.py @@ -28,7 +28,7 @@ # from packageurl import PackageURL # from vulnerabilities.importers.suse_backports import SUSEBackportsImporter -# from vulnerabilities.importer import Advisory +# from vulnerabilities.importer import AdvisoryData # BASE_DIR = os.path.dirname(os.path.abspath(__file__)) diff --git a/vulnerabilities/tests/test_suse_scores.py b/vulnerabilities/tests/test_suse_scores.py index db865a940..4a5752847 100644 --- a/vulnerabilities/tests/test_suse_scores.py +++ b/vulnerabilities/tests/test_suse_scores.py @@ -23,12 +23,12 @@ import os from unittest import TestCase +from vulnerabilities import severity_systems from vulnerabilities.helpers import load_yaml -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importer import VulnerabilitySeverity from vulnerabilities.importers.suse_scores import SUSESeverityScoreImporter -from vulnerabilities.severity_systems import ScoringSystem BASE_DIR = os.path.dirname(os.path.abspath(__file__)) TEST_DATA = os.path.join(BASE_DIR, "test_data/suse_scores", "suse-cvss-scores.yaml") @@ -38,7 +38,7 @@ class TestSUSESeverityScoreImporter(TestCase): def test_to_advisory(self): raw_data = load_yaml(TEST_DATA) expected_data = [ - Advisory( + AdvisoryData( summary="", references=[ Reference( @@ -46,39 +46,19 @@ def test_to_advisory(self): url="https://ftp.suse.com/pub/projects/security/yaml/suse-cvss-scores.yaml", severities=[ VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv2", - name="CVSSv2 Base Score", - url="https://www.first.org/cvss/v2/", - notes="cvssv2 base score", - ), + system=severity_systems.CVSSV2, value="4.3", ), VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv2_vector", - name="CVSSv2 Vector", - url="https://www.first.org/cvss/v2/", - notes="cvssv2 vector, used to get additional info about nature and severity of vulnerability", # nopep8 - ), + system=severity_systems.CVSSV2_VECTOR, value="AV:N/AC:M/Au:N/C:N/I:N/A:P", ), VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3.1", - name="CVSSv3.1 Base Score", - url="https://www.first.org/cvss/v3-1/", - notes="cvssv3.1 base score", - ), + system=severity_systems.CVSSV31, value="3.7", ), VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3.1_vector", - name="CVSSv3.1 Vector", - url="https://www.first.org/cvss/v3-1/", - notes="cvssv3.1 vector, used to get additional info about nature and severity of vulnerability", # nopep8 - ), + system=severity_systems.CVSSV31_VECTOR, value="CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L", ), ], @@ -86,7 +66,7 @@ def test_to_advisory(self): ], vulnerability_id="CVE-2004-0230", ), - Advisory( + AdvisoryData( summary="", references=[ Reference( @@ -94,21 +74,11 @@ def test_to_advisory(self): url="https://ftp.suse.com/pub/projects/security/yaml/suse-cvss-scores.yaml", severities=[ VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3", - name="CVSSv3 Base Score", - url="https://www.first.org/cvss/v3-0/", - notes="cvssv3 base score", - ), + system=severity_systems.CVSSV3, value="8.6", ), VulnerabilitySeverity( - system=ScoringSystem( - identifier="cvssv3_vector", - name="CVSSv3 Vector", - url="https://www.first.org/cvss/v3-0/", - notes="cvssv3 vector, used to get additional info about nature and severity of vulnerability", # nopep8 - ), + system=severity_systems.CVSSV3_VECTOR, value="CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N", ), ], @@ -119,6 +89,6 @@ def test_to_advisory(self): ] found_data = SUSESeverityScoreImporter.to_advisory(raw_data) - found_advisories = list(map(Advisory.normalized, found_data)) - expected_advisories = list(map(Advisory.normalized, expected_data)) + found_advisories = list(map(AdvisoryData.normalized, found_data)) + expected_advisories = list(map(AdvisoryData.normalized, expected_data)) assert sorted(found_advisories) == sorted(expected_advisories) diff --git a/vulnerabilities/tests/test_ubuntu.py b/vulnerabilities/tests/test_ubuntu.py index 09cdb687d..e6fd08bff 100644 --- a/vulnerabilities/tests/test_ubuntu.py +++ b/vulnerabilities/tests/test_ubuntu.py @@ -9,7 +9,7 @@ from packageurl import PackageURL from vulnerabilities.helpers import AffectedPackage -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference from vulnerabilities.importers.ubuntu import UbuntuImporter from vulnerabilities.oval_parser import OvalParser diff --git a/vulnerabilities/tests/test_ubuntu_usn.py b/vulnerabilities/tests/test_ubuntu_usn.py index 29c5df025..b549a6924 100644 --- a/vulnerabilities/tests/test_ubuntu_usn.py +++ b/vulnerabilities/tests/test_ubuntu_usn.py @@ -31,7 +31,7 @@ from packageurl import PackageURL import vulnerabilities.importers.ubuntu_usn as ubuntu_usn -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer import Reference BASE_DIR = os.path.dirname(os.path.abspath(__file__)) diff --git a/vulnerabilities/tests/test_upstream.py b/vulnerabilities/tests/test_upstream.py index d80da5d4e..290a72be1 100644 --- a/vulnerabilities/tests/test_upstream.py +++ b/vulnerabilities/tests/test_upstream.py @@ -4,7 +4,7 @@ import pytest from vulnerabilities import importers -from vulnerabilities.importer import Advisory +from vulnerabilities.importer import AdvisoryData from vulnerabilities.importer_yielder import IMPORTERS_REGISTRY MAX_ADVISORIES = 1 diff --git a/vulnerabilities/tests/util_tests.py b/vulnerabilities/tests/util_tests.py new file mode 100644 index 000000000..503388eb9 --- /dev/null +++ b/vulnerabilities/tests/util_tests.py @@ -0,0 +1,62 @@ +# +# Copyright (c) nexB Inc. and others. All rights reserved. +# http://nexb.com and https://github.com/nexB/vulnerablecode/ +# The VulnerableCode software is licensed under the Apache License version 2.0. +# Data generated with VulnerableCode require an acknowledgment. +# +# You may not use this software except in compliance with the License. +# You may obtain a copy of the License at: http://apache.org/licenses/LICENSE-2.0 +# Unless required by applicable law or agreed to in writing, software distributed +# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +# CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. +# +# When you publish or redistribute any data created with VulnerableCode or any VulnerableCode +# derivative work, you must accompany this data with the following acknowledgment: +# +# Generated with VulnerableCode and provided on an "AS IS" BASIS, WITHOUT WARRANTIES +# OR CONDITIONS OF ANY KIND, either express or implied. No content created from +# VulnerableCode should be considered or used as legal advice. Consult an Attorney +# for any legal advice. +# VulnerableCode is a free software code scanning tool from nexB Inc. and others. +# Visit https://github.com/nexB/vulnerablecode/ for support and download. + +import json +import os + +import saneyaml + +""" +Shared testing utilities +""" + +# Used for tests to regenerate fixtures with regen=True: run a test with this +# env. var set to any value to regenarte expected result files. For example with: +# "VULNERABLECODE_REGEN_TEST_FIXTURES=yes pytest -vvs vulnerabilities/tests" +VULNERABLECODE_REGEN_TEST_FIXTURES = os.getenv("VULNERABLECODE_REGEN_TEST_FIXTURES", False) + + +def check_results_against_json( + results, + expected_file, + regen=VULNERABLECODE_REGEN_TEST_FIXTURES, +): + """ + Check the JSON-serializable mapping or sequence ``results`` against the + expected data in the JSON ``expected_file`` + + If ``regen`` is True, the ``expected_file`` is overwritten with the + ``results`` data. This is convenient for updating tests expectations. + """ + if regen: + with open(expected_file, "w") as reg: + json.dump(results, reg, indent=2, separators=(",", ": ")) + expected = results + else: + with open(expected_file) as exp: + expected = json.load(exp) + + # NOTE we redump the JSON as a YAML string for easier display of + # the failures comparison/diff + if results != expected: + assert saneyaml.dump(results) == saneyaml.dump(expected) diff --git a/vulnerablecode/static/api_doc/api_schema.yaml b/vulnerablecode/static/api_doc/api_schema.yaml index 368e8fff1..9d01e07e5 100644 --- a/vulnerablecode/static/api_doc/api_schema.yaml +++ b/vulnerablecode/static/api_doc/api_schema.yaml @@ -321,7 +321,7 @@ components: - cvssv3.1_vector - rhbs - rhas - - avgs + - archlinux - cvssv3.1_qr - generic_textual - apache_httpd @@ -405,7 +405,7 @@ components: Vector system, cvssv3.1 is vulnerability_id for CVSSv3.1 Base Score system, cvssv3.1_vector is vulnerability_id for CVSSv3.1 Vector system, rhbs is vulnerability_id for RedHat Bugzilla severity system, rhas is vulnerability_id - for RedHat Aggregate severity system, avgs is vulnerability_id for Archlinux + for RedHat Aggregate severity system, archlinux is vulnerability_id for Archlinux Vulnerability Group Severity system, cvssv3.1_qr is vulnerability_id for CVSSv3.1 Qualitative Severity Rating system, generic_textual is vulnerability_id for Generic textual severity rating system, apache_httpd is vulnerability_id