From c67c676641437f1564cd81bc2fc39a0045a80300 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Mon, 17 Sep 2018 12:46:08 -0500 Subject: [PATCH] Add wildcard support of receiver --- plugins/mongo_db_plugin/mongo_db_plugin.cpp | 58 ++++++++++++--------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/plugins/mongo_db_plugin/mongo_db_plugin.cpp b/plugins/mongo_db_plugin/mongo_db_plugin.cpp index ea3a4a247..e335eb0f7 100644 --- a/plugins/mongo_db_plugin/mongo_db_plugin.cpp +++ b/plugins/mongo_db_plugin/mongo_db_plugin.cpp @@ -53,11 +53,16 @@ struct filter_entry { name receiver; name action; name actor; - std::tuple key() const { - return std::make_tuple(receiver, action, actor); - } + friend bool operator<( const filter_entry& a, const filter_entry& b ) { - return a.key() < b.key(); + return std::tie( a.receiver, a.action, a.actor ) < std::tie( b.receiver, b.action, b.actor ); + } + + // receiver action actor + bool match( const name& rr, const name& an, const name& ar ) const { + return (receiver.value == 0 || receiver == rr) && + (action.value == 0 || action == an) && + (actor.value == 0 || actor == ar); } }; @@ -214,32 +219,41 @@ const std::string mongo_db_plugin_impl::account_controls_col = "account_controls bool mongo_db_plugin_impl::filter_include( const chain::action_trace& action_trace ) const { bool include = false; - if( filter_on_star || - filter_on.find( {action_trace.receipt.receiver, 0, 0} ) != filter_on.end() || - filter_on.find( {action_trace.receipt.receiver, action_trace.act.name, 0} ) != filter_on.end() ) { + if( filter_on_star ) { include = true; } else { - for( const auto& a : action_trace.act.authorization ) { - if( filter_on.find( {action_trace.receipt.receiver, 0, a.actor} ) != filter_on.end() || - filter_on.find( {action_trace.receipt.receiver, action_trace.act.name, a.actor} ) != filter_on.end() ) { - include = true; - break; + auto itr = std::find_if( filter_on.cbegin(), filter_on.cend(), [&action_trace]( const auto& filter ) { + return filter.match( action_trace.receipt.receiver, action_trace.act.name, 0 ); + } ); + if( itr != filter_on.cend() ) { + include = true; + } else { + for( const auto& a : action_trace.act.authorization ) { + auto itr = std::find_if( filter_on.cbegin(), filter_on.cend(), [&action_trace, &a]( const auto& filter ) { + return filter.match( action_trace.receipt.receiver, action_trace.act.name, a.actor ); + } ); + if( itr != filter_on.cend() ) { + include = true; + break; + } } } } if( !include ) { return false; } - if( filter_out.find( {action_trace.receipt.receiver, 0, 0} ) != filter_out.end() || - filter_out.find( {action_trace.receipt.receiver, action_trace.act.name, 0} ) != filter_out.end() ) { - return false; - } + auto itr = std::find_if( filter_out.cbegin(), filter_out.cend(), [&action_trace]( const auto& filter ) { + return filter.match( action_trace.receipt.receiver, action_trace.act.name, 0 ); + } ); + if( itr != filter_out.cend() ) { return false; } + for( const auto& a : action_trace.act.authorization ) { - if( filter_out.find( {action_trace.receipt.receiver, 0, a.actor} ) != filter_out.end() || - filter_out.find( {action_trace.receipt.receiver, action_trace.act.name, a.actor} ) != filter_out.end() ) { - return false; - } + auto itr = std::find_if( filter_out.cbegin(), filter_out.cend(), [&action_trace, &a]( const auto& filter ) { + return filter.match( action_trace.receipt.receiver, action_trace.act.name, a.actor ); + } ); + if( itr != filter_out.cend() ) { return false; } } + return true; } @@ -1489,8 +1503,6 @@ void mongo_db_plugin::plugin_initialize(const variables_map& options) boost::split( v, s, boost::is_any_of( ":" )); EOS_ASSERT( v.size() == 3, fc::invalid_arg_exception, "Invalid value ${s} for --mongodb-filter-on", ("s", s)); filter_entry fe{v[0], v[1], v[2]}; - EOS_ASSERT( fe.receiver.value, fc::invalid_arg_exception, - "Invalid value ${s} for --mongodb-filter-on", ("s", s)); my->filter_on.insert( fe ); } } else { @@ -1503,8 +1515,6 @@ void mongo_db_plugin::plugin_initialize(const variables_map& options) boost::split( v, s, boost::is_any_of( ":" )); EOS_ASSERT( v.size() == 3, fc::invalid_arg_exception, "Invalid value ${s} for --mongodb-filter-out", ("s", s)); filter_entry fe{v[0], v[1], v[2]}; - EOS_ASSERT( fe.receiver.value, fc::invalid_arg_exception, - "Invalid value ${s} for --mongodb-filter-out", ("s", s)); my->filter_out.insert( fe ); } } -- GitLab