Source code for varats.provider.cve.cve_provider
"""Module for the :class:`CVEProvider`."""
import typing as tp
from typing import Protocol, runtime_checkable
from benchbuild.project import Project
from varats.project.project_util import get_local_project_repo
from varats.provider.cve.cve import CVE
from varats.provider.cve.cve_map import generate_cve_map, CVEDict
from varats.provider.provider import Provider
from varats.utils.git_util import FullCommitHash
[docs]
@runtime_checkable
class CVEProviderHook(Protocol):
"""
Gives the :class:`CVEProvider` the necessary information how to find CVEs
and CWEs for a project.
This class should be inherited by projects.
"""
[docs]
@classmethod
def get_cve_product_info(cls) -> tp.List[tp.Tuple[str, str]]:
"""
Get information on how to find CVEs for a project.
Returns:
a tuple ``(vendor, product)``
"""
[docs]
class CVEProvider(Provider):
"""Provides CVE and CWE information for a project."""
def __init__(self, project: tp.Type[Project]) -> None:
super().__init__(project)
project_name = project.NAME
if issubclass(project, CVEProviderHook):
self.__cve_map: CVEDict = generate_cve_map(
get_local_project_repo(project_name),
project.get_cve_product_info()
)
else:
raise ValueError(
f"Project {project} does not implement "
f"CVEProviderHook."
)
[docs]
@classmethod
def create_provider_for_project(
cls, project: tp.Type[Project]
) -> tp.Optional['CVEProvider']:
if issubclass(project, CVEProviderHook):
return CVEProvider(project)
return None
[docs]
@classmethod
def create_default_provider(
cls, project: tp.Type[Project]
) -> 'CVEProvider':
return CVEDefaultProvider(project)
[docs]
def get_revision_cve_tuples(
self
) -> tp.Set[tp.Tuple[FullCommitHash, tp.FrozenSet[CVE]]]:
"""
Get all CVEs associated with this provider's project along with the
fixing commits/versions.
Return:
a set of tuples of commit hash and cves
"""
return {(k, frozenset(v["cve"])) for k, v in self.__cve_map.items()}
[docs]
class CVEDefaultProvider(CVEProvider):
"""Default implementation of the :class:`CVE provider` for projects that do
not (yet) support CVEs."""
def __init__(self, project: tp.Type[Project]) -> None:
# pylint: disable=E1003
super(CVEProvider, self).__init__(project)
[docs]
def get_revision_cve_tuples(
self
) -> tp.Set[tp.Tuple[FullCommitHash, tp.FrozenSet[CVE]]]:
return set()