提交 c67c6766 编写于 作者: K Kevin Heifner

Add wildcard support of receiver

上级 1eb7e9c5
......@@ -53,11 +53,16 @@ struct filter_entry {
name receiver;
name action;
name actor;
std::tuple<name, name, name> 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 );
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册