Fix misleading "Method not found" multiwallet errors
Raise RPC_WALLET_NOT_SPECIFIED instead of RPC_METHOD_NOT_FOUND when a required wallet filename was not specified in an RPC call. Also raise more specific RPC_WALLET_NOT_FOUND error instead of RPC_INVALID_PARAMETER in case an invalid wallet was specified, for consistency.
This commit is contained in:
parent
04d395e832
commit
e526b3d34c
4 changed files with 18 additions and 8 deletions
|
@ -337,6 +337,10 @@ int CommandLineRPC(int argc, char *argv[])
|
|||
|
||||
if (errMsg.isStr())
|
||||
strPrint += "error message:\n"+errMsg.get_str();
|
||||
|
||||
if (errCode.isNum() && errCode.get_int() == RPC_WALLET_NOT_SPECIFIED) {
|
||||
strPrint += "\nTry adding \"-rpcwallet=<filename>\" option to bitcoin-cli command line.";
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Result
|
||||
|
|
|
@ -82,6 +82,8 @@ enum RPCErrorCode
|
|||
RPC_WALLET_WRONG_ENC_STATE = -15, //!< Command given in wrong wallet encryption state (encrypting an encrypted wallet etc.)
|
||||
RPC_WALLET_ENCRYPTION_FAILED = -16, //!< Failed to encrypt the wallet
|
||||
RPC_WALLET_ALREADY_UNLOCKED = -17, //!< Wallet is already unlocked
|
||||
RPC_WALLET_NOT_FOUND = -18, //!< Invalid wallet specified
|
||||
RPC_WALLET_NOT_SPECIFIED = -19, //!< No wallet specified (error when there are multiple wallets loaded)
|
||||
};
|
||||
|
||||
UniValue JSONRPCRequestObj(const std::string& strMethod, const UniValue& params, const UniValue& id);
|
||||
|
|
|
@ -43,7 +43,7 @@ CWallet *GetWalletForJSONRPCRequest(const JSONRPCRequest& request)
|
|||
return pwallet;
|
||||
}
|
||||
}
|
||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Requested wallet does not exist or is not loaded");
|
||||
throw JSONRPCError(RPC_WALLET_NOT_FOUND, "Requested wallet does not exist or is not loaded");
|
||||
}
|
||||
return ::vpwallets.size() == 1 || (request.fHelp && ::vpwallets.size() > 0) ? ::vpwallets[0] : nullptr;
|
||||
}
|
||||
|
@ -57,13 +57,14 @@ std::string HelpRequiringPassphrase(CWallet * const pwallet)
|
|||
|
||||
bool EnsureWalletIsAvailable(CWallet * const pwallet, bool avoidException)
|
||||
{
|
||||
if (!pwallet) {
|
||||
if (!avoidException)
|
||||
throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)");
|
||||
else
|
||||
return false;
|
||||
if (pwallet) return true;
|
||||
if (avoidException) return false;
|
||||
if (::vpwallets.empty()) {
|
||||
// Wallet RPC methods are disabled if no wallets are loaded.
|
||||
throw JSONRPCError(RPC_METHOD_NOT_FOUND, "Method not found (disabled)");
|
||||
}
|
||||
return true;
|
||||
throw JSONRPCError(RPC_WALLET_NOT_SPECIFIED,
|
||||
"Wallet file not specified (must request wallet RPC through /wallet/<filename> uri-path).");
|
||||
}
|
||||
|
||||
void EnsureWalletIsUnlocked(CWallet * const pwallet)
|
||||
|
|
|
@ -21,8 +21,11 @@ class MultiWalletTest(BitcoinTestFramework):
|
|||
w1 = self.nodes[0] / "wallet/w1"
|
||||
w1.generate(1)
|
||||
|
||||
# accessing invalid wallet fails
|
||||
assert_raises_jsonrpc(-18, "Requested wallet does not exist or is not loaded", (self.nodes[0] / "wallet/bad").getwalletinfo)
|
||||
|
||||
# accessing wallet RPC without using wallet endpoint fails
|
||||
assert_raises_jsonrpc(-32601, "Method not found", self.nodes[0].getwalletinfo)
|
||||
assert_raises_jsonrpc(-19, "Wallet file not specified", self.nodes[0].getwalletinfo)
|
||||
|
||||
# check w1 wallet balance
|
||||
w1_info = w1.getwalletinfo()
|
||||
|
|
Loading…
Reference in a new issue