Changeset View
Changeset View
Standalone View
Standalone View
src/wallet/wallet.cpp
Show First 20 Lines • Show All 4,223 Lines • ▼ Show 20 Lines | for (const auto &address : mapAddressBook) { | ||||
values.emplace_back(data.second); | values.emplace_back(data.second); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
return values; | return values; | ||||
} | } | ||||
bool CWallet::Verify(const CChainParams &chainParams, std::string wallet_file, | bool CWallet::Verify(const CChainParams &chainParams, std::string wallet_file, | ||||
bool salvage_wallet) { | 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: | ||||
// | // | ||||
// 1. Path where a directory can be created. | // 1. Path where a directory can be created. | ||||
// 2. Path to an existing directory. | // 2. Path to an existing directory. | ||||
// 3. Path to a symlink to a directory. | // 3. Path to a symlink to a directory. | ||||
// 4. For backwards compatibility, the name of a data file in -walletdir. | // 4. For backwards compatibility, the name of a data file in -walletdir. | ||||
LOCK(cs_wallets); | LOCK(cs_wallets); | ||||
fs::path wallet_path = fs::absolute(wallet_file, GetWalletDir()); | fs::path wallet_path = fs::absolute(wallet_file, GetWalletDir()); | ||||
fs::file_type path_type = fs::symlink_status(wallet_path).type(); | fs::file_type path_type = fs::symlink_status(wallet_path).type(); | ||||
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 && | (path_type == fs::regular_file && | ||||
fs::path(wallet_file).filename() == wallet_file))) { | fs::path(wallet_file).filename() == wallet_file))) { | ||||
return InitError( | error_string = | ||||
strprintf(_("Invalid -wallet path '%s'. -wallet path should point " | strprintf("Invalid -wallet path '%s'. -wallet path should point to " | ||||
"to a directory where wallet.dat and " | "a directory where wallet.dat and " | ||||
"database/log.?????????? files can be stored, a " | "database/log.?????????? files can be stored, a location " | ||||
"location where such a directory could be created, " | "where such a directory could be created, " | ||||
"or (for backwards compatibility) the name of an " | "or (for backwards compatibility) the name of an " | ||||
"existing data file in -walletdir (%s)"), | "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 " | error_string = strprintf("Error loading wallet %s. Duplicate " | ||||
"-wallet filename specified."), | "-wallet filename specified.", | ||||
wallet_file)); | 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) { | ||||
// Recover readable keypairs: | // Recover readable keypairs: | ||||
CWallet dummyWallet(chainParams, "dummy", | CWallet dummyWallet(chainParams, "dummy", | ||||
WalletDatabase::CreateDummy()); | WalletDatabase::CreateDummy()); | ||||
std::string backup_filename; | std::string backup_filename; | ||||
if (!WalletBatch::Recover( | if (!WalletBatch::Recover( | ||||
wallet_path, static_cast<void *>(&dummyWallet), | wallet_path, static_cast<void *>(&dummyWallet), | ||||
WalletBatch::RecoverKeysOnlyFilter, backup_filename)) { | WalletBatch::RecoverKeysOnlyFilter, backup_filename)) { | ||||
return false; | return false; | ||||
} | } | ||||
} | } | ||||
std::string strWarning; | return WalletBatch::VerifyDatabaseFile(wallet_path, warning_string, | ||||
bool dbV = | error_string); | ||||
WalletBatch::VerifyDatabaseFile(wallet_path, strWarning, strError); | |||||
if (!strWarning.empty()) { | |||||
InitWarning(strWarning); | |||||
} | |||||
if (!dbV) { | |||||
InitError(strError); | |||||
return false; | |||||
} | |||||
return true; | |||||
} | } | ||||
CWallet *CWallet::CreateWalletFromFile(const CChainParams &chainParams, | CWallet *CWallet::CreateWalletFromFile(const CChainParams &chainParams, | ||||
const std::string &name, | const std::string &name, | ||||
const fs::path &path) { | const fs::path &path) { | ||||
const std::string &walletFile = name; | const std::string &walletFile = name; | ||||
// Needed to restore wallet transaction meta data after -zapwallettxes | // Needed to restore wallet transaction meta data after -zapwallettxes | ||||
▲ Show 20 Lines • Show All 458 Lines • Show Last 20 Lines |