• Gavin Andresen's avatar
    Use boost::asio::deadline_timer for walletpassphrase timeout · e7c715e9
    Gavin Andresen authored
    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
    e7c715e9
wallet.cpp 60.5 KB