Fixed setaccount accepting foreign address

Fixed issue #4209 where using setaccount with a foreign
address causes the address to be added to your receiving addresses.
This commit is contained in:
Eric Shaw 2014-09-25 18:39:28 -04:00 committed by Wladimir J. van der Laan
parent 4b2b78b9f2
commit 31d6390fd1
2 changed files with 18 additions and 9 deletions

View File

@ -230,15 +230,20 @@ Value setaccount(const Array& params, bool fHelp)
if (params.size() > 1) if (params.size() > 1)
strAccount = AccountFromValue(params[1]); strAccount = AccountFromValue(params[1]);
// Detect when changing the account of an address that is the 'unused current key' of another account: // Only add the account if the address is yours.
if (pwalletMain->mapAddressBook.count(address.Get())) if (IsMine(*pwalletMain, address.Get()))
{ {
string strOldAccount = pwalletMain->mapAddressBook[address.Get()].name; // Detect when changing the account of an address that is the 'unused current key' of another account:
if (address == GetAccountAddress(strOldAccount)) if (pwalletMain->mapAddressBook.count(address.Get()))
GetAccountAddress(strOldAccount, true); {
string strOldAccount = pwalletMain->mapAddressBook[address.Get()].name;
if (address == GetAccountAddress(strOldAccount))
GetAccountAddress(strOldAccount, true);
}
pwalletMain->SetAddressBook(address.Get(), strAccount, "receive");
} }
else
pwalletMain->SetAddressBook(address.Get(), strAccount, "receive"); throw JSONRPCError(RPC_MISC_ERROR, "setaccount can only be used with own address");
return Value::null; return Value::null;
} }

View File

@ -80,11 +80,15 @@ BOOST_AUTO_TEST_CASE(rpc_wallet)
walletdb.WriteAccount(strAccount, account); walletdb.WriteAccount(strAccount, account);
}); });
CPubKey setaccountDemoPubkey = pwalletMain->GenerateNewKey();
CBitcoinAddress setaccountDemoAddress = CBitcoinAddress(CTxDestination(setaccountDemoPubkey.GetID()));
/********************************* /*********************************
* setaccount * setaccount
*********************************/ *********************************/
BOOST_CHECK_NO_THROW(CallRPC("setaccount 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ nullaccount")); BOOST_CHECK_NO_THROW(CallRPC("setaccount " + setaccountDemoAddress.ToString() + " nullaccount"));
/* 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ is not owned by the test wallet. */
BOOST_CHECK_THROW(CallRPC("setaccount 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4XZ nullaccount"), runtime_error);
BOOST_CHECK_THROW(CallRPC("setaccount"), runtime_error); BOOST_CHECK_THROW(CallRPC("setaccount"), runtime_error);
/* 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X (33 chars) is an illegal address (should be 34 chars) */ /* 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X (33 chars) is an illegal address (should be 34 chars) */
BOOST_CHECK_THROW(CallRPC("setaccount 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X nullaccount"), runtime_error); BOOST_CHECK_THROW(CallRPC("setaccount 1D1ZrZNe3JUo7ZycKEYQQiQAWd9y54F4X nullaccount"), runtime_error);