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
-
-
-
-
-
-
-
-
- ../
-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
+ Registration is now open for the free Microservices March Kubernetes event.
Click here to enroll.
+
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.
+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
+
+Excessive CPU usage in HTTP/2 with small window updates
Severity: medium
Advisory
CVE-2019-9511
Not vulnerable: 1.17.3+, 1.16.1+
Vulnerable: 1.9.5-1.17.2
+
+Excessive CPU usage in HTTP/2 with priority changes
Severity: low
Advisory
CVE-2019-9513
Not vulnerable: 1.17.3+, 1.16.1+
Vulnerable: 1.9.5-1.17.2
+
+Excessive memory usage in HTTP/2 with zero length headers
Severity: low
Advisory
CVE-2019-9516
Not vulnerable: 1.17.3+, 1.16.1+
Vulnerable: 1.9.5-1.17.2
+
+Excessive memory usage in HTTP/2
Severity: low
Advisory
CVE-2018-16843
Not vulnerable: 1.15.6+, 1.14.1+
Vulnerable: 1.9.5-1.15.5
+
+Excessive CPU usage in HTTP/2
Severity: low
Advisory
CVE-2018-16844
Not vulnerable: 1.15.6+, 1.14.1+
Vulnerable: 1.9.5-1.15.5
+
+Memory disclosure in the ngx_http_mp4_module
Severity: medium
Advisory
CVE-2018-16845
Not vulnerable: 1.15.6+, 1.14.1+
Vulnerable: 1.1.3-1.15.5, 1.0.7-1.0.15
The patch pgp
+
+Integer overflow in the range filter
Severity: medium
Advisory
CVE-2017-7529
Not vulnerable: 1.13.3+, 1.12.1+
Vulnerable: 0.5.6-1.13.2
The patch pgp
+
+NULL pointer dereference while writing client request body
Severity: medium
Advisory
CVE-2016-4450
Not vulnerable: 1.11.1+, 1.10.1+
Vulnerable: 1.3.9-1.11.0
The patch pgp (for 1.9.13-1.11.0)
The patch pgp (for 1.3.9-1.9.12)
+
+Invalid pointer dereference in resolver
Severity: medium
Advisory
CVE-2016-0742
Not vulnerable: 1.9.10+, 1.8.1+
Vulnerable: 0.6.18-1.9.9
+
+Use-after-free during CNAME response processing in resolver
Severity: medium
Advisory
CVE-2016-0746
Not vulnerable: 1.9.10+, 1.8.1+
Vulnerable: 0.6.18-1.9.9
+
+Insufficient limits of CNAME resolution in resolver
Severity: medium
Advisory
CVE-2016-0747
Not vulnerable: 1.9.10+, 1.8.1+
Vulnerable: 0.6.18-1.9.9
+
+SSL session reuse vulnerability
Severity: medium
Advisory
CVE-2014-3616
Not vulnerable: 1.7.5+, 1.6.2+
Vulnerable: 0.5.6-1.7.4
+
+STARTTLS command injection
Severity: medium
Advisory
CVE-2014-3556
Not vulnerable: 1.7.4+, 1.6.1+
Vulnerable: 1.5.6-1.7.3
The patch pgp
+
+SPDY heap buffer overflow
Severity: major
Advisory
CVE-2014-0133
Not vulnerable: 1.5.12+, 1.4.7+
Vulnerable: 1.3.15-1.5.11
The patch pgp
+
+SPDY memory corruption
Severity: major
Advisory
CVE-2014-0088
Not vulnerable: 1.5.11+
Vulnerable: 1.5.10
The patch pgp
+
+Request line parsing vulnerability
Severity: medium
Advisory
CVE-2013-4547
Not vulnerable: 1.5.7+, 1.4.4+
Vulnerable: 0.8.41-1.5.6
The patch pgp
+
+Memory disclosure with specially crafted HTTP backend responses
Severity: medium
Advisory
CVE-2013-2070
Not vulnerable: 1.5.0+, 1.4.1+, 1.2.9+
Vulnerable: 1.1.4-1.2.8, 1.3.9-1.4.0
The patch pgp (for 1.3.9-1.4.0)
The patch pgp (for 1.1.4-1.2.8)
Stack-based buffer overflow with specially crafted request
Severity: major
Advisory
CVE-2013-2028
Not vulnerable: 1.5.0+, 1.4.1+
Vulnerable: 1.3.9-1.4.0
The patch pgp
-
Vulnerabilities with Windows directory aliases
Severity: medium
Advisory
CVE-2011-4963
Not vulnerable: 1.3.1+, 1.2.1+
Vulnerable: nginx/Windows 0.7.52-1.3.0
+Buffer overflow in the ngx_http_mp4_module
Severity: major
Advisory
CVE-2012-2089
Not vulnerable: 1.1.19+, 1.0.15+
Vulnerable: 1.1.3-1.1.18, 1.0.7-1.0.14
The patch pgp
+
+Memory disclosure with specially crafted backend responses
Severity: major
Advisory
CVE-2012-1180
Not vulnerable: 1.1.17+, 1.0.14+
Vulnerable: 0.1.0-1.1.16
The patch pgp
+
+Buffer overflow in resolver
Severity: medium
CVE-2011-4315
Not vulnerable: 1.1.8+, 1.0.10+
Vulnerable: 0.6.18-1.1.7
-
Vulnerabilities with invalid UTF-8 sequence on Windows
Severity: major
CVE-2010-2266
Not vulnerable: 0.8.41+, 0.7.67+
Vulnerable: nginx/Windows 0.7.52-0.8.40
+Vulnerabilities with Windows file default stream
Severity: major
CVE-2010-2263
Not vulnerable: 0.8.40+, 0.7.66+
Vulnerable: nginx/Windows 0.7.52-0.8.39
-
-An error log data are not sanitized
Severity: none
CVE-2009-4487
Not vulnerable: none
Vulnerable: all
+Vulnerabilities with Windows 8.3 filename pseudonyms
Severity: major
CORE-2010-0121
Not vulnerable: 0.8.33+, 0.7.65+
Vulnerable: nginx/Windows 0.7.52-0.8.32
+An error log data are not sanitized
Severity: none
CVE-2009-4487
Not vulnerable: none
Vulnerable: all
The renegotiation vulnerability in SSL protocol
Severity: major
VU#120541 CVE-2009-3555
Not vulnerable: 0.8.23+, 0.7.64+
Vulnerable: 0.1.0-0.8.22
The patch pgp
Directory traversal vulnerability
Severity: minor
CVE-2009-3898
Not vulnerable: 0.8.17+, 0.7.63+
Vulnerable: 0.1.0-0.8.16
-/patch.null.pointer.txt">The patch pgp
+
+Buffer underflow vulnerability
Severity: major
VU#180065 CVE-2009-2629
Not vulnerable: 0.8.15+, 0.7.62+, 0.6.39+, 0.5.38+
Vulnerable: 0.1.0-0.8.14
The patch pgp
+
+Null pointer dereference vulnerability
Severity: major
CVE-2009-3896
Not vulnerable: 0.8.14+, 0.7.62+, 0.6.39+, 0.5.38+
Vulnerable: 0.1.0-0.8.13
The patch pgp
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