@@ -4,10 +4,12 @@ use serde::{
4
4
} ;
5
5
use std:: collections:: HashSet ;
6
6
7
+ use strum_macros:: { Display , EnumString } ;
8
+
7
9
/// Capabilities is a unique set of Capability values.
8
10
pub type Capabilities = HashSet < Capability > ;
9
11
10
- #[ derive( Clone , Copy , Debug , Eq , Hash , PartialEq , Serialize ) ]
12
+ #[ derive( Clone , Copy , Debug , EnumString , Eq , Display , Hash , PartialEq , Serialize ) ]
11
13
/// All available capabilities.
12
14
///
13
15
/// For the purpose of performing permission checks, traditional UNIX
@@ -21,6 +23,7 @@ pub type Capabilities = HashSet<Capability>;
21
23
/// Starting with kernel 2.2, Linux divides the privileges traditionally
22
24
/// associated with superuser into distinct units, known as capabilities, which
23
25
/// can be independently enabled and disabled. Capabilities are a per-thread attribute.
26
+ #[ strum( serialize_all = "SCREAMING_SNAKE_CASE" ) ]
24
27
pub enum Capability {
25
28
#[ serde( rename = "CAP_AUDIT_CONTROL" ) ]
26
29
/// Enable and disable kernel auditing; change auditing filter rules;
@@ -609,4 +612,60 @@ mod tests {
609
612
assert ! ( res. contains( & Capability :: Chown ) ) ;
610
613
Ok ( ( ) )
611
614
}
615
+
616
+ #[ test]
617
+ fn invalid_string2enum ( ) {
618
+ let invalid_cap_str = "INVALID_CAP" ;
619
+ let unknown_cap = invalid_cap_str. parse :: < Capability > ( ) ;
620
+ assert ! ( unknown_cap. is_err( ) ) ;
621
+ }
622
+
623
+ #[ test]
624
+ fn cap_enum_to_string ( ) {
625
+ let cap = Capability :: AuditControl ;
626
+ assert_eq ! ( cap. to_string( ) , "AUDIT_CONTROL" ) ;
627
+
628
+ let cap = Capability :: AuditRead ;
629
+ assert_eq ! ( cap. to_string( ) , "AUDIT_READ" ) ;
630
+
631
+ let cap = Capability :: SysAdmin ;
632
+ assert_eq ! ( cap. to_string( ) , "SYS_ADMIN" ) ;
633
+ }
634
+
635
+ #[ test]
636
+ fn cap_string_to_enum ( ) {
637
+ let cap_str = "AUDIT_CONTROL" ;
638
+ let cap_enum: Capability = cap_str. parse ( ) . unwrap ( ) ;
639
+ assert_eq ! ( cap_enum, Capability :: AuditControl ) ;
640
+
641
+ let cap_str = "AUDIT_READ" ;
642
+ let cap_enum: Capability = cap_str. parse ( ) . unwrap ( ) ;
643
+ assert_eq ! ( cap_enum, Capability :: AuditRead ) ;
644
+
645
+ let cap_str = "SYS_ADMIN" ;
646
+ let cap_enum: Capability = cap_str. parse ( ) . unwrap ( ) ;
647
+ assert_eq ! ( cap_enum, Capability :: SysAdmin ) ;
648
+ }
649
+
650
+ #[ test]
651
+ fn test_serde_serialization ( ) {
652
+ let cap = Capability :: AuditControl ;
653
+ let serialized = serde_json:: to_string ( & cap) . unwrap ( ) ;
654
+ assert_eq ! ( serialized, "\" CAP_AUDIT_CONTROL\" " ) ;
655
+
656
+ let cap = Capability :: SysAdmin ;
657
+ let serialized = serde_json:: to_string ( & cap) . unwrap ( ) ;
658
+ assert_eq ! ( serialized, "\" CAP_SYS_ADMIN\" " ) ;
659
+ }
660
+
661
+ #[ test]
662
+ fn test_serde_deserialization ( ) {
663
+ let serialized = "\" CAP_AUDIT_CONTROL\" " ;
664
+ let cap: Capability = serde_json:: from_str ( serialized) . unwrap ( ) ;
665
+ assert_eq ! ( cap, Capability :: AuditControl ) ;
666
+
667
+ let serialized = "\" CAP_SYS_ADMIN\" " ;
668
+ let cap: Capability = serde_json:: from_str ( serialized) . unwrap ( ) ;
669
+ assert_eq ! ( cap, Capability :: SysAdmin ) ;
670
+ }
612
671
}
0 commit comments