11//! Catalyst Signed Document COSE signature `kid` (Catalyst Id) role validation
22
3- use catalyst_signed_doc_spec:: signers:: roles:: { Role , Roles } ;
3+ use std:: collections:: HashSet ;
4+
5+ use catalyst_signed_doc_spec:: signers:: roles:: { AdminRole , Roles , UserRole } ;
46use catalyst_types:: catalyst_id:: role_index:: RoleId ;
57
68use crate :: CatalystSignedDocument ;
@@ -9,24 +11,43 @@ use crate::CatalystSignedDocument;
911#[ derive( Debug ) ]
1012pub ( crate ) struct SignatureKidRule {
1113 /// expected `RoleId` values for the `kid` field
12- pub ( crate ) allowed_roles : Vec < RoleId > ,
14+ pub ( crate ) allowed_roles : HashSet < RoleId > ,
1315}
1416
1517impl SignatureKidRule {
1618 /// Generating `SignatureKidRule` from specs
17- pub ( crate ) fn new ( spec : & Roles ) -> Self {
18- let allowed_roles = spec
19+ pub ( crate ) fn new ( spec : & Roles ) -> anyhow :: Result < Self > {
20+ let allowed_roles: HashSet < _ > = spec
1921 . user
2022 . iter ( )
2123 . map ( |v| {
2224 match v {
23- Role :: Registered => RoleId :: Role0 ,
24- Role :: Proposer => RoleId :: Proposer ,
25- Role :: Representative => RoleId :: DelegatedRepresentative ,
25+ UserRole :: Registered => RoleId :: Role0 ,
26+ UserRole :: Proposer => RoleId :: Proposer ,
27+ UserRole :: Representative => RoleId :: DelegatedRepresentative ,
2628 }
2729 } )
30+ . chain ( spec. admin . iter ( ) . map ( |v| {
31+ match v {
32+ AdminRole :: RootCA => RoleId :: RootCA ,
33+ AdminRole :: BrandCA => RoleId :: BrandCA ,
34+ AdminRole :: CampaignCA => RoleId :: CampaignCA ,
35+ AdminRole :: CategoryCA => RoleId :: CategoryCA ,
36+ AdminRole :: RootAdmin => RoleId :: RootAdmin ,
37+ AdminRole :: BrandAdmin => RoleId :: BrandAdmin ,
38+ AdminRole :: CampaignAdmin => RoleId :: CampaignAdmin ,
39+ AdminRole :: CategoryAdmin => RoleId :: CategoryAdmin ,
40+ AdminRole :: Moderator => RoleId :: Moderator ,
41+ }
42+ } ) )
2843 . collect ( ) ;
29- Self { allowed_roles }
44+
45+ anyhow:: ensure!(
46+ !allowed_roles. is_empty( ) ,
47+ "A list of allowed roles cannot be empty"
48+ ) ;
49+
50+ Ok ( Self { allowed_roles } )
3051 }
3152
3253 /// Field validation rule
@@ -73,7 +94,9 @@ mod tests {
7394 #[ tokio:: test]
7495 async fn signature_kid_rule_test ( ) {
7596 let mut rule = SignatureKidRule {
76- allowed_roles : vec ! [ RoleId :: Role0 , RoleId :: DelegatedRepresentative ] ,
97+ allowed_roles : [ RoleId :: Role0 , RoleId :: DelegatedRepresentative ]
98+ . into_iter ( )
99+ . collect ( ) ,
77100 } ;
78101
79102 let sk = ed25519_dalek:: SigningKey :: generate ( & mut rand:: rngs:: OsRng ) ;
@@ -92,7 +115,7 @@ mod tests {
92115
93116 assert ! ( rule. check( & doc) . await . unwrap( ) ) ;
94117
95- rule. allowed_roles = vec ! [ RoleId :: Proposer ] ;
118+ rule. allowed_roles = [ RoleId :: Proposer ] . into_iter ( ) . collect ( ) ;
96119 assert ! ( !rule. check( & doc) . await . unwrap( ) ) ;
97120 }
98121}
0 commit comments