diff --git a/src/simplewallet/simplewallet.cpp b/src/simplewallet/simplewallet.cpp index 34f703bf..106c9023 100644 --- a/src/simplewallet/simplewallet.cpp +++ b/src/simplewallet/simplewallet.cpp @@ -272,6 +272,17 @@ struct TransferCommand { } }; +std::error_code initAndLoadWallet(IWallet& wallet, std::istream& walletFile, const std::string& password) { + WalletHelper::InitWalletResultObserver initObserver; + std::future f_initError = initObserver.initResult.get_future(); + + wallet.addObserver(&initObserver); + wallet.initAndLoad(walletFile, password); + auto initError = f_initError.get(); + wallet.removeObserver(&initObserver); + + return initError; +} std::string tryToOpenWalletOrLoadKeysOrThrow(std::unique_ptr& wallet, const std::string& walletFile, const std::string& password) { std::string keys_file, walletFileName; @@ -280,20 +291,25 @@ std::string tryToOpenWalletOrLoadKeysOrThrow(std::unique_ptr& wallet, c boost::system::error_code ignore; bool keysExists = boost::filesystem::exists(keys_file, ignore); bool walletExists = boost::filesystem::exists(walletFileName, ignore); + if (!walletExists && !keysExists && boost::filesystem::exists(walletFile, ignore)) { + auto replaceEc = tools::replace_file(walletFile, walletFileName); + if (replaceEc) { + throw std::runtime_error("failed to rename file '" + walletFile + "' to '" + walletFileName + "'"); + } + + walletExists = true; + } if (walletExists) { LOG_PRINT_L0("Loading wallet..."); std::ifstream walletFile; walletFile.open(walletFileName, std::ios_base::binary | std::ios_base::in); - if (walletFile.fail()) - throw std::runtime_error("error opening walletfile"); + if (walletFile.fail()) { + throw std::runtime_error("error opening wallet file '" + walletFileName + "'"); + } + + auto initError = initAndLoadWallet(*wallet, walletFile, password); - WalletHelper::InitWalletResultObserver initObserver; - std::future f_initError = initObserver.initResult.get_future(); - wallet->addObserver(&initObserver); - wallet->initAndLoad(walletFile, password); - auto initError = f_initError.get(); - wallet->removeObserver(&initObserver); walletFile.close(); if (initError) { //bad password, or legacy format if (keysExists) { @@ -302,11 +318,7 @@ std::string tryToOpenWalletOrLoadKeysOrThrow(std::unique_ptr& wallet, c boost::filesystem::rename(keys_file, keys_file + ".back"); boost::filesystem::rename(walletFileName, walletFileName + ".back"); - f_initError = initObserver.initResult.get_future(); - wallet->addObserver(&initObserver); - wallet->initAndLoad(ss, password); - auto initError = f_initError.get(); - wallet->removeObserver(&initObserver); + initError = initAndLoadWallet(*wallet, ss, password); if (initError) { throw std::runtime_error("failed to load wallet: " + initError.message()); } @@ -314,8 +326,9 @@ std::string tryToOpenWalletOrLoadKeysOrThrow(std::unique_ptr& wallet, c LOG_PRINT_L0("Storing wallet..."); std::ofstream walletFile; walletFile.open(walletFileName, std::ios_base::binary | std::ios_base::out | std::ios::trunc); - if (walletFile.fail()) - throw std::runtime_error("error saving walletfile"); + if (walletFile.fail()) { + throw std::runtime_error("error saving wallet file '" + walletFileName + "'"); + } WalletHelper::SaveWalletResultObserver saveObserver; std::future f_saveError = saveObserver.saveResult.get_future(); wallet->addObserver(&saveObserver); @@ -324,54 +337,53 @@ std::string tryToOpenWalletOrLoadKeysOrThrow(std::unique_ptr& wallet, c wallet->removeObserver(&saveObserver); if (saveError) { fail_msg_writer() << "Failed to store wallet: " << saveError.message(); - throw std::runtime_error("error saving walletfile"); + throw std::runtime_error("error saving wallet file '" + walletFileName + "'"); } LOG_PRINT_GREEN("Stored ok", LOG_LEVEL_0); return walletFileName; } else { // no keys, wallet error loading - throw std::runtime_error("can't load walletfile, check password"); + throw std::runtime_error("can't load wallet file '" + walletFileName + "', check password"); } } else { //new wallet ok return walletFileName; } - } else { - if (keysExists) { //wallet not exists but keys presented - std::stringstream ss; - cryptonote::importLegacyKeys(keys_file, password, ss); - boost::filesystem::rename(keys_file, keys_file + ".back"); + } else if (keysExists) { //wallet not exists but keys presented + std::stringstream ss; + cryptonote::importLegacyKeys(keys_file, password, ss); + boost::filesystem::rename(keys_file, keys_file + ".back"); - WalletHelper::InitWalletResultObserver initObserver; - std::future f_initError = initObserver.initResult.get_future(); - wallet->addObserver(&initObserver); - wallet->initAndLoad(ss, password); - auto initError = f_initError.get(); - wallet->removeObserver(&initObserver); - if (initError) { - throw std::runtime_error("failed to load wallet: " + initError.message()); - } - - LOG_PRINT_L0("Storing wallet..."); - std::ofstream walletFile; - walletFile.open(walletFileName, std::ios_base::binary | std::ios_base::out | std::ios::trunc); - if (walletFile.fail()) - throw std::runtime_error("error saving walletfile"); - WalletHelper::SaveWalletResultObserver saveObserver; - std::future f_saveError = saveObserver.saveResult.get_future(); - wallet->addObserver(&saveObserver); - wallet->save(walletFile, false, false); - auto saveError = f_saveError.get(); - wallet->removeObserver(&saveObserver); - if (saveError) { - fail_msg_writer() << "Failed to store wallet: " << saveError.message(); - throw std::runtime_error("error saving walletfile"); - } - - LOG_PRINT_GREEN("Stored ok", LOG_LEVEL_0); - return walletFileName; - } else { //no wallet no keys - throw std::runtime_error("walletfile not found"); + WalletHelper::InitWalletResultObserver initObserver; + std::future f_initError = initObserver.initResult.get_future(); + wallet->addObserver(&initObserver); + wallet->initAndLoad(ss, password); + auto initError = f_initError.get(); + wallet->removeObserver(&initObserver); + if (initError) { + throw std::runtime_error("failed to load wallet: " + initError.message()); } + + LOG_PRINT_L0("Storing wallet..."); + std::ofstream walletFile; + walletFile.open(walletFileName, std::ios_base::binary | std::ios_base::out | std::ios::trunc); + if (walletFile.fail()) { + throw std::runtime_error("error saving wallet file '" + walletFileName + "'"); + } + WalletHelper::SaveWalletResultObserver saveObserver; + std::future f_saveError = saveObserver.saveResult.get_future(); + wallet->addObserver(&saveObserver); + wallet->save(walletFile, false, false); + auto saveError = f_saveError.get(); + wallet->removeObserver(&saveObserver); + if (saveError) { + fail_msg_writer() << "Failed to store wallet: " << saveError.message(); + throw std::runtime_error("error saving wallet file '" + walletFileName + "'"); + } + + LOG_PRINT_GREEN("Stored ok", LOG_LEVEL_0); + return walletFileName; + } else { //no wallet no keys + throw std::runtime_error("wallet file '" + walletFileName + "' is not found"); } } @@ -448,8 +460,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm) { handle_command_line(vm); - if (!m_daemon_address.empty() && !m_daemon_host.empty() && 0 != m_daemon_port) - { + if (!m_daemon_address.empty() && (!m_daemon_host.empty() || 0 != m_daemon_port)) { fail_msg_writer() << "you can't specify daemon host or port several times"; return false; } @@ -462,7 +473,7 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm) std::getline(std::cin, answer); c = answer[0]; if (!(c == 'O' || c == 'G' || c == 'E' || c == 'o' || c == 'g' || c == 'e')) { - std::cout << "Unknown command: " << c<getAddress(); - success_msg_writer() << "**********************************************************************\n" << "Use \"help\" command to see the list of available commands.\n" << diff --git a/src/wallet/WalletHelper.cpp b/src/wallet/WalletHelper.cpp index 80698235..6e5c286e 100755 --- a/src/wallet/WalletHelper.cpp +++ b/src/wallet/WalletHelper.cpp @@ -9,12 +9,14 @@ using namespace epee; void WalletHelper::prepareFileNames(const std::string& file_path, std::string& keys_file, std::string& wallet_file) { - keys_file = file_path; - wallet_file = file_path; - boost::system::error_code e; - if (string_tools::get_extension(keys_file) == "keys") {//provided keys file name - wallet_file = string_tools::cut_off_extension(wallet_file); - } else {//provided wallet file name - keys_file += ".keys"; + if (string_tools::get_extension(file_path) == "wallet") { + keys_file = string_tools::cut_off_extension(file_path) + ".keys"; + wallet_file = file_path; + } else if (string_tools::get_extension(file_path) == "keys") { + keys_file = file_path; + wallet_file = string_tools::cut_off_extension(file_path) + ".wallet"; + } else { + keys_file = file_path + ".keys"; + wallet_file = file_path + ".wallet"; } }