diff --git a/libraries/chain/chain_controller.cpp b/libraries/chain/chain_controller.cpp index 1c5c7dc4d10b36513000346cf7e6bfb9c7d66415..7c25066160d43045bf84a59aa00b3c7a8cec2aee 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 f5aad4b2d6fd16f914df161a5a2a88af7bb0ed5d..5cffdea7a2299d87f5140a33671ec18d72a0c683 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 7ce12d23763db8c538a8db7bc651aefebe6e9d43..3bf70f3d94891327dcf0dc41728370118959a093 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 cffdc9277b0469bdc38d467890a1231e4c162233..2ab38787f702be607bb69ea055845956cf40e37a 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 8f8f2599d832355e777968e93ef45dd379351225..152827e9e8fc018d73dde88fa5dc0c83d4397b45 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; }