Skip to content

Commit 172559d

Browse files
committed
feat: ver
1 parent b4ee917 commit 172559d

File tree

3 files changed

+66
-6
lines changed

3 files changed

+66
-6
lines changed

rust/signed_doc/src/validator/mod.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
//! Catalyst Signed Documents validation logic
22
3+
pub(crate) mod ver;
34
pub(crate) mod json_schema;
45
pub(crate) mod rules;
56
pub(crate) mod utils;
@@ -21,11 +22,7 @@ use crate::{
2122
doc_types::{
2223
BRAND_PARAMETERS, CAMPAIGN_PARAMETERS, CATEGORY_PARAMETERS, PROPOSAL, PROPOSAL_COMMENT,
2324
PROPOSAL_COMMENT_FORM_TEMPLATE, PROPOSAL_FORM_TEMPLATE, PROPOSAL_SUBMISSION_ACTION,
24-
},
25-
metadata::DocType,
26-
providers::{CatalystSignedDocumentProvider, VerifyingKeyProvider},
27-
signature::{tbs_data, Signature},
28-
CatalystSignedDocument, ContentEncoding, ContentType,
25+
}, metadata::DocType, providers::{CatalystSignedDocumentProvider, VerifyingKeyProvider}, signature::{tbs_data, Signature}, CatalystSignedDocument, ContentEncoding, ContentType
2926
};
3027

3128
/// A table representing a full set or validation rules per document id.
@@ -42,6 +39,8 @@ fn proposal_rule() -> Rules {
4239
CATEGORY_PARAMETERS.clone(),
4340
];
4441
Rules {
42+
id: None,
43+
ver: None,
4544
content_type: ContentTypeRule {
4645
exp: ContentType::Json,
4746
},
@@ -76,6 +75,8 @@ fn proposal_comment_rule() -> Rules {
7675
CATEGORY_PARAMETERS.clone(),
7776
];
7877
Rules {
78+
id: None,
79+
ver: None,
7980
content_type: ContentTypeRule {
8081
exp: ContentType::Json,
8182
},
@@ -127,6 +128,8 @@ fn proposal_submission_action_rule() -> Rules {
127128
.expect("Must be a valid json scheme file");
128129

129130
Rules {
131+
id: None,
132+
ver: None,
130133
content_type: ContentTypeRule {
131134
exp: ContentType::Json,
132135
},

rust/signed_doc/src/validator/rules/mod.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
use futures::FutureExt;
55

6-
use crate::{providers::CatalystSignedDocumentProvider, CatalystSignedDocument};
6+
use crate::{providers::CatalystSignedDocumentProvider, validator::id_and_ver::{IdRule, VerRule}, CatalystSignedDocument};
77

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

2626
/// Struct represented a full collection of rules for all fields
2727
pub(crate) struct Rules {
28+
/// 'id' field validation rule
29+
pub(crate) id: Option<IdRule>,
30+
/// 'ver' field validation rule
31+
pub(crate) ver: Option<VerRule>,
2832
/// 'content-type' field validation rule
2933
pub(crate) content_type: ContentTypeRule,
3034
/// 'content-encoding' field validation rule
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//! Validator for Signed Document Version
2+
3+
use std::time::{Duration, SystemTime};
4+
5+
use crate::{providers::CatalystSignedDocumentProvider, CatalystSignedDocument};
6+
7+
pub(crate) struct VerRule;
8+
9+
impl VerRule {
10+
pub(crate) fn check<Provider>(
11+
&self,
12+
doc: &CatalystSignedDocument,
13+
_provider: &Provider,
14+
) -> anyhow::Result<bool>
15+
where
16+
Provider: CatalystSignedDocumentProvider,
17+
{
18+
let id = doc.doc_id().ok();
19+
let ver = doc.doc_ver().ok();
20+
21+
if id.is_none() {
22+
doc.report().missing_field(
23+
"id",
24+
"Can't get a document id during the validation process",
25+
);
26+
}
27+
if ver.is_none() {
28+
doc.report().missing_field(
29+
"ver",
30+
"Can't get a document ver during the validation process",
31+
);
32+
}
33+
34+
match (id, ver) {
35+
(Some(id), Some(ver)) => {
36+
if ver < id {
37+
doc.report().invalid_value(
38+
"ver",
39+
&ver.to_string(),
40+
"ver < id",
41+
&format!(
42+
"Document Version {ver} cannot be smaller than Document ID {id}"
43+
),
44+
);
45+
Ok(false)
46+
} else {
47+
Ok(true)
48+
}
49+
}
50+
_ => Ok(false),
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)