[wallet] Pass error message back from CWallet::Verify()

Pass an error message back from CWallet::Verify(), and call
InitError/InitWarning from WalletInit::Verify().

This means that we can call CWallet::Verify() independently from
WalletInit and not have InitErrors printed to stdout. It also means that
the error can be reported to the user if dynamic wallet load fails.
This commit is contained in:
John Newbery 2018-04-18 14:17:09 -04:00
parent e0e90db07b
commit 876eb64680
3 changed files with 18 additions and 22 deletions

View file

@ -207,7 +207,12 @@ bool WalletInit::Verify() const
return InitError(strprintf(_("Error loading wallet %s. Duplicate -wallet filename specified."), wallet_file)); return InitError(strprintf(_("Error loading wallet %s. Duplicate -wallet filename specified."), wallet_file));
} }
if (!CWallet::Verify(wallet_file, salvage_wallet)) return false; std::string error_string;
std::string warning_string;
bool verify_success = CWallet::Verify(wallet_file, salvage_wallet, error_string, warning_string);
if (!error_string.empty()) InitError(error_string);
if (!warning_string.empty()) InitWarning(warning_string);
if (!verify_success) return false;
} }
return true; return true;

View file

@ -3990,7 +3990,7 @@ void CWallet::MarkPreSplitKeys()
} }
} }
bool CWallet::Verify(std::string wallet_file, bool salvage_wallet) bool CWallet::Verify(std::string wallet_file, bool salvage_wallet, std::string& error_string, std::string& warning_string)
{ {
// Do some checking on wallet path. It should be either a: // Do some checking on wallet path. It should be either a:
// //
@ -4004,23 +4004,24 @@ bool CWallet::Verify(std::string wallet_file, bool salvage_wallet)
if (!(path_type == fs::file_not_found || path_type == fs::directory_file || if (!(path_type == fs::file_not_found || path_type == fs::directory_file ||
(path_type == fs::symlink_file && fs::is_directory(wallet_path)) || (path_type == fs::symlink_file && fs::is_directory(wallet_path)) ||
(path_type == fs::regular_file && fs::path(wallet_file).filename() == wallet_file))) { (path_type == fs::regular_file && fs::path(wallet_file).filename() == wallet_file))) {
return InitError(strprintf( error_string = strprintf(
_("Invalid -wallet path '%s'. -wallet path should point to a directory where wallet.dat and " "Invalid -wallet path '%s'. -wallet path should point to a directory where wallet.dat and "
"database/log.?????????? files can be stored, a location where such a directory could be created, " "database/log.?????????? files can be stored, a location where such a directory could be created, "
"or (for backwards compatibility) the name of an existing data file in -walletdir (%s)"), "or (for backwards compatibility) the name of an existing data file in -walletdir (%s)",
wallet_file, GetWalletDir())); wallet_file, GetWalletDir());
return false;
} }
// Make sure that the wallet path doesn't clash with an existing wallet path // Make sure that the wallet path doesn't clash with an existing wallet path
for (auto wallet : GetWallets()) { for (auto wallet : GetWallets()) {
if (fs::absolute(wallet->GetName(), GetWalletDir()) == wallet_path) { if (fs::absolute(wallet->GetName(), GetWalletDir()) == wallet_path) {
return InitError(strprintf(_("Error loading wallet %s. Duplicate -wallet filename specified."), wallet_file)); error_string = strprintf("Error loading wallet %s. Duplicate -wallet filename specified.", wallet_file);
return false;
} }
} }
std::string strError; if (!WalletBatch::VerifyEnvironment(wallet_path, error_string)) {
if (!WalletBatch::VerifyEnvironment(wallet_path, strError)) { return false;
return InitError(strError);
} }
if (salvage_wallet) { if (salvage_wallet) {
@ -4032,17 +4033,7 @@ bool CWallet::Verify(std::string wallet_file, bool salvage_wallet)
} }
} }
std::string strWarning; return WalletBatch::VerifyDatabaseFile(wallet_path, warning_string, error_string);
bool dbV = WalletBatch::VerifyDatabaseFile(wallet_path, strWarning, strError);
if (!strWarning.empty()) {
InitWarning(strWarning);
}
if (!dbV) {
InitError(strError);
return false;
}
return true;
} }
CWallet* CWallet::CreateWalletFromFile(const std::string& name, const fs::path& path) CWallet* CWallet::CreateWalletFromFile(const std::string& name, const fs::path& path)

View file

@ -1119,7 +1119,7 @@ public:
bool MarkReplaced(const uint256& originalHash, const uint256& newHash); bool MarkReplaced(const uint256& originalHash, const uint256& newHash);
//! Verify wallet naming and perform salvage on the wallet if required //! Verify wallet naming and perform salvage on the wallet if required
static bool Verify(std::string wallet_file, bool salvage_wallet); static bool Verify(std::string wallet_file, bool salvage_wallet, std::string& error_string, std::string& warning_string);
/* Initializes the wallet, returns a new CWallet instance or a null pointer in case of an error */ /* Initializes the wallet, returns a new CWallet instance or a null pointer in case of an error */
static CWallet* CreateWalletFromFile(const std::string& name, const fs::path& path); static CWallet* CreateWalletFromFile(const std::string& name, const fs::path& path);