utils/checkpackagelib: add check for CPE variables set to default values
Now that we can specify that the default values for the CPE_ID variables are valid, without having to actually set one (or more) to their default, add a check-package check that validates that the CPE_ID variables are indeed not set to their default. It also validates that CPE_ID_VALID is not set when another CPE_ID variable is set to a non-default value. Add an anchor in the manual so that we can easily point to it. Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr> Cc: Fabrice Fontaine <fontaine.fabrice@gmail.com> Cc: Ricardo Martincoski <ricardo.martincoski@gmail.com> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
This commit is contained in:
parent
c19cca0452
commit
fcf465d04b
@ -511,7 +511,7 @@ LIBFOO_IGNORE_CVES += CVE-2020-12345
|
|||||||
LIBFOO_IGNORE_CVES += CVE-2020-54321
|
LIBFOO_IGNORE_CVES += CVE-2020-54321
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
* +LIBFOO_CPE_ID_*+ variables is a set of variables that allows the
|
* [[cpe-id]] +LIBFOO_CPE_ID_*+ variables is a set of variables that allows the
|
||||||
package to define its https://nvd.nist.gov/products/cpe[CPE
|
package to define its https://nvd.nist.gov/products/cpe[CPE
|
||||||
identifier]. The available variables are:
|
identifier]. The available variables are:
|
||||||
+
|
+
|
||||||
|
@ -366,3 +366,76 @@ class VariableWithBraces(_CheckFunction):
|
|||||||
return ["{}:{}: use $() to delimit variables, not ${{}}"
|
return ["{}:{}: use $() to delimit variables, not ${{}}"
|
||||||
.format(self.filename, lineno),
|
.format(self.filename, lineno),
|
||||||
text]
|
text]
|
||||||
|
|
||||||
|
|
||||||
|
class CPEVariables(_CheckFunction):
|
||||||
|
"""
|
||||||
|
Check that the values for the CPE variables are not the default.
|
||||||
|
- CPE_ID_* variables must not be set to their default
|
||||||
|
- CPE_ID_VALID must not be set if a non-default CPE_ID variable is set
|
||||||
|
"""
|
||||||
|
def before(self):
|
||||||
|
pkg, _ = os.path.splitext(os.path.basename(self.filename))
|
||||||
|
self.CPE_fields_defaults = {
|
||||||
|
"VALID": "NO",
|
||||||
|
"PREFIX": "cpe:2.3:a",
|
||||||
|
"VENDOR": f"{pkg}_project",
|
||||||
|
"PRODUCT": pkg,
|
||||||
|
"VERSION": None,
|
||||||
|
"UPDATE": "*",
|
||||||
|
}
|
||||||
|
self.valid = None
|
||||||
|
self.non_defaults = 0
|
||||||
|
self.CPE_FIELDS_RE = re.compile(
|
||||||
|
r"^\s*(.+_CPE_ID_({}))\s*=\s*(.+)$"
|
||||||
|
.format("|".join(self.CPE_fields_defaults)),
|
||||||
|
)
|
||||||
|
self.VERSION_RE = re.compile(
|
||||||
|
rf"^(HOST_)?{pkg.upper().replace('-', '_')}_VERSION\s*=\s*(.+)$",
|
||||||
|
)
|
||||||
|
self.COMMENT_RE = re.compile(r"^\s*#.*")
|
||||||
|
|
||||||
|
def check_line(self, lineno, text):
|
||||||
|
text = self.COMMENT_RE.sub('', text.rstrip())
|
||||||
|
|
||||||
|
# WARNING! The VERSION_RE can _also_ match the same lines as CPE_FIELDS_RE,
|
||||||
|
# but not the other way around. So we must first check for CPE_FIELDS_RE,
|
||||||
|
# and if not matched, then and only then check for VERSION_RE.
|
||||||
|
match = self.CPE_FIELDS_RE.match(text)
|
||||||
|
if match:
|
||||||
|
var, field, val = match.groups()
|
||||||
|
return self._check_field(lineno, text, field, var, val)
|
||||||
|
|
||||||
|
match = self.VERSION_RE.match(text)
|
||||||
|
if match:
|
||||||
|
self.CPE_fields_defaults["VERSION"] = match.groups()[1]
|
||||||
|
|
||||||
|
def after(self):
|
||||||
|
# "VALID" counts in the non-defaults; so when "VALID" is present,
|
||||||
|
# 1 non-default means only "VALID" is present, so that's OK.
|
||||||
|
if self.valid and self.non_defaults > 1:
|
||||||
|
return ["{}:{}: 'YES' is implied when a non-default CPE_ID field is specified: {} ({}#cpe-id)".format(
|
||||||
|
self.filename,
|
||||||
|
self.valid["lineno"],
|
||||||
|
self.valid["text"],
|
||||||
|
self.url_to_manual,
|
||||||
|
)]
|
||||||
|
|
||||||
|
def _check_field(self, lineno, text, field, var, val):
|
||||||
|
if field == "VERSION" and self.CPE_fields_defaults[field] is None:
|
||||||
|
return ["{}:{}: expecting package version to be set before CPE_ID_VERSION".format(
|
||||||
|
self.filename,
|
||||||
|
lineno,
|
||||||
|
)]
|
||||||
|
if val == self.CPE_fields_defaults[field]:
|
||||||
|
return ["{}:{}: '{}' is the default value for {} ({}#cpe-id)".format(
|
||||||
|
self.filename,
|
||||||
|
lineno,
|
||||||
|
val,
|
||||||
|
var,
|
||||||
|
self.url_to_manual,
|
||||||
|
)]
|
||||||
|
else:
|
||||||
|
if field == "VALID":
|
||||||
|
self.valid = {"lineno": lineno, "text": text}
|
||||||
|
self.non_defaults += 1
|
||||||
|
Loading…
Reference in New Issue
Block a user