@@ -46,13 +46,15 @@ fn rm_permission_files(identifier: &str, dir: &Path) -> Result<()> {
4646 permission_file. default = None ;
4747 } else {
4848 let set_len = permission_file. set . len ( ) ;
49- permission_file. set . retain ( |s| s. identifier != identifier) ;
49+ permission_file
50+ . set
51+ . retain ( |s| !identifier_match ( identifier, & s. identifier ) ) ;
5052 updated = permission_file. set . len ( ) != set_len;
5153
5254 let permission_len = permission_file. permission . len ( ) ;
5355 permission_file
5456 . permission
55- . retain ( |s| s. identifier != identifier ) ;
57+ . retain ( |s| ! identifier_match ( identifier , & s. identifier ) ) ;
5658 updated = updated || permission_file. permission . len ( ) != permission_len;
5759 }
5860
@@ -84,7 +86,11 @@ fn rm_permission_from_capabilities(identifier: &str, dir: &Path) -> Result<()> {
8486 if let Ok ( mut value) = content. parse :: < toml_edit:: DocumentMut > ( ) {
8587 if let Some ( permissions) = value. get_mut ( "permissions" ) . and_then ( |p| p. as_array_mut ( ) ) {
8688 let prev_len = permissions. len ( ) ;
87- permissions. retain ( |p| p. as_str ( ) . map ( |p| p != identifier) . unwrap_or ( false ) ) ;
89+ permissions. retain ( |p| {
90+ p. as_str ( )
91+ . map ( |p| !identifier_match ( identifier, p) )
92+ . unwrap_or ( false )
93+ } ) ;
8894 if prev_len != permissions. len ( ) {
8995 std:: fs:: write ( & path, value. to_string ( ) ) ?;
9096 log:: info!( action = "Removed" ; "permission from capability at {}" , dunce:: simplified( & path) . display( ) ) ;
@@ -97,7 +103,11 @@ fn rm_permission_from_capabilities(identifier: &str, dir: &Path) -> Result<()> {
97103 if let Ok ( mut value) = serde_json:: from_slice :: < serde_json:: Value > ( & content) {
98104 if let Some ( permissions) = value. get_mut ( "permissions" ) . and_then ( |p| p. as_array_mut ( ) ) {
99105 let prev_len = permissions. len ( ) ;
100- permissions. retain ( |p| p. as_str ( ) . map ( |p| p != identifier) . unwrap_or ( false ) ) ;
106+ permissions. retain ( |p| {
107+ p. as_str ( )
108+ . map ( |p| !identifier_match ( identifier, p) )
109+ . unwrap_or ( false )
110+ } ) ;
101111 if prev_len != permissions. len ( ) {
102112 std:: fs:: write ( & path, serde_json:: to_vec_pretty ( & value) ?) ?;
103113 log:: info!( action = "Removed" ; "permission from capability at {}" , dunce:: simplified( & path) . display( ) ) ;
@@ -113,11 +123,20 @@ fn rm_permission_from_capabilities(identifier: &str, dir: &Path) -> Result<()> {
113123 Ok ( ( ) )
114124}
115125
126+ fn identifier_match ( identifier : & str , permission : & str ) -> bool {
127+ match identifier. split_once ( ':' ) {
128+ Some ( ( plugin_name, "*" ) ) => permission. contains ( plugin_name) ,
129+ _ => permission == identifier,
130+ }
131+ }
132+
116133#[ derive( Debug , Parser ) ]
117134#[ clap( about = "Remove a permission file, and its reference from any capability" ) ]
118135pub struct Options {
119136 /// Permission to remove.
120- identifier : String ,
137+ ///
138+ /// To remove all permissions for a given plugin, provide `<plugin-name>:*`
139+ pub identifier : String ,
121140}
122141
123142pub fn command ( options : Options ) -> Result < ( ) > {
0 commit comments