1
0
Files
vault_totp/cmd/kill/main.go
2025-12-23 20:58:56 -05:00

122 lines
2.4 KiB
Go

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.")
}