aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--sec_certs/model/cpe_matching.py12
-rw-r--r--sec_certs/sample/cpe.py14
2 files changed, 11 insertions, 15 deletions
diff --git a/sec_certs/model/cpe_matching.py b/sec_certs/model/cpe_matching.py
index 81fc8206..e9febfa5 100644
--- a/sec_certs/model/cpe_matching.py
+++ b/sec_certs/model/cpe_matching.py
@@ -100,19 +100,12 @@ class CPEClassifier(BaseEstimator):
sanitized_vendor = CPEClassifier._discard_trademark_symbols(vendor).lower() if vendor else vendor
sanitized_product_name = CPEClassifier._fully_sanitize_string(product_name) if product_name else product_name
candidate_vendors = self.get_candidate_list_of_vendors(sanitized_vendor)
-
- if candidate_vendors is None:
- raise RuntimeError("Candidate vendors were not calculated successfully.")
- if versions is None:
- raise RuntimeError("Version were not calculated successfully.")
candidates = self.get_candidate_cpe_matches(candidate_vendors, versions)
ratings = [self.compute_best_match(cpe, sanitized_product_name, candidate_vendors, versions, relax_title=relax_title) for cpe in candidates]
threshold = self.match_threshold if not relax_version else 100
final_matches_aux: List[Tuple[float, CPE]] = list(filter(lambda x: x[0] >= threshold, zip(ratings, candidates)))
final_matches: Optional[List[str]] = [x[1].uri for x in final_matches_aux[:self.n_max_matches] if x[1].uri is not None]
-
-
if not relax_title and not final_matches:
final_matches = self.predict_single_cert(vendor, product_name, versions, relax_version=relax_version, relax_title=True)
@@ -133,17 +126,12 @@ class CPEClassifier(BaseEstimator):
@return: Maximal value of the four string similarities discussed above.
"""
if relax_title:
- if cpe.title is None or cpe.vendor is None or cpe.item_name is None or cpe.version is None or cpe.update is None or cpe.target_hw is None:
- raise RuntimeError(f"There was a problem in computing best match for CPE {cpe.title if cpe.title else cpe.item_name}")
sanitized_title = CPEClassifier._fully_sanitize_string(cpe.title) if cpe.title else CPEClassifier._fully_sanitize_string(cpe.vendor + ' ' + cpe.item_name + ' ' + cpe.version + ' ' + cpe.update + ' ' + cpe.target_hw)
else:
if cpe.title:
sanitized_title = CPEClassifier._fully_sanitize_string(cpe.title)
else:
return 0
-
- if cpe.item_name is None or versions is None:
- raise RuntimeError(f"There was a problem in computing best match for CPE {cpe.title}")
sanitized_item_name = CPEClassifier._fully_sanitize_string(cpe.item_name)
cert_stripped = CPEClassifier._strip_manufacturer_and_version(product_name, candidate_vendors, versions)
diff --git a/sec_certs/sample/cpe.py b/sec_certs/sample/cpe.py
index c2b542ce..ea1510b3 100644
--- a/sec_certs/sample/cpe.py
+++ b/sec_certs/sample/cpe.py
@@ -1,5 +1,5 @@
from dataclasses import dataclass
-from typing import ClassVar, List, Optional, Tuple
+from typing import ClassVar, List, Optional, Tuple, Dict
from sec_certs.serialization.json import ComplexSerializableType
from sec_certs.serialization.pandas import PandasSerializableType
@@ -22,8 +22,8 @@ class CPE(PandasSerializableType, ComplexSerializableType):
end_version: Optional[Tuple[str, str]] = None):
self.uri = uri
self.title = title
- self.start_version = start_version if start_version else None
- self.end_version = end_version if end_version else None
+ self.start_version = start_version
+ self.end_version = end_version
if self.uri:
self.vendor = ' '.join(self.uri.split(':')[3].split('_'))
@@ -35,6 +35,14 @@ class CPE(PandasSerializableType, ComplexSerializableType):
raise RuntimeError("Cannot compare CPEs because title is missing.")
return self.title < other.title
+ @classmethod
+ def from_dict(cls, dct: Dict):
+ if isinstance(dct['start_version'], list):
+ dct['start_version'] = tuple(dct['start_version'])
+ if isinstance(dct['end_version'], list):
+ dct['end_version'] = tuple(dct['end_version'])
+ return super().from_dict(dct)
+
@property
def serialized_attributes(self) -> List[str]:
return ['uri', 'title', 'start_version', 'end_version']