mirror of https://github.com/certusone/santa.git
174 lines
4.1 KiB
Go
174 lines
4.1 KiB
Go
package cmd
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
|
|
bip39 "github.com/bartekn/go-bip39"
|
|
input "github.com/cosmos/cosmos-sdk/client"
|
|
"github.com/spf13/cobra"
|
|
"github.com/spf13/viper"
|
|
)
|
|
|
|
const (
|
|
flagRecover = "recover"
|
|
flagOldHdPath = "old-hd-path"
|
|
flagBech = "bech"
|
|
)
|
|
|
|
// versionCmd represents the version command
|
|
var keysCmd = &cobra.Command{
|
|
Use: "keys",
|
|
Short: "Runs keys calls",
|
|
}
|
|
|
|
// get keys list
|
|
var keysList = &cobra.Command{
|
|
Use: "list",
|
|
Short: "Fetch all keys managed by the server",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
out, err := app.GetKeys()
|
|
if err != nil {
|
|
log.Fatalf("Failed: %s", err.Error())
|
|
return
|
|
}
|
|
fmt.Println(string(out))
|
|
},
|
|
}
|
|
|
|
// keys add
|
|
var keysAdd = &cobra.Command{
|
|
Use: "add [name]",
|
|
Args: cobra.ExactArgs(1),
|
|
Short: "Add a new key to the keyserver, optionally pass a mnemonic to restore the key",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
password, err := input.GetCheckPassword(
|
|
"Enter a passphrase to encrypt your key to disk:",
|
|
"Repeat the passphrase:", reader)
|
|
|
|
if err != nil {
|
|
log.Fatalf("failed reading password: %s", err.Error())
|
|
return
|
|
}
|
|
|
|
var mnemonic string
|
|
oldHdPath := false
|
|
if viper.GetBool(flagRecover) {
|
|
bip39Message := "Enter your bip39 mnemonic"
|
|
mnemonic, err = input.GetString(bip39Message, reader)
|
|
if err != nil {
|
|
log.Fatalf("failed reading mnemonic: %s", err.Error())
|
|
return
|
|
}
|
|
|
|
if !bip39.IsMnemonicValid(mnemonic) {
|
|
log.Fatal("invalid mnemonic")
|
|
return
|
|
}
|
|
|
|
oldHdPath = viper.GetBool(flagOldHdPath)
|
|
} else if viper.GetBool(flagOldHdPath) {
|
|
log.Fatal("--old-hd-path can not be used without --recover flag")
|
|
return
|
|
}
|
|
|
|
out, err := app.AddNewKey(args[0], password, mnemonic, oldHdPath)
|
|
|
|
if err != nil {
|
|
log.Fatalf("Failed: %s", err.Error())
|
|
return
|
|
}
|
|
fmt.Println(string(out))
|
|
},
|
|
}
|
|
|
|
// key show
|
|
var keyShow = &cobra.Command{
|
|
Use: "show [name]",
|
|
Args: cobra.ExactArgs(1),
|
|
Short: "Fetch details for one key",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
out, err := app.GetKey(args[0], viper.GetString(flagBech))
|
|
|
|
if err != nil {
|
|
log.Fatalf("Failed: %s", err.Error())
|
|
return
|
|
}
|
|
fmt.Println(string(out))
|
|
},
|
|
}
|
|
|
|
// /keys/{name} PUT
|
|
var keyPut = &cobra.Command{
|
|
Use: "put [name]",
|
|
Args: cobra.ExactArgs(1),
|
|
Short: "Update the password on a key",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
reader := bufio.NewReader(os.Stdin)
|
|
password, err := input.GetPassword("Enter the current passphrase:", reader)
|
|
if err != nil {
|
|
log.Fatalf("failed reading password: %s", err.Error())
|
|
return
|
|
}
|
|
|
|
newPassword, err := input.GetCheckPassword(
|
|
"Enter the new passphrase:",
|
|
"Repeat the new passphrase:", reader)
|
|
|
|
if err != nil {
|
|
log.Fatalf("failed reading new password: %s", err.Error())
|
|
return
|
|
}
|
|
err = app.UpdateKey(args[0], password, newPassword)
|
|
if err != nil {
|
|
log.Fatalf("Failed: %s", err.Error())
|
|
return
|
|
}
|
|
fmt.Println("ok")
|
|
},
|
|
}
|
|
|
|
// /keys/{name} DELETE
|
|
var keyDelete = &cobra.Command{
|
|
Use: "delete [name]",
|
|
Args: cobra.ExactArgs(1),
|
|
Short: "Delete a key",
|
|
Run: func(cmd *cobra.Command, args []string) {
|
|
reader := bufio.NewReader(os.Stdin)
|
|
password, err := input.GetPassword("Enter the passphrase:", reader)
|
|
if err != nil {
|
|
log.Fatalf("failed reading password: %s", err.Error())
|
|
return
|
|
}
|
|
|
|
err = app.DeleteKey(args[0], password)
|
|
if err != nil {
|
|
log.Fatalf("Failed: %s", err.Error())
|
|
return
|
|
}
|
|
fmt.Println("ok")
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
keysCmd.AddCommand(keysList)
|
|
|
|
keysAdd.Flags().Bool(flagRecover, false, "Recovering key option; mnemonic is required")
|
|
keysAdd.Flags().Bool(flagOldHdPath, false, "Recover key with old hd path")
|
|
viper.BindPFlag(flagRecover, keysAdd.Flags().Lookup(flagRecover))
|
|
viper.BindPFlag(flagOldHdPath, keysAdd.Flags().Lookup(flagOldHdPath))
|
|
keysCmd.AddCommand(keysAdd)
|
|
|
|
keyShow.Flags().String(flagBech, "", "bech32 prefix; acc or val or cons")
|
|
viper.BindPFlag(flagBech, keyShow.Flags().Lookup(flagBech))
|
|
keysCmd.AddCommand(keyShow)
|
|
keysCmd.AddCommand(keyPut)
|
|
keysCmd.AddCommand(keyDelete)
|
|
rootCmd.AddCommand(keysCmd)
|
|
|
|
}
|