From 12dcd352dba3ce163f4c542cf390da59dcf12fd2 Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Wed, 2 Aug 2017 15:49:35 -0500 Subject: [PATCH] Ref #123: Define/Implement unlinkauth Add an unlinkauth message type which removes a link from a message type to a required authority --- libraries/native_contract/eos_contract.cpp | 11 ++++++++++- .../include/eos/native_contract/eos_contract.hpp | 1 + .../native_contract_chain_initializer.cpp | 1 + libraries/types/types.eos | 5 +++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libraries/native_contract/eos_contract.cpp b/libraries/native_contract/eos_contract.cpp index 13117b56818..d617174980e 100644 --- a/libraries/native_contract/eos_contract.cpp +++ b/libraries/native_contract/eos_contract.cpp @@ -378,7 +378,7 @@ void apply_eos_linkauth(apply_context& context) { if (link) { EOS_ASSERT(link->required_permission != requirement.requirement, message_precondition_exception, - "Attempting to update required authority, but new requirement is same as old."); + "Attempting to update required authority, but new requirement is same as old"); db.modify(*link, [requirement = requirement.requirement](permission_link_object& link) { link.required_permission = requirement; }); @@ -392,5 +392,14 @@ void apply_eos_linkauth(apply_context& context) { } } +void apply_eos_unlinkauth(apply_context& context) { + auto& db = context.mutable_db; + auto unlink = context.msg.as(); + auto linkKey = boost::make_tuple(unlink.account, unlink.code, unlink.type); + auto link = db.find(linkKey); + EOS_ASSERT(link != nullptr, message_precondition_exception, "Attempting to unlink authority, but no link found"); + db.remove(*link); +} + } // namespace eos } // namespace native diff --git a/libraries/native_contract/include/eos/native_contract/eos_contract.hpp b/libraries/native_contract/include/eos/native_contract/eos_contract.hpp index 9866dbd6f4c..e820a6dc9b1 100644 --- a/libraries/native_contract/include/eos/native_contract/eos_contract.hpp +++ b/libraries/native_contract/include/eos/native_contract/eos_contract.hpp @@ -19,6 +19,7 @@ void apply_eos_setproducer(chain::apply_context&); void apply_eos_setproxy(chain::apply_context&); void apply_eos_setcode(chain::apply_context&); void apply_eos_linkauth(chain::apply_context&); +void apply_eos_unlinkauth(chain::apply_context&); } // namespace eos } // namespace native diff --git a/libraries/native_contract/native_contract_chain_initializer.cpp b/libraries/native_contract/native_contract_chain_initializer.cpp index bbf0519ff76..ba5c0bb2e09 100644 --- a/libraries/native_contract/native_contract_chain_initializer.cpp +++ b/libraries/native_contract/native_contract_chain_initializer.cpp @@ -49,6 +49,7 @@ void native_contract_chain_initializer::register_types(chain_controller& chain, SET_APP_HANDLER( eos, eos, setproxy ); SET_APP_HANDLER( eos, eos, setcode ); SET_APP_HANDLER( eos, eos, linkauth ); + SET_APP_HANDLER( eos, eos, unlinkauth ); } std::vector native_contract_chain_initializer::prepare_database(chain_controller& chain, diff --git a/libraries/types/types.eos b/libraries/types/types.eos index 5aaea9332b6..f2f684ee8d6 100644 --- a/libraries/types/types.eos +++ b/libraries/types/types.eos @@ -131,3 +131,8 @@ struct linkauth code AccountName # The contract to require permissions to invoke type FuncName requirement PermissionName # The permission name to require + +struct unlinkauth + account AccountName # The account to require permissions for + code AccountName # The contract to require permissions to invoke + type FuncName