Browse Source

avoid strAddress + validity checks

Avoid references to addresses using strings, and use CBitcoinAddress
as much as possible. Also added some validity checks on addresses
entered using RPC.
0.8
Pieter Wuille 13 years ago
parent
commit
4d2ef6e5b6
  1. 36
      src/rpc.cpp

36
src/rpc.cpp

@ -342,21 +342,19 @@ Value getnewaddress(const Array& params, bool fHelp) @@ -342,21 +342,19 @@ Value getnewaddress(const Array& params, bool fHelp)
strAccount = AccountFromValue(params[0]);
// Generate a new key that is added to wallet
string strAddress = CBitcoinAddress(pwalletMain->GetOrReuseKeyFromPool()).ToString();
CBitcoinAddress address(pwalletMain->GetOrReuseKeyFromPool());
// This could be done in the same main CS as GetKeyFromKeyPool.
CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook)
pwalletMain->SetAddressBookName(strAddress, strAccount);
pwalletMain->SetAddressBookName(address, strAccount);
return strAddress;
return address.ToString();
}
// requires cs_main, cs_mapWallet, cs_mapAddressBook locks
CBitcoinAddress GetAccountAddress(string strAccount, bool bForceNew=false)
{
string strAddress;
CWalletDB walletdb(pwalletMain->strWalletFile);
CAccount account;
@ -393,8 +391,7 @@ CBitcoinAddress GetAccountAddress(string strAccount, bool bForceNew=false) @@ -393,8 +391,7 @@ CBitcoinAddress GetAccountAddress(string strAccount, bool bForceNew=false)
else
{
account.vchPubKey = pwalletMain->GetOrReuseKeyFromPool();
string strAddress = CBitcoinAddress(account.vchPubKey).ToString();
pwalletMain->SetAddressBookName(strAddress, strAccount);
pwalletMain->SetAddressBookName(CBitcoinAddress(account.vchPubKey), strAccount);
walletdb.WriteAccount(strAccount, account);
}
}
@ -434,8 +431,7 @@ Value setaccount(const Array& params, bool fHelp) @@ -434,8 +431,7 @@ Value setaccount(const Array& params, bool fHelp)
"setaccount <bitcoinaddress> <account>\n"
"Sets the account associated with the given address.");
string strAddress = params[0].get_str();
CBitcoinAddress address(strAddress);
CBitcoinAddress address(params[0].get_str());
if (!address.IsValid())
throw JSONRPCError(-5, "Invalid bitcoin address");
@ -456,7 +452,7 @@ Value setaccount(const Array& params, bool fHelp) @@ -456,7 +452,7 @@ Value setaccount(const Array& params, bool fHelp)
GetAccountAddress(strOldAccount, true);
}
pwalletMain->SetAddressBookName(strAddress, strAccount);
pwalletMain->SetAddressBookName(address, strAccount);
}
return Value::null;
@ -470,8 +466,9 @@ Value getaccount(const Array& params, bool fHelp) @@ -470,8 +466,9 @@ Value getaccount(const Array& params, bool fHelp)
"getaccount <bitcoinaddress>\n"
"Returns the account associated with the given address.");
string strAddress = params[0].get_str();
CBitcoinAddress address(strAddress);
CBitcoinAddress address(params[0].get_str());
if (!address.IsValid())
throw JSONRPCError(-5, "Invalid bitcoin address");
string strAccount;
CRITICAL_BLOCK(pwalletMain->cs_mapAddressBook)
@ -536,7 +533,9 @@ Value sendtoaddress(const Array& params, bool fHelp) @@ -536,7 +533,9 @@ Value sendtoaddress(const Array& params, bool fHelp)
"sendtoaddress <bitcoinaddress> <amount> [comment] [comment-to]\n"
"<amount> is a real and is rounded to the nearest 0.00000001");
string strAddress = params[0].get_str();
CBitcoinAddress address(params[0].get_str());
if (!address.IsValid())
throw JSONRPCError(-5, "Invalid bitcoin address");
// Amount
int64 nAmount = AmountFromValue(params[1]);
@ -554,7 +553,7 @@ Value sendtoaddress(const Array& params, bool fHelp) @@ -554,7 +553,7 @@ Value sendtoaddress(const Array& params, bool fHelp)
if(pwalletMain->IsLocked())
throw JSONRPCError(-14, "Error: The wallet passphrase entered was incorrect.");
string strError = pwalletMain->SendMoneyToBitcoinAddress(strAddress, nAmount, wtx);
string strError = pwalletMain->SendMoneyToBitcoinAddress(address, nAmount, wtx);
if (strError != "")
throw JSONRPCError(-4, strError);
}
@ -807,7 +806,9 @@ Value sendfrom(const Array& params, bool fHelp) @@ -807,7 +806,9 @@ Value sendfrom(const Array& params, bool fHelp)
"<amount> is a real and is rounded to the nearest 0.00000001");
string strAccount = AccountFromValue(params[0]);
string strAddress = params[1].get_str();
CBitcoinAddress address(params[1].get_str());
if (!address.IsValid())
throw JSONRPCError(-5, "Invalid bitcoin address");
int64 nAmount = AmountFromValue(params[2]);
int nMinDepth = 1;
if (params.size() > 3)
@ -833,7 +834,7 @@ Value sendfrom(const Array& params, bool fHelp) @@ -833,7 +834,7 @@ Value sendfrom(const Array& params, bool fHelp)
throw JSONRPCError(-6, "Account has insufficient funds");
// Send
string strError = pwalletMain->SendMoneyToBitcoinAddress(strAddress, nAmount, wtx);
string strError = pwalletMain->SendMoneyToBitcoinAddress(address, nAmount, wtx);
if (strError != "")
throw JSONRPCError(-4, strError);
}
@ -1538,8 +1539,7 @@ Value validateaddress(const Array& params, bool fHelp) @@ -1538,8 +1539,7 @@ Value validateaddress(const Array& params, bool fHelp)
"validateaddress <bitcoinaddress>\n"
"Return information about <bitcoinaddress>.");
string strAddress = params[0].get_str();
CBitcoinAddress address(strAddress);
CBitcoinAddress address(params[0].get_str());
bool isValid = address.IsValid();
Object ret;

Loading…
Cancel
Save