Skip to content
This repository was archived by the owner on Jul 4, 2022. It is now read-only.

Commit dfa6023

Browse files
Added the IssuerPermissions back to solve an bug (#127)
* Added the IssuerPermissions back to solve an bug Added some unit tests back * initialise_issuer also grant the issuer that access * Added a unit tests that tests the revocation of the topic permissions Added a unit tests that tests force-remove and its revocation of topic permissions
1 parent c98b2c3 commit dfa6023

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed

prml/consortium-permission/src/lib.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,18 @@ pub type Topic = Vec<u8>;
7272
/// Type used for values of corresponding topics.
7373
pub type Value = Vec<u8>;
7474

75+
/// Allows runtime implmentation of issuer configuration.
76+
pub trait IssuerPermissions {
77+
type AccountId;
78+
type Topic;
79+
80+
/// Grants the permission to issue claims for a new topic.
81+
fn grant_issuer_permissions(issuer: &Self::AccountId, topic: &Topic);
82+
83+
/// Revokes the permission to issue claims for a topic.
84+
fn revoke_issuer_permissions(issuer: &Self::AccountId, topic: &Topic);
85+
}
86+
7587
/// The module's config trait.
7688
pub trait Trait: frame_system::Trait {
7789
/// The overarching event type.
@@ -80,6 +92,8 @@ pub trait Trait: frame_system::Trait {
8092
type MaximumTopicSize: Get<usize>;
8193
/// The maximum number of bytes allowed for a value.
8294
type MaximumValueSize: Get<usize>;
95+
/// Provides an interface for setting issuer permissions
96+
type IssuerPermissions: IssuerPermissions<AccountId = <Self as frame_system::Trait>::AccountId, Topic = Topic>;
8397
}
8498

8599
decl_storage! {
@@ -171,6 +185,8 @@ decl_module! {
171185
current_topics.push(topic.clone());
172186
Issuers::<T>::insert(who.clone(), current_topics);
173187

188+
T::IssuerPermissions::grant_issuer_permissions(&who, &topic);
189+
174190
Self::deposit_event(RawEvent::IssuerWithTopicAdded(who, topic));
175191
}
176192

@@ -195,6 +211,8 @@ decl_module! {
195211
Issuers::<T>::insert(who.clone(), current_topics);
196212
}
197213

214+
T::IssuerPermissions::revoke_issuer_permissions(&who, &topic);
215+
198216
Self::deposit_event(RawEvent::IssuerWithTopicRemoved(who, topic));
199217
}
200218

@@ -203,6 +221,14 @@ decl_module! {
203221
/// Requires Root.
204222
pub fn force_remove_issuer(origin, who: T::AccountId) {
205223
ensure_root(origin)?;
224+
225+
// Notify the revocation of all current permissions.
226+
let current_topics = Self::issuers(&who);
227+
for topic in current_topics {
228+
T::IssuerPermissions::revoke_issuer_permissions(&who, &topic);
229+
}
230+
231+
// Remove topics for this issuer.
206232
Issuers::<T>::remove(&who);
207233

208234
Self::deposit_event(RawEvent::IssuerForceRemoved(who));
@@ -270,6 +296,9 @@ impl<T: Trait> Module<T> {
270296
fn initialise_issuers(issuers: &Vec<(T::AccountId, Vec<Topic>)>) {
271297
for (issuer, topics) in issuers {
272298
Issuers::<T>::insert(issuer, topics);
299+
for topic in topics {
300+
T::IssuerPermissions::grant_issuer_permissions(&issuer, &topic);
301+
}
273302
}
274303
}
275304

prml/consortium-permission/src/mock.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,35 @@ pub const ACCESS_TOPIC: &[u8; 6] = b"access";
3636
/// Reserved value for access to submit an extrinsic.
3737
pub const ACCESS_VALUE: u8 = 1;
3838

39+
pub struct IssuerPermissionsMock;
40+
41+
impl IssuerPermissions for IssuerPermissionsMock {
42+
type AccountId = AccountId;
43+
type Topic = Topic;
44+
/// When an issuer is authorized to make claims on the "access" topic, also grant themself the
45+
/// "access" permission.
46+
fn grant_issuer_permissions(issuer: &Self::AccountId, topic: &Topic) {
47+
if *topic == ACCESS_TOPIC {
48+
ConsortiumPermission::do_make_claim(
49+
issuer,
50+
issuer,
51+
ACCESS_TOPIC.to_vec().as_ref(),
52+
vec![ACCESS_VALUE].as_ref(),
53+
);
54+
}
55+
}
56+
/// When an issuer's authority on the "access" topic is revoked, also revoke their self-claimed
57+
/// "access" permission.
58+
fn revoke_issuer_permissions(issuer: &Self::AccountId, topic: &Topic) {
59+
if *topic == ACCESS_TOPIC {
60+
let (claim_issuer, _) = ConsortiumPermission::claim((issuer, ACCESS_TOPIC.to_vec()));
61+
if claim_issuer == *issuer {
62+
ConsortiumPermission::do_revoke_claim(*issuer, ACCESS_TOPIC.to_vec());
63+
}
64+
}
65+
}
66+
}
67+
3968
impl_outer_origin! {
4069
pub enum Origin for Test where system = frame_system {}
4170
}
@@ -88,6 +117,7 @@ impl Trait for Test {
88117
type Event = TestEvent;
89118
type MaximumTopicSize = MaximumTopicSize;
90119
type MaximumValueSize = MaximumValueSize;
120+
type IssuerPermissions = IssuerPermissionsMock;
91121
}
92122

93123
#[derive(Default)]

prml/consortium-permission/src/tests.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,20 @@ fn add_issuer_with_topic_requires_root() {
6161
});
6262
}
6363

64+
#[test]
65+
fn added_issuer_has_access_true() {
66+
ExtBuilder::default()
67+
.topic(ACCESS_TOPIC, true)
68+
.build()
69+
.execute_with(|| {
70+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, BOB, ACCESS_TOPIC.to_vec()));
71+
assert_eq!(
72+
ConsortiumPermission::claim((BOB, ACCESS_TOPIC.to_vec())),
73+
(BOB, vec![ACCESS_VALUE])
74+
);
75+
});
76+
}
77+
6478
#[test]
6579
fn add_issuer_with_topic_rejects_invalid_topics() {
6680
ExtBuilder::default()
@@ -305,6 +319,28 @@ fn remove_issuer_with_topic_emits_events() {
305319
});
306320
}
307321

322+
#[test]
323+
fn removed_issuer_loses_only_self_assigned_access() {
324+
ExtBuilder::default().genesis_topic(ACCESS_TOPIC).build().execute_with(|| {
325+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, ALICE, ACCESS_TOPIC.to_vec()));
326+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, BOB, ACCESS_TOPIC.to_vec()));
327+
328+
// Revoking the "access" authority should also revoke the self-claimed "access" permission.
329+
assert_ok!(ConsortiumPermission::remove_issuer_with_topic(Origin::ROOT, BOB, ACCESS_TOPIC.to_vec()));
330+
assert_eq!(ConsortiumPermission::holder_claims(BOB), Vec::<Topic>::default());
331+
332+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, BOB, ACCESS_TOPIC.to_vec()));
333+
assert_ok!(ConsortiumPermission::make_claim(Origin::signed(ALICE), BOB, ACCESS_TOPIC.to_vec(), vec![ACCESS_VALUE]));
334+
335+
// Since the "access" claim is now made by alice, BOB should keep the access permission even if its
336+
// authority on the "access" topic has been revoked.
337+
assert_ok!(ConsortiumPermission::remove_issuer_with_topic(Origin::ROOT, BOB, ACCESS_TOPIC.to_vec()));
338+
assert_eq!(ConsortiumPermission::claim((BOB, ACCESS_TOPIC.to_vec())), (ALICE, vec![ACCESS_VALUE]) );
339+
340+
});
341+
}
342+
343+
308344
#[test]
309345
fn force_remove_issuer_works() {
310346
ExtBuilder::default()
@@ -342,6 +378,28 @@ fn force_remove_issuer_works() {
342378
});
343379
}
344380

381+
#[test]
382+
fn force_remove_issuer_loses_only_self_assigned_access() {
383+
ExtBuilder::default().genesis_topic(ACCESS_TOPIC).build().execute_with(|| {
384+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, ALICE, ACCESS_TOPIC.to_vec()));
385+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, BOB, ACCESS_TOPIC.to_vec()));
386+
387+
// Force-removing Bob should also revoke his self-claimed "access" permission.
388+
assert_ok!(ConsortiumPermission::force_remove_issuer(Origin::ROOT, BOB));
389+
assert_eq!(ConsortiumPermission::holder_claims(BOB), Vec::<Topic>::default());
390+
391+
assert_ok!(ConsortiumPermission::add_issuer_with_topic(Origin::ROOT, BOB, ACCESS_TOPIC.to_vec()));
392+
assert_ok!(ConsortiumPermission::make_claim(Origin::signed(ALICE), BOB, ACCESS_TOPIC.to_vec(), vec![ACCESS_VALUE]));
393+
394+
// Since the "access" claim is now made by alice, BOB should keep the access permission
395+
// even if he is force_removed
396+
assert_ok!(ConsortiumPermission::force_remove_issuer(Origin::ROOT, BOB));
397+
assert_eq!(ConsortiumPermission::claim((BOB, ACCESS_TOPIC.to_vec())), (ALICE, vec![ACCESS_VALUE]) );
398+
399+
});
400+
}
401+
402+
345403
// Claims
346404
#[test]
347405
fn claim_extrinsics_must_be_signed() {

0 commit comments

Comments
 (0)