diff --git a/cve_bin_tool/parsers/r.py b/cve_bin_tool/parsers/r.py index b75abca067..32973a0889 100644 --- a/cve_bin_tool/parsers/r.py +++ b/cve_bin_tool/parsers/r.py @@ -2,15 +2,58 @@ # SPDX-License-Identifier: GPL-3.0-or-later import json +import re from cve_bin_tool.parsers import Parser class RParser(Parser): + """ + Parser implementation for R module files (renv.lock). + + This parser is designed to parse Go module files and generate Package URL (PURL) strings + based on the modules and their dependencies listed in the file. + + Attributes: + cve_db (CVEDB): The CVE database instance used for vulnerability information. + logger (Logger): The logger instance for logging messages and debugging information. + + Methods: + generate_purl(product, version, vendor): + Generates PURL after normalizing all components. + run_checker(filename): + Parse the R module file and yield valid PURLs for the modules listed in the file. + + """ + def __init__(self, cve_db, logger): super().__init__(cve_db, logger) + self.purl_pkg_type = "cran" + + def generate_purl(self, product, version, vendor, qualifier={}, subpath=None): + """Generates PURL after normalizing all components.""" + + product = re.sub(r"[^a-zA-Z0-9.-]", "", product) + version = re.sub(r"^[^a-zA-Z0-9]|[^a-zA-Z0-9.-]", "", version) + vendor = "UNKNOWN" + + if not re.match(r"^[a-zA-Z0-9_-]", product): + return + if version == "": + version = "UNKNOWN" + + purl = super().generate_purl( + product, + version, + vendor, + qualifier, + subpath, + ) + + return purl def run_checker(self, filename): + """Parse the file and yield valid PURLs.""" self.filename = filename with open(self.filename) as fh: # parse the json structure for extracting product version pairs