forked from bitcoin/bitcoin
-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge bitcoin#23640: MOVEONLY: Move helper functions from rpcwallet t…
…o wallet/rpc/util ff945e5 MOVEONLY: Move utility functions from rpcwallet to wallet/rpc/util (Samuel Dobson) 7b04a06 Introduce wallet/rpc/util (Samuel Dobson) Pull request description: This is part one of multiple to split up rpcwallet.cpp into smaller, more logical units. See bitcoin#23622 for context and overall plan. I'll open PRs in stages to hopefully minimise conflicts. Can be reviewed with `--color-moved=dimmed-zebra` The end goal can be seen here: https://github.com/meshcollider/bitcoin/tree/202111_split_walletrpc ACKs for top commit: MarcoFalke: nice, ACK ff945e5 🐰 shaavan: ACK ff945e5 Tree-SHA512: 6e3d1de6db770fe2fca540c8c4f30183ab8258c26e3a1fb46937714d28818a52933eafbfcafe2995f6a6e2551a3f3dd3ec93363b81de7912c0d81f5749d1c86d
- Loading branch information
1 parent
106172e
commit 0644cde
Showing
9 changed files
with
167 additions
and
126 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
// Copyright (c) 2011-2021 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#include <wallet/rpc/util.h> | ||
|
||
#include <rpc/util.h> | ||
#include <util/url.h> | ||
#include <wallet/context.h> | ||
#include <wallet/wallet.h> | ||
|
||
#include <univalue.h> | ||
|
||
static const std::string WALLET_ENDPOINT_BASE = "/wallet/"; | ||
const std::string HELP_REQUIRING_PASSPHRASE{"\nRequires wallet passphrase to be set with walletpassphrase call if wallet is encrypted.\n"}; | ||
|
||
bool GetAvoidReuseFlag(const CWallet& wallet, const UniValue& param) { | ||
bool can_avoid_reuse = wallet.IsWalletFlagSet(WALLET_FLAG_AVOID_REUSE); | ||
bool avoid_reuse = param.isNull() ? can_avoid_reuse : param.get_bool(); | ||
|
||
if (avoid_reuse && !can_avoid_reuse) { | ||
throw JSONRPCError(RPC_WALLET_ERROR, "wallet does not have the \"avoid reuse\" feature enabled"); | ||
} | ||
|
||
return avoid_reuse; | ||
} | ||
|
||
/** Used by RPC commands that have an include_watchonly parameter. | ||
* We default to true for watchonly wallets if include_watchonly isn't | ||
* explicitly set. | ||
*/ | ||
bool ParseIncludeWatchonly(const UniValue& include_watchonly, const CWallet& wallet) | ||
{ | ||
if (include_watchonly.isNull()) { | ||
// if include_watchonly isn't explicitly set, then check if we have a watchonly wallet | ||
return wallet.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS); | ||
} | ||
|
||
// otherwise return whatever include_watchonly was set to | ||
return include_watchonly.get_bool(); | ||
} | ||
|
||
bool GetWalletNameFromJSONRPCRequest(const JSONRPCRequest& request, std::string& wallet_name) | ||
{ | ||
if (URL_DECODE && request.URI.substr(0, WALLET_ENDPOINT_BASE.size()) == WALLET_ENDPOINT_BASE) { | ||
// wallet endpoint was used | ||
wallet_name = URL_DECODE(request.URI.substr(WALLET_ENDPOINT_BASE.size())); | ||
return true; | ||
} | ||
return false; | ||
} | ||
|
||
std::shared_ptr<CWallet> GetWalletForJSONRPCRequest(const JSONRPCRequest& request) | ||
{ | ||
CHECK_NONFATAL(request.mode == JSONRPCRequest::EXECUTE); | ||
WalletContext& context = EnsureWalletContext(request.context); | ||
|
||
std::string wallet_name; | ||
if (GetWalletNameFromJSONRPCRequest(request, wallet_name)) { | ||
const std::shared_ptr<CWallet> pwallet = GetWallet(context, wallet_name); | ||
if (!pwallet) throw JSONRPCError(RPC_WALLET_NOT_FOUND, "Requested wallet does not exist or is not loaded"); | ||
return pwallet; | ||
} | ||
|
||
std::vector<std::shared_ptr<CWallet>> wallets = GetWallets(context); | ||
if (wallets.size() == 1) { | ||
return wallets[0]; | ||
} | ||
|
||
if (wallets.empty()) { | ||
throw JSONRPCError( | ||
RPC_WALLET_NOT_FOUND, "No wallet is loaded. Load a wallet using loadwallet or create a new one with createwallet. (Note: A default wallet is no longer automatically created)"); | ||
} | ||
throw JSONRPCError(RPC_WALLET_NOT_SPECIFIED, | ||
"Wallet file not specified (must request wallet RPC through /wallet/<filename> uri-path)."); | ||
} | ||
|
||
void EnsureWalletIsUnlocked(const CWallet& wallet) | ||
{ | ||
if (wallet.IsLocked()) { | ||
throw JSONRPCError(RPC_WALLET_UNLOCK_NEEDED, "Error: Please enter the wallet passphrase with walletpassphrase first."); | ||
} | ||
} | ||
|
||
WalletContext& EnsureWalletContext(const std::any& context) | ||
{ | ||
auto wallet_context = util::AnyPtr<WalletContext>(context); | ||
if (!wallet_context) { | ||
throw JSONRPCError(RPC_INTERNAL_ERROR, "Wallet context not found"); | ||
} | ||
return *wallet_context; | ||
} | ||
|
||
// also_create should only be set to true only when the RPC is expected to add things to a blank wallet and make it no longer blank | ||
LegacyScriptPubKeyMan& EnsureLegacyScriptPubKeyMan(CWallet& wallet, bool also_create) | ||
{ | ||
LegacyScriptPubKeyMan* spk_man = wallet.GetLegacyScriptPubKeyMan(); | ||
if (!spk_man && also_create) { | ||
spk_man = wallet.GetOrCreateLegacyScriptPubKeyMan(); | ||
} | ||
if (!spk_man) { | ||
throw JSONRPCError(RPC_WALLET_ERROR, "This type of wallet does not support this command"); | ||
} | ||
return *spk_man; | ||
} | ||
|
||
const LegacyScriptPubKeyMan& EnsureConstLegacyScriptPubKeyMan(const CWallet& wallet) | ||
{ | ||
const LegacyScriptPubKeyMan* spk_man = wallet.GetLegacyScriptPubKeyMan(); | ||
if (!spk_man) { | ||
throw JSONRPCError(RPC_WALLET_ERROR, "This type of wallet does not support this command"); | ||
} | ||
return *spk_man; | ||
} | ||
|
||
std::string LabelFromValue(const UniValue& value) | ||
{ | ||
std::string label = value.get_str(); | ||
if (label == "*") | ||
throw JSONRPCError(RPC_WALLET_INVALID_LABEL_NAME, "Invalid label name"); | ||
return label; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
// Copyright (c) 2017-2021 The Bitcoin Core developers | ||
// Distributed under the MIT software license, see the accompanying | ||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||
|
||
#ifndef BITCOIN_WALLET_RPC_UTIL_H | ||
#define BITCOIN_WALLET_RPC_UTIL_H | ||
|
||
#include <any> | ||
#include <memory> | ||
#include <string> | ||
|
||
class CWallet; | ||
class JSONRPCRequest; | ||
class LegacyScriptPubKeyMan; | ||
class UniValue; | ||
struct WalletContext; | ||
|
||
extern const std::string HELP_REQUIRING_PASSPHRASE; | ||
|
||
/** | ||
* Figures out what wallet, if any, to use for a JSONRPCRequest. | ||
* | ||
* @param[in] request JSONRPCRequest that wishes to access a wallet | ||
* @return nullptr if no wallet should be used, or a pointer to the CWallet | ||
*/ | ||
std::shared_ptr<CWallet> GetWalletForJSONRPCRequest(const JSONRPCRequest& request); | ||
bool GetWalletNameFromJSONRPCRequest(const JSONRPCRequest& request, std::string& wallet_name); | ||
|
||
void EnsureWalletIsUnlocked(const CWallet&); | ||
WalletContext& EnsureWalletContext(const std::any& context); | ||
LegacyScriptPubKeyMan& EnsureLegacyScriptPubKeyMan(CWallet& wallet, bool also_create = false); | ||
const LegacyScriptPubKeyMan& EnsureConstLegacyScriptPubKeyMan(const CWallet& wallet); | ||
|
||
bool GetAvoidReuseFlag(const CWallet& wallet, const UniValue& param); | ||
bool ParseIncludeWatchonly(const UniValue& include_watchonly, const CWallet& wallet); | ||
std::string LabelFromValue(const UniValue& value); | ||
|
||
#endif // BITCOIN_WALLET_RPC_UTIL_H |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters