avoid directly overwriting wallet file
This commit is contained in:
parent
f1fef49373
commit
d3ecbba3d7
1 changed files with 25 additions and 3 deletions
|
|
@ -1100,8 +1100,6 @@ public:
|
||||||
if( wallet_filename == "" )
|
if( wallet_filename == "" )
|
||||||
wallet_filename = _wallet_filename;
|
wallet_filename = _wallet_filename;
|
||||||
|
|
||||||
wlog( "saving wallet to file ${fn}", ("fn", wallet_filename) );
|
|
||||||
|
|
||||||
string data = fc::json::to_pretty_string( _wallet );
|
string data = fc::json::to_pretty_string( _wallet );
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
@ -1112,14 +1110,38 @@ public:
|
||||||
//
|
//
|
||||||
// http://en.wikipedia.org/wiki/Most_vexing_parse
|
// http://en.wikipedia.org/wiki/Most_vexing_parse
|
||||||
//
|
//
|
||||||
fc::ofstream outfile{ fc::path( wallet_filename ) };
|
std::string tmp_wallet_filename = wallet_filename + ".tmp";
|
||||||
|
fc::ofstream outfile{ fc::path( tmp_wallet_filename ) };
|
||||||
outfile.write( data.c_str(), data.length() );
|
outfile.write( data.c_str(), data.length() );
|
||||||
outfile.flush();
|
outfile.flush();
|
||||||
outfile.close();
|
outfile.close();
|
||||||
|
|
||||||
|
ilog( "saved successfully wallet to tmp file ${fn}", ("fn", tmp_wallet_filename) );
|
||||||
|
|
||||||
|
std::string wallet_file_content;
|
||||||
|
fc::read_file_contents(tmp_wallet_filename, wallet_file_content);
|
||||||
|
|
||||||
|
if (wallet_file_content == data) {
|
||||||
|
dlog( "validated successfully tmp wallet file ${fn}", ("fn", tmp_wallet_filename) );
|
||||||
|
fc::rename( tmp_wallet_filename, wallet_filename );
|
||||||
|
dlog( "renamed successfully tmp wallet file ${fn}", ("fn", tmp_wallet_filename) );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FC_THROW("tmp wallet file cannot be validated ${fn}", ("fn", tmp_wallet_filename) );
|
||||||
|
}
|
||||||
|
|
||||||
|
ilog( "successfully saved wallet to file ${fn}", ("fn", wallet_filename) );
|
||||||
|
|
||||||
disable_umask_protection();
|
disable_umask_protection();
|
||||||
}
|
}
|
||||||
catch(...)
|
catch(...)
|
||||||
{
|
{
|
||||||
|
string ws_password = _wallet.ws_password;
|
||||||
|
_wallet.ws_password = "";
|
||||||
|
elog("wallet file content is: ${data}", ("data", fc::json::to_pretty_string( _wallet ) ) );
|
||||||
|
_wallet.ws_password = ws_password;
|
||||||
|
|
||||||
disable_umask_protection();
|
disable_umask_protection();
|
||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue