Merge pull request #2823

0d149f70 Add out-of-bound exceptions and handle them in RPC (Michał Sałaban)
This commit is contained in:
Riccardo Spagni 2017-11-25 19:53:11 +02:00
commit 4c90d638bc
No known key found for this signature in database
GPG Key ID: 55432DF31CCD4FCD
3 changed files with 47 additions and 27 deletions

View File

@ -699,8 +699,7 @@ void wallet2::add_subaddress_account(const std::string& label)
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
void wallet2::add_subaddress(uint32_t index_major, const std::string& label) void wallet2::add_subaddress(uint32_t index_major, const std::string& label)
{ {
if (index_major >= m_subaddress_labels.size()) THROW_WALLET_EXCEPTION_IF(index_major >= m_subaddress_labels.size(), error::account_index_outofbound);
throw std::runtime_error("index_major is out of bound");
uint32_t index_minor = (uint32_t)get_num_subaddresses(index_major); uint32_t index_minor = (uint32_t)get_num_subaddresses(index_major);
expand_subaddresses({index_major, index_minor}); expand_subaddresses({index_major, index_minor});
m_subaddress_labels[index_major][index_minor] = label; m_subaddress_labels[index_major][index_minor] = label;
@ -756,9 +755,8 @@ std::string wallet2::get_subaddress_label(const cryptonote::subaddress_index& in
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
void wallet2::set_subaddress_label(const cryptonote::subaddress_index& index, const std::string &label) void wallet2::set_subaddress_label(const cryptonote::subaddress_index& index, const std::string &label)
{ {
if (index.major >= m_subaddress_labels.size() || index.minor >= m_subaddress_labels[index.major].size()) THROW_WALLET_EXCEPTION_IF(index.major >= m_subaddress_labels.size(), error::account_index_outofbound);
MERROR("Subaddress index is out of bounds. Failed to set subaddress label."); THROW_WALLET_EXCEPTION_IF(index.minor >= m_subaddress_labels[index.major].size(), error::address_index_outofbound);
else
m_subaddress_labels[index.major][index.minor] = label; m_subaddress_labels[index.major][index.minor] = label;
} }
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------

View File

@ -269,6 +269,28 @@ namespace tools
} }
}; };
//---------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------------------------------------
struct index_outofbound : public wallet_logic_error
{
explicit index_outofbound(std::string&& loc, const std::string& message)
: wallet_logic_error(std::move(loc), message)
{
}
};
struct account_index_outofbound : public index_outofbound
{
explicit account_index_outofbound(std::string&& loc)
: index_outofbound(std::move(loc), "account index is out of bound")
{
}
};
struct address_index_outofbound: public index_outofbound
{
explicit address_index_outofbound(std::string&& loc)
: index_outofbound(std::move(loc), "address index is out of bound")
{
}
};
//----------------------------------------------------------------------------------------------------
struct acc_outs_lookup_error : public refresh_error struct acc_outs_lookup_error : public refresh_error
{ {
explicit acc_outs_lookup_error(std::string&& loc, const cryptonote::transaction& tx, explicit acc_outs_lookup_error(std::string&& loc, const cryptonote::transaction& tx,

View File

@ -378,27 +378,23 @@ namespace tools
bool wallet_rpc_server::on_create_address(const wallet_rpc::COMMAND_RPC_CREATE_ADDRESS::request& req, wallet_rpc::COMMAND_RPC_CREATE_ADDRESS::response& res, epee::json_rpc::error& er) bool wallet_rpc_server::on_create_address(const wallet_rpc::COMMAND_RPC_CREATE_ADDRESS::request& req, wallet_rpc::COMMAND_RPC_CREATE_ADDRESS::response& res, epee::json_rpc::error& er)
{ {
if (!m_wallet) return not_open(er); if (!m_wallet) return not_open(er);
try
{
m_wallet->add_subaddress(req.account_index, req.label); m_wallet->add_subaddress(req.account_index, req.label);
res.address_index = m_wallet->get_num_subaddresses(req.account_index) - 1; res.address_index = m_wallet->get_num_subaddresses(req.account_index) - 1;
res.address = m_wallet->get_subaddress_as_str({req.account_index, res.address_index}); res.address = m_wallet->get_subaddress_as_str({req.account_index, res.address_index});
}
catch (const std::exception& e)
{
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
return false;
}
return true; return true;
} }
//------------------------------------------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server::on_label_address(const wallet_rpc::COMMAND_RPC_LABEL_ADDRESS::request& req, wallet_rpc::COMMAND_RPC_LABEL_ADDRESS::response& res, epee::json_rpc::error& er) bool wallet_rpc_server::on_label_address(const wallet_rpc::COMMAND_RPC_LABEL_ADDRESS::request& req, wallet_rpc::COMMAND_RPC_LABEL_ADDRESS::response& res, epee::json_rpc::error& er)
{ {
if (!m_wallet) return not_open(er); if (!m_wallet) return not_open(er);
if (req.index.major >= m_wallet->get_num_subaddress_accounts())
{
er.code = WALLET_RPC_ERROR_CODE_ACCOUNT_INDEX_OUTOFBOUND;
er.message = "Account index is out of bound";
return false;
}
if (req.index.minor >= m_wallet->get_num_subaddresses(req.index.major))
{
er.code = WALLET_RPC_ERROR_CODE_ADDRESS_INDEX_OUTOFBOUND;
er.message = "Address index is out of bound";
return false;
}
try try
{ {
m_wallet->set_subaddress_label(req.index, req.label); m_wallet->set_subaddress_label(req.index, req.label);
@ -460,12 +456,6 @@ namespace tools
bool wallet_rpc_server::on_label_account(const wallet_rpc::COMMAND_RPC_LABEL_ACCOUNT::request& req, wallet_rpc::COMMAND_RPC_LABEL_ACCOUNT::response& res, epee::json_rpc::error& er) bool wallet_rpc_server::on_label_account(const wallet_rpc::COMMAND_RPC_LABEL_ACCOUNT::request& req, wallet_rpc::COMMAND_RPC_LABEL_ACCOUNT::response& res, epee::json_rpc::error& er)
{ {
if (!m_wallet) return not_open(er); if (!m_wallet) return not_open(er);
if (req.account_index >= m_wallet->get_num_subaddress_accounts())
{
er.code = WALLET_RPC_ERROR_CODE_ACCOUNT_INDEX_OUTOFBOUND;
er.message = "Account index is out of bound";
return false;
}
try try
{ {
m_wallet->set_subaddress_label({req.account_index, 0}, req.label); m_wallet->set_subaddress_label({req.account_index, 0}, req.label);
@ -2325,6 +2315,16 @@ namespace tools
er.code = WALLET_RPC_ERROR_CODE_INVALID_PASSWORD; er.code = WALLET_RPC_ERROR_CODE_INVALID_PASSWORD;
er.message = "Invalid password."; er.message = "Invalid password.";
} }
catch (const error::account_index_outofbound& e)
{
er.code = WALLET_RPC_ERROR_CODE_ACCOUNT_INDEX_OUTOFBOUND;
er.message = e.what();
}
catch (const error::address_index_outofbound& e)
{
er.code = WALLET_RPC_ERROR_CODE_ADDRESS_INDEX_OUTOFBOUND;
er.message = e.what();
}
catch (const std::exception& e) catch (const std::exception& e)
{ {
er.code = default_error_code; er.code = default_error_code;