Skip to content

Commit

Permalink
refactor: collect more warnings
Browse files Browse the repository at this point in the history
  • Loading branch information
ctron committed Jul 11, 2024
1 parent 575e482 commit df55ad3
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 18 deletions.
36 changes: 20 additions & 16 deletions modules/ingestor/src/service/advisory/csaf/loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ use crate::{
Graph,
},
model::IngestResult,
service::{advisory::csaf::PurlStatusCreator, Error},
service::{advisory::csaf::PurlStatusCreator, Error, Warnings},
};
use csaf::{
vulnerability::{ProductStatus, Vulnerability},
Csaf,
};
use sbom_walker::report::ReportSink;
use std::{io::Read, str::FromStr};
use time::OffsetDateTime;
use tracing::{info_span, instrument};
Expand Down Expand Up @@ -57,6 +58,8 @@ impl<'g> CsafLoader<'g> {
document: R,
digests: &Digests,
) -> Result<IngestResult, Error> {
let warnings = Warnings::new();

let csaf: Csaf =
info_span!("parse document").in_scope(|| serde_json::from_reader(document))?;

Expand All @@ -71,7 +74,7 @@ impl<'g> CsafLoader<'g> {
.await?;

for vuln in csaf.vulnerabilities.iter().flatten() {
self.ingest_vulnerability(&csaf, &advisory, vuln, &tx)
self.ingest_vulnerability(&csaf, &advisory, vuln, &warnings, &tx)
.await?;
}

Expand All @@ -80,7 +83,7 @@ impl<'g> CsafLoader<'g> {
Ok(IngestResult {
id: Id::Uuid(advisory.advisory.id),
document_id: advisory_id,
warnings: vec![],
warnings: warnings.into(),
})
}

Expand All @@ -95,6 +98,7 @@ impl<'g> CsafLoader<'g> {
csaf: &Csaf,
advisory: &AdvisoryContext<'_>,
vulnerability: &Vulnerability,
report: &dyn ReportSink,
tx: TX,
) -> Result<(), Error> {
if let Some(cve_id) = &vulnerability.cve {
Expand Down Expand Up @@ -124,19 +128,19 @@ impl<'g> CsafLoader<'g> {
.await?;
}

if let Some(scores) = &vulnerability.scores {
for score in scores {
if let Some(v3) = &score.cvss_v3 {
match Cvss3Base::from_str(&v3.to_string()) {
Ok(cvss3) => {
log::debug!("{cvss3:?}");
advisory_vulnerability
.ingest_cvss3_score(cvss3, &tx)
.await?;
}
Err(err) => {
log::warn!("Unable to parse CVSS3: {:#?}", err);
}
for score in vulnerability.scores.iter().flatten() {
if let Some(v3) = &score.cvss_v3 {
match Cvss3Base::from_str(&v3.to_string()) {
Ok(cvss3) => {
log::debug!("{cvss3:?}");
advisory_vulnerability
.ingest_cvss3_score(cvss3, &tx)
.await?;
}
Err(err) => {
let msg = format!("Unable to parse CVSS3: {:#?}", err);
log::info!("{msg}");
report.error(msg);
}
}
}
Expand Down
10 changes: 8 additions & 2 deletions modules/ingestor/src/service/advisory/osv/loader.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::graph::advisory::advisory_vulnerability::{Version, VersionInfo, VersionSpec};
use crate::model::IngestResult;
use crate::service::Warnings;
use crate::{
graph::{
advisory::{AdvisoryInformation, AdvisoryVulnerabilityInformation},
Expand All @@ -8,6 +9,7 @@ use crate::{
service::{advisory::osv::translate, Error},
};
use osv::schema::{Event, ReferenceType, SeverityType, Vulnerability};
use sbom_walker::report::ReportSink;
use std::{io::Read, str::FromStr, sync::OnceLock};
use trustify_common::hashing::Digests;
use trustify_common::id::Id;
Expand All @@ -31,6 +33,8 @@ impl<'g> OsvLoader<'g> {
digests: &Digests,
issuer: Option<String>,
) -> Result<IngestResult, Error> {
let warnings = Warnings::new();

let osv: Vulnerability = serde_json::from_reader(record)?;

let labels = labels.into().add("type", "osv");
Expand Down Expand Up @@ -88,7 +92,9 @@ impl<'g> OsvLoader<'g> {
advisory_vuln.ingest_cvss3_score(cvss3, &tx).await?;
}
Err(err) => {
log::warn!("Unable to parse CVSS3: {:#?}", err);
let msg = format!("Unable to parse CVSS3: {:#?}", err);
log::info!("{msg}");
warnings.error(msg)
}
}
}
Expand Down Expand Up @@ -191,7 +197,7 @@ impl<'g> OsvLoader<'g> {
Ok(IngestResult {
id: Id::Uuid(advisory.advisory.id),
document_id: osv.id,
warnings: vec![],
warnings: warnings.into(),
})
}
}
Expand Down
6 changes: 6 additions & 0 deletions modules/ingestor/src/service/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,12 @@ impl IngestorService {
#[derive(Default)]
pub(crate) struct Warnings(Arc<Mutex<Vec<String>>>);

impl Warnings {
pub fn new() -> Self {
Self::default()
}
}

impl ReportSink for Warnings {
fn error(&self, msg: String) {
self.0.lock().push(msg);
Expand Down

0 comments on commit df55ad3

Please sign in to comment.