github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/crypto/keys/client/delete.go (about)

     1  package client
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"flag"
     7  
     8  	"github.com/gnolang/gno/tm2/pkg/commands"
     9  	"github.com/gnolang/gno/tm2/pkg/crypto/keys"
    10  )
    11  
    12  type DeleteCfg struct {
    13  	RootCfg *BaseCfg
    14  
    15  	Yes   bool
    16  	Force bool
    17  }
    18  
    19  func NewDeleteCmd(rootCfg *BaseCfg, io commands.IO) *commands.Command {
    20  	cfg := &DeleteCfg{
    21  		RootCfg: rootCfg,
    22  	}
    23  
    24  	return commands.NewCommand(
    25  		commands.Metadata{
    26  			Name:       "delete",
    27  			ShortUsage: "delete [flags] <key-name>",
    28  			ShortHelp:  "deletes a key from the keybase",
    29  		},
    30  		cfg,
    31  		func(_ context.Context, args []string) error {
    32  			return execDelete(cfg, args, io)
    33  		},
    34  	)
    35  }
    36  
    37  func (c *DeleteCfg) RegisterFlags(fs *flag.FlagSet) {
    38  	fs.BoolVar(
    39  		&c.Yes,
    40  		"yes",
    41  		false,
    42  		"skip confirmation prompt",
    43  	)
    44  
    45  	fs.BoolVar(
    46  		&c.Force,
    47  		"force",
    48  		false,
    49  		"remove key unconditionally",
    50  	)
    51  }
    52  
    53  func execDelete(cfg *DeleteCfg, args []string, io commands.IO) error {
    54  	if len(args) != 1 {
    55  		return flag.ErrHelp
    56  	}
    57  
    58  	nameOrBech32 := args[0]
    59  
    60  	kb, err := keys.NewKeyBaseFromDir(cfg.RootCfg.Home)
    61  	if err != nil {
    62  		return err
    63  	}
    64  
    65  	info, err := kb.GetByNameOrAddress(nameOrBech32)
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	if info.GetType() == keys.TypeLedger || info.GetType() == keys.TypeOffline {
    71  		if !cfg.Yes {
    72  			if err := confirmDeletion(io); err != nil {
    73  				return err
    74  			}
    75  		}
    76  
    77  		if err := kb.Delete(nameOrBech32, "", true); err != nil {
    78  			return err
    79  		}
    80  		io.ErrPrintln("Public key reference deleted")
    81  
    82  		return nil
    83  	}
    84  
    85  	// skip passphrase check if run with --force
    86  	skipPass := cfg.Force
    87  	var oldpass string
    88  	if !skipPass {
    89  		msg := "DANGER - enter password to permanently delete key:"
    90  		if oldpass, err = io.GetPassword(msg, cfg.RootCfg.InsecurePasswordStdin); err != nil {
    91  			return err
    92  		}
    93  	}
    94  
    95  	err = kb.Delete(nameOrBech32, oldpass, skipPass)
    96  	if err != nil {
    97  		return err
    98  	}
    99  	io.ErrPrintln("Key deleted")
   100  
   101  	return nil
   102  }
   103  
   104  func confirmDeletion(io commands.IO) error {
   105  	answer, err := io.GetConfirmation("Key reference will be deleted. Continue?")
   106  	if err != nil {
   107  		return err
   108  	}
   109  
   110  	if !answer {
   111  		return errors.New("aborted")
   112  	}
   113  
   114  	return nil
   115  }