diff --git a/pallets/certification/src/lib.rs b/pallets/certification/src/lib.rs index 13209fea45827b47443ec0f59e7fc09ce3091c15..cd09e397aba562bbfef3cae86f0d1087ef7638d1 100644 --- a/pallets/certification/src/lib.rs +++ b/pallets/certification/src/lib.rs @@ -282,8 +282,13 @@ pub mod pallet { ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; + // Verify caller ownership + let issuer_owner_key = + T::OwnerKeyOf::convert(issuer).ok_or(Error::<T>::IssuerNotFound)?; + ensure!(issuer_owner_key == who, DispatchError::BadOrigin); + let block_number = frame_system::pallet::Pallet::<T>::block_number(); - Self::check_cert_allowed(who, issuer, receiver, block_number)?; + Self::check_add_cert(issuer, receiver, block_number)?; Self::do_add_cert(block_number, issuer, receiver); Ok(().into()) @@ -326,37 +331,18 @@ pub mod pallet { receiver: T::IdtyIndex, verify_rules: bool, ) -> DispatchResultWithPostInfo { - // Verify rule (1.) Forbid self cert - ensure!(issuer != receiver, Error::<T>::CannotCertifySelf); - let block_number = frame_system::pallet::Pallet::<T>::block_number(); if verify_rules { - // Verify rule (3.) MinReceivedCertToBeAbleToIssueCert - let issuer_idty_cert_meta = StorageIdtyCertMeta::<T>::get(issuer); - ensure!( - issuer_idty_cert_meta.received_count - >= T::MinReceivedCertToBeAbleToIssueCert::get(), - Error::<T>::NotEnoughCertReceived - ); - - // Verify rule (4.) MaxByIssuer - ensure!( - issuer_idty_cert_meta.issued_count < T::MaxByIssuer::get(), - Error::<T>::IssuedTooManyCert - ); - - // Verify rule (5.) CertPeriod - ensure!( - block_number >= issuer_idty_cert_meta.next_issuable_on, - Error::<T>::NotRespectCertPeriod - ); + // only verify internal rules if asked + Self::check_add_cert_internal(issuer, receiver, block_number)?; }; Self::do_add_cert(block_number, issuer, receiver); Ok(().into()) } + /// perform cert addition or renewal fn do_add_cert(block_number: T::BlockNumber, issuer: T::IdtyIndex, receiver: T::IdtyIndex) { // Write CertsRemovableOn @@ -416,6 +402,7 @@ pub mod pallet { Self::deposit_event(Event::CertRenewed { issuer, receiver }); }; } + /// remove the certifications due to expire on the given block // (run at on_initialize step) fn prune_certifications(block_number: T::BlockNumber) -> Weight { @@ -430,6 +417,7 @@ pub mod pallet { total_weight } + /// perform the certification removal /// if block number is given only remove cert if still set to expire at this block number pub fn do_remove_cert( @@ -493,24 +481,19 @@ pub mod pallet { } /// check cert allowed - // first internal checks - // then external checks - fn check_cert_allowed( - caller_key: T::AccountId, + // 1. no self cert + // 2. issuer received cert count + // 3. issuer max emitted cert + // 4. issuer cert period + fn check_add_cert_internal( issuer: T::IdtyIndex, receiver: T::IdtyIndex, block_number: T::BlockNumber, ) -> DispatchResult { - // --- first internal checks // 1. Forbid self cert ensure!(issuer != receiver, Error::<T>::CannotCertifySelf); - // 2. Verify caller ownership - let issuer_owner_key = - T::OwnerKeyOf::convert(issuer).ok_or(Error::<T>::IssuerNotFound)?; - ensure!(issuer_owner_key == caller_key, DispatchError::BadOrigin); - - // 3. Verify rule MinReceivedCertToBeAbleToIssueCert + // 2. Verify rule MinReceivedCertToBeAbleToIssueCert // (this number can differ from the one necessary to be member) let issuer_idty_cert_meta = <StorageIdtyCertMeta<T>>::get(issuer); ensure!( @@ -519,18 +502,32 @@ pub mod pallet { Error::<T>::NotEnoughCertReceived ); - // 4. Verify rule MaxByIssuer + // 3. Verify rule MaxByIssuer ensure!( issuer_idty_cert_meta.issued_count < T::MaxByIssuer::get(), Error::<T>::IssuedTooManyCert ); - // 5. Verify rule CertPeriod + // 4. Verify rule CertPeriod ensure!( block_number >= issuer_idty_cert_meta.next_issuable_on, Error::<T>::NotRespectCertPeriod ); + Ok(()) + } + + /// check cert allowed + // first internal checks + // then external checks + fn check_add_cert( + issuer: T::IdtyIndex, + receiver: T::IdtyIndex, + block_number: T::BlockNumber, + ) -> DispatchResult { + // internal checks + Self::check_add_cert_internal(issuer, receiver, block_number)?; + // --- then external checks // - issuer is member // - receiver is confirmed