package main import ( `bufio` `fmt` `log` `maps` `os` `slices` `strings` `r00t2.io/vault_totp/internal` ) func main() { var err error var p string var doExit bool var keyNm string var doGlobal bool var keyNms []string var rdr *bufio.Reader = bufio.NewReader(os.Stdin) var keys map[string]struct{} = make(map[string]struct{}) log.SetOutput(os.Stdout) if doExit, err = internal.PrepParser("kill", args.CommonArgs, parser); err != nil { log.Panicln(err) } if doExit { return } logger = internal.Logger if err = internal.Validate(args); err != nil { log.Panicln(err) } if vc, err = internal.GetVaultClient(&args.VaultArgs); err != nil { log.Panicln(err) } if existingOtp, err = internal.ListTotpKeys(ctx, vc, args.KillArgs.VaultTotpMnt); err != nil { log.Panicln(err) } if len(existingOtp) == 0 { fmt.Printf("No existing TOTP keys found at '%s'.\n", args.KillArgs.VaultTotpMnt) os.Exit(0) } if args.KillArgs.KeyNms == nil || len(args.KillArgs.KeyNms) == 0 { for keyNm = range maps.Keys(existingOtp) { keys[keyNm] = struct{}{} keyNms = append(keyNms, keyNm) } doGlobal = !args.KillArgs.Force } else { if args.KillArgs.Force { doGlobal = !args.KillArgs.Force2 } for _, keyNm = range args.KillArgs.KeyNms { if !args.KillArgs.Force { p = "" fmt.Printf("Delete TOTP '[%s]/%s'? (y/N)\n", args.KillArgs.VaultTotpMnt, keyNm) if p, err = rdr.ReadString('\n'); err != nil { log.Panicln(err) } if strings.HasPrefix( strings.ToLower( strings.TrimSpace( p, ), ), "y", ) { keys[keyNm] = struct{}{} keyNms = append(keyNms, keyNm) } } } } fmt.Println() if keyNms == nil || len(keyNms) == 0 { fmt.Printf("No keys selected for deletion on '%s'.\n", args.KillArgs.VaultTotpMnt) os.Exit(0) } slices.Sort(keyNms) if doGlobal { fmt.Printf( "Will delete the following TOTP keys on mount '%s':\n"+ "\t* %s"+ "\n", args.KillArgs.VaultTotpMnt, strings.Join(keyNms, "\n\t*"), ) fmt.Println("Is this OK? (y/N)") p = "" if p, err = rdr.ReadString('\n'); err != nil { log.Panicln(err) } fmt.Println() if !strings.HasPrefix( strings.ToLower( strings.TrimSpace( p, ), ), "y", ) { fmt.Println("Exiting.") os.Exit(0) } } for _, keyNm = range keys { wg.Add(1) go killKeyAsync(keyNm) } log.Println("Done.") }