From ee404e96ab07cc61eb9bc6c6e5d869d23bc52689 Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Wed, 9 Oct 2019 19:53:54 +0100 Subject: [PATCH] Merge PR #5164: Handle New{,Test}Keyring errors --- client/keys/migrate.go | 12 ++++++++++-- crypto/keys/keyring.go | 12 ++++++------ crypto/keys/keyring_test.go | 23 +++++++++++++++-------- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/client/keys/migrate.go b/client/keys/migrate.go index ae9c6e6b7..63f4e33b0 100644 --- a/client/keys/migrate.go +++ b/client/keys/migrate.go @@ -2,12 +2,14 @@ package keys import ( "bufio" + "fmt" "github.com/cosmos/cosmos-sdk/client/flags" "github.com/cosmos/cosmos-sdk/client/input" "github.com/cosmos/cosmos-sdk/crypto/keys" "github.com/cosmos/cosmos-sdk/types" + "github.com/pkg/errors" "github.com/spf13/cobra" "github.com/spf13/viper" ) @@ -48,10 +50,16 @@ func runMigrateCmd(cmd *cobra.Command, args []string) error { // instantiate keyring var keyring keys.Keybase buf := bufio.NewReader(cmd.InOrStdin()) + keyringServiceName := types.GetConfig().GetKeyringServiceName() if viper.GetBool(flags.FlagDryRun) { - keyring = keys.NewTestKeyring(types.GetConfig().GetKeyringServiceName(), rootDir) + keyring, err = keys.NewTestKeyring(keyringServiceName, rootDir) } else { - keyring = keys.NewKeyring(types.GetConfig().GetKeyringServiceName(), rootDir, buf) + keyring, err = keys.NewKeyring(keyringServiceName, rootDir, buf) + } + if err != nil { + return errors.Wrap(err, fmt.Sprintf( + "failed to initialize keyring for service %s at directory %s", + keyringServiceName, rootDir)) } for _, key := range oldKeys { diff --git a/crypto/keys/keyring.go b/crypto/keys/keyring.go index 7a06a4299..a80f5f5ce 100644 --- a/crypto/keys/keyring.go +++ b/crypto/keys/keyring.go @@ -38,24 +38,24 @@ type keyringKeybase struct { var maxPassphraseEntryAttempts = 3 // NewKeyring creates a new instance of a keyring. -func NewKeyring(name string, dir string, userInput io.Reader) Keybase { +func NewKeyring(name string, dir string, userInput io.Reader) (Keybase, error) { db, err := keyring.Open(lkbToKeyringConfig(name, dir, userInput, false)) if err != nil { - panic(err) + return nil, err } - return newKeyringKeybase(db) + return newKeyringKeybase(db), nil } // NewTestKeyring creates a new instance of a keyring for // testing purposes that does not prompt users for password. -func NewTestKeyring(name string, dir string) Keybase { +func NewTestKeyring(name string, dir string) (Keybase, error) { db, err := keyring.Open(lkbToKeyringConfig(name, dir, nil, true)) if err != nil { - panic(err) + return nil, err } - return newKeyringKeybase(db) + return newKeyringKeybase(db), nil } // CreateMnemonic generates a new key and persists it to storage, encrypted diff --git a/crypto/keys/keyring_test.go b/crypto/keys/keyring_test.go index a347939c6..0916e0f46 100644 --- a/crypto/keys/keyring_test.go +++ b/crypto/keys/keyring_test.go @@ -17,7 +17,8 @@ import ( func TestLazyKeyManagementKeyRing(t *testing.T) { dir, cleanup := tests.NewTestCaseDir(t) defer cleanup() - kb := NewTestKeyring("keybasename", dir) + kb, err := NewTestKeyring("keybasename", dir) + require.NoError(t, err) algo := Secp256k1 n1, n2, n3 := "personal", "business", "other" @@ -100,7 +101,8 @@ func TestLazyKeyManagementKeyRing(t *testing.T) { func TestLazySignVerifyKeyRing(t *testing.T) { dir, cleanup := tests.NewTestCaseDir(t) defer cleanup() - kb := NewTestKeyring("keybasename", dir) + kb, err := NewTestKeyring("keybasename", dir) + require.NoError(t, err) algo := Secp256k1 n1, n2, n3 := "some dude", "a dudette", "dude-ish" @@ -175,7 +177,8 @@ func TestLazySignVerifyKeyRing(t *testing.T) { func TestLazyExportImportKeyRing(t *testing.T) { dir, cleanup := tests.NewTestCaseDir(t) defer cleanup() - kb := NewTestKeyring("keybasename", dir) + kb, err := NewTestKeyring("keybasename", dir) + require.NoError(t, err) info, _, err := kb.CreateMnemonic("john", English, "secretcpw", Secp256k1) require.NoError(t, err) @@ -203,7 +206,8 @@ func TestLazyExportImportKeyRing(t *testing.T) { func TestLazyExportImportPubKeyKeyRing(t *testing.T) { dir, cleanup := tests.NewTestCaseDir(t) defer cleanup() - kb := NewTestKeyring("keybasename", dir) + kb, err := NewTestKeyring("keybasename", dir) + require.NoError(t, err) // CreateMnemonic a private-public key pair and ensure consistency notPasswd := "n9y25ah7" @@ -242,7 +246,8 @@ func TestLazyExportImportPubKeyKeyRing(t *testing.T) { func TestLazyExportPrivateKeyObjectKeyRing(t *testing.T) { dir, cleanup := tests.NewTestCaseDir(t) defer cleanup() - kb := NewTestKeyring("keybasename", dir) + kb, err := NewTestKeyring("keybasename", dir) + require.NoError(t, err) info, _, err := kb.CreateMnemonic("john", English, "secretcpw", Secp256k1) require.NoError(t, err) @@ -257,14 +262,15 @@ func TestLazyExportPrivateKeyObjectKeyRing(t *testing.T) { func TestLazyAdvancedKeyManagementKeyRing(t *testing.T) { dir, cleanup := tests.NewTestCaseDir(t) defer cleanup() - kb := NewTestKeyring("keybasename", dir) + kb, err := NewTestKeyring("keybasename", dir) + require.NoError(t, err) algo := Secp256k1 n1, n2 := "old-name", "new name" p1 := "1234" // make sure key works with initial password - _, _, err := kb.CreateMnemonic(n1, English, p1, algo) + _, _, err = kb.CreateMnemonic(n1, English, p1, algo) require.Nil(t, err, "%+v", err) _, err = kb.Export(n1 + ".notreal") @@ -290,7 +296,8 @@ func TestLazyAdvancedKeyManagementKeyRing(t *testing.T) { func TestLazySeedPhraseKeyRing(t *testing.T) { dir, cleanup := tests.NewTestCaseDir(t) defer cleanup() - kb := NewTestKeyring("keybasename", dir) + kb, err := NewTestKeyring("keybasename", dir) + require.NoError(t, err) algo := Secp256k1 n1, n2 := "lost-key", "found-again"