rbac9 - wallet and db api changes

This commit is contained in:
sierra19XX 2020-06-03 08:58:18 +00:00
parent 4c2ea61c48
commit c43ff2e53d
5 changed files with 397 additions and 4 deletions

View file

@ -184,6 +184,14 @@ class database_api_impl : public std::enable_shared_from_this<database_api_impl>
// gpos
gpos_info get_gpos_info(const account_id_type account) const;
// rbac
vector<custom_permission_object> get_custom_permissions(const account_id_type account) const;
fc::optional<custom_permission_object> get_custom_permission_by_name(const account_id_type account, const string& permission_name) const;
vector<custom_account_authority_object> get_custom_account_authorities(const account_id_type account) const;
vector<custom_account_authority_object> get_custom_account_authorities_by_permission_id(const custom_permission_id_type permission_id) const;
vector<custom_account_authority_object> get_custom_account_authorities_by_permission_name(const account_id_type account, const string& permission_name) const;
vector<authority> get_active_custom_account_authorities_by_operation(const account_id_type account, int operation_type) const;
//private:
const account_object* get_account_from_string( const std::string& name_or_id,
bool throw_if_not_found = true ) const;
@ -2305,6 +2313,118 @@ graphene::app::gpos_info database_api_impl::get_gpos_info(const account_id_type
return result;
}
//////////////////////////////////////////////////////////////////////
// //
// RBAC methods //
// //
//////////////////////////////////////////////////////////////////////
vector<custom_permission_object> database_api::get_custom_permissions(const account_id_type account) const
{
return my->get_custom_permissions(account);
}
vector<custom_permission_object> database_api_impl::get_custom_permissions(const account_id_type account) const
{
const auto& pindex = _db.get_index_type<custom_permission_index>().indices().get<by_account_and_permission>();
auto prange = pindex.equal_range(boost::make_tuple(account));
vector<custom_permission_object> custom_permissions;
for(const custom_permission_object& pobj : boost::make_iterator_range(prange.first, prange.second))
{
custom_permissions.push_back(pobj);
}
return custom_permissions;
}
fc::optional<custom_permission_object> database_api::get_custom_permission_by_name(const account_id_type account, const string& permission_name) const
{
return my->get_custom_permission_by_name(account, permission_name);
}
fc::optional<custom_permission_object> database_api_impl::get_custom_permission_by_name(const account_id_type account, const string& permission_name) const
{
const auto& pindex = _db.get_index_type<custom_permission_index>().indices().get<by_account_and_permission>();
auto prange = pindex.equal_range(boost::make_tuple(account, permission_name));
for(const custom_permission_object& pobj : boost::make_iterator_range(prange.first, prange.second))
{
return pobj;
}
return {};
}
vector<custom_account_authority_object> database_api::get_custom_account_authorities(const account_id_type account) const
{
return my->get_custom_account_authorities(account);
}
vector<custom_account_authority_object> database_api_impl::get_custom_account_authorities(const account_id_type account) const
{
const auto& pindex = _db.get_index_type<custom_permission_index>().indices().get<by_account_and_permission>();
const auto& cindex = _db.get_index_type<custom_account_authority_index>().indices().get<by_permission_and_op>();
vector<custom_account_authority_object> custom_account_auths;
auto prange = pindex.equal_range(boost::make_tuple(account));
for(const custom_permission_object& pobj : boost::make_iterator_range(prange.first, prange.second))
{
auto crange = cindex.equal_range(boost::make_tuple(pobj.id));
for(const custom_account_authority_object& cobj : boost::make_iterator_range(crange.first, crange.second))
{
custom_account_auths.push_back(cobj);
}
}
return custom_account_auths;
}
vector<custom_account_authority_object> database_api::get_custom_account_authorities_by_permission_id(const custom_permission_id_type permission_id) const
{
return my->get_custom_account_authorities_by_permission_id(permission_id);
}
vector<custom_account_authority_object> database_api_impl::get_custom_account_authorities_by_permission_id(const custom_permission_id_type permission_id) const
{
const auto& cindex = _db.get_index_type<custom_account_authority_index>().indices().get<by_permission_and_op>();
vector<custom_account_authority_object> custom_account_auths;
auto crange = cindex.equal_range(boost::make_tuple(permission_id));
for(const custom_account_authority_object& cobj : boost::make_iterator_range(crange.first, crange.second))
{
custom_account_auths.push_back(cobj);
}
return custom_account_auths;
}
vector<custom_account_authority_object> database_api::get_custom_account_authorities_by_permission_name(const account_id_type account, const string& permission_name) const
{
return my->get_custom_account_authorities_by_permission_name(account, permission_name);
}
vector<custom_account_authority_object> database_api_impl::get_custom_account_authorities_by_permission_name(const account_id_type account, const string& permission_name) const
{
vector<custom_account_authority_object> custom_account_auths;
fc::optional<custom_permission_object> pobj = get_custom_permission_by_name(account, permission_name);
if(!pobj)
{
return custom_account_auths;
}
const auto& cindex = _db.get_index_type<custom_account_authority_index>().indices().get<by_permission_and_op>();
auto crange = cindex.equal_range(boost::make_tuple(pobj->id));
for(const custom_account_authority_object& cobj : boost::make_iterator_range(crange.first, crange.second))
{
custom_account_auths.push_back(cobj);
}
return custom_account_auths;
}
vector<authority> database_api::get_active_custom_account_authorities_by_operation(const account_id_type account, int operation_type) const
{
return my->get_active_custom_account_authorities_by_operation(account, operation_type);
}
vector<authority> database_api_impl::get_active_custom_account_authorities_by_operation(const account_id_type account, int operation_type) const
{
operation op;
op.set_which(operation_type);
return _db.get_account_custom_authorities(account, op);
}
//////////////////////////////////////////////////////////////////////
// //
// Private methods //

View file

@ -48,6 +48,9 @@
#include <graphene/chain/witness_object.hpp>
#include <graphene/chain/tournament_object.hpp>
#include <graphene/chain/custom_permission_object.hpp>
#include <graphene/chain/custom_account_authority_object.hpp>
#include <graphene/market_history/market_history_plugin.hpp>
#include <fc/api.hpp>
@ -709,6 +712,18 @@ class database_api
*/
gpos_info get_gpos_info(const account_id_type account) const;
//////////
// RBAC //
//////////
/**
* @return account and custom permissions/account-authorities info
*/
vector<custom_permission_object> get_custom_permissions(const account_id_type account) const;
fc::optional<custom_permission_object> get_custom_permission_by_name(const account_id_type account, const string& permission_name) const;
vector<custom_account_authority_object> get_custom_account_authorities(const account_id_type account) const;
vector<custom_account_authority_object> get_custom_account_authorities_by_permission_id(const custom_permission_id_type permission_id) const;
vector<custom_account_authority_object> get_custom_account_authorities_by_permission_name(const account_id_type account, const string& permission_name) const;
vector<authority> get_active_custom_account_authorities_by_operation(const account_id_type account, int operation_type) const;
private:
@ -848,4 +863,12 @@ FC_API(graphene::app::database_api,
// gpos
(get_gpos_info)
//rbac
(get_custom_permissions)
(get_custom_permission_by_name)
(get_custom_account_authorities)
(get_custom_account_authorities_by_permission_id)
(get_custom_account_authorities_by_permission_name)
(get_active_custom_account_authorities_by_operation)
)

View file

@ -84,15 +84,11 @@ void_result update_custom_account_authority_evaluator::do_evaluate(const custom_
auto valid_to = aobj.valid_to;
if (op.new_valid_from)
{
FC_ASSERT(*op.new_valid_from != aobj.valid_from,
"New valid_from provided is not different from old valid_from");
valid_from = *op.new_valid_from;
}
if (op.new_valid_to)
{
FC_ASSERT(*op.new_valid_to != aobj.valid_to,
"New valid_to provided is not different from old valid_to");
FC_ASSERT(*op.new_valid_to > now, "New valid_to expiry should be in the future");
valid_to = *op.new_valid_to;
}

View file

@ -1895,6 +1895,38 @@ class wallet_api
bool is_gpos,
bool broadcast);
signed_transaction create_custom_permission(string owner,
string permission_name,
authority auth,
bool broadcast = true);
signed_transaction update_custom_permission(string owner,
custom_permission_id_type permission_id,
fc::optional<authority> new_auth,
bool broadcast = true);
signed_transaction delete_custom_permission(string owner,
custom_permission_id_type permission_id,
bool broadcast = true);
signed_transaction create_custom_account_authority(string owner,
custom_permission_id_type permission_id,
int operation_type,
fc::time_point_sec valid_from,
fc::time_point_sec valid_to,
bool broadcast = true);
signed_transaction update_custom_account_authority(string owner,
custom_account_authority_id_type auth_id,
fc::optional<fc::time_point_sec> new_valid_from,
fc::optional<fc::time_point_sec> new_valid_to,
bool broadcast = true);
signed_transaction delete_custom_account_authority(string owner,
custom_account_authority_id_type auth_id,
bool broadcast = true);
vector<custom_permission_object> get_custom_permissions(string owner) const;
fc::optional<custom_permission_object> get_custom_permission_by_name(string owner, string permission_name) const;
vector<custom_account_authority_object> get_custom_account_authorities(string owner) const;
vector<custom_account_authority_object> get_custom_account_authorities_by_permission_id(custom_permission_id_type permission_id) const;
vector<custom_account_authority_object> get_custom_account_authorities_by_permission_name(string owner, string permission_name) const;
vector<authority> get_active_custom_account_authorities_by_operation(string owner, int operation_type) const;
void dbg_make_uia(string creator, string symbol);
void dbg_make_mia(string creator, string symbol);
void dbg_push_blocks( std::string src_filename, uint32_t count );
@ -2157,4 +2189,16 @@ FC_API( graphene::wallet::wallet_api,
(get_all_matched_bets_for_bettor)
(buy_ticket)
(quit)
(create_custom_permission)
(update_custom_permission)
(delete_custom_permission)
(create_custom_account_authority)
(update_custom_account_authority)
(delete_custom_account_authority)
(get_custom_permissions)
(get_custom_permission_by_name)
(get_custom_account_authorities)
(get_custom_account_authorities_by_permission_id)
(get_custom_account_authorities_by_permission_name)
(get_active_custom_account_authorities_by_operation)
)

View file

@ -3242,6 +3242,140 @@ public:
return sign_transaction(tx, broadcast);
}
signed_transaction create_custom_permission(string owner,
string permission_name,
authority auth,
bool broadcast)
{
custom_permission_create_operation create_op;
create_op.owner_account = get_account(owner).id;
create_op.permission_name = permission_name;
create_op.auth = auth;
signed_transaction tx;
tx.operations.push_back(create_op);
set_operation_fees(tx, get_global_properties().parameters.current_fees);
tx.validate();
return sign_transaction(tx, broadcast);
}
signed_transaction update_custom_permission(string owner,
custom_permission_id_type permission_id,
fc::optional<authority> new_auth,
bool broadcast)
{
custom_permission_update_operation update_op;
update_op.owner_account = get_account(owner).id;
update_op.permission_id = permission_id;
update_op.new_auth = new_auth;
signed_transaction tx;
tx.operations.push_back(update_op);
set_operation_fees(tx, get_global_properties().parameters.current_fees);
tx.validate();
return sign_transaction(tx, broadcast);
}
signed_transaction delete_custom_permission(string owner,
custom_permission_id_type permission_id,
bool broadcast)
{
custom_permission_delete_operation delete_op;
delete_op.owner_account = get_account(owner).id;
delete_op.permission_id = permission_id;
signed_transaction tx;
tx.operations.push_back(delete_op);
set_operation_fees(tx, get_global_properties().parameters.current_fees);
tx.validate();
return sign_transaction(tx, broadcast);
}
signed_transaction create_custom_account_authority(string owner,
custom_permission_id_type permission_id,
int operation_type,
fc::time_point_sec valid_from,
fc::time_point_sec valid_to,
bool broadcast)
{
custom_account_authority_create_operation create_op;
create_op.owner_account = get_account(owner).id;
create_op.permission_id = permission_id;
create_op.operation_type = operation_type;
create_op.valid_from = valid_from;
create_op.valid_to = valid_to;
signed_transaction tx;
tx.operations.push_back(create_op);
set_operation_fees(tx, get_global_properties().parameters.current_fees);
tx.validate();
return sign_transaction(tx, broadcast);
}
signed_transaction update_custom_account_authority(string owner,
custom_account_authority_id_type auth_id,
fc::optional<fc::time_point_sec> new_valid_from,
fc::optional<fc::time_point_sec> new_valid_to,
bool broadcast)
{
custom_account_authority_update_operation update_op;
update_op.owner_account = get_account(owner).id;
update_op.auth_id = auth_id;
update_op.new_valid_from = new_valid_from;
update_op.new_valid_to = new_valid_to;
signed_transaction tx;
tx.operations.push_back(update_op);
set_operation_fees(tx, get_global_properties().parameters.current_fees);
tx.validate();
return sign_transaction(tx, broadcast);
}
signed_transaction delete_custom_account_authority(string owner,
custom_account_authority_id_type auth_id,
bool broadcast)
{
custom_account_authority_delete_operation delete_op;
delete_op.owner_account = get_account(owner).id;
delete_op.auth_id = auth_id;
signed_transaction tx;
tx.operations.push_back(delete_op);
set_operation_fees(tx, get_global_properties().parameters.current_fees);
tx.validate();
return sign_transaction(tx, broadcast);
}
vector<custom_permission_object> get_custom_permissions(string owner) const
{
return _remote_db->get_custom_permissions(get_account(owner).id);
}
fc::optional<custom_permission_object> get_custom_permission_by_name(string owner, string permission_name) const
{
return _remote_db->get_custom_permission_by_name(get_account(owner).id, permission_name);
}
vector<custom_account_authority_object> get_custom_account_authorities(string owner) const
{
return _remote_db->get_custom_account_authorities(get_account(owner).id);
}
vector<custom_account_authority_object> get_custom_account_authorities_by_permission_id(custom_permission_id_type permission_id) const
{
return _remote_db->get_custom_account_authorities_by_permission_id(permission_id);
}
vector<custom_account_authority_object> get_custom_account_authorities_by_permission_name(string owner, string permission_name) const
{
return _remote_db->get_custom_account_authorities_by_permission_name(get_account(owner).id, permission_name);
}
vector<authority> get_active_custom_account_authorities_by_operation(string owner, int operation_type) const
{
return _remote_db->get_active_custom_account_authorities_by_operation(get_account(owner).id, operation_type);
}
void dbg_make_uia(string creator, string symbol)
{
asset_options opts;
@ -4541,8 +4675,84 @@ signed_transaction wallet_api::approve_proposal(
return my->approve_proposal( fee_paying_account, proposal_id, delta, broadcast );
}
signed_transaction wallet_api::create_custom_permission(string owner,
string permission_name,
authority auth,
bool broadcast)
{
return my->create_custom_permission(owner, permission_name, auth, broadcast);
}
signed_transaction wallet_api::update_custom_permission(string owner,
custom_permission_id_type permission_id,
fc::optional<authority> new_auth,
bool broadcast)
{
return my->update_custom_permission(owner, permission_id, new_auth, broadcast);
}
signed_transaction wallet_api::delete_custom_permission(string owner,
custom_permission_id_type permission_id,
bool broadcast)
{
return my->delete_custom_permission(owner, permission_id, broadcast);
}
signed_transaction wallet_api::create_custom_account_authority(string owner,
custom_permission_id_type permission_id,
int operation_type,
fc::time_point_sec valid_from,
fc::time_point_sec valid_to,
bool broadcast)
{
return my->create_custom_account_authority(owner, permission_id, operation_type, valid_from, valid_to, broadcast);
}
signed_transaction wallet_api::update_custom_account_authority(string owner,
custom_account_authority_id_type auth_id,
fc::optional<fc::time_point_sec> new_valid_from,
fc::optional<fc::time_point_sec> new_valid_to,
bool broadcast)
{
return my->update_custom_account_authority(owner, auth_id, new_valid_from, new_valid_to, broadcast);
}
signed_transaction wallet_api::delete_custom_account_authority(string owner,
custom_account_authority_id_type auth_id,
bool broadcast)
{
return my->delete_custom_account_authority(owner, auth_id, broadcast);
}
vector<custom_permission_object> wallet_api::get_custom_permissions(string owner) const
{
return my->get_custom_permissions(owner);
}
fc::optional<custom_permission_object> wallet_api::get_custom_permission_by_name(string owner, string permission_name) const
{
return my->get_custom_permission_by_name(owner, permission_name);
}
vector<custom_account_authority_object> wallet_api::get_custom_account_authorities(string owner) const
{
return my->get_custom_account_authorities(owner);
}
vector<custom_account_authority_object> wallet_api::get_custom_account_authorities_by_permission_id(custom_permission_id_type permission_id) const
{
return my->get_custom_account_authorities_by_permission_id(permission_id);
}
vector<custom_account_authority_object> wallet_api::get_custom_account_authorities_by_permission_name(string owner, string permission_name) const
{
return my->get_custom_account_authorities_by_permission_name(owner, permission_name);
}
vector<authority> wallet_api::get_active_custom_account_authorities_by_operation(string owner, int operation_type) const
{
return my->get_active_custom_account_authorities_by_operation(owner, operation_type);
}
global_property_object wallet_api::get_global_properties() const
{