Merge #14813: qa: Add wallet_encryption error tests

fa739d4bd7 qa: Add wallet_encryption error tests (MarcoFalke)

Pull request description:

  The errors for empty passphrases are the help text of the RPC call, which is not very specific. Replace that with proper RPC errors and test them.

Tree-SHA512: 3137e0f8f2e42a1f8ab1eeb57c99052557725f6f85139ff48c24acc8f3cf4087802de5216f3ce97375b291d21bddb7cd1379a6f280166136a306a0c9663bbd42
This commit is contained in:
MarcoFalke 2018-11-27 13:54:16 -05:00
commit 8c119b2755
No known key found for this signature in database
GPG key ID: D2EA4850E7528B25
2 changed files with 18 additions and 31 deletions

View file

@ -2009,21 +2009,13 @@ static UniValue walletpassphrase(const JSONRPCRequest& request)
nSleepTime = MAX_SLEEP_TIME; nSleepTime = MAX_SLEEP_TIME;
} }
if (strWalletPass.length() > 0) if (strWalletPass.empty()) {
{ throw JSONRPCError(RPC_INVALID_PARAMETER, "passphrase can not be empty");
}
if (!pwallet->Unlock(strWalletPass)) { if (!pwallet->Unlock(strWalletPass)) {
throw JSONRPCError(RPC_WALLET_PASSPHRASE_INCORRECT, "Error: The wallet passphrase entered was incorrect."); throw JSONRPCError(RPC_WALLET_PASSPHRASE_INCORRECT, "Error: The wallet passphrase entered was incorrect.");
} }
}
else
throw std::runtime_error(
RPCHelpMan{"walletpassphrase",
"Stores the wallet decryption key in memory for <timeout> seconds.",
{
{"passphrase", RPCArg::Type::STR, false},
{"timeout", RPCArg::Type::NUM, false},
}}
.ToString());
pwallet->TopUpKeyPool(); pwallet->TopUpKeyPool();
@ -2089,15 +2081,9 @@ static UniValue walletpassphrasechange(const JSONRPCRequest& request)
strNewWalletPass.reserve(100); strNewWalletPass.reserve(100);
strNewWalletPass = request.params[1].get_str().c_str(); strNewWalletPass = request.params[1].get_str().c_str();
if (strOldWalletPass.length() < 1 || strNewWalletPass.length() < 1) if (strOldWalletPass.empty() || strNewWalletPass.empty()) {
throw std::runtime_error( throw JSONRPCError(RPC_INVALID_PARAMETER, "passphrase can not be empty");
RPCHelpMan{"walletpassphrasechange", }
"Changes the wallet passphrase from <oldpassphrase> to <newpassphrase>.",
{
{"oldpassphrase", RPCArg::Type::STR, false},
{"newpassphrase", RPCArg::Type::STR, false},
}}
.ToString());
if (!pwallet->ChangeWalletPassphrase(strOldWalletPass, strNewWalletPass)) { if (!pwallet->ChangeWalletPassphrase(strOldWalletPass, strNewWalletPass)) {
throw JSONRPCError(RPC_WALLET_PASSPHRASE_INCORRECT, "Error: The wallet passphrase entered was incorrect."); throw JSONRPCError(RPC_WALLET_PASSPHRASE_INCORRECT, "Error: The wallet passphrase entered was incorrect.");
@ -2200,14 +2186,9 @@ static UniValue encryptwallet(const JSONRPCRequest& request)
strWalletPass.reserve(100); strWalletPass.reserve(100);
strWalletPass = request.params[0].get_str().c_str(); strWalletPass = request.params[0].get_str().c_str();
if (strWalletPass.length() < 1) if (strWalletPass.empty()) {
throw std::runtime_error( throw JSONRPCError(RPC_INVALID_PARAMETER, "passphrase can not be empty");
RPCHelpMan{"encryptwallet", }
"Encrypts the wallet with <passphrase>.",
{
{"passphrase", RPCArg::Type::STR, false},
}}
.ToString());
if (!pwallet->EncryptWallet(strWalletPass)) { if (!pwallet->EncryptWallet(strWalletPass)) {
throw JSONRPCError(RPC_WALLET_ENCRYPTION_FAILED, "Error: Failed to encrypt the wallet."); throw JSONRPCError(RPC_WALLET_ENCRYPTION_FAILED, "Error: Failed to encrypt the wallet.");

View file

@ -31,12 +31,18 @@ class WalletEncryptionTest(BitcoinTestFramework):
privkey = self.nodes[0].dumpprivkey(address) privkey = self.nodes[0].dumpprivkey(address)
assert_equal(privkey[:1], "c") assert_equal(privkey[:1], "c")
assert_equal(len(privkey), 52) assert_equal(len(privkey), 52)
assert_raises_rpc_error(-15, "Error: running with an unencrypted wallet, but walletpassphrase was called", self.nodes[0].walletpassphrase, 'ff', 1)
assert_raises_rpc_error(-15, "Error: running with an unencrypted wallet, but walletpassphrasechange was called.", self.nodes[0].walletpassphrasechange, 'ff', 'ff')
# Encrypt the wallet # Encrypt the wallet
assert_raises_rpc_error(-8, "passphrase can not be empty", self.nodes[0].encryptwallet, '')
self.nodes[0].encryptwallet(passphrase) self.nodes[0].encryptwallet(passphrase)
# Test that the wallet is encrypted # Test that the wallet is encrypted
assert_raises_rpc_error(-13, "Please enter the wallet passphrase with walletpassphrase first", self.nodes[0].dumpprivkey, address) assert_raises_rpc_error(-13, "Please enter the wallet passphrase with walletpassphrase first", self.nodes[0].dumpprivkey, address)
assert_raises_rpc_error(-15, "Error: running with an encrypted wallet, but encryptwallet was called.", self.nodes[0].encryptwallet, 'ff')
assert_raises_rpc_error(-8, "passphrase can not be empty", self.nodes[0].walletpassphrase, '', 1)
assert_raises_rpc_error(-8, "passphrase can not be empty", self.nodes[0].walletpassphrasechange, '', 'ff')
# Check that walletpassphrase works # Check that walletpassphrase works
self.nodes[0].walletpassphrase(passphrase, 2) self.nodes[0].walletpassphrase(passphrase, 2)