Changeset View
Changeset View
Standalone View
Standalone View
src/wallet/wallet.cpp
Show First 20 Lines • Show All 221 Lines • ▼ Show 20 Lines | |||||
namespace { | namespace { | ||||
std::shared_ptr<CWallet> | std::shared_ptr<CWallet> | ||||
LoadWalletInternal(interfaces::Chain &chain, const std::string &name, | LoadWalletInternal(interfaces::Chain &chain, const std::string &name, | ||||
std::optional<bool> load_on_start, | std::optional<bool> load_on_start, | ||||
const DatabaseOptions &options, DatabaseStatus &status, | const DatabaseOptions &options, DatabaseStatus &status, | ||||
bilingual_str &error, std::vector<bilingual_str> &warnings) { | bilingual_str &error, std::vector<bilingual_str> &warnings) { | ||||
try { | try { | ||||
if (!MakeWalletDatabase(name, options, status, error)) { | std::unique_ptr<WalletDatabase> database = | ||||
MakeWalletDatabase(name, options, status, error); | |||||
if (!database) { | |||||
error = Untranslated("Wallet file verification failed.") + | error = Untranslated("Wallet file verification failed.") + | ||||
Untranslated(" ") + error; | Untranslated(" ") + error; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
std::shared_ptr<CWallet> wallet = | std::shared_ptr<CWallet> wallet = | ||||
CWallet::CreateWalletFromFile(chain, name, error, warnings); | CWallet::Create(chain, name, std::move(database), | ||||
options.create_flags, error, warnings); | |||||
if (!wallet) { | if (!wallet) { | ||||
error = Untranslated("Wallet loading failed.") + Untranslated(" ") + | error = Untranslated("Wallet loading failed.") + Untranslated(" ") + | ||||
error; | error; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
AddWallet(wallet); | AddWallet(wallet); | ||||
wallet->postInitProcess(); | wallet->postInitProcess(); | ||||
▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | if (fs::symlink_status( | ||||
.type() != fs::file_not_found) { | .type() != fs::file_not_found) { | ||||
error = strprintf(Untranslated("Wallet %s already exists."), name); | error = strprintf(Untranslated("Wallet %s already exists."), name); | ||||
status = DatabaseStatus::FAILED_CREATE; | status = DatabaseStatus::FAILED_CREATE; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
// Wallet::Verify will check if we're trying to create a wallet with a | // Wallet::Verify will check if we're trying to create a wallet with a | ||||
// duplicate name. | // duplicate name. | ||||
if (!MakeWalletDatabase(name, options, status, error)) { | std::unique_ptr<WalletDatabase> database = | ||||
MakeWalletDatabase(name, options, status, error); | |||||
if (!database) { | |||||
error = Untranslated("Wallet file verification failed.") + | error = Untranslated("Wallet file verification failed.") + | ||||
Untranslated(" ") + error; | Untranslated(" ") + error; | ||||
status = DatabaseStatus::FAILED_VERIFY; | status = DatabaseStatus::FAILED_VERIFY; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
// Do not allow a passphrase when private keys are disabled | // Do not allow a passphrase when private keys are disabled | ||||
if (!passphrase.empty() && | if (!passphrase.empty() && | ||||
(wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) { | (wallet_creation_flags & WALLET_FLAG_DISABLE_PRIVATE_KEYS)) { | ||||
error = Untranslated( | error = Untranslated( | ||||
"Passphrase provided but private keys are disabled. A passphrase " | "Passphrase provided but private keys are disabled. A passphrase " | ||||
"is only used to encrypt private keys, so cannot be used for " | "is only used to encrypt private keys, so cannot be used for " | ||||
"wallets with private keys disabled."); | "wallets with private keys disabled."); | ||||
status = DatabaseStatus::FAILED_CREATE; | status = DatabaseStatus::FAILED_CREATE; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
// Make the wallet | // Make the wallet | ||||
std::shared_ptr<CWallet> wallet = CWallet::CreateWalletFromFile( | std::shared_ptr<CWallet> wallet = | ||||
chain, name, error, warnings, wallet_creation_flags); | CWallet::Create(chain, name, std::move(database), wallet_creation_flags, | ||||
error, warnings); | |||||
if (!wallet) { | if (!wallet) { | ||||
error = | error = | ||||
Untranslated("Wallet creation failed.") + Untranslated(" ") + error; | Untranslated("Wallet creation failed.") + Untranslated(" ") + error; | ||||
status = DatabaseStatus::FAILED_CREATE; | status = DatabaseStatus::FAILED_CREATE; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
// Encrypt the wallet | // Encrypt the wallet | ||||
▲ Show 20 Lines • Show All 3,907 Lines • ▼ Show 20 Lines | if (!(path_type == fs::file_not_found || path_type == fs::directory_file || | ||||
"existing data file in -walletdir (%s)", | "existing data file in -walletdir (%s)", | ||||
name, GetWalletDir())); | name, GetWalletDir())); | ||||
status = DatabaseStatus::FAILED_BAD_PATH; | status = DatabaseStatus::FAILED_BAD_PATH; | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
return MakeDatabase(wallet_path, options, status, error_string); | return MakeDatabase(wallet_path, options, status, error_string); | ||||
} | } | ||||
std::shared_ptr<CWallet> CWallet::CreateWalletFromFile( | std::shared_ptr<CWallet> | ||||
interfaces::Chain &chain, const std::string &name, bilingual_str &error, | CWallet::Create(interfaces::Chain &chain, const std::string &name, | ||||
std::vector<bilingual_str> &warnings, uint64_t wallet_creation_flags) { | std::unique_ptr<WalletDatabase> database, | ||||
fs::path path = fs::absolute(name, GetWalletDir()); | uint64_t wallet_creation_flags, bilingual_str &error, | ||||
const std::string walletFile = WalletDataFilePath(path).string(); | std::vector<bilingual_str> &warnings) { | ||||
const std::string &walletFile = database->Filename(); | |||||
chain.initMessage(_("Loading wallet...").translated); | chain.initMessage(_("Loading wallet...").translated); | ||||
int64_t nStart = GetTimeMillis(); | int64_t nStart = GetTimeMillis(); | ||||
bool fFirstRun = true; | bool fFirstRun = true; | ||||
// TODO: Can't use std::make_shared because we need a custom deleter but | // TODO: Can't use std::make_shared because we need a custom deleter but | ||||
// should be possible to use std::allocate_shared. | // should be possible to use std::allocate_shared. | ||||
std::shared_ptr<CWallet> walletInstance( | std::shared_ptr<CWallet> walletInstance( | ||||
new CWallet(&chain, name, CreateWalletDatabase(path)), ReleaseWallet); | new CWallet(&chain, name, std::move(database)), ReleaseWallet); | ||||
DBErrors nLoadWalletRet = walletInstance->LoadWallet(fFirstRun); | DBErrors nLoadWalletRet = walletInstance->LoadWallet(fFirstRun); | ||||
if (nLoadWalletRet != DBErrors::LOAD_OK) { | if (nLoadWalletRet != DBErrors::LOAD_OK) { | ||||
if (nLoadWalletRet == DBErrors::CORRUPT) { | if (nLoadWalletRet == DBErrors::CORRUPT) { | ||||
error = | error = | ||||
strprintf(_("Error loading %s: Wallet corrupted"), walletFile); | strprintf(_("Error loading %s: Wallet corrupted"), walletFile); | ||||
return nullptr; | return nullptr; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 823 Lines • Show Last 20 Lines |