diff --git a/pallets/smith-members/src/lib.rs b/pallets/smith-members/src/lib.rs index 68221c0cf0a1eb848ae6691fa93ef5ce350ab77d..90882404d63c7c417842fb012659dbc67a09f3c2 100644 --- a/pallets/smith-members/src/lib.rs +++ b/pallets/smith-members/src/lib.rs @@ -33,6 +33,7 @@ use frame_support::{ensure, RuntimeDebug}; use frame_system::ensure_signed; use frame_system::pallet_prelude::OriginFor; use sp_runtime::traits::AtLeast32BitUnsigned; +use sp_runtime::traits::IsMember; use sp_std::fmt::Debug; use sp_std::prelude::*; @@ -235,6 +236,8 @@ pub mod pallet { InvitationAlreadyAccepted, /// Invitation of an already known smith is forbidden except if it has been excluded InvitationOfNonExcluded, + /// Invitation of a non-member (of the WoT) is forbidden + InvitationOfNonMember, /// Certification cannot be made on someone who has not accepted an invitation CertificationMustBeAgreed, /// Certification cannot be made on excluded @@ -310,6 +313,10 @@ impl<T: Config> Pallet<T> { Error::<T>::InvitationOfNonExcluded ); } + ensure!( + T::IsWoTMember::is_member(&receiver), + Error::<T>::InvitationOfNonMember + ); Ok(().into()) } diff --git a/pallets/smith-members/src/mock.rs b/pallets/smith-members/src/mock.rs index 09faf0cda805ffffbf1ab41cb70ece216ea59630..c8f70031238194f30bb47906ee228ba29b3a82be 100644 --- a/pallets/smith-members/src/mock.rs +++ b/pallets/smith-members/src/mock.rs @@ -80,7 +80,7 @@ impl frame_system::Config for Runtime { pub struct EveryoneExceptIdZero; impl IsMember<u64> for EveryoneExceptIdZero { fn is_member(member_id: &u64) -> bool { - member_id != &0 + member_id != &0 && member_id != &10 } } diff --git a/pallets/smith-members/src/tests.rs b/pallets/smith-members/src/tests.rs index 0d8eaabd168a6ca0ec7bdc26864f0a91045e163d..caed26b8c17f009badcfa2126d6ebcb1bb2b92f7 100644 --- a/pallets/smith-members/src/tests.rs +++ b/pallets/smith-members/src/tests.rs @@ -464,3 +464,25 @@ fn certifying_on_different_status() { ); }); } + +#[test] +fn invitation_on_non_wot_member() { + new_test_ext(GenesisConfig { + certs_by_receiver: btreemap![ + 1 => vec![2, 3, 4], + 2 => vec![3, 4], + 3 => vec![1, 2], + 4 => vec![], + ], + }) + .execute_with(|| { + // State before + assert_eq!(Smiths::<Runtime>::get(10), None); + + // After invitation + assert_err!( + Pallet::<Runtime>::invite_smith(RuntimeOrigin::signed(1), 10), + Error::<Runtime>::InvitationOfNonMember + ); + }); +}