Skip to content

Commit e3dce83

Browse files
Block setting except permission for external agent (#1855)
1 parent 44b85c0 commit e3dce83

File tree

2 files changed

+102
-16
lines changed

2 files changed

+102
-16
lines changed

pallets/external-agents/src/lib.rs

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ pub mod pallet {
194194
SecondaryKeyNotAuthorizedForAsset,
195195
/// The extrinsic expected a different `AuthorizationType` than what the `data.auth_type()` is.
196196
BadAuthorizationType,
197+
/// Except `ExtrinsicPermissions` are not allowed for external agents.
198+
ExceptPermissionsNotAllowed,
197199
}
198200

199201
#[pallet::call]
@@ -402,16 +404,45 @@ impl<T: Config> Pallet<T> {
402404
fn base_create_group(
403405
origin: OriginFor<T>,
404406
asset_id: AssetId,
405-
perms: ExtrinsicPermissions,
407+
extrinsics_permissions: ExtrinsicPermissions,
406408
) -> Result<(IdentityId, AGId), DispatchError> {
407-
let did = Self::ensure_perms(origin, asset_id)?;
408-
<Identity<T>>::ensure_extrinsic_perms_length_limited(&perms)?;
409409
// Fetch the AG id & advance the sequence.
410-
let id = AGIdSequence::<T>::try_mutate(asset_id, try_next_pre::<T, _>)?;
411-
// Commit & emit.
412-
GroupPermissions::<T>::insert(asset_id, id, perms.clone());
413-
Self::deposit_event(Event::GroupCreated(did.for_event(), asset_id, id, perms));
414-
Ok((did, id))
410+
let ag_id = AGIdSequence::<T>::try_mutate(asset_id, try_next_pre::<T, _>)?;
411+
412+
let caller_did = Self::validate_set_group_permissions(
413+
origin,
414+
asset_id.clone(),
415+
&extrinsics_permissions,
416+
&ag_id,
417+
)?;
418+
419+
GroupPermissions::<T>::insert(asset_id, ag_id, extrinsics_permissions.clone());
420+
Self::deposit_event(Event::GroupCreated(
421+
caller_did.for_event(),
422+
asset_id,
423+
ag_id,
424+
extrinsics_permissions,
425+
));
426+
Ok((caller_did, ag_id))
427+
}
428+
429+
fn validate_set_group_permissions(
430+
origin: OriginFor<T>,
431+
asset_id: AssetId,
432+
extrinsics_permissions: &ExtrinsicPermissions,
433+
ag_id: &AGId,
434+
) -> Result<IdentityId, DispatchError> {
435+
if let ExtrinsicPermissions::Except(_) = extrinsics_permissions {
436+
return Err(Error::<T>::ExceptPermissionsNotAllowed.into());
437+
}
438+
439+
let caller_did = Self::ensure_perms(origin, asset_id)?;
440+
441+
Identity::<T>::ensure_extrinsic_perms_length_limited(extrinsics_permissions)?;
442+
443+
Self::ensure_custom_agent_group_exists(&asset_id, ag_id)?;
444+
445+
Ok(caller_did)
415446
}
416447

417448
fn base_create_group_and_add_auth(
@@ -434,16 +465,23 @@ impl<T: Config> Pallet<T> {
434465
fn base_set_group_permissions(
435466
origin: OriginFor<T>,
436467
asset_id: AssetId,
437-
id: AGId,
438-
perms: ExtrinsicPermissions,
468+
ag_id: AGId,
469+
extrinsics_permissions: ExtrinsicPermissions,
439470
) -> DispatchResult {
440-
let did = Self::ensure_perms(origin, asset_id)?.for_event();
441-
<Identity<T>>::ensure_extrinsic_perms_length_limited(&perms)?;
442-
Self::ensure_custom_agent_group_exists(&asset_id, &id)?;
471+
let caller_did = Self::validate_set_group_permissions(
472+
origin,
473+
asset_id.clone(),
474+
&extrinsics_permissions,
475+
&ag_id,
476+
)?;
443477

444-
// Commit & emit.
445-
GroupPermissions::<T>::insert(asset_id, id, perms.clone());
446-
Self::deposit_event(Event::GroupPermissionsUpdated(did, asset_id, id, perms));
478+
GroupPermissions::<T>::insert(asset_id, ag_id, extrinsics_permissions.clone());
479+
Self::deposit_event(Event::GroupPermissionsUpdated(
480+
caller_did.for_event(),
481+
asset_id,
482+
ag_id,
483+
extrinsics_permissions,
484+
));
447485
Ok(())
448486
}
449487

pallets/runtime/tests/src/external_agents_test.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,3 +422,51 @@ fn atredis_multi_group_perms() {
422422
assert_ok!(set(b));
423423
});
424424
}
425+
426+
#[test]
427+
fn except_permissions_not_allowed() {
428+
ExtBuilder::default().build().execute_with(|| {
429+
let alice = User::new(AccountKeyring::Alice);
430+
let asset_id = create_and_issue_sample_asset(&alice);
431+
432+
let ext_perms = ExtrinsicPermissions::except([PalletPermissions::entire_pallet(
433+
"pallet_external_agent".into(),
434+
)]);
435+
436+
assert_noop!(
437+
ExternalAgents::create_group(alice.origin(), asset_id, ext_perms.clone()),
438+
Error::ExceptPermissionsNotAllowed
439+
);
440+
});
441+
}
442+
443+
#[test]
444+
fn except_permissions_not_allowed_set() {
445+
ExtBuilder::default().build().execute_with(|| {
446+
let alice = User::new(AccountKeyring::Alice);
447+
let asset_id = create_and_issue_sample_asset(&alice);
448+
449+
let ext_perms = ExtrinsicPermissions::these([PalletPermissions::entire_pallet(
450+
"pallet_external_agent".into(),
451+
)]);
452+
453+
assert_ok!(ExternalAgents::create_group(
454+
alice.origin(),
455+
asset_id,
456+
ext_perms.clone()
457+
),);
458+
459+
let ext_perms = ExtrinsicPermissions::except([PalletPermissions::entire_pallet(
460+
"pallet_external_agent".into(),
461+
)]);
462+
assert_noop!(
463+
ExternalAgents::set_group_permissions(
464+
alice.origin(),
465+
asset_id,
466+
AGIdSequence::get(asset_id),
467+
ext_perms.clone()
468+
),
469+
Error::ExceptPermissionsNotAllowed
470+
);
471+
});
472+
}

0 commit comments

Comments
 (0)