Skip to content
18 changes: 18 additions & 0 deletions csaf-rs/src/csaf/traits/document/aggregate_severity_trait.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
use crate::csaf::traits::util::impl_macros::{impl_optional_str_field_getter, impl_str_field_getter};
use crate::schema::csaf2_0::schema::AggregateSeverity as AggregateSeverity20;
use crate::schema::csaf2_1::schema::AggregateSeverity as AggregateSeverity21;

pub trait AggregateSeverityTrait {
fn get_namespace(&self) -> Option<&str>;
fn get_text(&self) -> &str;
}

impl AggregateSeverityTrait for AggregateSeverity20 {
impl_optional_str_field_getter!(get_namespace, namespace);
impl_str_field_getter!(get_text, text);
}

impl AggregateSeverityTrait for AggregateSeverity21 {
impl_optional_str_field_getter!(get_namespace, namespace);
impl_str_field_getter!(get_text, text);
}
7 changes: 7 additions & 0 deletions csaf-rs/src/csaf/traits/document/distribution_trait.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::csaf::traits::util::impl_macros::impl_optional_str_field_getter;
use crate::csaf::traits::util::not_present_20::NotPresentInCsaf20;
use crate::csaf_traits::{SharingGroupTrait, TlpTrait};
use crate::schema::csaf2_0::schema::{
Expand Down Expand Up @@ -25,12 +26,16 @@ pub trait DistributionTrait {

/// Returns the TLP information for this distribution with CSAF 2.1 semantics
fn get_tlp_21(&self) -> Result<&Self::TlpType, ValidationError>;

fn get_text(&self) -> Option<&str>;
}

impl DistributionTrait for RulesForSharingDocument20 {
type SharingGroupType = NotPresentInCsaf20;
type TlpType = TrafficLightProtocolTlp20;

impl_optional_str_field_getter!(get_text, text);

fn get_sharing_group(&self) -> Option<&Self::SharingGroupType> {
None
}
Expand All @@ -56,6 +61,8 @@ impl DistributionTrait for RulesForDocumentSharing21 {
type SharingGroupType = SharingGroup21;
type TlpType = TrafficLightProtocolTlp21;

impl_optional_str_field_getter!(get_text, text);

fn get_sharing_group(&self) -> Option<&Self::SharingGroupType> {
self.sharing_group.as_ref()
}
Expand Down
19 changes: 19 additions & 0 deletions csaf-rs/src/csaf/traits/document/engine_trait.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
use crate::csaf::traits::util::{impl_optional_str_field_getter, impl_str_field_getter};
use crate::schema::csaf2_0::schema::EngineOfDocumentGeneration as Engine20;
use crate::schema::csaf2_1::schema::EngineOfDocumentGeneration as Engine21;

/// Trait for accessing document generation engine information
pub trait EngineTrait {
fn get_name(&self) -> &str;
fn get_version(&self) -> Option<&str>;
}

impl EngineTrait for Engine20 {
impl_str_field_getter!(get_name, name);
impl_optional_str_field_getter!(get_version, version);
}

impl EngineTrait for Engine21 {
impl_str_field_getter!(get_name, name);
impl_optional_str_field_getter!(get_version, version);
}
33 changes: 28 additions & 5 deletions csaf-rs/src/csaf/traits/document/generator_trait.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,36 @@
use crate::csaf::traits::document::engine_trait::EngineTrait;
use crate::csaf_traits::WithOptionalDate;
use crate::schema::csaf2_0::schema::DocumentGenerator as DocumentGenerator20;
use crate::schema::csaf2_1::schema::DocumentGenerator as DocumentGenerator21;
use crate::schema::csaf2_0::schema::{
DocumentGenerator as DocumentGenerator20, EngineOfDocumentGeneration as Engine20,
};
use crate::schema::csaf2_1::schema::{
DocumentGenerator as DocumentGenerator21, EngineOfDocumentGeneration as Engine21,
};

/// Trait for accessing document generator information
pub trait GeneratorTrait: WithOptionalDate {}
pub trait GeneratorTrait: WithOptionalDate {
/// Type representing the generation engine
type EngineType: EngineTrait;

impl GeneratorTrait for DocumentGenerator20 {}
/// Returns the engine that generated this document
fn get_engine(&self) -> &Self::EngineType;
}

impl GeneratorTrait for DocumentGenerator21 {}
impl GeneratorTrait for DocumentGenerator20 {
type EngineType = Engine20;

fn get_engine(&self) -> &Self::EngineType {
&self.engine
}
}

impl GeneratorTrait for DocumentGenerator21 {
type EngineType = Engine21;

fn get_engine(&self) -> &Self::EngineType {
&self.engine
}
}

crate::csaf::traits::impl_with_optional_date!(DocumentGenerator20);
crate::csaf::traits::impl_with_optional_date!(DocumentGenerator21);
2 changes: 2 additions & 0 deletions csaf-rs/src/csaf/traits/document/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
pub mod aggregate_severity_trait;
pub mod distribution_trait;
pub mod engine_trait;
pub mod generator_trait;
pub mod publisher_trait;
pub mod revision_trait;
Expand Down
15 changes: 15 additions & 0 deletions csaf-rs/src/csaf/traits/document/publisher_trait.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
use crate::csaf::traits::util::{impl_optional_str_field_getter, impl_str_field_getter};
use crate::schema::csaf2_0::schema::{CategoryOfPublisher as CategoryOfPublisher20, Publisher as Publisher20};
use crate::schema::csaf2_1::schema::{CategoryOfPublisher as CategoryOfPublisher21, Publisher as Publisher21};

/// Trait representing publisher information
pub trait PublisherTrait {
fn get_category(&self) -> CategoryOfPublisher21;
fn get_issuing_authority(&self) -> Option<&str>;
fn get_name(&self) -> &str;
fn get_namespace(&self) -> &str;
fn get_contact_details(&self) -> Option<&str>;
}

impl PublisherTrait for Publisher20 {
Expand All @@ -17,10 +22,20 @@ impl PublisherTrait for Publisher20 {
CategoryOfPublisher20::User => CategoryOfPublisher21::User,
}
}

impl_optional_str_field_getter!(get_issuing_authority, issuing_authority);
impl_str_field_getter!(get_name, name);
impl_str_field_getter!(get_namespace, namespace);
impl_optional_str_field_getter!(get_contact_details, contact_details);
}

impl PublisherTrait for Publisher21 {
fn get_category(&self) -> CategoryOfPublisher21 {
self.category
}

impl_optional_str_field_getter!(get_issuing_authority, issuing_authority);
impl_str_field_getter!(get_name, name);
impl_str_field_getter!(get_namespace, namespace);
impl_optional_str_field_getter!(get_contact_details, contact_details);
}
14 changes: 14 additions & 0 deletions csaf-rs/src/csaf/traits/document/tracking_trait.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ pub trait TrackingTrait {
}

fn get_version(&self) -> CsafVersionNumber;

fn get_aliases(&self) -> Option<Vec<&str>>;
}
Comment thread
peinjoh marked this conversation as resolved.

impl TrackingTrait for Tracking20 {
Expand All @@ -115,6 +117,12 @@ impl TrackingTrait for Tracking20 {
CsafDateTime::from(&self.initial_release_date)
}

fn get_aliases(&self) -> Option<Vec<&str>> {
self.aliases
.as_ref()
.map(|aliases| aliases.iter().map(|a| a.as_str()).collect())
}

fn get_generator(&self) -> Option<&Self::GeneratorType> {
self.generator.as_ref()
}
Expand Down Expand Up @@ -167,6 +175,12 @@ impl TrackingTrait for Tracking21 {
fn get_version(&self) -> CsafVersionNumber {
CsafVersionNumber::from(&self.version)
}

fn get_aliases(&self) -> Option<Vec<&str>> {
self.aliases
.as_ref()
.map(|aliases| aliases.iter().map(|a| a.as_str()).collect())
}
}

#[cfg(test)]
Expand Down
39 changes: 35 additions & 4 deletions csaf-rs/src/csaf/traits/document_trait.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,17 @@ use crate::csaf::traits::util::extract_references::{
use crate::csaf::traits::util::impl_str_field_getter;
use crate::csaf::types::csaf_document_category::CsafDocumentCategory;
use crate::csaf::types::language::CsafLanguage;
use crate::csaf_traits::{DistributionTrait, NoteTrait, PublisherTrait, ReferenceTrait, TrackingTrait};
use crate::csaf_traits::{
AcknowledgmentTrait, AggregateSeverityTrait, DistributionTrait, NoteTrait, PublisherTrait, ReferenceTrait,
TrackingTrait,
};
use crate::schema::csaf2_0::schema::{
CsafVersion as CsafVersion20, DocumentLevelMetaData as DocumentLevelMetaData20, Note as Note20,
Publisher as Publisher20, Reference as Reference20, RulesForSharingDocument as RulesForSharingDocument20,
Tracking as Tracking20,
Acknowledgment as Acknowledgment20, AggregateSeverity as AggregateSeverity20, CsafVersion as CsafVersion20,
DocumentLevelMetaData as DocumentLevelMetaData20, Note as Note20, Publisher as Publisher20,
Reference as Reference20, RulesForSharingDocument as RulesForSharingDocument20, Tracking as Tracking20,
};
use crate::schema::csaf2_1::schema::{
Acknowledgment as Acknowledgment21, AggregateSeverity as AggregateSeverity21,
CategoryOfReference as CategoryOfReference21, CsafVersion as CsafVersion21,
DocumentLevelMetaData as DocumentLevelMetaData21, Note as Note21, Publisher as Publisher21,
Reference as Reference21, RulesForDocumentSharing as RulesForDocumentSharing21, Tracking as Tracking21,
Expand All @@ -35,6 +39,9 @@ fn canonical_url_candidates<'a, R: ReferenceTrait>(

/// Trait representing document meta-level information
pub trait DocumentTrait {
type AcknowledgmentType: AcknowledgmentTrait;

type AggregateSeverityType: AggregateSeverityTrait;
/// Type representing document tracking information
type TrackingType: TrackingTrait;

Expand All @@ -49,6 +56,10 @@ pub trait DocumentTrait {

type ReferenceType: ReferenceTrait;

fn get_acknowledgments(&self) -> Option<&Vec<Self::AcknowledgmentType>>;

fn get_aggregate_severity(&self) -> Option<&Self::AggregateSeverityType>;

/// Returns the tracking information for this document
fn get_tracking(&self) -> &Self::TrackingType;

Expand Down Expand Up @@ -105,12 +116,22 @@ pub trait DocumentTrait {
}

impl DocumentTrait for DocumentLevelMetaData20 {
type AcknowledgmentType = Acknowledgment20;
type AggregateSeverityType = AggregateSeverity20;
type TrackingType = Tracking20;
type DistributionType = RulesForSharingDocument20;
type NoteType = Note20;
type PublisherType = Publisher20;
type ReferenceType = Reference20;

fn get_acknowledgments(&self) -> Option<&Vec<Self::AcknowledgmentType>> {
self.acknowledgments.as_deref()
}

fn get_aggregate_severity(&self) -> Option<&Self::AggregateSeverityType> {
self.aggregate_severity.as_ref()
}

fn get_tracking(&self) -> &Self::TrackingType {
&self.tracking
}
Expand Down Expand Up @@ -165,12 +186,22 @@ impl DocumentTrait for DocumentLevelMetaData20 {
}

impl DocumentTrait for DocumentLevelMetaData21 {
type AcknowledgmentType = Acknowledgment21;
type AggregateSeverityType = AggregateSeverity21;
type TrackingType = Tracking21;
type DistributionType = RulesForDocumentSharing21;
type NoteType = Note21;
type PublisherType = Publisher21;
type ReferenceType = Reference21;

fn get_acknowledgments(&self) -> Option<&Vec<Self::AcknowledgmentType>> {
self.acknowledgments.as_deref()
}

fn get_aggregate_severity(&self) -> Option<&Self::AggregateSeverityType> {
self.aggregate_severity.as_ref()
}

fn get_tracking(&self) -> &Self::TrackingType {
&self.tracking
}
Expand Down
39 changes: 39 additions & 0 deletions csaf-rs/src/csaf/traits/shared/acknowledgment_trait.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
use crate::csaf::traits::util::impl_optional_str_field_getter;
use crate::schema::csaf2_0::schema::Acknowledgment as Acknowledgment20;
use crate::schema::csaf2_1::schema::Acknowledgment as Acknowledgment21;

pub trait AcknowledgmentTrait {
fn get_names(&self) -> Vec<&str>;

fn get_organization(&self) -> Option<&str>;

fn get_summary(&self) -> Option<&str>;

fn get_urls(&self) -> Vec<&str>;
}
Comment thread
peinjoh marked this conversation as resolved.

impl AcknowledgmentTrait for Acknowledgment20 {
fn get_names(&self) -> Vec<&str> {
self.names.iter().map(|n| n.as_str()).collect()
}

impl_optional_str_field_getter!(get_organization, organization);
impl_optional_str_field_getter!(get_summary, summary);

fn get_urls(&self) -> Vec<&str> {
self.urls.iter().map(|u| u.as_str()).collect()
}
}

impl AcknowledgmentTrait for Acknowledgment21 {
fn get_names(&self) -> Vec<&str> {
self.names.iter().map(|n| n.as_str()).collect()
}

impl_optional_str_field_getter!(get_organization, organization);
impl_optional_str_field_getter!(get_summary, summary);

fn get_urls(&self) -> Vec<&str> {
self.urls.iter().map(|u| u.as_str()).collect()
}
}
1 change: 1 addition & 0 deletions csaf-rs/src/csaf/traits/shared/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pub mod acknowledgment_trait;
pub mod note_trait;
pub mod references_trait;
10 changes: 9 additions & 1 deletion csaf-rs/src/csaf/traits/shared/note_trait.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
use crate::csaf::traits::util::impl_optional_str_field_getter;
use crate::csaf::traits::util::{impl_optional_str_field_getter, impl_str_field_getter};
use crate::csaf_traits::{WithOptionalGroupIds, WithOptionalProductIds};
use crate::schema::csaf2_0::schema::{Note as Note20, NoteCategory as NoteCategory20};
use crate::schema::csaf2_1::schema::{Note as Note21, NoteCategory as NoteCategory21};

pub trait NoteTrait: WithOptionalGroupIds + WithOptionalProductIds {
fn get_category(&self) -> NoteCategory21;
fn get_title(&self) -> Option<&str>;

fn get_audience(&self) -> Option<&str>;

fn get_text(&self) -> &str;
}

// CSAF 2.0 implementation
Expand All @@ -26,6 +30,8 @@ impl NoteTrait for Note20 {
}

impl_optional_str_field_getter!(get_title, title);
impl_optional_str_field_getter!(get_audience, audience);
impl_str_field_getter!(get_text, text);
}

// CSAF 2.1 implementation
Expand All @@ -38,4 +44,6 @@ impl NoteTrait for Note21 {
}

impl_optional_str_field_getter!(get_title, title);
impl_optional_str_field_getter!(get_audience, audience);
impl_str_field_getter!(get_text, text);
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::csaf::traits::util::impl_optional_str_field_getter;
use crate::csaf_traits::{WithOptionalDate, WithOptionalGroupIds, WithOptionalProductIds};
use crate::schema::csaf2_0::schema::{Involvement as Involvement20, PartyCategory as PartyCategory20};
use crate::schema::csaf2_1::schema::{Involvement as Involvement21, PartyCategory as PartyCategory21};
Expand All @@ -6,6 +7,7 @@ use crate::schema::csaf2_1::schema::{Involvement as Involvement21, PartyCategory
pub trait InvolvementTrait: WithOptionalGroupIds + WithOptionalDate + WithOptionalProductIds {
/// Returns the party associated with this vulnerability involvement
fn get_party(&self) -> PartyCategory21;
fn get_summary(&self) -> Option<&str>;
}

impl InvolvementTrait for Involvement20 {
Expand All @@ -18,6 +20,8 @@ impl InvolvementTrait for Involvement20 {
PartyCategory20::Vendor => PartyCategory21::Vendor,
}
}

impl_optional_str_field_getter!(get_summary, summary);
}

crate::csaf::traits::impl_with_optional_date!(Involvement20);
Expand All @@ -28,6 +32,8 @@ impl InvolvementTrait for Involvement21 {
fn get_party(&self) -> PartyCategory21 {
self.party
}

impl_optional_str_field_getter!(get_summary, summary);
}

crate::csaf::traits::impl_with_optional_date!(Involvement21);
Expand Down
1 change: 1 addition & 0 deletions csaf-rs/src/csaf/traits/vulnerabilities/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ pub mod metric_trait;
pub mod product_ident_helper_trait;
pub mod product_status_trait;
pub mod remediation_trait;
pub mod restart_required_trait;
pub mod threat_trait;
pub mod vulnerability_id_trait;
Loading
Loading