aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorw0xlt <94266259+w0xlt@users.noreply.github.com>2021-12-14 19:18:56 -0300
committerw0xlt <94266259+w0xlt@users.noreply.github.com>2021-12-14 19:18:56 -0300
commit4807f73f48f4ff1084fcf7aee94e5b14592bfda8 (patch)
tree7761551b1159c35a4bed0ccf5a97d5f77650f0df /src
parentf727d814bd8df5a5346c128dd4573e457c1970e1 (diff)
refactor: Implement restorewallet() logic in the wallet section
Currently restorewallet() logic is written in the RPC layer and it canĀ“t be reused by GUI. So it reimplements this in the wallet and interface sections and then, GUI can access it.
Diffstat (limited to 'src')
-rw-r--r--src/interfaces/wallet.h3
-rw-r--r--src/wallet/interfaces.cpp6
-rw-r--r--src/wallet/wallet.cpp25
-rw-r--r--src/wallet/wallet.h1
4 files changed, 35 insertions, 0 deletions
diff --git a/src/interfaces/wallet.h b/src/interfaces/wallet.h
index a56ed8802d..4213a22749 100644
--- a/src/interfaces/wallet.h
+++ b/src/interfaces/wallet.h
@@ -322,6 +322,9 @@ public:
//! Return default wallet directory.
virtual std::string getWalletDir() = 0;
+ //! Restore backup wallet
+ virtual std::unique_ptr<Wallet> restoreWallet(const std::string& backup_file, const std::string& wallet_name, bilingual_str& error, std::vector<bilingual_str>& warnings) = 0;
+
//! Return available wallets in wallet directory.
virtual std::vector<std::string> listWalletDir() = 0;
diff --git a/src/wallet/interfaces.cpp b/src/wallet/interfaces.cpp
index 6c9d0ca132..bba909b807 100644
--- a/src/wallet/interfaces.cpp
+++ b/src/wallet/interfaces.cpp
@@ -552,6 +552,12 @@ public:
options.require_existing = true;
return MakeWallet(m_context, LoadWallet(m_context, name, true /* load_on_start */, options, status, error, warnings));
}
+ std::unique_ptr<Wallet> restoreWallet(const std::string& backup_file, const std::string& wallet_name, bilingual_str& error, std::vector<bilingual_str>& warnings) override
+ {
+ DatabaseStatus status;
+
+ return MakeWallet(m_context, RestoreWallet(m_context, backup_file, wallet_name, /*load_on_start=*/true, status, error, warnings));
+ }
std::string getWalletDir() override
{
return fs::PathToString(GetWalletDir());
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
index cfe550cb3f..59ed8c2571 100644
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -357,6 +357,31 @@ std::shared_ptr<CWallet> CreateWallet(WalletContext& context, const std::string&
return wallet;
}
+std::shared_ptr<CWallet> RestoreWallet(WalletContext& context, const std::string& backup_file, const std::string& wallet_name, std::optional<bool> load_on_start, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings)
+{
+ DatabaseOptions options;
+ options.require_existing = true;
+
+ if (!fs::exists(fs::u8path(backup_file))) {
+ error = Untranslated("Backup file does not exist");
+ status = DatabaseStatus::FAILED_BAD_PATH;
+ return nullptr;
+ }
+
+ const fs::path wallet_path = fsbridge::AbsPathJoin(GetWalletDir(), fs::u8path(wallet_name));
+
+ if (fs::exists(wallet_path) || !TryCreateDirectories(wallet_path)) {
+ error = Untranslated(strprintf("Failed to create database path '%s'. Database already exists.", fs::PathToString(wallet_path)));
+ status = DatabaseStatus::FAILED_ALREADY_EXISTS;
+ return nullptr;
+ }
+
+ auto wallet_file = wallet_path / "wallet.dat";
+ fs::copy_file(backup_file, wallet_file, fs::copy_option::fail_if_exists);
+
+ return LoadWallet(context, wallet_name, load_on_start, options, status, error, warnings);
+}
+
/** @defgroup mapWallet
*
* @{
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h
index dbf0f6375d..1dc40d228e 100644
--- a/src/wallet/wallet.h
+++ b/src/wallet/wallet.h
@@ -60,6 +60,7 @@ std::vector<std::shared_ptr<CWallet>> GetWallets(WalletContext& context);
std::shared_ptr<CWallet> GetWallet(WalletContext& context, const std::string& name);
std::shared_ptr<CWallet> LoadWallet(WalletContext& context, const std::string& name, std::optional<bool> load_on_start, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings);
std::shared_ptr<CWallet> CreateWallet(WalletContext& context, const std::string& name, std::optional<bool> load_on_start, DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings);
+std::shared_ptr<CWallet> RestoreWallet(WalletContext& context, const std::string& backup_file, const std::string& wallet_name, std::optional<bool> load_on_start, DatabaseStatus& status, bilingual_str& error, std::vector<bilingual_str>& warnings);
std::unique_ptr<interfaces::Handler> HandleLoadWallet(WalletContext& context, LoadWalletFn load_wallet);
std::unique_ptr<WalletDatabase> MakeWalletDatabase(const std::string& name, const DatabaseOptions& options, DatabaseStatus& status, bilingual_str& error);