Merge pull request #5429

bcb86ae6 wallet_rpc_server: fix inconsistent wallet caches on reload (moneromooo-monero)
This commit is contained in:
Riccardo Spagni 2019-04-16 22:39:37 +02:00
commit 35b3d754e8
No known key found for this signature in database
GPG Key ID: 55432DF31CCD4FCD
3 changed files with 77 additions and 45 deletions

View File

@ -3111,6 +3111,18 @@ namespace tools
er.message = "Invalid filename"; er.message = "Invalid filename";
return false; return false;
} }
if (m_wallet && req.autosave_current)
{
try
{
m_wallet->store();
}
catch (const std::exception& e)
{
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
return false;
}
}
std::string wallet_file = m_wallet_dir + "/" + req.filename; std::string wallet_file = m_wallet_dir + "/" + req.filename;
{ {
po::options_description desc("dummy"); po::options_description desc("dummy");
@ -3141,6 +3153,16 @@ namespace tools
} }
if (m_wallet) if (m_wallet)
delete m_wallet;
m_wallet = wal.release();
return true;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server::on_close_wallet(const wallet_rpc::COMMAND_RPC_CLOSE_WALLET::request& req, wallet_rpc::COMMAND_RPC_CLOSE_WALLET::response& res, epee::json_rpc::error& er, const connection_context *ctx)
{
if (!m_wallet) return not_open(er);
if (req.autosave_current)
{ {
try try
{ {
@ -3151,24 +3173,6 @@ namespace tools
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR); handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
return false; return false;
} }
delete m_wallet;
}
m_wallet = wal.release();
return true;
}
//------------------------------------------------------------------------------------------------------------------------------
bool wallet_rpc_server::on_close_wallet(const wallet_rpc::COMMAND_RPC_CLOSE_WALLET::request& req, wallet_rpc::COMMAND_RPC_CLOSE_WALLET::response& res, epee::json_rpc::error& er, const connection_context *ctx)
{
if (!m_wallet) return not_open(er);
try
{
m_wallet->store();
}
catch (const std::exception& e)
{
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
return false;
} }
delete m_wallet; delete m_wallet;
m_wallet = NULL; m_wallet = NULL;
@ -3385,6 +3389,20 @@ namespace tools
return false; return false;
} }
if (m_wallet && req.autosave_current)
{
try
{
if (!wallet_file.empty())
m_wallet->store();
}
catch (const std::exception &e)
{
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
return false;
}
}
try try
{ {
if (!req.spendkey.empty()) if (!req.spendkey.empty())
@ -3433,19 +3451,7 @@ namespace tools
} }
if (m_wallet) if (m_wallet)
{
try
{
if (!wallet_file.empty())
m_wallet->store();
}
catch (const std::exception &e)
{
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
return false;
}
delete m_wallet; delete m_wallet;
}
m_wallet = wal.release(); m_wallet = wal.release();
res.address = m_wallet->get_account().get_public_address_str(m_wallet->nettype()); res.address = m_wallet->get_account().get_public_address_str(m_wallet->nettype());
return true; return true;
@ -3511,6 +3517,18 @@ namespace tools
return false; return false;
} }
} }
if (m_wallet && req.autosave_current)
{
try
{
m_wallet->store();
}
catch (const std::exception &e)
{
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
return false;
}
}
// process seed_offset if given // process seed_offset if given
{ {
@ -3621,18 +3639,7 @@ namespace tools
} }
if (m_wallet) if (m_wallet)
{
try
{
m_wallet->store();
}
catch (const std::exception &e)
{
handle_rpc_exception(std::current_exception(), er, WALLET_RPC_ERROR_CODE_UNKNOWN_ERROR);
return false;
}
delete m_wallet; delete m_wallet;
}
m_wallet = wal.release(); m_wallet = wal.release();
res.address = m_wallet->get_account().get_public_address_str(m_wallet->nettype()); res.address = m_wallet->get_account().get_public_address_str(m_wallet->nettype());
res.info = "Wallet has been restored successfully."; res.info = "Wallet has been restored successfully.";

View File

@ -2046,10 +2046,12 @@ namespace wallet_rpc
{ {
std::string filename; std::string filename;
std::string password; std::string password;
bool autosave_current;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE(filename) KV_SERIALIZE(filename)
KV_SERIALIZE(password) KV_SERIALIZE(password)
KV_SERIALIZE_OPT(autosave_current, true)
END_KV_SERIALIZE_MAP() END_KV_SERIALIZE_MAP()
}; };
typedef epee::misc_utils::struct_init<request_t> request; typedef epee::misc_utils::struct_init<request_t> request;
@ -2066,7 +2068,10 @@ namespace wallet_rpc
{ {
struct request_t struct request_t
{ {
bool autosave_current;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE_OPT(autosave_current, true)
END_KV_SERIALIZE_MAP() END_KV_SERIALIZE_MAP()
}; };
typedef epee::misc_utils::struct_init<request_t> request; typedef epee::misc_utils::struct_init<request_t> request;
@ -2111,6 +2116,7 @@ namespace wallet_rpc
std::string spendkey; std::string spendkey;
std::string viewkey; std::string viewkey;
std::string password; std::string password;
bool autosave_current;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE_OPT(restore_height, (uint64_t)0) KV_SERIALIZE_OPT(restore_height, (uint64_t)0)
@ -2119,6 +2125,7 @@ namespace wallet_rpc
KV_SERIALIZE(spendkey) KV_SERIALIZE(spendkey)
KV_SERIALIZE(viewkey) KV_SERIALIZE(viewkey)
KV_SERIALIZE(password) KV_SERIALIZE(password)
KV_SERIALIZE_OPT(autosave_current, true)
END_KV_SERIALIZE_MAP() END_KV_SERIALIZE_MAP()
}; };
@ -2144,6 +2151,7 @@ namespace wallet_rpc
std::string seed_offset; std::string seed_offset;
std::string password; std::string password;
std::string language; std::string language;
bool autosave_current;
BEGIN_KV_SERIALIZE_MAP() BEGIN_KV_SERIALIZE_MAP()
KV_SERIALIZE_OPT(restore_height, (uint64_t)0) KV_SERIALIZE_OPT(restore_height, (uint64_t)0)
@ -2152,6 +2160,7 @@ namespace wallet_rpc
KV_SERIALIZE(seed_offset) KV_SERIALIZE(seed_offset)
KV_SERIALIZE(password) KV_SERIALIZE(password)
KV_SERIALIZE(language) KV_SERIALIZE(language)
KV_SERIALIZE_OPT(autosave_current, true)
END_KV_SERIALIZE_MAP() END_KV_SERIALIZE_MAP()
}; };
typedef epee::misc_utils::struct_init<request_t> request; typedef epee::misc_utils::struct_init<request_t> request;

View File

@ -265,7 +265,7 @@ class Wallet(object):
} }
return self.rpc.send_json_rpc_request(query_key) return self.rpc.send_json_rpc_request(query_key)
def restore_deterministic_wallet(self, seed = '', seed_offset = '', filename = '', restore_height = 0, password = '', language = ''): def restore_deterministic_wallet(self, seed = '', seed_offset = '', filename = '', restore_height = 0, password = '', language = '', autosave_current = True):
restore_deterministic_wallet = { restore_deterministic_wallet = {
'method': 'restore_deterministic_wallet', 'method': 'restore_deterministic_wallet',
'params' : { 'params' : {
@ -274,14 +274,15 @@ class Wallet(object):
'seed': seed, 'seed': seed,
'seed_offset': seed_offset, 'seed_offset': seed_offset,
'password': password, 'password': password,
'language': language 'language': language,
'autosave_current': autosave_current,
}, },
'jsonrpc': '2.0', 'jsonrpc': '2.0',
'id': '0' 'id': '0'
} }
return self.rpc.send_json_rpc_request(restore_deterministic_wallet) return self.rpc.send_json_rpc_request(restore_deterministic_wallet)
def generate_from_keys(self, restore_height = 0, filename = "", password = "", address = "", spendkey = "", viewkey = ""): def generate_from_keys(self, restore_height = 0, filename = "", password = "", address = "", spendkey = "", viewkey = "", autosave_current = True):
generate_from_keys = { generate_from_keys = {
'method': 'generate_from_keys', 'method': 'generate_from_keys',
'params' : { 'params' : {
@ -291,16 +292,31 @@ class Wallet(object):
'spendkey': spendkey, 'spendkey': spendkey,
'viewkey': viewkey, 'viewkey': viewkey,
'password': password, 'password': password,
'autosave_current': autosave_current,
}, },
'jsonrpc': '2.0', 'jsonrpc': '2.0',
'id': '0' 'id': '0'
} }
return self.rpc.send_json_rpc_request(generate_from_keys) return self.rpc.send_json_rpc_request(generate_from_keys)
def close_wallet(self): def open_wallet(self, filename, password='', autosave_current = True):
open_wallet = {
'method': 'open_wallet',
'params' : {
'filename': filename,
'password': password,
'autosave_current': autosave_current,
},
'jsonrpc': '2.0',
'id': '0'
}
return self.rpc.send_json_rpc_request(open_wallet)
def close_wallet(self, autosave_current = True):
close_wallet = { close_wallet = {
'method': 'close_wallet', 'method': 'close_wallet',
'params' : { 'params' : {
'autosave_current': autosave_current
}, },
'jsonrpc': '2.0', 'jsonrpc': '2.0',
'id': '0' 'id': '0'