Skip to content

Commit ee57ba2

Browse files
authored
Rename missing from CLI (#1776)
1 parent 74301cd commit ee57ba2

2 files changed

Lines changed: 43 additions & 1 deletion

File tree

keystore/cli/cli.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ CREATE TABLE IF NOT EXISTS encrypted_keystore (
6666
exportCmd := NewExportCmd()
6767
importCmd := NewImportCmd()
6868
setMetadataCmd := NewSetMetadataCmd()
69+
renameCmd := NewRenameCmd()
6970
// Note these could potentially be supported with KMS, but not yet implemented.
7071
encryptCmd := NewEncryptCmd()
7172
decryptCmd := NewDecryptCmd()
@@ -77,11 +78,12 @@ CREATE TABLE IF NOT EXISTS encrypted_keystore (
7778
exportCmd.Hidden = true
7879
importCmd.Hidden = true
7980
setMetadataCmd.Hidden = true
81+
renameCmd.Hidden = true
8082
encryptCmd.Hidden = true
8183
decryptCmd.Hidden = true
8284
}
8385

84-
cmd.AddCommand(listCmd, getCmd, createCmd, deleteCmd, exportCmd, importCmd, setMetadataCmd, signCmd, verifyCmd, encryptCmd, decryptCmd)
86+
cmd.AddCommand(listCmd, getCmd, createCmd, deleteCmd, exportCmd, importCmd, setMetadataCmd, renameCmd, signCmd, verifyCmd, encryptCmd, decryptCmd)
8587
return cmd
8688
}
8789

@@ -232,6 +234,20 @@ func NewSetMetadataCmd() *cobra.Command {
232234
return &cmd
233235
}
234236

237+
func NewRenameCmd() *cobra.Command {
238+
cmd := cobra.Command{
239+
Use: "rename", Short: "Rename a key",
240+
RunE: func(cmd *cobra.Command, args []string) error {
241+
return runKeystoreCommand[ks.Keystore, ks.RenameKeyRequest, ks.RenameKeyResponse](cmd, args, loadKeystore, func(ctx context.Context, k ks.Keystore, req ks.RenameKeyRequest) (ks.RenameKeyResponse, error) {
242+
return k.RenameKey(ctx, req)
243+
})
244+
},
245+
}
246+
cmd.Flags().StringP("file", "f", "", "input file path (use \"-\" for stdin)")
247+
cmd.Flags().StringP("data", "d", "", "inline JSON request, e.g. '{\"OldName\": \"key1\", \"NewName\": \"key2\"}'")
248+
return &cmd
249+
}
250+
235251
// runKeystoreCommandGeneric is a generic helper that runs a keystore command with a custom loader function.
236252
func runKeystoreCommand[K any, Req any, Resp any](
237253
cmd *cobra.Command,

keystore/cli/cli_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,32 @@ func TestAdminCLI(t *testing.T) {
109109
require.Equal(t, "testkey", resp.Keys[0].KeyInfo.Name)
110110
// Metadata is []byte, Go's JSON unmarshaler automatically decodes base64 strings
111111
require.Equal(t, "my-custom-metadata", string(resp.Keys[0].KeyInfo.Metadata))
112+
originalPublicKey := resp.Keys[0].KeyInfo.PublicKey
113+
114+
// Rename testkey to renamedkey.
115+
_, err = runCommand(t, nil, "rename", "-d", `{"OldName": "testkey", "NewName": "renamedkey"}`)
116+
require.NoError(t, err)
117+
118+
// Verify the old name doesn't exist.
119+
out, err = runCommand(t, nil, "get", "-d", `{"KeyNames": ["testkey"]}`)
120+
require.Error(t, err)
121+
122+
// Verify the new name exists with the same key material.
123+
out, err = runCommand(t, nil, "get", "-d", `{"KeyNames": ["renamedkey"]}`)
124+
require.NoError(t, err)
125+
resp = ks.GetKeysResponse{}
126+
err = json.Unmarshal(out.Bytes(), &resp)
127+
require.NoError(t, err)
128+
require.Len(t, resp.Keys, 1)
129+
require.Equal(t, "renamedkey", resp.Keys[0].KeyInfo.Name)
130+
require.Equal(t, ks.X25519, resp.Keys[0].KeyInfo.KeyType)
131+
require.Equal(t, originalPublicKey, resp.Keys[0].KeyInfo.PublicKey)
132+
// Metadata should be preserved
133+
require.Equal(t, "my-custom-metadata", string(resp.Keys[0].KeyInfo.Metadata))
134+
135+
// Rename it back to testkey for cleanup.
136+
_, err = runCommand(t, nil, "rename", "-d", `{"OldName": "renamedkey", "NewName": "testkey"}`)
137+
require.NoError(t, err)
112138

113139
// Delete the keys with confirmation.
114140
out, err = runCommand(t, bytes.NewBufferString("yes\n"), "delete", "-d", `{"KeyNames": ["testkey", "testkey2"]}`)

0 commit comments

Comments
 (0)