1- use std:: path:: Path ;
1+ use std:: { path:: Path , str :: FromStr } ;
22
33use tashi_collections:: HashMap ;
44
5- use crate :: mqtt:: trie:: Filter ;
5+ use crate :: mqtt:: trie:: { Filter , TopicName } ;
66
7- #[ derive( serde:: Deserialize , serde :: Serialize , Default ) ]
7+ #[ derive( serde:: Deserialize , Default ) ]
88pub struct AclConfig {
9+ #[ serde( default ) ]
910 pub permissions : HashMap < String , TopicsConfig > ,
1011}
1112
12- #[ derive( serde:: Deserialize , serde :: Serialize ) ]
13+ #[ derive( serde:: Deserialize , Debug ) ]
1314pub struct TopicsConfig {
1415 pub topic : Vec < TopicPermissions > ,
1516}
1617
17- #[ derive( serde:: Deserialize , serde :: Serialize ) ]
18+ #[ derive( serde:: Deserialize , Debug ) ]
1819pub struct TopicPermissions {
19- pub filter : String ,
20+ #[ serde( deserialize_with = "from_str" ) ]
21+ pub filter : Filter ,
2022 pub allowed : Vec < TransactionType > ,
23+ #[ serde( default ) ]
2124 pub denied : Vec < TransactionType > ,
2225}
2326
24- #[ derive( serde:: Deserialize , serde:: Serialize , PartialEq , Eq ) ]
27+ fn from_str < ' de , D > ( deserializer : D ) -> Result < Filter , D :: Error >
28+ where
29+ D : serde:: Deserializer < ' de > ,
30+ {
31+ let s: String = serde:: Deserialize :: deserialize ( deserializer) ?;
32+
33+ Filter :: from_str ( & s) . map_err ( serde:: de:: Error :: custom)
34+ }
35+
36+ #[ derive( serde:: Deserialize , PartialEq , Eq , Debug ) ]
37+ #[ serde( rename_all = "lowercase" ) ]
2538pub enum TransactionType {
2639 Subscribe ,
2740 Publish ,
@@ -38,13 +51,14 @@ impl AclConfig {
3851 pub fn check_acl_config (
3952 & self ,
4053 topics_config : Option < & TopicsConfig > ,
41- filter : & Filter ,
54+ topic_name : & str ,
4255 transaction_type : TransactionType ,
4356 ) -> bool {
4457 // Allows everything if no topics config was found.
4558 topics_config. map_or ( true , |perms| {
46- !perms. topic . iter ( ) . any ( |k| {
47- k. allowed . iter ( ) . any ( |k| * k == transaction_type) && filter. matches_topic ( & k. filter )
59+ perms. topic . iter ( ) . any ( |k| {
60+ k. allowed . iter ( ) . any ( |k| * k == transaction_type)
61+ && k. filter . matches_topic ( topic_name)
4862 } )
4963 } )
5064 }
0 commit comments