From 74581363b3db5a2f3d8980ce667b098a95013c7c Mon Sep 17 00:00:00 2001 From: Daniel Larimer Date: Thu, 20 Jul 2017 14:33:10 -0400 Subject: [PATCH] fix Name to string conversion, add new WASM hooks to test for notify and auth --- libraries/chain/chain_controller.cpp | 2 +- .../eos/chain/message_handling_contexts.hpp | 2 ++ libraries/chain/message_handling_contexts.cpp | 20 +++++++++++++++++-- libraries/chain/wasm_interface.cpp | 7 +++++++ libraries/types/include/eos/types/native.hpp | 2 +- 5 files changed, 29 insertions(+), 4 deletions(-) diff --git a/libraries/chain/chain_controller.cpp b/libraries/chain/chain_controller.cpp index 1c5c7dc4d..7c2506616 100644 --- a/libraries/chain/chain_controller.cpp +++ b/libraries/chain/chain_controller.cpp @@ -607,7 +607,7 @@ void chain_controller::process_message( const Transaction& trx, const Message& m apply_message(apply_ctx); for (const auto& recipient : message.recipients) { - if( recipient == message.code ) continue; /// we already ran it above + FC_ASSERT( recipient != message.code, "message::code handler is always called and shouldn't be included in recipient list" ); try { apply_context recipient_ctx(*this,_db, trx, message, recipient); validate_message_precondition(recipient_ctx); diff --git a/libraries/chain/include/eos/chain/message_handling_contexts.hpp b/libraries/chain/include/eos/chain/message_handling_contexts.hpp index f5aad4b2d..5cffdea7a 100644 --- a/libraries/chain/include/eos/chain/message_handling_contexts.hpp +++ b/libraries/chain/include/eos/chain/message_handling_contexts.hpp @@ -30,6 +30,8 @@ public: void require_authorization(const types::AccountName& account); void require_scope(const types::AccountName& account)const; void require_recipient(const types::AccountName& account)const; + bool has_recipient( const types::AccountName& account )const; + bool has_authorization( const types::AccountName& account )const; bool all_authorizations_used() const; const chain_controller& controller; diff --git a/libraries/chain/message_handling_contexts.cpp b/libraries/chain/message_handling_contexts.cpp index 7ce12d237..3bf70f3d9 100644 --- a/libraries/chain/message_handling_contexts.cpp +++ b/libraries/chain/message_handling_contexts.cpp @@ -8,6 +8,15 @@ namespace eos { namespace chain { +bool message_validate_context::has_authorization(const types::AccountName& account)const { + + auto itr = boost::find_if(msg.authorization, [&account](const types::AccountPermission& ap) { + return ap.account == account; + }); + return itr != msg.authorization.end(); + +} + void message_validate_context::require_authorization(const types::AccountName& account) { auto itr = boost::find_if(msg.authorization, [&account](const types::AccountPermission& ap) { @@ -29,12 +38,19 @@ void message_validate_context::require_scope(const types::AccountName& account)c "Required scope ${scope} not declared by transaction", ("scope",account) ); } -void message_validate_context::require_recipient(const types::AccountName& account)const { +bool message_validate_context::has_recipient( const types::AccountName& account )const { + if( msg.code == account ) return true; + auto itr = boost::find_if(msg.recipients, [&account](const auto& recipient) { return recipient == account; }); - EOS_ASSERT( itr != msg.recipients.end(), tx_missing_recipient, + return itr != msg.recipients.end(); +} + +void message_validate_context::require_recipient(const types::AccountName& account)const { + + EOS_ASSERT( has_recipient( account ), tx_missing_recipient, "Required recipient ${recipient} not declared by message", ("recipient",account)("recipients",msg.recipients) ); } diff --git a/libraries/chain/wasm_interface.cpp b/libraries/chain/wasm_interface.cpp index cffdc9277..2ab38787f 100644 --- a/libraries/chain/wasm_interface.cpp +++ b/libraries/chain/wasm_interface.cpp @@ -149,6 +149,13 @@ DEFINE_INTRINSIC_FUNCTION1(env,requireNotice,requireNotice,none,i64,account) { wasm_interface::get().current_validate_context->require_recipient( account ); } +DEFINE_INTRINSIC_FUNCTION1(env,hasRecipient,hasRecipient,i32,i64,account) { + return wasm_interface::get().current_validate_context->has_recipient( account ); +} +DEFINE_INTRINSIC_FUNCTION1(env,hasAuth,hasAuth,i32,i64,account) { + return wasm_interface::get().current_validate_context->has_authorization( account ); +} + DEFINE_INTRINSIC_FUNCTION1(env,requireScope,requireScope,none,i64,scope) { wasm_interface::get().current_validate_context->require_scope( scope ); } diff --git a/libraries/types/include/eos/types/native.hpp b/libraries/types/include/eos/types/native.hpp index 8f8f2599d..152827e9e 100644 --- a/libraries/types/include/eos/types/native.hpp +++ b/libraries/types/include/eos/types/native.hpp @@ -62,7 +62,7 @@ namespace eos { namespace types { if( c >= 'a' && c <= 'z' ) return (c - 'a') + 1; if( c >= '1' && c <= '5' ) - return (c - '1') + 26; + return (c - '1') + 27; return 0; } -- GitLab