accounts: ensure TimedUnlock does not override indefinite unlock timeout
This commit is contained in:
		@@ -164,14 +164,15 @@ func (am *Manager) Lock(addr common.Address) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TimedUnlock unlocks the given account with. The account
 | 
					// TimedUnlock unlocks the given account with the passphrase. The account
 | 
				
			||||||
// stays unlocked for the duration of timeout. A timeout of 0 unlocks the account
 | 
					// stays unlocked for the duration of timeout. A timeout of 0 unlocks the account
 | 
				
			||||||
// until the program exits. The account must match a unique key.
 | 
					// until the program exits. The account must match a unique key file.
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// If the accout is already unlocked, TimedUnlock extends or shortens
 | 
					// If the account address is already unlocked for a duration, TimedUnlock extends or
 | 
				
			||||||
// the active unlock timeout.
 | 
					// shortens the active unlock timeout. If the address was previously unlocked
 | 
				
			||||||
func (am *Manager) TimedUnlock(a Account, keyAuth string, timeout time.Duration) error {
 | 
					// indefinitely the timeout is not altered.
 | 
				
			||||||
	_, key, err := am.getDecryptedKey(a, keyAuth)
 | 
					func (am *Manager) TimedUnlock(a Account, passphrase string, timeout time.Duration) error {
 | 
				
			||||||
 | 
						a, key, err := am.getDecryptedKey(a, passphrase)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -180,8 +181,13 @@ func (am *Manager) TimedUnlock(a Account, keyAuth string, timeout time.Duration)
 | 
				
			|||||||
	defer am.mu.Unlock()
 | 
						defer am.mu.Unlock()
 | 
				
			||||||
	u, found := am.unlocked[a.Address]
 | 
						u, found := am.unlocked[a.Address]
 | 
				
			||||||
	if found {
 | 
						if found {
 | 
				
			||||||
		// terminate dropLater for this key to avoid unexpected drops.
 | 
							if u.abort == nil {
 | 
				
			||||||
		if u.abort != nil {
 | 
								// The address was unlocked indefinitely, so unlocking
 | 
				
			||||||
 | 
								// it with a timeout would be confusing.
 | 
				
			||||||
 | 
								zeroKey(key.PrivateKey)
 | 
				
			||||||
 | 
								return nil
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								// Terminate the expire goroutine and replace it below.
 | 
				
			||||||
			close(u.abort)
 | 
								close(u.abort)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -120,8 +120,8 @@ func TestOverrideUnlock(t *testing.T) {
 | 
				
			|||||||
	pass := "foo"
 | 
						pass := "foo"
 | 
				
			||||||
	a1, err := am.NewAccount(pass)
 | 
						a1, err := am.NewAccount(pass)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Unlock indefinitely
 | 
						// Unlock indefinitely.
 | 
				
			||||||
	if err = am.Unlock(a1, pass); err != nil {
 | 
						if err = am.TimedUnlock(a1, pass, 5*time.Minute); err != nil {
 | 
				
			||||||
		t.Fatal(err)
 | 
							t.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user