keys: Keybase.Update no longer asks for newpass if oldpass is incorrect
Achieved by refactoring the parameter newpass as follows: * (newpass string) -> (getNewpass func() (string, error)) Closes #1629
This commit is contained in:
@@ -330,8 +330,9 @@ func (kb dbKeybase) Delete(name, passphrase string) error {
|
||||
// encrypted.
|
||||
//
|
||||
// oldpass must be the current passphrase used for encryption,
|
||||
// newpass will be the only valid passphrase from this time forward.
|
||||
func (kb dbKeybase) Update(name, oldpass, newpass string) error {
|
||||
// getNewpass is a function to get the passphrase to permanently replace
|
||||
// the current passphrase
|
||||
func (kb dbKeybase) Update(name, oldpass string, getNewpass func() (string, error)) error {
|
||||
info, err := kb.Get(name)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -343,6 +344,10 @@ func (kb dbKeybase) Update(name, oldpass, newpass string) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
newpass, err := getNewpass()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
kb.writeLocalKey(key, name, newpass)
|
||||
return nil
|
||||
default:
|
||||
|
||||
@@ -167,9 +167,10 @@ func TestSignVerify(t *testing.T) {
|
||||
}
|
||||
|
||||
func assertPassword(t *testing.T, cstore Keybase, name, pass, badpass string) {
|
||||
err := cstore.Update(name, badpass, pass)
|
||||
getNewpass := func() (string, error) { return pass, nil }
|
||||
err := cstore.Update(name, badpass, getNewpass)
|
||||
require.NotNil(t, err)
|
||||
err = cstore.Update(name, pass, pass)
|
||||
err = cstore.Update(name, pass, getNewpass)
|
||||
require.Nil(t, err, "%+v", err)
|
||||
}
|
||||
|
||||
@@ -265,12 +266,13 @@ func TestAdvancedKeyManagement(t *testing.T) {
|
||||
assertPassword(t, cstore, n1, p1, p2)
|
||||
|
||||
// update password requires the existing password
|
||||
err = cstore.Update(n1, "jkkgkg", p2)
|
||||
getNewpass := func() (string, error) { return p2, nil }
|
||||
err = cstore.Update(n1, "jkkgkg", getNewpass)
|
||||
require.NotNil(t, err)
|
||||
assertPassword(t, cstore, n1, p1, p2)
|
||||
|
||||
// then it changes the password when correct
|
||||
err = cstore.Update(n1, p1, p2)
|
||||
err = cstore.Update(n1, p1, getNewpass)
|
||||
require.NoError(t, err)
|
||||
// p2 is now the proper one!
|
||||
assertPassword(t, cstore, n1, p2, p1)
|
||||
|
||||
@@ -34,7 +34,7 @@ type Keybase interface {
|
||||
CreateOffline(name string, pubkey crypto.PubKey) (info Info, err error)
|
||||
|
||||
// The following operations will *only* work on locally-stored keys
|
||||
Update(name, oldpass, newpass string) error
|
||||
Update(name, oldpass string, getNewpass func() (string, error)) error
|
||||
Import(name string, armor string) (err error)
|
||||
ImportPubKey(name string, armor string) (err error)
|
||||
Export(name string) (armor string, err error)
|
||||
|
||||
Reference in New Issue
Block a user