@@ -61,23 +61,19 @@ impl SetPermissionCliCommand {
6161 } ) ?;
6262 ( sig, permissions)
6363 }
64- Some ( ( _, current) ) => {
65- // Account exists — apply incremental delta.
66- let add_mask = names_to_bitmask ( & self . add ) ;
67- let remove_mask = names_to_bitmask ( & self . remove ) ;
68- let new_permissions = ( current. permissions | add_mask) & !remove_mask;
69-
70- if new_permissions == 0 {
71- return Err ( eyre:: eyre!(
72- "resulting permissions bitmask is zero — at least one permission is required"
73- ) ) ;
74- }
75-
64+ Some ( _) => {
65+ // Account exists — apply incremental delta atomically via the program.
66+ let add = names_to_bitmask ( & self . add ) ;
67+ let remove = names_to_bitmask ( & self . remove ) ;
7668 let sig = client. update_permission ( UpdatePermissionCommand {
7769 permission_pda,
78- permissions : new_permissions,
70+ add,
71+ remove,
72+ } ) ?;
73+ let ( _, updated) = client. get_permission ( GetPermissionCommand {
74+ pubkey : permission_pda. to_string ( ) ,
7975 } ) ?;
80- ( sig, new_permissions )
76+ ( sig, updated . permissions )
8177 }
8278 } ;
8379
@@ -205,7 +201,7 @@ mod tests {
205201 let ( permission_pda, _) = get_permission_pda ( & TEST_PROGRAM_ID , & user_payer) ;
206202
207203 let initial = permission_flags:: NETWORK_ADMIN ;
208- let expected = initial | permission_flags:: SENTINEL ;
204+ let updated = initial | permission_flags:: SENTINEL ;
209205
210206 client
211207 . expect_check_requirements ( )
@@ -216,14 +212,23 @@ mod tests {
216212 . with ( predicate:: eq ( GetPermissionCommand {
217213 pubkey : permission_pda. to_string ( ) ,
218214 } ) )
215+ . once ( )
219216 . returning ( move |_| Ok ( ( permission_pda, make_permission ( initial) ) ) ) ;
220217 client
221218 . expect_update_permission ( )
222219 . with ( predicate:: eq ( UpdatePermissionCommand {
223220 permission_pda,
224- permissions : expected,
221+ add : permission_flags:: SENTINEL ,
222+ remove : 0 ,
225223 } ) )
226224 . returning ( |_| Ok ( Signature :: new_unique ( ) ) ) ;
225+ client
226+ . expect_get_permission ( )
227+ . with ( predicate:: eq ( GetPermissionCommand {
228+ pubkey : permission_pda. to_string ( ) ,
229+ } ) )
230+ . once ( )
231+ . returning ( move |_| Ok ( ( permission_pda, make_permission ( updated) ) ) ) ;
227232
228233 let mut output = Vec :: new ( ) ;
229234 let res = SetPermissionCliCommand {
@@ -246,7 +251,7 @@ mod tests {
246251 let ( permission_pda, _) = get_permission_pda ( & TEST_PROGRAM_ID , & user_payer) ;
247252
248253 let initial = permission_flags:: NETWORK_ADMIN | permission_flags:: USER_ADMIN ;
249- let expected = permission_flags:: NETWORK_ADMIN ;
254+ let updated = permission_flags:: NETWORK_ADMIN ;
250255
251256 client
252257 . expect_check_requirements ( )
@@ -257,14 +262,23 @@ mod tests {
257262 . with ( predicate:: eq ( GetPermissionCommand {
258263 pubkey : permission_pda. to_string ( ) ,
259264 } ) )
265+ . once ( )
260266 . returning ( move |_| Ok ( ( permission_pda, make_permission ( initial) ) ) ) ;
261267 client
262268 . expect_update_permission ( )
263269 . with ( predicate:: eq ( UpdatePermissionCommand {
264270 permission_pda,
265- permissions : expected,
271+ add : 0 ,
272+ remove : permission_flags:: USER_ADMIN ,
266273 } ) )
267274 . returning ( |_| Ok ( Signature :: new_unique ( ) ) ) ;
275+ client
276+ . expect_get_permission ( )
277+ . with ( predicate:: eq ( GetPermissionCommand {
278+ pubkey : permission_pda. to_string ( ) ,
279+ } ) )
280+ . once ( )
281+ . returning ( move |_| Ok ( ( permission_pda, make_permission ( updated) ) ) ) ;
268282
269283 let mut output = Vec :: new ( ) ;
270284 let res = SetPermissionCliCommand {
@@ -287,7 +301,7 @@ mod tests {
287301 let ( permission_pda, _) = get_permission_pda ( & TEST_PROGRAM_ID , & user_payer) ;
288302
289303 let initial = permission_flags:: NETWORK_ADMIN | permission_flags:: USER_ADMIN ;
290- let expected = permission_flags:: NETWORK_ADMIN | permission_flags:: SENTINEL ;
304+ let updated = permission_flags:: NETWORK_ADMIN | permission_flags:: SENTINEL ;
291305
292306 client
293307 . expect_check_requirements ( )
@@ -298,61 +312,33 @@ mod tests {
298312 . with ( predicate:: eq ( GetPermissionCommand {
299313 pubkey : permission_pda. to_string ( ) ,
300314 } ) )
315+ . once ( )
301316 . returning ( move |_| Ok ( ( permission_pda, make_permission ( initial) ) ) ) ;
302317 client
303318 . expect_update_permission ( )
304319 . with ( predicate:: eq ( UpdatePermissionCommand {
305320 permission_pda,
306- permissions : expected,
321+ add : permission_flags:: SENTINEL ,
322+ remove : permission_flags:: USER_ADMIN ,
307323 } ) )
308324 . returning ( |_| Ok ( Signature :: new_unique ( ) ) ) ;
309-
310- let mut output = Vec :: new ( ) ;
311- let res = SetPermissionCliCommand {
312- user_payer : user_payer. to_string ( ) ,
313- add : vec ! [ PermissionName :: Sentinel ] ,
314- remove : vec ! [ PermissionName :: UserAdmin ] ,
315- }
316- . execute ( & client, & mut output) ;
317-
318- assert ! ( res. is_ok( ) ) ;
319- }
320-
321- #[ test]
322- fn test_set_remove_all_rejected ( ) {
323- let mut client = create_test_client ( ) ;
324- let user_payer = Pubkey :: new_unique ( ) ;
325- let ( permission_pda, _) = get_permission_pda ( & TEST_PROGRAM_ID , & user_payer) ;
326-
327- client
328- . expect_check_requirements ( )
329- . with ( predicate:: eq ( CHECK_ID_JSON | CHECK_BALANCE ) )
330- . returning ( |_| Ok ( ( ) ) ) ;
331325 client
332326 . expect_get_permission ( )
333327 . with ( predicate:: eq ( GetPermissionCommand {
334328 pubkey : permission_pda. to_string ( ) ,
335329 } ) )
336- . returning ( move |_| {
337- Ok ( (
338- permission_pda,
339- make_permission ( permission_flags:: NETWORK_ADMIN ) ,
340- ) )
341- } ) ;
330+ . once ( )
331+ . returning ( move |_| Ok ( ( permission_pda, make_permission ( updated) ) ) ) ;
342332
343333 let mut output = Vec :: new ( ) ;
344334 let res = SetPermissionCliCommand {
345335 user_payer : user_payer. to_string ( ) ,
346- add : vec ! [ ] ,
347- remove : vec ! [ PermissionName :: NetworkAdmin ] ,
336+ add : vec ! [ PermissionName :: Sentinel ] ,
337+ remove : vec ! [ PermissionName :: UserAdmin ] ,
348338 }
349339 . execute ( & client, & mut output) ;
350340
351- assert ! ( res. is_err( ) ) ;
352- assert ! ( res
353- . unwrap_err( )
354- . to_string( )
355- . contains( "resulting permissions bitmask is zero" ) ) ;
341+ assert ! ( res. is_ok( ) ) ;
356342 }
357343
358344 #[ test]
0 commit comments