Skip to content

Commit 42c8767

Browse files
committed
fix: added key when dry-run is true (cosmos#9480)
(cherry picked from commit 7679820)
1 parent 4fc0f4e commit 42c8767

File tree

5 files changed

+197
-15
lines changed

5 files changed

+197
-15
lines changed

client/keys/add.go

+17-13
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func runAddCmdPrepare(cmd *cobra.Command, args []string) error {
8989
return err
9090
}
9191

92-
return RunAddCmd(clientCtx, cmd, args, buf)
92+
return runAddCmd(clientCtx, cmd, args, buf)
9393
}
9494

9595
/*
@@ -101,7 +101,7 @@ input
101101
output
102102
- armor encrypted private key (saved to file)
103103
*/
104-
func RunAddCmd(ctx client.Context, cmd *cobra.Command, args []string, inBuf *bufio.Reader) error {
104+
func runAddCmd(ctx client.Context, cmd *cobra.Command, args []string, inBuf *bufio.Reader) error {
105105
var err error
106106

107107
name := args[0]
@@ -118,7 +118,10 @@ func RunAddCmd(ctx client.Context, cmd *cobra.Command, args []string, inBuf *buf
118118
return err
119119
}
120120

121-
if dryRun, _ := cmd.Flags().GetBool(flags.FlagDryRun); !dryRun {
121+
if dryRun, _ := cmd.Flags().GetBool(flags.FlagDryRun); dryRun {
122+
// use in memory keybase
123+
kb = keyring.NewInMemory()
124+
} else {
122125
_, err = kb.Key(name)
123126
if err == nil {
124127
// account exists, ask for user confirmation
@@ -139,20 +142,19 @@ func RunAddCmd(ctx client.Context, cmd *cobra.Command, args []string, inBuf *buf
139142

140143
multisigKeys, _ := cmd.Flags().GetStringSlice(flagMultisig)
141144
if len(multisigKeys) != 0 {
142-
var pks []cryptotypes.PubKey
143-
145+
pks := make([]cryptotypes.PubKey, len(multisigKeys))
144146
multisigThreshold, _ := cmd.Flags().GetInt(flagMultiSigThreshold)
145147
if err := validateMultisigThreshold(multisigThreshold, len(multisigKeys)); err != nil {
146148
return err
147149
}
148150

149-
for _, keyname := range multisigKeys {
151+
for i, keyname := range multisigKeys {
150152
k, err := kb.Key(keyname)
151153
if err != nil {
152154
return err
153155
}
154156

155-
pks = append(pks, k.GetPubKey())
157+
pks[i] = k.GetPubKey()
156158
}
157159

158160
if noSort, _ := cmd.Flags().GetBool(flagNoSort); !noSort {
@@ -162,27 +164,29 @@ func RunAddCmd(ctx client.Context, cmd *cobra.Command, args []string, inBuf *buf
162164
}
163165

164166
pk := multisig.NewLegacyAminoPubKey(multisigThreshold, pks)
165-
if _, err := kb.SaveMultisig(name, pk); err != nil {
167+
info, err := kb.SaveMultisig(name, pk)
168+
if err != nil {
166169
return err
167170
}
168171

169-
cmd.PrintErrf("Key %q saved to disk.\n", name)
170-
return nil
172+
return printCreate(cmd, info, false, "", outputFormat)
171173
}
172174
}
173175

174176
pubKey, _ := cmd.Flags().GetString(FlagPublicKey)
175177
if pubKey != "" {
176-
pk, err := sdk.GetPubKeyFromBech32(sdk.Bech32PubKeyTypeAccPub, pubKey)
178+
var pk cryptotypes.PubKey
179+
err = ctx.JSONMarshaler.UnmarshalInterfaceJSON([]byte(pubKey), &pk)
177180
if err != nil {
178181
return err
179182
}
180183

181-
if _, err := kb.SavePubKey(name, pk, algo.Name()); err != nil {
184+
info, err := kb.SavePubKey(name, pk, algo.Name())
185+
if err != nil {
182186
return err
183187
}
184188

185-
return nil
189+
return printCreate(cmd, info, false, "", outputFormat)
186190
}
187191

188192
coinType, _ := cmd.Flags().GetUint32(flagCoinType)

client/keys/add_ledger_test.go

+65
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
package keys
44

55
import (
6+
"bytes"
67
"context"
78
"fmt"
9+
"io/ioutil"
810
"testing"
911

1012
"github.com/stretchr/testify/require"
@@ -125,3 +127,66 @@ func Test_runAddCmdLedger(t *testing.T) {
125127
"cosmospub1addwnpepqd87l8xhcnrrtzxnkql7k55ph8fr9jarf4hn6udwukfprlalu8lgw0urza0",
126128
sdk.MustBech32ifyPubKey(sdk.Bech32PubKeyTypeAccPub, key1.GetPubKey()))
127129
}
130+
131+
func Test_runAddCmdLedgerDryRun(t *testing.T) {
132+
testData := []struct {
133+
name string
134+
args []string
135+
added bool
136+
}{
137+
{
138+
name: "ledger account is added",
139+
args: []string{
140+
"testkey",
141+
fmt.Sprintf("--%s=%s", flags.FlagDryRun, "false"),
142+
fmt.Sprintf("--%s=%s", flags.FlagUseLedger, "true"),
143+
},
144+
added: true,
145+
},
146+
{
147+
name: "ledger account is not added with dry run",
148+
args: []string{
149+
"testkey",
150+
fmt.Sprintf("--%s=%s", flags.FlagDryRun, "true"),
151+
fmt.Sprintf("--%s=%s", flags.FlagUseLedger, "true"),
152+
},
153+
added: false,
154+
},
155+
}
156+
for _, tt := range testData {
157+
tt := tt
158+
t.Run(tt.name, func(t *testing.T) {
159+
cmd := AddKeyCommand()
160+
cmd.Flags().AddFlagSet(Commands("home").PersistentFlags())
161+
162+
kbHome := t.TempDir()
163+
mockIn := testutil.ApplyMockIODiscardOutErr(cmd)
164+
kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, kbHome, mockIn)
165+
require.NoError(t, err)
166+
167+
clientCtx := client.Context{}.
168+
WithKeyringDir(kbHome).
169+
WithKeyring(kb)
170+
ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
171+
172+
b := bytes.NewBufferString("")
173+
cmd.SetOut(b)
174+
175+
cmd.SetArgs(tt.args)
176+
require.NoError(t, cmd.ExecuteContext(ctx))
177+
178+
if tt.added {
179+
_, err = kb.Key("testkey")
180+
require.NoError(t, err)
181+
182+
out, err := ioutil.ReadAll(b)
183+
require.NoError(t, err)
184+
require.Contains(t, string(out), "name: testkey")
185+
} else {
186+
_, err = kb.Key("testkey")
187+
require.Error(t, err)
188+
require.Equal(t, "The specified item could not be found in the keyring", err.Error())
189+
}
190+
})
191+
}
192+
}

client/keys/add_test.go

+113
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package keys
22

33
import (
4+
"bytes"
45
"context"
56
"fmt"
7+
"io/ioutil"
68
"testing"
79

810
"github.com/stretchr/testify/require"
@@ -13,6 +15,7 @@ import (
1315
"github.com/cosmos/cosmos-sdk/client/flags"
1416
"github.com/cosmos/cosmos-sdk/crypto/hd"
1517
"github.com/cosmos/cosmos-sdk/crypto/keyring"
18+
"github.com/cosmos/cosmos-sdk/simapp"
1619
"github.com/cosmos/cosmos-sdk/testutil"
1720
sdk "github.com/cosmos/cosmos-sdk/types"
1821
)
@@ -114,3 +117,113 @@ func Test_runAddCmdBasic(t *testing.T) {
114117
mockIn.Reset("\n" + password + "\n" + "fail" + "\n")
115118
require.Error(t, cmd.ExecuteContext(ctx))
116119
}
120+
121+
func Test_runAddCmdDryRun(t *testing.T) {
122+
pubkey1 := `{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"AtObiFVE4s+9+RX5SP8TN9r2mxpoaT4eGj9CJfK7VRzN"}`
123+
pubkey2 := `{"@type":"/cosmos.crypto.secp256k1.PubKey","key":"A/se1vkqgdQ7VJQCM4mxN+L+ciGhnnJ4XYsQCRBMrdRi"}`
124+
125+
testData := []struct {
126+
name string
127+
args []string
128+
added bool
129+
}{
130+
{
131+
name: "account is added",
132+
args: []string{
133+
"testkey",
134+
fmt.Sprintf("--%s=%s", flags.FlagDryRun, "false"),
135+
},
136+
added: true,
137+
},
138+
{
139+
name: "account is not added with dry run",
140+
args: []string{
141+
"testkey",
142+
fmt.Sprintf("--%s=%s", flags.FlagDryRun, "true"),
143+
},
144+
added: false,
145+
},
146+
{
147+
name: "multisig account is added",
148+
args: []string{
149+
"testkey",
150+
fmt.Sprintf("--%s=%s", flags.FlagDryRun, "false"),
151+
fmt.Sprintf("--%s=%s", flagMultisig, "subkey"),
152+
},
153+
added: true,
154+
},
155+
{
156+
name: "multisig account is not added with dry run",
157+
args: []string{
158+
"testkey",
159+
fmt.Sprintf("--%s=%s", flags.FlagDryRun, "true"),
160+
fmt.Sprintf("--%s=%s", flagMultisig, "subkey"),
161+
},
162+
added: false,
163+
},
164+
{
165+
name: "pubkey account is added",
166+
args: []string{
167+
"testkey",
168+
fmt.Sprintf("--%s=%s", flags.FlagDryRun, "false"),
169+
fmt.Sprintf("--%s=%s", FlagPublicKey, pubkey1),
170+
},
171+
added: true,
172+
},
173+
{
174+
name: "pubkey account is not added with dry run",
175+
args: []string{
176+
"testkey",
177+
fmt.Sprintf("--%s=%s", flags.FlagDryRun, "true"),
178+
fmt.Sprintf("--%s=%s", FlagPublicKey, pubkey2),
179+
},
180+
added: false,
181+
},
182+
}
183+
for _, tt := range testData {
184+
tt := tt
185+
t.Run(tt.name, func(t *testing.T) {
186+
cmd := AddKeyCommand()
187+
cmd.Flags().AddFlagSet(Commands("home").PersistentFlags())
188+
189+
kbHome := t.TempDir()
190+
mockIn := testutil.ApplyMockIODiscardOutErr(cmd)
191+
kb, err := keyring.New(sdk.KeyringServiceName(), keyring.BackendTest, kbHome, mockIn)
192+
require.NoError(t, err)
193+
194+
appCodec := simapp.MakeTestEncodingConfig().Marshaler
195+
clientCtx := client.Context{}.
196+
WithJSONMarshaler(appCodec).
197+
WithKeyringDir(kbHome).
198+
WithKeyring(kb)
199+
ctx := context.WithValue(context.Background(), client.ClientContextKey, &clientCtx)
200+
201+
path := sdk.GetConfig().GetFullFundraiserPath()
202+
_, err = kb.NewAccount("subkey", testutil.TestMnemonic, "", path, hd.Secp256k1)
203+
require.NoError(t, err)
204+
205+
t.Cleanup(func() {
206+
_ = kb.Delete("subkey")
207+
})
208+
209+
b := bytes.NewBufferString("")
210+
cmd.SetOut(b)
211+
212+
cmd.SetArgs(tt.args)
213+
require.NoError(t, cmd.ExecuteContext(ctx))
214+
215+
if tt.added {
216+
_, err = kb.Key("testkey")
217+
require.NoError(t, err)
218+
219+
out, err := ioutil.ReadAll(b)
220+
require.NoError(t, err)
221+
require.Contains(t, string(out), "name: testkey")
222+
} else {
223+
_, err = kb.Key("testkey")
224+
require.Error(t, err)
225+
require.Equal(t, "The specified item could not be found in the keyring", err.Error())
226+
}
227+
})
228+
}
229+
}

crypto/keyring/keyring.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -744,7 +744,7 @@ func (ks keystore) writeInfo(info Info) error {
744744

745745
exists, err := ks.existsInDb(info)
746746
if exists {
747-
return errors.New("public key already exist in keybase")
747+
return errors.New("public key already exists in keybase")
748748
}
749749

750750
if err != nil {

crypto/keyring/legacy_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,5 @@ func TestLegacyKeybase(t *testing.T) {
5353

5454
err = importer.Import("test", armoredInfo)
5555
require.Error(t, err)
56-
require.Equal(t, `public key already exist in keybase`, err.Error())
56+
require.Equal(t, `public key already exists in keybase`, err.Error())
5757
}

0 commit comments

Comments
 (0)