From 2f97bbaf4dfa5e78c7aa3b2ef7d744c7e15a64d9 Mon Sep 17 00:00:00 2001
From: tuxmain <tuxmain@zettascript.org>
Date: Mon, 13 Jun 2022 09:13:36 +0200
Subject: [PATCH] feat(duniter-wot): remove received certs on unvalidated idty
 removal

---
 pallets/duniter-wot/src/lib.rs   | 15 ++++++++++++++-
 pallets/duniter-wot/src/tests.rs | 22 ++++++++++++++++++++++
 pallets/identity/src/lib.rs      |  7 ++++++-
 pallets/identity/src/types.rs    |  2 +-
 4 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/pallets/duniter-wot/src/lib.rs b/pallets/duniter-wot/src/lib.rs
index ff541ca4f..226696120 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 2aab1f4c8..7bff9e19f 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 87d607cb9..79fedb652 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 456cf3023..529fb0bab 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)]
-- 
GitLab