Skip to content

Commit c307001

Browse files
authored
refactor(client): check name validation for keys add|import|rename (#18950)
1 parent 41c84d6 commit c307001

7 files changed

Lines changed: 69 additions & 0 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ Ref: https://keepachangelog.com/en/1.0.0/
5555

5656
### Improvements
5757

58+
* (client/keys) [#18950](https://github.com/cosmos/cosmos-sdk/pull/18950) Improve `<appd> keys add`, `<appd> keys import` and `<appd> keys rename` by checking name validation.
5859
* (baseapp) [#18915](https://github.com/cosmos/cosmos-sdk/pull/18915) Add a new `ExecModeVerifyVoteExtension` exec mode and ensure it's populated in the `Context` during `VerifyVoteExtension` execution.
5960
* (types) [#18888](https://github.com/cosmos/cosmos-sdk/pull/18888) Speedup DecCoin.Sort() if len(coins) <= 1
6061
* (types) [#18875](https://github.com/cosmos/cosmos-sdk/pull/18875) Speedup coins.Sort() if len(coins) <= 1

client/keys/add.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"errors"
99
"fmt"
1010
"sort"
11+
"strings"
1112

1213
"github.com/cosmos/go-bip39"
1314
"github.com/spf13/cobra"
@@ -123,6 +124,9 @@ func runAddCmd(ctx client.Context, cmd *cobra.Command, args []string, inBuf *buf
123124
var err error
124125

125126
name := args[0]
127+
if strings.TrimSpace(name) == "" {
128+
return errors.New("the provided name is invalid or empty after trimming whitespace")
129+
}
126130
interactive, _ := cmd.Flags().GetBool(flagInteractive)
127131
kb := ctx.Keyring
128132
outputFormat := ctx.OutputFormat

client/keys/add_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,17 @@ func Test_runAddCmdBasic(t *testing.T) {
4747
_ = kb.Delete("keyname2")
4848
})
4949

50+
// test empty name
51+
cmd.SetArgs([]string{
52+
"",
53+
fmt.Sprintf("--%s=%s", flags.FlagKeyringDir, kbHome),
54+
fmt.Sprintf("--%s=%s", flags.FlagOutput, flags.OutputFormatText),
55+
fmt.Sprintf("--%s=%s", flags.FlagKeyType, hd.Secp256k1Type),
56+
fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest),
57+
})
58+
mockIn.Reset("y\n")
59+
require.ErrorContains(t, cmd.ExecuteContext(ctx), "the provided name is invalid or empty after trimming whitespace")
60+
5061
cmd.SetArgs([]string{
5162
"keyname1",
5263
fmt.Sprintf("--%s=%s", flags.FlagKeyringDir, kbHome),

client/keys/import.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package keys
22

33
import (
44
"bufio"
5+
"errors"
56
"fmt"
67
"os"
8+
"strings"
79

810
"github.com/spf13/cobra"
911

@@ -26,6 +28,10 @@ func ImportKeyCommand() *cobra.Command {
2628
if err != nil {
2729
return err
2830
}
31+
name := args[0]
32+
if strings.TrimSpace(name) == "" {
33+
return errors.New("the provided name is invalid or empty after trimming whitespace")
34+
}
2935
buf := bufio.NewReader(clientCtx.Input)
3036

3137
bz, err := os.ReadFile(args[1])
@@ -54,6 +60,10 @@ func ImportKeyHexCommand() *cobra.Command {
5460
if err != nil {
5561
return err
5662
}
63+
name := args[0]
64+
if strings.TrimSpace(name) == "" {
65+
return errors.New("the provided name is invalid or empty after trimming whitespace")
66+
}
5767
keyType, _ := cmd.Flags().GetString(flags.FlagKeyType)
5868
return clientCtx.Keyring.ImportPrivKeyHex(args[0], args[1], keyType)
5969
},

client/keys/import_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,37 @@ func Test_runImportHexCmd(t *testing.T) {
177177
})
178178
}
179179
}
180+
181+
func Test_runImportCmdWithEmptyName(t *testing.T) {
182+
cmd := ImportKeyCommand()
183+
cmd.Flags().AddFlagSet(Commands().PersistentFlags())
184+
mockIn := testutil.ApplyMockIODiscardOutErr(cmd)
185+
// Now add a temporary keybase
186+
kbHome := t.TempDir()
187+
cdc := moduletestutil.MakeTestEncodingConfig().Codec
188+
kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, kbHome, mockIn, cdc)
189+
require.NoError(t, err)
190+
191+
clientCtx := client.Context{}.
192+
WithKeyringDir(kbHome).
193+
WithKeyring(kb).
194+
WithInput(mockIn).
195+
WithCodec(cdc)
196+
ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
197+
cmd.SetArgs([]string{
198+
"", "fake-file",
199+
fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest),
200+
})
201+
202+
require.ErrorContains(t, cmd.ExecuteContext(ctx), "the provided name is invalid or empty after trimming whitespace")
203+
204+
cmd = ImportKeyHexCommand()
205+
cmd.Flags().AddFlagSet(Commands().PersistentFlags())
206+
testutil.ApplyMockIODiscardOutErr(cmd)
207+
cmd.SetArgs([]string{
208+
"", "fake-hex",
209+
fmt.Sprintf("--%s=%s", flags.FlagKeyringBackend, keyring.BackendTest),
210+
})
211+
212+
require.ErrorContains(t, cmd.ExecuteContext(ctx), "the provided name is invalid or empty after trimming whitespace")
213+
}

client/keys/rename.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package keys
22

33
import (
44
"bufio"
5+
"errors"
56
"fmt"
7+
"strings"
68

79
"github.com/spf13/cobra"
810

@@ -31,6 +33,9 @@ private keys stored in a ledger device cannot be renamed with the CLI.
3133
}
3234

3335
oldName, newName := args[0], args[1]
36+
if strings.TrimSpace(newName) == "" {
37+
return errors.New("the new name cannot be empty or consist solely of whitespace")
38+
}
3439

3540
k, err := clientCtx.Keyring.Key(oldName)
3641
if err != nil {

client/keys/rename_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ func Test_runRenameCmd(t *testing.T) {
2727
yesF, _ := cmd.Flags().GetBool(flagYes)
2828
require.False(t, yesF)
2929

30+
invalidName := ""
3031
fakeKeyName1 := "runRenameCmd_Key1"
3132
fakeKeyName2 := "runRenameCmd_Key2"
3233

@@ -46,6 +47,9 @@ func Test_runRenameCmd(t *testing.T) {
4647

4748
ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
4849

50+
cmd.SetArgs([]string{fakeKeyName1, invalidName, fmt.Sprintf("--%s=%s", flags.FlagKeyringDir, kbHome)})
51+
require.ErrorContains(t, cmd.ExecuteContext(ctx), "the new name cannot be empty or consist solely of whitespace")
52+
4953
// rename a key 'blah' which doesnt exist
5054
cmd.SetArgs([]string{"blah", "blaah", fmt.Sprintf("--%s=%s", flags.FlagKeyringDir, kbHome)})
5155
err = cmd.ExecuteContext(ctx)

0 commit comments

Comments
 (0)