wallet: move some scoped_message_writer calls from the libs

This commit is contained in:
moneromooo-monero 2017-10-28 23:04:24 +01:00
parent e89994e98f
commit 437421ce42
No known key found for this signature in database
GPG Key ID: 686F07454D6CEFC3
6 changed files with 86 additions and 86 deletions

View File

@ -1501,7 +1501,15 @@ bool simple_wallet::init(const boost::program_options::variables_map& vm)
else if (!m_generate_from_json.empty()) else if (!m_generate_from_json.empty())
{ {
m_wallet_file = m_generate_from_json; m_wallet_file = m_generate_from_json;
try
{
m_wallet = tools::wallet2::make_from_json(vm, m_wallet_file, password_prompter); m_wallet = tools::wallet2::make_from_json(vm, m_wallet_file, password_prompter);
}
catch (const std::exception &e)
{
fail_msg_writer() << e.what();
return false;
}
if (!m_wallet) if (!m_wallet)
return false; return false;
} }
@ -5702,6 +5710,7 @@ int main(int argc, char* argv[])
"monero-wallet-cli [--wallet-file=<file>|--generate-new-wallet=<file>] [<COMMAND>]", "monero-wallet-cli [--wallet-file=<file>|--generate-new-wallet=<file>] [<COMMAND>]",
desc_params, desc_params,
positional_options, positional_options,
[](const std::string &s, bool emphasis){ tools::scoped_message_writer(emphasis ? epee::console_color_white : epee::console_color_default, true) << s; },
"monero-wallet-cli.log" "monero-wallet-cli.log"
); );

View File

@ -144,11 +144,8 @@ std::unique_ptr<tools::wallet2> make_basic(const boost::program_options::variabl
auto daemon_host = command_line::get_arg(vm, opts.daemon_host); auto daemon_host = command_line::get_arg(vm, opts.daemon_host);
auto daemon_port = command_line::get_arg(vm, opts.daemon_port); auto daemon_port = command_line::get_arg(vm, opts.daemon_port);
if (!daemon_address.empty() && !daemon_host.empty() && 0 != daemon_port) THROW_WALLET_EXCEPTION_IF(!daemon_address.empty() && !daemon_host.empty() && 0 != daemon_port,
{ tools::error::wallet_internal_error, tools::wallet2::tr("can't specify daemon host or port more than once"));
tools::fail_msg_writer() << tools::wallet2::tr("can't specify daemon host or port more than once");
return nullptr;
}
boost::optional<epee::net_utils::http::login> login{}; boost::optional<epee::net_utils::http::login> login{};
if (command_line::has_arg(vm, opts.daemon_login)) if (command_line::has_arg(vm, opts.daemon_login))
@ -184,8 +181,7 @@ boost::optional<tools::password_container> get_password(const boost::program_opt
{ {
if (command_line::has_arg(vm, opts.password) && command_line::has_arg(vm, opts.password_file)) if (command_line::has_arg(vm, opts.password) && command_line::has_arg(vm, opts.password_file))
{ {
tools::fail_msg_writer() << tools::wallet2::tr("can't specify more than one of --password and --password-file"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("can't specify more than one of --password and --password-file"));
return boost::none;
} }
if (command_line::has_arg(vm, opts.password)) if (command_line::has_arg(vm, opts.password))
@ -198,11 +194,7 @@ boost::optional<tools::password_container> get_password(const boost::program_opt
std::string password; std::string password;
bool r = epee::file_io_utils::load_file_to_string(command_line::get_arg(vm, opts.password_file), bool r = epee::file_io_utils::load_file_to_string(command_line::get_arg(vm, opts.password_file),
password); password);
if (!r) THROW_WALLET_EXCEPTION_IF(!r, tools::error::wallet_internal_error, tools::wallet2::tr("the password file specified could not be read"));
{
tools::fail_msg_writer() << tools::wallet2::tr("the password file specified could not be read");
return boost::none;
}
// Remove line breaks the user might have inserted // Remove line breaks the user might have inserted
boost::trim_right_if(password, boost::is_any_of("\r\n")); boost::trim_right_if(password, boost::is_any_of("\r\n"));
@ -223,22 +215,20 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file,
const auto do_generate = [&]() -> bool { const auto do_generate = [&]() -> bool {
std::string buf; std::string buf;
if (!epee::file_io_utils::load_file_to_string(json_file, buf)) { if (!epee::file_io_utils::load_file_to_string(json_file, buf)) {
tools::fail_msg_writer() << tools::wallet2::tr("Failed to load file ") << json_file; THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, std::string(tools::wallet2::tr("Failed to load file ")) + json_file);
return false; return false;
} }
rapidjson::Document json; rapidjson::Document json;
if (json.Parse(buf.c_str()).HasParseError()) { if (json.Parse(buf.c_str()).HasParseError()) {
tools::fail_msg_writer() << tools::wallet2::tr("Failed to parse JSON"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("Failed to parse JSON"));
return false; return false;
} }
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, version, unsigned, Uint, true, 0); GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, version, unsigned, Uint, true, 0);
const int current_version = 1; const int current_version = 1;
if (field_version > current_version) { THROW_WALLET_EXCEPTION_IF(field_version > current_version, tools::error::wallet_internal_error,
tools::fail_msg_writer() << boost::format(tools::wallet2::tr("Version %u too new, we can only grok up to %u")) % field_version % current_version; ((boost::format(tools::wallet2::tr("Version %u too new, we can only grok up to %u")) % field_version % current_version)).str());
return false;
}
GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, filename, std::string, String, true, std::string()); GET_FIELD_FROM_JSON_RETURN_ON_ERROR(json, filename, std::string, String, true, std::string());
@ -254,14 +244,12 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file,
cryptonote::blobdata viewkey_data; cryptonote::blobdata viewkey_data;
if(!epee::string_tools::parse_hexstr_to_binbuff(field_viewkey, viewkey_data) || viewkey_data.size() != sizeof(crypto::secret_key)) if(!epee::string_tools::parse_hexstr_to_binbuff(field_viewkey, viewkey_data) || viewkey_data.size() != sizeof(crypto::secret_key))
{ {
tools::fail_msg_writer() << tools::wallet2::tr("failed to parse view key secret key"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("failed to parse view key secret key"));
return false;
} }
viewkey = *reinterpret_cast<const crypto::secret_key*>(viewkey_data.data()); viewkey = *reinterpret_cast<const crypto::secret_key*>(viewkey_data.data());
crypto::public_key pkey; crypto::public_key pkey;
if (!crypto::secret_key_to_public_key(viewkey, pkey)) { if (!crypto::secret_key_to_public_key(viewkey, pkey)) {
tools::fail_msg_writer() << tools::wallet2::tr("failed to verify view key secret key"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("failed to verify view key secret key"));
return false;
} }
} }
@ -272,14 +260,12 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file,
cryptonote::blobdata spendkey_data; cryptonote::blobdata spendkey_data;
if(!epee::string_tools::parse_hexstr_to_binbuff(field_spendkey, spendkey_data) || spendkey_data.size() != sizeof(crypto::secret_key)) if(!epee::string_tools::parse_hexstr_to_binbuff(field_spendkey, spendkey_data) || spendkey_data.size() != sizeof(crypto::secret_key))
{ {
tools::fail_msg_writer() << tools::wallet2::tr("failed to parse spend key secret key"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("failed to parse spend key secret key"));
return false;
} }
spendkey = *reinterpret_cast<const crypto::secret_key*>(spendkey_data.data()); spendkey = *reinterpret_cast<const crypto::secret_key*>(spendkey_data.data());
crypto::public_key pkey; crypto::public_key pkey;
if (!crypto::secret_key_to_public_key(spendkey, pkey)) { if (!crypto::secret_key_to_public_key(spendkey, pkey)) {
tools::fail_msg_writer() << tools::wallet2::tr("failed to verify spend key secret key"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("failed to verify spend key secret key"));
return false;
} }
} }
@ -291,8 +277,7 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file,
{ {
if (!crypto::ElectrumWords::words_to_bytes(field_seed, recovery_key, old_language)) if (!crypto::ElectrumWords::words_to_bytes(field_seed, recovery_key, old_language))
{ {
tools::fail_msg_writer() << tools::wallet2::tr("Electrum-style word list failed verification"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("Electrum-style word list failed verification"));
return false;
} }
restore_deterministic_wallet = true; restore_deterministic_wallet = true;
@ -309,13 +294,11 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file,
// compatibility checks // compatibility checks
if (!field_seed_found && !field_viewkey_found && !field_spendkey_found) if (!field_seed_found && !field_viewkey_found && !field_spendkey_found)
{ {
tools::fail_msg_writer() << tools::wallet2::tr("At least one of Electrum-style word list and private view key and private spend key must be specified"); THROW_WALLET_EXCEPTION(tools::wallet2::tr("At least one of Electrum-style word list and private view key and private spend key must be specified"));
return false;
} }
if (field_seed_found && (field_viewkey_found || field_spendkey_found)) if (field_seed_found && (field_viewkey_found || field_spendkey_found))
{ {
tools::fail_msg_writer() << tools::wallet2::tr("Both Electrum-style word list and private key(s) specified"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("Both Electrum-style word list and private key(s) specified"));
return false;
} }
// if an address was given, we check keys against it, and deduce the spend // if an address was given, we check keys against it, and deduce the spend
@ -325,41 +308,34 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file,
cryptonote::address_parse_info info; cryptonote::address_parse_info info;
if(!get_account_address_from_str(info, testnet, field_address)) if(!get_account_address_from_str(info, testnet, field_address))
{ {
tools::fail_msg_writer() << tools::wallet2::tr("invalid address"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("invalid address"));
return false;
} }
if (field_viewkey_found) if (field_viewkey_found)
{ {
crypto::public_key pkey; crypto::public_key pkey;
if (!crypto::secret_key_to_public_key(viewkey, pkey)) { if (!crypto::secret_key_to_public_key(viewkey, pkey)) {
tools::fail_msg_writer() << tools::wallet2::tr("failed to verify view key secret key"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("failed to verify view key secret key"));
return false;
} }
if (info.address.m_view_public_key != pkey) { if (info.address.m_view_public_key != pkey) {
tools::fail_msg_writer() << tools::wallet2::tr("view key does not match standard address"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("view key does not match standard address"));
return false;
} }
} }
if (field_spendkey_found) if (field_spendkey_found)
{ {
crypto::public_key pkey; crypto::public_key pkey;
if (!crypto::secret_key_to_public_key(spendkey, pkey)) { if (!crypto::secret_key_to_public_key(spendkey, pkey)) {
tools::fail_msg_writer() << tools::wallet2::tr("failed to verify spend key secret key"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("failed to verify spend key secret key"));
return false;
} }
if (info.address.m_spend_public_key != pkey) { if (info.address.m_spend_public_key != pkey) {
tools::fail_msg_writer() << tools::wallet2::tr("spend key does not match standard address"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("spend key does not match standard address"));
return false;
} }
} }
} }
const bool deprecated_wallet = restore_deterministic_wallet && ((old_language == crypto::ElectrumWords::old_language_name) || const bool deprecated_wallet = restore_deterministic_wallet && ((old_language == crypto::ElectrumWords::old_language_name) ||
crypto::ElectrumWords::get_is_old_style_seed(field_seed)); crypto::ElectrumWords::get_is_old_style_seed(field_seed));
if (deprecated_wallet) { THROW_WALLET_EXCEPTION_IF(deprecated_wallet, tools::error::wallet_internal_error,
tools::fail_msg_writer() << tools::wallet2::tr("Cannot create deprecated wallets from JSON"); tools::wallet2::tr("Cannot create deprecated wallets from JSON"));
return false;
}
wallet.reset(make_basic(vm, opts, password_prompter).release()); wallet.reset(make_basic(vm, opts, password_prompter).release());
wallet->set_refresh_from_block_height(field_scan_from_height); wallet->set_refresh_from_block_height(field_scan_from_height);
@ -378,8 +354,7 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file,
{ {
cryptonote::account_public_address address; cryptonote::account_public_address address;
if (!crypto::secret_key_to_public_key(viewkey, address.m_view_public_key)) { if (!crypto::secret_key_to_public_key(viewkey, address.m_view_public_key)) {
tools::fail_msg_writer() << tools::wallet2::tr("failed to verify view key secret key"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("failed to verify view key secret key"));
return false;
} }
if (field_spendkey.empty()) if (field_spendkey.empty())
@ -391,8 +366,7 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file,
cryptonote::address_parse_info info; cryptonote::address_parse_info info;
if(!get_account_address_from_str(info, testnet, field_address)) if(!get_account_address_from_str(info, testnet, field_address))
{ {
tools::fail_msg_writer() << tools::wallet2::tr("failed to parse address: ") << field_address; THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, std::string(tools::wallet2::tr("failed to parse address: ")) + field_address);
return false;
} }
address.m_spend_public_key = info.address.m_spend_public_key; address.m_spend_public_key = info.address.m_spend_public_key;
} }
@ -406,8 +380,7 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file,
else else
{ {
if (!crypto::secret_key_to_public_key(spendkey, address.m_spend_public_key)) { if (!crypto::secret_key_to_public_key(spendkey, address.m_spend_public_key)) {
tools::fail_msg_writer() << tools::wallet2::tr("failed to verify spend key secret key"); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, tools::wallet2::tr("failed to verify spend key secret key"));
return false;
} }
wallet->generate(field_filename, field_password, address, spendkey, viewkey); wallet->generate(field_filename, field_password, address, spendkey, viewkey);
} }
@ -415,8 +388,7 @@ std::unique_ptr<tools::wallet2> generate_from_json(const std::string& json_file,
} }
catch (const std::exception& e) catch (const std::exception& e)
{ {
tools::fail_msg_writer() << tools::wallet2::tr("failed to generate new wallet: ") << e.what(); THROW_WALLET_EXCEPTION(tools::error::wallet_internal_error, std::string(tools::wallet2::tr("failed to generate new wallet: ")) + e.what());
return false;
} }
return true; return true;
}; };
@ -6513,16 +6485,12 @@ uint64_t wallet2::import_key_images(const std::string &filename, uint64_t &spent
std::string data; std::string data;
bool r = epee::file_io_utils::load_file_to_string(filename, data); bool r = epee::file_io_utils::load_file_to_string(filename, data);
if (!r) THROW_WALLET_EXCEPTION_IF(!r, error::wallet_internal_error, std::string(tr("failed to read file ")) + filename);
{
fail_msg_writer() << tr("failed to read file ") << filename;
return 0;
}
const size_t magiclen = strlen(KEY_IMAGE_EXPORT_FILE_MAGIC); const size_t magiclen = strlen(KEY_IMAGE_EXPORT_FILE_MAGIC);
if (data.size() < magiclen || memcmp(data.data(), KEY_IMAGE_EXPORT_FILE_MAGIC, magiclen)) if (data.size() < magiclen || memcmp(data.data(), KEY_IMAGE_EXPORT_FILE_MAGIC, magiclen))
{ {
fail_msg_writer() << "Bad key image export file magic in " << filename; THROW_WALLET_EXCEPTION(error::wallet_internal_error, std::string("Bad key image export file magic in ") + filename);
return 0;
} }
try try
@ -6531,31 +6499,22 @@ uint64_t wallet2::import_key_images(const std::string &filename, uint64_t &spent
} }
catch (const std::exception &e) catch (const std::exception &e)
{ {
fail_msg_writer() << "Failed to decrypt " << filename << ": " << e.what(); THROW_WALLET_EXCEPTION(error::wallet_internal_error, std::string("Failed to decrypt ") + filename + ": " + e.what());
return 0;
} }
const size_t headerlen = 2 * sizeof(crypto::public_key); const size_t headerlen = 2 * sizeof(crypto::public_key);
if (data.size() < headerlen) THROW_WALLET_EXCEPTION_IF(data.size() < headerlen, error::wallet_internal_error, std::string("Bad data size from file ") + filename);
{
fail_msg_writer() << "Bad data size from file " << filename;
return 0;
}
const crypto::public_key &public_spend_key = *(const crypto::public_key*)&data[0]; const crypto::public_key &public_spend_key = *(const crypto::public_key*)&data[0];
const crypto::public_key &public_view_key = *(const crypto::public_key*)&data[sizeof(crypto::public_key)]; const crypto::public_key &public_view_key = *(const crypto::public_key*)&data[sizeof(crypto::public_key)];
const cryptonote::account_public_address &keys = get_account().get_keys().m_account_address; const cryptonote::account_public_address &keys = get_account().get_keys().m_account_address;
if (public_spend_key != keys.m_spend_public_key || public_view_key != keys.m_view_public_key) if (public_spend_key != keys.m_spend_public_key || public_view_key != keys.m_view_public_key)
{ {
fail_msg_writer() << "Key images from " << filename << " are for a different account"; THROW_WALLET_EXCEPTION(error::wallet_internal_error, std::string( "Key images from ") + filename + " are for a different account");
return 0;
} }
const size_t record_size = sizeof(crypto::key_image) + sizeof(crypto::signature); const size_t record_size = sizeof(crypto::key_image) + sizeof(crypto::signature);
if ((data.size() - headerlen) % record_size) THROW_WALLET_EXCEPTION_IF((data.size() - headerlen) % record_size,
{ error::wallet_internal_error, std::string("Bad data size from file ") + filename);
fail_msg_writer() << "Bad data size from file " << filename;
return 0;
}
size_t nki = (data.size() - headerlen) / record_size; size_t nki = (data.size() - headerlen) / record_size;
std::vector<std::pair<crypto::key_image, crypto::signature>> ski; std::vector<std::pair<crypto::key_image, crypto::signature>> ski;

View File

@ -30,7 +30,6 @@
#include <boost/filesystem/path.hpp> #include <boost/filesystem/path.hpp>
#include <boost/format.hpp> #include <boost/format.hpp>
#include "common/i18n.h" #include "common/i18n.h"
#include "common/scoped_message_writer.h"
#include "common/util.h" #include "common/util.h"
#include "misc_log_ex.h" #include "misc_log_ex.h"
#include "string_tools.h" #include "string_tools.h"
@ -50,6 +49,20 @@
#define DEFAULT_MAX_CONCURRENCY 0 #define DEFAULT_MAX_CONCURRENCY 0
#endif #endif
namespace
{
class Print
{
public:
Print(const std::function<void(const std::string&, bool)> &p, bool em = false): print(p), emphasis(em) {}
~Print() { print(ss.str(), emphasis); }
template<typename T> std::ostream &operator<<(const T &t) { ss << t; return ss; }
private:
const std::function<void(const std::string&, bool)> &print;
std::stringstream ss;
bool emphasis;
};
}
namespace wallet_args namespace wallet_args
{ {
@ -73,6 +86,7 @@ namespace wallet_args
const char* const usage, const char* const usage,
boost::program_options::options_description desc_params, boost::program_options::options_description desc_params,
const boost::program_options::positional_options_description& positional_options, const boost::program_options::positional_options_description& positional_options,
const std::function<void(const std::string&, bool)> &print,
const char *default_log_name, const char *default_log_name,
bool log_to_console) bool log_to_console)
@ -118,16 +132,16 @@ namespace wallet_args
if (command_line::get_arg(vm, command_line::arg_help)) if (command_line::get_arg(vm, command_line::arg_help))
{ {
tools::msg_writer() << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL; Print(print) << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")" << ENDL;
tools::msg_writer() << wallet_args::tr("This is the command line monero wallet. It needs to connect to a monero\n" Print(print) << wallet_args::tr("This is the command line monero wallet. It needs to connect to a monero\n"
"daemon to work correctly.") << ENDL; "daemon to work correctly.") << ENDL;
tools::msg_writer() << wallet_args::tr("Usage:") << ENDL << " " << usage; Print(print) << wallet_args::tr("Usage:") << ENDL << " " << usage;
tools::msg_writer() << desc_all; Print(print) << desc_all;
return false; return false;
} }
else if (command_line::get_arg(vm, command_line::arg_version)) else if (command_line::get_arg(vm, command_line::arg_version))
{ {
tools::msg_writer() << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")"; Print(print) << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")";
return false; return false;
} }
@ -142,7 +156,7 @@ namespace wallet_args
} }
else else
{ {
tools::fail_msg_writer() << wallet_args::tr("Can't find config file ") << config; MERROR(wallet_args::tr("Can't find config file ") << config);
return false; return false;
} }
} }
@ -167,14 +181,15 @@ namespace wallet_args
if(command_line::has_arg(vm, arg_max_concurrency)) if(command_line::has_arg(vm, arg_max_concurrency))
tools::set_max_concurrency(command_line::get_arg(vm, arg_max_concurrency)); tools::set_max_concurrency(command_line::get_arg(vm, arg_max_concurrency));
tools::scoped_message_writer(epee::console_color_white, true) << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")"; Print(print) << "Monero '" << MONERO_RELEASE_NAME << "' (v" << MONERO_VERSION_FULL << ")";
if (!command_line::is_arg_defaulted(vm, arg_log_level)) if (!command_line::is_arg_defaulted(vm, arg_log_level))
MINFO("Setting log level = " << command_line::get_arg(vm, arg_log_level)); MINFO("Setting log level = " << command_line::get_arg(vm, arg_log_level));
else else
MINFO("Setting log levels = " << getenv("MONERO_LOGS")); MINFO("Setting log levels = " << getenv("MONERO_LOGS"));
MINFO(wallet_args::tr("Logging to: ") << log_path); MINFO(wallet_args::tr("Logging to: ") << log_path);
tools::scoped_message_writer(epee::console_color_white, true) << boost::format(wallet_args::tr("Logging to %s")) % log_path;
Print(print) << boost::format(wallet_args::tr("Logging to %s")) % log_path;
return {std::move(vm)}; return {std::move(vm)};
} }

View File

@ -50,5 +50,6 @@ namespace wallet_args
const char* const usage, const char* const usage,
boost::program_options::options_description desc_params, boost::program_options::options_description desc_params,
const boost::program_options::positional_options_description& positional_options, const boost::program_options::positional_options_description& positional_options,
const std::function<void(const std::string&, bool)> &print,
const char *default_log_name, bool log_to_console = false); const char *default_log_name, bool log_to_console = false);
} }

View File

@ -765,6 +765,12 @@ namespace tools
#define STRINGIZE_DETAIL(x) #x #define STRINGIZE_DETAIL(x) #x
#define STRINGIZE(x) STRINGIZE_DETAIL(x) #define STRINGIZE(x) STRINGIZE_DETAIL(x)
#define THROW_WALLET_EXCEPTION(err_type, ...) \
do { \
LOG_ERROR("THROW EXCEPTION: " << #err_type); \
tools::error::throw_wallet_ex<err_type>(std::string(__FILE__ ":" STRINGIZE(__LINE__)), ## __VA_ARGS__); \
} while(0)
#define THROW_WALLET_EXCEPTION_IF(cond, err_type, ...) \ #define THROW_WALLET_EXCEPTION_IF(cond, err_type, ...) \
if (cond) \ if (cond) \
{ \ { \

View File

@ -38,6 +38,7 @@ using namespace epee;
#include "wallet/wallet_args.h" #include "wallet/wallet_args.h"
#include "common/command_line.h" #include "common/command_line.h"
#include "common/i18n.h" #include "common/i18n.h"
#include "common/scoped_message_writer.h"
#include "cryptonote_basic/cryptonote_format_utils.h" #include "cryptonote_basic/cryptonote_format_utils.h"
#include "cryptonote_basic/account.h" #include "cryptonote_basic/account.h"
#include "wallet_rpc_server_commands_defs.h" #include "wallet_rpc_server_commands_defs.h"
@ -1981,6 +1982,7 @@ int main(int argc, char** argv) {
"monero-wallet-rpc [--wallet-file=<file>|--generate-from-json=<file>|--wallet-dir=<directory>] [--rpc-bind-port=<port>]", "monero-wallet-rpc [--wallet-file=<file>|--generate-from-json=<file>|--wallet-dir=<directory>] [--rpc-bind-port=<port>]",
desc_params, desc_params,
po::positional_options_description(), po::positional_options_description(),
[](const std::string &s, bool emphasis){ tools::scoped_message_writer(emphasis ? epee::console_color_white : epee::console_color_default, true) << s; },
"monero-wallet-rpc.log", "monero-wallet-rpc.log",
true true
); );
@ -2020,9 +2022,17 @@ int main(int argc, char** argv) {
wal = tools::wallet2::make_from_file(*vm, wallet_file, password_prompter).first; wal = tools::wallet2::make_from_file(*vm, wallet_file, password_prompter).first;
} }
else else
{
try
{ {
wal = tools::wallet2::make_from_json(*vm, from_json, password_prompter); wal = tools::wallet2::make_from_json(*vm, from_json, password_prompter);
} }
catch (const std::exception &e)
{
MERROR("Error creating wallet: " << e.what());
return 1;
}
}
if (!wal) if (!wal)
{ {
return 1; return 1;