Skip to content
Merged
13 changes: 8 additions & 5 deletions rust/signed_doc/src/validator/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
//! Catalyst Signed Documents validation logic

pub(crate) mod ver;
pub(crate) mod json_schema;
pub(crate) mod rules;
pub(crate) mod utils;
Expand All @@ -21,11 +22,7 @@ use crate::{
doc_types::{
BRAND_PARAMETERS, CAMPAIGN_PARAMETERS, CATEGORY_PARAMETERS, PROPOSAL, PROPOSAL_COMMENT,
PROPOSAL_COMMENT_FORM_TEMPLATE, PROPOSAL_FORM_TEMPLATE, PROPOSAL_SUBMISSION_ACTION,
},
metadata::DocType,
providers::{CatalystSignedDocumentProvider, VerifyingKeyProvider},
signature::{tbs_data, Signature},
CatalystSignedDocument, ContentEncoding, ContentType,
}, metadata::DocType, providers::{CatalystSignedDocumentProvider, VerifyingKeyProvider}, signature::{tbs_data, Signature}, CatalystSignedDocument, ContentEncoding, ContentType
};

/// A table representing a full set or validation rules per document id.
Expand All @@ -42,6 +39,8 @@ fn proposal_rule() -> Rules {
CATEGORY_PARAMETERS.clone(),
];
Rules {
id: None,
ver: None,
content_type: ContentTypeRule {
exp: ContentType::Json,
},
Expand Down Expand Up @@ -76,6 +75,8 @@ fn proposal_comment_rule() -> Rules {
CATEGORY_PARAMETERS.clone(),
];
Rules {
id: None,
ver: None,
content_type: ContentTypeRule {
exp: ContentType::Json,
},
Expand Down Expand Up @@ -127,6 +128,8 @@ fn proposal_submission_action_rule() -> Rules {
.expect("Must be a valid json scheme file");

Rules {
id: None,
ver: None,
content_type: ContentTypeRule {
exp: ContentType::Json,
},
Expand Down
6 changes: 5 additions & 1 deletion rust/signed_doc/src/validator/rules/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

use futures::FutureExt;

use crate::{providers::CatalystSignedDocumentProvider, CatalystSignedDocument};
use crate::{providers::CatalystSignedDocumentProvider, validator::id_and_ver::{IdRule, VerRule}, CatalystSignedDocument};

mod content_encoding;
mod content_type;
Expand All @@ -25,6 +25,10 @@ pub(crate) use template::{ContentRule, ContentSchema};

/// Struct represented a full collection of rules for all fields
pub(crate) struct Rules {
/// 'id' field validation rule
pub(crate) id: Option<IdRule>,
/// 'ver' field validation rule
pub(crate) ver: Option<VerRule>,
/// 'content-type' field validation rule
pub(crate) content_type: ContentTypeRule,
/// 'content-encoding' field validation rule
Expand Down
53 changes: 53 additions & 0 deletions rust/signed_doc/src/validator/ver.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
//! Validator for Signed Document Version
use std::time::{Duration, SystemTime};

use crate::{providers::CatalystSignedDocumentProvider, CatalystSignedDocument};

pub(crate) struct VerRule;

impl VerRule {
pub(crate) fn check<Provider>(
&self,
doc: &CatalystSignedDocument,
_provider: &Provider,
) -> anyhow::Result<bool>
where
Provider: CatalystSignedDocumentProvider,
{
let id = doc.doc_id().ok();
let ver = doc.doc_ver().ok();

if id.is_none() {
doc.report().missing_field(
"id",
"Can't get a document id during the validation process",
);
}
if ver.is_none() {
doc.report().missing_field(
"ver",
"Can't get a document ver during the validation process",
);
}

match (id, ver) {
(Some(id), Some(ver)) => {
if ver < id {
doc.report().invalid_value(
"ver",
&ver.to_string(),
"ver < id",
&format!(
"Document Version {ver} cannot be smaller than Document ID {id}"
),
);
Ok(false)
} else {
Ok(true)
}
}
_ => Ok(false),
}
}
}
Loading