diff --git a/pallets/duniter-wot/src/lib.rs b/pallets/duniter-wot/src/lib.rs index ff541ca4f86c24af84618174970731f6403b6ea3..22669612004c9d49bbe6f43eebd7f2c77204e99f 100644 --- a/pallets/duniter-wot/src/lib.rs +++ b/pallets/duniter-wot/src/lib.rs @@ -249,7 +249,20 @@ impl<T: Config<I>, I: 'static> pallet_identity::traits::OnIdtyChange<T> for Pall } IdtyEvent::Confirmed => {} IdtyEvent::Validated => {} - IdtyEvent::Removed => {} + IdtyEvent::Removed { status } => { + if status != IdtyStatus::Validated { + if let Err(e) = + <pallet_certification::Pallet<T, I>>::remove_all_certs_received_by( + frame_system::Origin::<T>::Root.into(), + idty_index, + ) + { + sp_std::if_std! { + println!("fail to remove certs received by some idty: {:?}", e) + } + } + } + } } 0 } diff --git a/pallets/duniter-wot/src/tests.rs b/pallets/duniter-wot/src/tests.rs index 2aab1f4c8e3bcef4fec23b329097d2bed057407d..7bff9e19f9a86fe1cff5cb0d988f5837adc4170c 100644 --- a/pallets/duniter-wot/src/tests.rs +++ b/pallets/duniter-wot/src/tests.rs @@ -287,3 +287,25 @@ fn test_idty_membership_expire_them_requested() { ); }); } + +#[test] +fn test_unvalidated_idty_certs_removal() { + new_test_ext(5, 2).execute_with(|| { + // Alice creates Ferdie identity + run_to_block(2); + assert_ok!(Identity::create_identity(Origin::signed(1), 6)); + + // Ferdie confirms his identity + run_to_block(3); + assert_ok!(Identity::confirm_identity( + Origin::signed(6), + IdtyName::from("Ferdie"), + )); + + // After PendingMembershipPeriod, Ferdie identity should expire + // and his received certifications should be removed + assert_eq!(Cert::certs_by_receiver(6).len(), 1); + run_to_block(6); + assert_eq!(Cert::certs_by_receiver(6).len(), 0); + }); +} diff --git a/pallets/identity/src/lib.rs b/pallets/identity/src/lib.rs index 87d607cb95fde1ce9f5dafa4f3788f25e09f36ac..79fedb652c08af1808ce19054acb9960bd8628d2 100644 --- a/pallets/identity/src/lib.rs +++ b/pallets/identity/src/lib.rs @@ -525,7 +525,12 @@ pub mod pallet { Identities::<T>::remove(idty_index); frame_system::Pallet::<T>::dec_sufficients(&idty_val.owner_key); Self::deposit_event(Event::IdtyRemoved { idty_index }); - T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Removed); + T::OnIdtyChange::on_idty_change( + idty_index, + IdtyEvent::Removed { + status: idty_val.status, + }, + ); } 0 } diff --git a/pallets/identity/src/types.rs b/pallets/identity/src/types.rs index 456cf3023c6ebd517c5d9b8b8bf8969abf0dc967..529fb0babe1f01c91b496a62499a1c70d9f35b5a 100644 --- a/pallets/identity/src/types.rs +++ b/pallets/identity/src/types.rs @@ -27,7 +27,7 @@ pub enum IdtyEvent<T: crate::Config> { Created { creator: T::IdtyIndex }, Confirmed, Validated, - Removed, + Removed { status: IdtyStatus }, } #[derive(Encode, Decode, Default, Clone, PartialEq, Eq, PartialOrd, Ord, RuntimeDebug)]