From ea337f2d0318a860f695698cfb3aa91c03ded858 Mon Sep 17 00:00:00 2001 From: Andrew Chow Date: Fri, 15 May 2020 19:45:19 -0400 Subject: [PATCH] Move RecoverKeysOnlyFilter into RecoverDataBaseFile --- src/wallet/salvage.cpp | 48 ++++++++++++++++----------------------- src/wallet/salvage.h | 5 +--- src/wallet/wallettool.cpp | 4 +--- 3 files changed, 21 insertions(+), 36 deletions(-) diff --git a/src/wallet/salvage.cpp b/src/wallet/salvage.cpp index 99d6238490..70067ebef0 100644 --- a/src/wallet/salvage.cpp +++ b/src/wallet/salvage.cpp @@ -15,7 +15,7 @@ static const char *HEADER_END = "HEADER=END"; static const char *DATA_END = "DATA=END"; typedef std::pair, std::vector > KeyValPair; -bool RecoverDatabaseFile(const fs::path& file_path, void *callbackDataIn, bool (*recoverKVcallback)(void* callbackData, CDataStream ssKey, CDataStream ssValue), std::string& newFilename) +bool RecoverDatabaseFile(const fs::path& file_path) { std::string filename; std::shared_ptr env = GetWalletEnv(file_path, filename); @@ -28,7 +28,7 @@ bool RecoverDatabaseFile(const fs::path& file_path, void *callbackDataIn, bool ( // Set -rescan so any missing transactions will be // found. int64_t now = GetTime(); - newFilename = strprintf("%s.%d.bak", filename, now); + std::string newFilename = strprintf("%s.%d.bak", filename, now); int result = env->dbenv->dbrename(nullptr, filename.c_str(), nullptr, newFilename.c_str(), DB_AUTO_COMMIT); @@ -116,14 +116,26 @@ bool RecoverDatabaseFile(const fs::path& file_path, void *callbackDataIn, bool ( } DbTxn* ptxn = env->TxnBegin(); + CWallet dummyWallet(nullptr, WalletLocation(), WalletDatabase::CreateDummy()); for (KeyValPair& row : salvagedData) { - if (recoverKVcallback) + /* Filter for only private key type KV pairs to be added to the salvaged wallet */ + CDataStream ssKey(row.first, SER_DISK, CLIENT_VERSION); + CDataStream ssValue(row.second, SER_DISK, CLIENT_VERSION); + std::string strType, strErr; + bool fReadOK; { - CDataStream ssKey(row.first, SER_DISK, CLIENT_VERSION); - CDataStream ssValue(row.second, SER_DISK, CLIENT_VERSION); - if (!(*recoverKVcallback)(callbackDataIn, ssKey, ssValue)) - continue; + // Required in LoadKeyMetadata(): + LOCK(dummyWallet.cs_wallet); + fReadOK = ReadKeyValue(&dummyWallet, ssKey, ssValue, strType, strErr); + } + if (!WalletBatch::IsKeyType(strType) && strType != DBKeys::HDCHAIN) { + continue; + } + if (!fReadOK) + { + LogPrintf("WARNING: WalletBatch::Recover skipping %s: %s\n", strType, strErr); + continue; } Dbt datKey(&row.first[0], row.first.size()); Dbt datValue(&row.second[0], row.second.size()); @@ -136,25 +148,3 @@ bool RecoverDatabaseFile(const fs::path& file_path, void *callbackDataIn, bool ( return fSuccess; } - -bool RecoverKeysOnlyFilter(void *callbackData, CDataStream ssKey, CDataStream ssValue) -{ - CWallet *dummyWallet = reinterpret_cast(callbackData); - std::string strType, strErr; - bool fReadOK; - { - // Required in LoadKeyMetadata(): - LOCK(dummyWallet->cs_wallet); - fReadOK = ReadKeyValue(dummyWallet, ssKey, ssValue, strType, strErr); - } - if (!WalletBatch::IsKeyType(strType) && strType != DBKeys::HDCHAIN) { - return false; - } - if (!fReadOK) - { - LogPrintf("WARNING: WalletBatch::Recover skipping %s: %s\n", strType, strErr); - return false; - } - - return true; -} diff --git a/src/wallet/salvage.h b/src/wallet/salvage.h index e501c54456..e361930f5e 100644 --- a/src/wallet/salvage.h +++ b/src/wallet/salvage.h @@ -9,9 +9,6 @@ #include #include -bool RecoverDatabaseFile(const fs::path& file_path, void *callbackDataIn, bool (*recoverKVcallback)(void* callbackData, CDataStream ssKey, CDataStream ssValue), std::string& out_backup_filename); - -/* Recover filter (used as callback), will only let keys (cryptographical keys) as KV/key-type pass through */ -bool RecoverKeysOnlyFilter(void *callbackData, CDataStream ssKey, CDataStream ssValue); +bool RecoverDatabaseFile(const fs::path& file_path); #endif // BITCOIN_WALLET_SALVAGE_H diff --git a/src/wallet/wallettool.cpp b/src/wallet/wallettool.cpp index ab5cf0061c..be07c28503 100644 --- a/src/wallet/wallettool.cpp +++ b/src/wallet/wallettool.cpp @@ -122,9 +122,7 @@ static bool SalvageWallet(const fs::path& path) } // Perform the recovery - CWallet dummy_wallet(nullptr, WalletLocation(), WalletDatabase::CreateDummy()); - std::string backup_filename; - return RecoverDatabaseFile(path, (void*)&dummy_wallet, RecoverKeysOnlyFilter, backup_filename); + return RecoverDatabaseFile(path); } bool ExecuteWalletToolFunc(const std::string& command, const std::string& name)