mirror of
https://github.com/monero-project/monero.git
synced 2024-12-14 20:36:31 +02:00
Add out-of-bound exceptions and handle them in RPC
This commit is contained in:
parent
dc6a8014bd
commit
0d149f708f
@ -644,8 +644,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;
|
||||||
@ -701,9 +700,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;
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
@ -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,
|
||||||
|
@ -376,27 +376,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);
|
||||||
@ -458,12 +454,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);
|
||||||
@ -2041,6 +2031,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;
|
||||||
|
Loading…
Reference in New Issue
Block a user