aboutsummaryrefslogtreecommitdiff
path: root/src/wallet.cpp
diff options
context:
space:
mode:
authorGavin Andresen <gavinandresen@gmail.com>2013-05-07 10:47:00 -0400
committerGavin Andresen <gavinandresen@gmail.com>2013-05-07 11:47:33 -0400
commit92f2c1fe0fe2905540b0435188988851145f92be (patch)
treebd9d7b05aee0bbe4520ddcb08b0a88947c51795d /src/wallet.cpp
parent9d053d170be718cf0ff902916fb11ffdee46537b (diff)
Use boost::asio::deadline_timer for walletpassphrase timeout
New method in bitcoinrpc: RunLater, that uses a map of deadline timers to run a function later. Behavior of walletpassphrase is changed; before, calling walletpassphrase again before the lock timeout passed would result in: Error: Wallet is already unlocked. You would have to call lockwallet before walletpassphrase. Now: the last walletpassphrase with correct password wins, and overrides any previous timeout. Fixes issue# 1961 which was caused by spawning too many threads. Test plan: Start with encrypted wallet, password 'foo' NOTE: python -c 'import time; print("%d"%time.time())' ... will tell you current unix timestamp. Try: walletpassphrase foo 600 getinfo EXPECT: unlocked_until is about 10 minutes in the future walletpassphrase foo 1 sleep 2 sendtoaddress mun74Bvba3B1PF2YkrF4NsgcJwHXXh12LF 11 EXPECT: Error: Please enter the wallet passphrase with walletpassphrase first. walletpassphrase foo 600 walletpassphrase foo 0 getinfo EXPECT: wallet is locked (unlocked_until is 0) walletpassphrase foo 10 walletpassphrase foo 600 getinfo EXPECT: wallet is unlocked until 10 minutes in future walletpassphrase foo 60 walletpassphrase bar 600 EXPECT: Error, incorrect passphrase getinfo EXPECT: wallet still scheduled to lock 60 seconds from first (successful) walletpassphrase
Diffstat (limited to 'src/wallet.cpp')
-rw-r--r--src/wallet.cpp5
1 files changed, 1 insertions, 4 deletions
diff --git a/src/wallet.cpp b/src/wallet.cpp
index c70ea20e88..eebd8ac18f 100644
--- a/src/wallet.cpp
+++ b/src/wallet.cpp
@@ -87,9 +87,6 @@ bool CWallet::AddCScript(const CScript& redeemScript)
bool CWallet::Unlock(const SecureString& strWalletPassphrase)
{
- if (!IsLocked())
- return false;
-
CCrypter crypter;
CKeyingMaterial vMasterKey;
@@ -100,7 +97,7 @@ bool CWallet::Unlock(const SecureString& strWalletPassphrase)
if(!crypter.SetKeyFromPassphrase(strWalletPassphrase, pMasterKey.second.vchSalt, pMasterKey.second.nDeriveIterations, pMasterKey.second.nDerivationMethod))
return false;
if (!crypter.Decrypt(pMasterKey.second.vchCryptedKey, vMasterKey))
- return false;
+ continue; // try another master key
if (CCryptoKeyStore::Unlock(vMasterKey))
return true;
}