Skip to content

Commit 256c3aa

Browse files
committed
update SignatureKidRule initialisation, include admin roles
1 parent b2afe47 commit 256c3aa

File tree

7 files changed

+83
-27
lines changed

7 files changed

+83
-27
lines changed

rust/catalyst-signed-doc-spec/src/signers/roles.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,52 @@
44
#[derive(serde::Deserialize)]
55
#[allow(clippy::missing_docs_in_private_items)]
66
pub struct Roles {
7-
pub user: Vec<Role>,
7+
#[serde(default)]
8+
pub user: Vec<UserRole>,
9+
#[serde(default)]
10+
pub admin: Vec<AdminRole>,
811
}
912

1013
/// Role definition
1114
#[derive(serde::Deserialize)]
1215
#[allow(clippy::missing_docs_in_private_items)]
13-
pub enum Role {
16+
pub enum UserRole {
1417
/// Role 0 - A registered User / Voter - Base Role
1518
Registered,
1619
/// Registered for posting proposals
1720
Proposer,
1821
/// Registered as a rep for voting purposes.
1922
Representative,
2023
}
24+
25+
#[derive(serde::Deserialize)]
26+
#[allow(clippy::missing_docs_in_private_items)]
27+
pub enum AdminRole {
28+
/// Root Certificate Authority role.
29+
#[serde(rename = "Root CA")]
30+
RootCA,
31+
/// Brand Certificate Authority role.
32+
#[serde(rename = "Brand CA")]
33+
BrandCA,
34+
/// Campaign Certificate Authority role.
35+
#[serde(rename = "Campaign CA")]
36+
CampaignCA,
37+
/// Category Certificate Authority role.
38+
#[serde(rename = "Category CA")]
39+
CategoryCA,
40+
/// Root Admin role.
41+
#[serde(rename = "Root Admin")]
42+
RootAdmin,
43+
/// Brand Admin role.
44+
#[serde(rename = "Brand Admin")]
45+
BrandAdmin,
46+
/// Campaign Admin role.
47+
#[serde(rename = "Campaign Admin")]
48+
CampaignAdmin,
49+
/// Category Admin role.
50+
#[serde(rename = "Category Admin")]
51+
CategoryAdmin,
52+
/// Moderator role.
53+
#[serde(rename = "Moderator")]
54+
Moderator,
55+
}

rust/signed_doc/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ license.workspace = true
1111
workspace = true
1212

1313
[dependencies]
14-
catalyst-types = { version = "0.0.7", git = "https://github.com/input-output-hk/catalyst-libs.git", tag = "catalyst-types/v0.0.7" }
14+
catalyst-types = { version = "0.0.8", git = "https://github.com/input-output-hk/catalyst-libs.git", tag = "catalyst-types/v0.0.8" }
1515
cbork-utils = { version = "0.0.2", git = "https://github.com/input-output-hk/catalyst-libs.git", tag = "cbork-utils-v0.0.2" }
1616

1717
catalyst-signed-doc-macro = { version = "0.0.1", path = "../catalyst-signed-doc-macro" }

rust/signed_doc/src/providers.rs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ use ed25519_dalek::VerifyingKey;
77

88
use crate::{CatalystSignedDocument, DocumentRef};
99

10-
/// `VerifyingKey` Provider trait
11-
pub trait VerifyingKeyProvider: Send + Sync {
12-
/// Try to get `VerifyingKey`
13-
fn try_get_key(
10+
/// `CatalystId` Provider trait
11+
pub trait CatalystIdProvider: Send + Sync {
12+
/// Try to get `VerifyingKey` by the provided `CatalystId` and corresponding `RoleId`
13+
/// and `KeyRotation` Return `None` if the provided `CatalystId` with the
14+
/// corresponding `RoleId` and `KeyRotation` has not been registered.
15+
fn try_get_registered_key(
1416
&self,
1517
kid: &CatalystId,
1618
) -> impl Future<Output = anyhow::Result<Option<VerifyingKey>>> + Send;
@@ -48,8 +50,8 @@ pub mod tests {
4850
use std::{collections::HashMap, time::Duration};
4951

5052
use super::{
51-
CatalystId, CatalystSignedDocument, CatalystSignedDocumentProvider, VerifyingKey,
52-
VerifyingKeyProvider,
53+
CatalystId, CatalystIdProvider, CatalystSignedDocument, CatalystSignedDocumentProvider,
54+
VerifyingKey,
5355
};
5456
use crate::{DocLocator, DocumentRef};
5557

@@ -123,8 +125,8 @@ pub mod tests {
123125
}
124126
}
125127

126-
impl VerifyingKeyProvider for TestCatalystProvider {
127-
async fn try_get_key(
128+
impl CatalystIdProvider for TestCatalystProvider {
129+
async fn try_get_registered_key(
128130
&self,
129131
kid: &CatalystId,
130132
) -> anyhow::Result<Option<VerifyingKey>> {

rust/signed_doc/src/validator/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::{
1717
PROPOSAL_COMMENT_FORM_TEMPLATE, PROPOSAL_FORM_TEMPLATE, PROPOSAL_SUBMISSION_ACTION,
1818
},
1919
metadata::DocType,
20-
providers::{CatalystSignedDocumentProvider, VerifyingKeyProvider},
20+
providers::{CatalystIdProvider, CatalystSignedDocumentProvider},
2121
validator::rules::{CollaboratorsRule, SignatureRule, TemplateRule},
2222
CatalystSignedDocument, ContentEncoding, ContentType,
2323
};
@@ -196,7 +196,7 @@ pub async fn validate<Provider>(
196196
provider: &Provider,
197197
) -> anyhow::Result<bool>
198198
where
199-
Provider: CatalystSignedDocumentProvider + VerifyingKeyProvider,
199+
Provider: CatalystSignedDocumentProvider + CatalystIdProvider,
200200
{
201201
let Ok(doc_type) = doc.doc_type() else {
202202
doc.report().missing_field(

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
use futures::FutureExt;
55

66
use crate::{
7-
providers::{CatalystSignedDocumentProvider, VerifyingKeyProvider},
7+
providers::{CatalystIdProvider, CatalystSignedDocumentProvider},
88
CatalystSignedDocument,
99
};
1010

@@ -80,7 +80,7 @@ impl Rules {
8080
provider: &Provider,
8181
) -> anyhow::Result<bool>
8282
where
83-
Provider: CatalystSignedDocumentProvider + VerifyingKeyProvider,
83+
Provider: CatalystSignedDocumentProvider + CatalystIdProvider,
8484
{
8585
let rules = [
8686
self.id.check(doc, provider).boxed(),
@@ -139,7 +139,7 @@ impl Rules {
139139
section: SectionRule::NotSpecified,
140140
collaborators: CollaboratorsRule::NotSpecified,
141141
content: ContentRule::new(&doc_spec.payload)?,
142-
kid: SignatureKidRule::new(&doc_spec.signers.roles),
142+
kid: SignatureKidRule::new(&doc_spec.signers.roles)?,
143143
signature: SignatureRule { mutlisig: false },
144144
original_author: OriginalAuthorRule,
145145
};

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use anyhow::Context;
44
use catalyst_types::problem_report::ProblemReport;
55

66
use crate::{
7-
providers::{CatalystSignedDocumentProvider, VerifyingKeyProvider},
7+
providers::{CatalystIdProvider, CatalystSignedDocumentProvider},
88
signature::{tbs_data, Signature},
99
CatalystSignedDocument,
1010
};
@@ -28,7 +28,7 @@ impl SignatureRule {
2828
provider: &Provider,
2929
) -> anyhow::Result<bool>
3030
where
31-
Provider: CatalystSignedDocumentProvider + VerifyingKeyProvider,
31+
Provider: CatalystSignedDocumentProvider + CatalystIdProvider,
3232
{
3333
if doc.signatures().is_empty() {
3434
doc.report().other(
@@ -74,11 +74,11 @@ async fn validate_signature<Provider>(
7474
report: &ProblemReport,
7575
) -> anyhow::Result<bool>
7676
where
77-
Provider: VerifyingKeyProvider,
77+
Provider: CatalystIdProvider,
7878
{
7979
let kid = sign.kid();
8080

81-
let Some(pk) = provider.try_get_key(kid).await? else {
81+
let Some(pk) = provider.try_get_registered_key(kid).await? else {
8282
report.other(
8383
&format!("Missing public key for {kid}."),
8484
"During public key extraction",

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

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Catalyst Signed Document COSE signature `kid` (Catalyst Id) role validation
22
3-
use catalyst_signed_doc_spec::signers::roles::{Role, Roles};
3+
use catalyst_signed_doc_spec::signers::roles::{AdminRole, Roles, UserRole};
44
use catalyst_types::catalyst_id::role_index::RoleId;
55

66
use crate::CatalystSignedDocument;
@@ -14,19 +14,38 @@ pub(crate) struct SignatureKidRule {
1414

1515
impl SignatureKidRule {
1616
/// Generating `SignatureKidRule` from specs
17-
pub(crate) fn new(spec: &Roles) -> Self {
18-
let allowed_roles = spec
17+
pub(crate) fn new(spec: &Roles) -> anyhow::Result<Self> {
18+
let allowed_roles: Vec<_> = spec
1919
.user
2020
.iter()
2121
.map(|v| {
2222
match v {
23-
Role::Registered => RoleId::Role0,
24-
Role::Proposer => RoleId::Proposer,
25-
Role::Representative => RoleId::DelegatedRepresentative,
23+
UserRole::Registered => RoleId::Role0,
24+
UserRole::Proposer => RoleId::Proposer,
25+
UserRole::Representative => RoleId::DelegatedRepresentative,
2626
}
2727
})
28+
.chain(spec.admin.iter().map(|v| {
29+
match v {
30+
AdminRole::RootCA => RoleId::RootCA,
31+
AdminRole::BrandCA => RoleId::BrandCA,
32+
AdminRole::CampaignCA => RoleId::CampaignCA,
33+
AdminRole::CategoryCA => RoleId::CategoryCA,
34+
AdminRole::RootAdmin => RoleId::RootAdmin,
35+
AdminRole::BrandAdmin => RoleId::BrandAdmin,
36+
AdminRole::CampaignAdmin => RoleId::CampaignAdmin,
37+
AdminRole::CategoryAdmin => RoleId::CategoryAdmin,
38+
AdminRole::Moderator => RoleId::Moderator,
39+
}
40+
}))
2841
.collect();
29-
Self { allowed_roles }
42+
43+
anyhow::ensure!(
44+
!allowed_roles.is_empty(),
45+
"A list of allowed roles cannot be empty"
46+
);
47+
48+
Ok(Self { allowed_roles })
3049
}
3150

3251
/// Field validation rule

0 commit comments

Comments
 (0)