From 3cc5658c9e41bc0862c4d36fc28367b399fe044a Mon Sep 17 00:00:00 2001 From: likhita-809 <78951027+likhita-809@users.noreply.github.com> Date: Tue, 26 Oct 2021 16:36:44 +0530 Subject: [PATCH] fix: Migrate key names correctly (#10328) ## Description Closes: #10219 Migrate key names correctly when migrating from v0.42.9 to master keyring --- ### Author Checklist *All items are required. Please add a note to the item if the item is not applicable and please add links to any relevant follow up issues.* I have... - [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] added `!` to the type prefix if API or client breaking change - [ ] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting)) - [ ] provided a link to the relevant issue or specification - [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules) - [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing) - [ ] added a changelog entry to `CHANGELOG.md` - [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) - [ ] updated the relevant documentation or specification - [ ] reviewed "Files changed" and left comments if necessary - [ ] confirmed all CI checks have passed ### Reviewers Checklist *All items are required. Please add a note if the item is not applicable and please add your handle next to the items reviewed if you only reviewed selected items.* I have... - [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] confirmed `!` in the type prefix if API or client breaking change - [ ] confirmed all author checklist items have been addressed - [ ] reviewed state machine logic - [ ] reviewed API design and naming - [ ] reviewed documentation is accurate - [ ] reviewed tests and test coverage - [ ] manually tested (if applicable) --- client/keys/add_ledger_test.go | 5 +++-- client/keys/add_test.go | 3 +-- client/keys/delete.go | 4 ++-- client/keys/delete_test.go | 2 +- client/keys/rename.go | 3 ++- client/keys/rename_test.go | 2 +- crypto/keyring/keyring.go | 11 ++++++++--- crypto/keyring/keyring_test.go | 4 ++-- crypto/keyring/legacy_info.go | 2 ++ crypto/keyring/types.go | 1 + server/init.go | 3 +-- 11 files changed, 24 insertions(+), 16 deletions(-) diff --git a/client/keys/add_ledger_test.go b/client/keys/add_ledger_test.go index 90ffc16b78..e46b7e26fc 100644 --- a/client/keys/add_ledger_test.go +++ b/client/keys/add_ledger_test.go @@ -1,4 +1,5 @@ -//+build ledger test_ledger_mock +//go:build ledger || test_ledger_mock +// +build ledger test_ledger_mock package keys @@ -194,7 +195,7 @@ func Test_runAddCmdLedgerDryRun(t *testing.T) { } else { _, err = kb.Key("testkey") require.Error(t, err) - require.Equal(t, "testkey: key not found", err.Error()) + require.Equal(t, "testkey.info: key not found", err.Error()) } }) } diff --git a/client/keys/add_test.go b/client/keys/add_test.go index 6368fec6f1..edc7491222 100644 --- a/client/keys/add_test.go +++ b/client/keys/add_test.go @@ -8,7 +8,6 @@ import ( "testing" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/cli" "github.com/cosmos/cosmos-sdk/client" @@ -226,7 +225,7 @@ func Test_runAddCmdDryRun(t *testing.T) { } else { _, err = kb.Key("testkey") require.Error(t, err) - require.Equal(t, "testkey: key not found", err.Error()) + require.Equal(t, "testkey.info: key not found", err.Error()) } }) } diff --git a/client/keys/delete.go b/client/keys/delete.go index 939ede0623..46a269091d 100644 --- a/client/keys/delete.go +++ b/client/keys/delete.go @@ -3,11 +3,11 @@ package keys import ( "bufio" + "github.com/spf13/cobra" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/input" "github.com/cosmos/cosmos-sdk/crypto/keyring" - - "github.com/spf13/cobra" ) const ( diff --git a/client/keys/delete_test.go b/client/keys/delete_test.go index 2250eac5ce..b87a98da5a 100644 --- a/client/keys/delete_test.go +++ b/client/keys/delete_test.go @@ -53,7 +53,7 @@ func Test_runDeleteCmd(t *testing.T) { err = cmd.ExecuteContext(ctx) require.Error(t, err) - require.EqualError(t, err, "blah: key not found") + require.EqualError(t, err, "blah.info: key not found") // User confirmation missing cmd.SetArgs([]string{ diff --git a/client/keys/rename.go b/client/keys/rename.go index 18326c8d35..f703c60f20 100644 --- a/client/keys/rename.go +++ b/client/keys/rename.go @@ -4,10 +4,11 @@ import ( "bufio" "fmt" + "github.com/spf13/cobra" + "github.com/cosmos/cosmos-sdk/client" "github.com/cosmos/cosmos-sdk/client/input" "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/spf13/cobra" ) // RenameKeyCommand renames a key from the key store. diff --git a/client/keys/rename_test.go b/client/keys/rename_test.go index cf2e859648..b32e08c096 100644 --- a/client/keys/rename_test.go +++ b/client/keys/rename_test.go @@ -49,7 +49,7 @@ func Test_runRenameCmd(t *testing.T) { cmd.SetArgs([]string{"blah", "blaah", fmt.Sprintf("--%s=%s", flags.FlagHome, kbHome)}) err = cmd.ExecuteContext(ctx) require.Error(t, err) - require.EqualError(t, err, "blah: key not found") + require.EqualError(t, err, "blah.info: key not found") // User confirmation missing cmd.SetArgs([]string{ diff --git a/crypto/keyring/keyring.go b/crypto/keyring/keyring.go index 156147eaaf..7686d18cdd 100644 --- a/crypto/keyring/keyring.go +++ b/crypto/keyring/keyring.go @@ -11,7 +11,6 @@ import ( "strings" "github.com/99designs/keyring" - "github.com/cosmos/go-bip39" "github.com/pkg/errors" "github.com/tendermint/crypto/bcrypt" tmcrypto "github.com/tendermint/tendermint/crypto" @@ -24,6 +23,7 @@ import ( "github.com/cosmos/cosmos-sdk/crypto/types" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + "github.com/cosmos/go-bip39" ) // Backend options for Keyring @@ -440,6 +440,8 @@ func (ks keystore) Rename(oldName, newName string) error { return nil } +// Delete deletes a key in the keyring. `uid` represents the key name, without +// the `.info` suffix. func (ks keystore) Delete(uid string) error { k, err := ks.Key(uid) if err != nil { @@ -456,7 +458,7 @@ func (ks keystore) Delete(uid string) error { return err } - err = ks.db.Remove(uid) + err = ks.db.Remove(infoKey(uid)) if err != nil { return err } @@ -770,7 +772,7 @@ func (ks keystore) writeRecord(k *Record) error { return err } - key := k.Name + key := infoKey(k.Name) exists, err := ks.existsInDb(addr, key) if err != nil { @@ -877,6 +879,9 @@ func (ks keystore) MigrateAll() (bool, error) { // migrate converts keyring.Item from amino to proto serialization format. func (ks keystore) migrate(key string) (*Record, bool, error) { + if !(strings.HasSuffix(key, infoSuffix)) && !(strings.HasPrefix(key, sdk.Bech32PrefixAccAddr)) { + key = infoKey(key) + } item, err := ks.db.Get(key) if err != nil { return nil, false, wrapKeyNotFound(err, key) diff --git a/crypto/keyring/keyring_test.go b/crypto/keyring/keyring_test.go index 6fc968240b..3afd35676f 100644 --- a/crypto/keyring/keyring_test.go +++ b/crypto/keyring/keyring_test.go @@ -7,7 +7,7 @@ import ( "testing" "github.com/99designs/keyring" - bip39 "github.com/cosmos/go-bip39" + "github.com/cosmos/go-bip39" "github.com/stretchr/testify/require" "github.com/cosmos/cosmos-sdk/codec" @@ -432,7 +432,7 @@ func TestKeyringKeybaseExportImportPrivKey(t *testing.T) { // try export non existing key _, err = kb.ExportPrivKeyArmor("john3", "wrongpassword") - require.EqualError(t, err, "john3: key not found") + require.EqualError(t, err, "john3.info: key not found") } func TestInMemoryLanguage(t *testing.T) { diff --git a/crypto/keyring/legacy_info.go b/crypto/keyring/legacy_info.go index 0480fa5eb2..8b05b6a031 100644 --- a/crypto/keyring/legacy_info.go +++ b/crypto/keyring/legacy_info.go @@ -43,6 +43,8 @@ type legacyLocalInfo struct { Algo hd.PubKeyType `json:"algo"` } +func infoKey(name string) string { return fmt.Sprintf("%s.%s", name, infoSuffix) } + // GetType implements Info interface func (i legacyLocalInfo) GetType() KeyType { return TypeLocal diff --git a/crypto/keyring/types.go b/crypto/keyring/types.go index 307eb9b3f0..0b893ea4cc 100644 --- a/crypto/keyring/types.go +++ b/crypto/keyring/types.go @@ -37,6 +37,7 @@ const ( // bits of entropy to draw when creating a mnemonic defaultEntropySize = 256 addressSuffix = "address" + infoSuffix = "info" ) // KeyType reflects a human-readable type for key listing. diff --git a/server/init.go b/server/init.go index e00ca1d35a..1b6e0cdc51 100644 --- a/server/init.go +++ b/server/init.go @@ -3,9 +3,8 @@ package server import ( "fmt" - "github.com/cosmos/cosmos-sdk/crypto/keyring" - "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/crypto/keyring" sdk "github.com/cosmos/cosmos-sdk/types" )