122 lines
2.4 KiB
Go
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.")
|
|
}
|