Skip to content

Commit

Permalink
Simplewallet improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
Antonio Juarez committed Apr 14, 2015
1 parent e15c015 commit 89271f5
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 77 deletions.
148 changes: 78 additions & 70 deletions src/simplewallet/simplewallet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,17 @@ struct TransferCommand {
}
};

std::error_code initAndLoadWallet(IWallet& wallet, std::istream& walletFile, const std::string& password) {
WalletHelper::InitWalletResultObserver initObserver;
std::future<std::error_code> 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<IWallet>& wallet, const std::string& walletFile, const std::string& password) {
std::string keys_file, walletFileName;
Expand All @@ -280,20 +291,25 @@ std::string tryToOpenWalletOrLoadKeysOrThrow(std::unique_ptr<IWallet>& 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<std::error_code> 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) {
Expand All @@ -302,20 +318,17 @@ std::string tryToOpenWalletOrLoadKeysOrThrow(std::unique_ptr<IWallet>& 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());
}

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<std::error_code> f_saveError = saveObserver.saveResult.get_future();
wallet->addObserver(&saveObserver);
Expand All @@ -324,54 +337,53 @@ std::string tryToOpenWalletOrLoadKeysOrThrow(std::unique_ptr<IWallet>& 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");

WalletHelper::InitWalletResultObserver initObserver;
std::future<std::error_code> 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());
}
} 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");

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<std::error_code> 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");
}
WalletHelper::InitWalletResultObserver initObserver;
std::future<std::error_code> 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_GREEN("Stored ok", LOG_LEVEL_0);
return walletFileName;
} else { //no wallet no keys
throw std::runtime_error("walletfile not found");
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<std::error_code> 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");
}
}

Expand Down Expand Up @@ -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;
}
Expand All @@ -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<<std::endl;
std::cout << "Unknown command: " << c <<std::endl;
} else {
break;
}
Expand All @@ -473,13 +484,17 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
}

std::cout << "Specify wallet file name (e.g., wallet.bin).\n";
std::cout << "Wallet file name: ";
std::string userInput;
do {
std::cout << "Wallet file name: ";
std::getline(std::cin, userInput);
userInput = string_tools::trim(userInput);
} while (userInput.empty());

if (c == 'g' || c == 'G') {
std::getline(std::cin, m_generate_new);
m_generate_new = string_tools::trim(m_generate_new);
m_generate_new = userInput;
} else {
std::getline(std::cin, m_wallet_file_arg);
m_wallet_file_arg = string_tools::trim(m_wallet_file_arg);
m_wallet_file_arg = userInput;
}
}

Expand All @@ -488,21 +503,15 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
return false;
}

std::string keys_file, walletFileName;
std::string walletFileName;
if (!m_generate_new.empty()) {
WalletHelper::prepareFileNames(m_generate_new, keys_file, walletFileName);
std::string ignoredString;
WalletHelper::prepareFileNames(m_generate_new, ignoredString, walletFileName);
boost::system::error_code ignore;
bool keysExists = boost::filesystem::exists(keys_file, ignore);
bool walletExists = boost::filesystem::exists(walletFileName, ignore);
if (walletExists) {
if (boost::filesystem::exists(walletFileName, ignore)) {
fail_msg_writer() << walletFileName << " already exists";
return false;
}

if (keysExists) {
fail_msg_writer() << "keys file found: "<< keys_file<< " you should probably try to load existing wallet";
return false;
}
}

if (m_daemon_host.empty())
Expand Down Expand Up @@ -560,7 +569,6 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)

message_writer(epee::log_space::console_color_white, true) << "Opened wallet: " << m_wallet->getAddress();


success_msg_writer() <<
"**********************************************************************\n" <<
"Use \"help\" command to see the list of available commands.\n" <<
Expand Down
16 changes: 9 additions & 7 deletions src/wallet/WalletHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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";
}
}

0 comments on commit 89271f5

Please sign in to comment.